From be096396384f93c4d9027484a997509edf240708 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Fri, 3 Jul 2020 16:09:03 +0000 Subject: [PATCH] =?UTF-8?q?[github-185]=20Fix=20if=20function=20in=20array?= =?UTF-8?q?=20formulas=20with=202nd=20argument=20evaluating=20to=20error.?= =?UTF-8?q?=20Thanks=20to=20Mi=C5=82osz=20Rembisz.=20This=20closes=20#185?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1879481 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/formula/functions/IfFunc.java | 296 +++++++++--------- .../spreadsheet/IfFunctionTestCaseData.xls | Bin 34816 -> 36864 bytes 2 files changed, 147 insertions(+), 149 deletions(-) diff --git a/src/java/org/apache/poi/ss/formula/functions/IfFunc.java b/src/java/org/apache/poi/ss/formula/functions/IfFunc.java index 7f92881353..c73e13a1cc 100644 --- a/src/java/org/apache/poi/ss/formula/functions/IfFunc.java +++ b/src/java/org/apache/poi/ss/formula/functions/IfFunc.java @@ -38,170 +38,168 @@ import java.util.function.BiFunction; public final class IfFunc extends Var2or3ArgFunction implements ArrayFunction { @Override - public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) { - boolean b; - try { - b = evaluateFirstArg(arg0, srcRowIndex, srcColumnIndex); - } catch (EvaluationException e) { - return e.getErrorEval(); - } - if (b) { - if (arg1 == MissingArgEval.instance) { - return BlankEval.instance; - } - return arg1; - } - return BoolEval.FALSE; - } + public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) { + boolean b; + try { + b = evaluateFirstArg(arg0, srcRowIndex, srcColumnIndex); + } catch (EvaluationException e) { + return e.getErrorEval(); + } + if (b) { + if (arg1 == MissingArgEval.instance) { + return BlankEval.instance; + } + return arg1; + } + return BoolEval.FALSE; + } @Override - public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1, - ValueEval arg2) { - boolean b; - try { - b = evaluateFirstArg(arg0, srcRowIndex, srcColumnIndex); - } catch (EvaluationException e) { - return e.getErrorEval(); - } - if (b) { - if (arg1 == MissingArgEval.instance) { - return BlankEval.instance; - } - return arg1; - } - if (arg2 == MissingArgEval.instance) { - return BlankEval.instance; - } - return arg2; - } + public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1, + ValueEval arg2) { + boolean b; + try { + b = evaluateFirstArg(arg0, srcRowIndex, srcColumnIndex); + } catch (EvaluationException e) { + return e.getErrorEval(); + } + if (b) { + if (arg1 == MissingArgEval.instance) { + return BlankEval.instance; + } + return arg1; + } + if (arg2 == MissingArgEval.instance) { + return BlankEval.instance; + } + return arg2; + } - public static boolean evaluateFirstArg(ValueEval arg, int srcCellRow, int srcCellCol) - throws EvaluationException { - ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol); - Boolean b = OperandResolver.coerceValueToBoolean(ve, false); - if (b == null) { - return false; - } - return b.booleanValue(); - } + public static boolean evaluateFirstArg(ValueEval arg, int srcCellRow, int srcCellCol) + throws EvaluationException { + ValueEval ve = OperandResolver.getSingleValue(arg, srcCellRow, srcCellCol); + Boolean b = OperandResolver.coerceValueToBoolean(ve, false); + if (b == null) { + return false; + } + return b.booleanValue(); + } - @Override - public ValueEval evaluateArray(ValueEval[] args, int srcRowIndex, int srcColumnIndex) { - if (args.length < 2 || args.length > 3) { - return ErrorEval.VALUE_INVALID; - } + @Override + public ValueEval evaluateArray(ValueEval[] args, int srcRowIndex, int srcColumnIndex) { + if (args.length < 2 || args.length > 3) { + return ErrorEval.VALUE_INVALID; + } - ValueEval arg0 = args[0]; - ValueEval arg1 = args[1]; - ValueEval arg2 = args.length == 2 ? BoolEval.FALSE : args[2]; - return evaluateArrayArgs(arg0, arg1, arg2, srcRowIndex, srcColumnIndex); - } + ValueEval arg0 = args[0]; + ValueEval arg1 = args[1]; + ValueEval arg2 = args.length == 2 ? BoolEval.FALSE : args[2]; + return evaluateArrayArgs(arg0, arg1, arg2, srcRowIndex, srcColumnIndex); + } - ValueEval evaluateArrayArgs(ValueEval arg0, ValueEval arg1, ValueEval arg2, int srcRowIndex, int srcColumnIndex) { - int w1, w2, h1, h2; - int a1FirstCol = 0, a1FirstRow = 0; - if (arg0 instanceof AreaEval) { - AreaEval ae = (AreaEval)arg0; - w1 = ae.getWidth(); - h1 = ae.getHeight(); - a1FirstCol = ae.getFirstColumn(); - a1FirstRow = ae.getFirstRow(); - } else if (arg0 instanceof RefEval){ - RefEval ref = (RefEval)arg0; - w1 = 1; - h1 = 1; - a1FirstCol = ref.getColumn(); - a1FirstRow = ref.getRow(); - } else { - w1 = 1; - h1 = 1; - } - int a2FirstCol = 0, a2FirstRow = 0; - if (arg1 instanceof AreaEval) { - AreaEval ae = (AreaEval)arg1; - w2 = ae.getWidth(); - h2 = ae.getHeight(); - a2FirstCol = ae.getFirstColumn(); - a2FirstRow = ae.getFirstRow(); - } else if (arg1 instanceof RefEval){ - RefEval ref = (RefEval)arg1; - w2 = 1; - h2 = 1; - a2FirstCol = ref.getColumn(); - a2FirstRow = ref.getRow(); - } else { - w2 = 1; - h2 = 1; - } + ValueEval evaluateArrayArgs(ValueEval arg0, ValueEval arg1, ValueEval arg2, int srcRowIndex, int srcColumnIndex) { + int w1, w2, h1, h2; + int a1FirstCol = 0, a1FirstRow = 0; + if (arg0 instanceof AreaEval) { + AreaEval ae = (AreaEval)arg0; + w1 = ae.getWidth(); + h1 = ae.getHeight(); + a1FirstCol = ae.getFirstColumn(); + a1FirstRow = ae.getFirstRow(); + } else if (arg0 instanceof RefEval){ + RefEval ref = (RefEval)arg0; + w1 = 1; + h1 = 1; + a1FirstCol = ref.getColumn(); + a1FirstRow = ref.getRow(); + } else { + w1 = 1; + h1 = 1; + } + int a2FirstCol = 0, a2FirstRow = 0; + if (arg1 instanceof AreaEval) { + AreaEval ae = (AreaEval)arg1; + w2 = ae.getWidth(); + h2 = ae.getHeight(); + a2FirstCol = ae.getFirstColumn(); + a2FirstRow = ae.getFirstRow(); + } else if (arg1 instanceof RefEval){ + RefEval ref = (RefEval)arg1; + w2 = 1; + h2 = 1; + a2FirstCol = ref.getColumn(); + a2FirstRow = ref.getRow(); + } else { + w2 = 1; + h2 = 1; + } - int a3FirstCol = 0, a3FirstRow = 0; - if (arg2 instanceof AreaEval) { - AreaEval ae = (AreaEval)arg2; - a3FirstCol = ae.getFirstColumn(); - a3FirstRow = ae.getFirstRow(); - } else if (arg2 instanceof RefEval){ - RefEval ref = (RefEval)arg2; - a3FirstCol = ref.getColumn(); - a3FirstRow = ref.getRow(); - } + int a3FirstCol = 0, a3FirstRow = 0; + if (arg2 instanceof AreaEval) { + AreaEval ae = (AreaEval)arg2; + a3FirstCol = ae.getFirstColumn(); + a3FirstRow = ae.getFirstRow(); + } else if (arg2 instanceof RefEval){ + RefEval ref = (RefEval)arg2; + a3FirstCol = ref.getColumn(); + a3FirstRow = ref.getRow(); + } - int width = Math.max(w1, w2); - int height = Math.max(h1, h2); + int width = Math.max(w1, w2); + int height = Math.max(h1, h2); - ValueEval[] vals = new ValueEval[height * width]; + ValueEval[] vals = new ValueEval[height * width]; - int idx = 0; - for(int i = 0; i < height; i++){ - for(int j = 0; j < width; j++){ - ValueEval vA; - try { - vA = OperandResolver.getSingleValue(arg0, a1FirstRow + i, a1FirstCol + j); - } catch (FormulaParseException e) { - vA = ErrorEval.NAME_INVALID; - } catch (EvaluationException e) { - vA = e.getErrorEval(); - } - ValueEval vB; - try { - vB = OperandResolver.getSingleValue(arg1, a2FirstRow + i, a2FirstCol + j); - } catch (FormulaParseException e) { - vB = ErrorEval.NAME_INVALID; - } catch (EvaluationException e) { - vB = e.getErrorEval(); - } + int idx = 0; + for(int i = 0; i < height; i++){ + for(int j = 0; j < width; j++){ + ValueEval vA; + try { + vA = OperandResolver.getSingleValue(arg0, a1FirstRow + i, a1FirstCol + j); + } catch (FormulaParseException e) { + vA = ErrorEval.NAME_INVALID; + } catch (EvaluationException e) { + vA = e.getErrorEval(); + } + ValueEval vB; + try { + vB = OperandResolver.getSingleValue(arg1, a2FirstRow + i, a2FirstCol + j); + } catch (FormulaParseException e) { + vB = ErrorEval.NAME_INVALID; + } catch (EvaluationException e) { + vB = e.getErrorEval(); + } - ValueEval vC; - try { - vC = OperandResolver.getSingleValue(arg2, a3FirstRow + i, a3FirstCol + j); - } catch (FormulaParseException e) { - vC = ErrorEval.NAME_INVALID; - } catch (EvaluationException e) { - vC = e.getErrorEval(); - } + ValueEval vC; + try { + vC = OperandResolver.getSingleValue(arg2, a3FirstRow + i, a3FirstCol + j); + } catch (FormulaParseException e) { + vC = ErrorEval.NAME_INVALID; + } catch (EvaluationException e) { + vC = e.getErrorEval(); + } - if(vA instanceof ErrorEval){ - vals[idx++] = vA; - } else if (vB instanceof ErrorEval) { - vals[idx++] = vB; - } else { - Boolean b; - try { - b = OperandResolver.coerceValueToBoolean(vA, false); - vals[idx++] = b != null && b ? vB : vC; - } catch (EvaluationException e) { - vals[idx++] = e.getErrorEval(); - } - } + if(vA instanceof ErrorEval){ + vals[idx++] = vA; + } else { + Boolean b; + try { + b = OperandResolver.coerceValueToBoolean(vA, false); + vals[idx++] = b != null && b ? vB : vC; + } catch (EvaluationException e) { + vals[idx++] = e.getErrorEval(); + } + } - } - } + } + } - if (vals.length == 1) { - return vals[0]; - } + if (vals.length == 1) { + return vals[0]; + } - return new CacheAreaEval(srcRowIndex, srcColumnIndex, srcRowIndex + height - 1, srcColumnIndex + width - 1, vals); - } + return new CacheAreaEval(srcRowIndex, srcColumnIndex, srcRowIndex + height - 1, srcColumnIndex + width - 1, vals); + } } diff --git a/test-data/spreadsheet/IfFunctionTestCaseData.xls b/test-data/spreadsheet/IfFunctionTestCaseData.xls index fb648da613214dcb1cf64b3a01eb22a6471468c5..961ff164b2d4d0e43bc9914406f341dc56756c32 100644 GIT binary patch delta 6850 zcmb7}du&|A6^GBL^(%3_&iWlclJ%1+4USFXke4A@+nW&Vtm!6J zYKyS0fY6o}f=_5^i=dHsH6)N=sg$asp@>Q#DDX!?s)UqMsj7skB1N=Ofoy+sH=FF^ z=B8Y0=H5Ls=bJNU&dj|tUOb^J{!%&N7q>jtGmwEHYe9*Bq{f+r zd|J)X=!N{Q_9PkWuQOx|8&h=A!nO8$&9Vil5=d4l2>qxYc2@QT0tQQOdL_Zjv7HDAiLZiM{YZJ$$0?1z8&R(#`6i zW>f=tq2f((a~vY`UXr<6ZJ;$&N3_>h@2P62s`Bskb&n@KOS#wQg>bA@=8D=gLGIUcmsi0AokOTBo3AGdUgU-1W)CUKe-YrlArhpe6A3`eb{;w(R5 zEqA^|4kGVJ*xP+I+rQuIR_~yf`A^n;;@t8&+uuz*oKwnYk^Y=rYO>Iayf3>1*nQbW z9D;NxyOjT#y^oLK*@x%1aQ`BwRIK2ztwa>doIio=kS&X!%5i{jS|hxm5sIKulY6rH zHB$l6z4`gCx?XkVDHl8!sSp!|NMC*$a{es$PItT*_2hL;?KGV?d5COW;izSwqm+N_ z*k~E0txtdF^74m{pJ#~;JmVY`t$g0O)s+~bEVL+BplCE2^J)>*&F)oo=0?b@e5%yV zcdhc5r`HYy0*TsW=Toaz^5%*H{>!QfexxFo!v$5Mhl2%v(ZNr<{Gy&ea1Dxe{B&70 zcb0kheV3hID0A_BcrGlf;j!Ypd>6AYzFgjI?$Ua2TcMk8cl$H?`^qb?BznN7+;x1;nadx!hyK5wiZ-oxov_g_+WA7o zPO*O3>G`g>){Gr)HIZ^rb|~T2GnM-d%Y9zM^5vJjy9JLHBomnz0<#U;-9;JXpM^X%fq7n2tcwL`$|2BxzCn5~@3vOE=WuN2+Uq%{Rt2 z>tMZx*e^6}fibp42U}~19j}qrt~AEB>R{^)v2SYFLSt;34z|${TVE@!Ei%To>tLG= zv5#rkVu@}2Mv+hf>I|`e)UZxttX?FnHN^T> zOKVpdWA!3oogwz5hIJWZ^&+9g5c{QuEtA;xZxjh0U~j0w6KkXs%8jvlkx*@jeOtr2 zjj?)>u-Xvoub0+V7-RJ!p}`RQQw{4e#_C0a-w=C6!&Vw&^&+9w5F1)s+nj@!5LW)a z>B&&|h^J}EHh`ri@g5)&YI)3tkHVz)1^-r4t4dO9&Qz<+P;)fM)~b`#S~AsYGSsFt zwVEWg)=afE8EUU-YPCsfZJBDm47FUJG_o#9tvyq%DMM}2S36cotK|R<;_Vv7yVXNS zk>5>w#3Z&zv)ZpE+e4||RSGdc1{$2(JPz=hbnyI5!9{7{G!1q%I@#4au-1;Rax>B3 z>_lXK$+jWYJh3WfhIzBvK5w3P`KzNUtz9(5mTdK@HO;1&9W@uw)es#5zOKNKRAzpc7wux|Yc0GaXWp34zTmoZnQ&KWwr`o%lS|g~>&;JFQzQbz!X-Tm`|G zO;!_8#inDi8vIgN$)y&`BH9v~I}!=bgb|lRsX$Ry7|VjALNtdj*a%!ZBZG~vG&ij7 zNUKVitXmKO5rn|idRn`Ds(NLY1D`f_qLGQ2gOdxP@Ij1qG*w?IhV3Jm0P?s)j;#D@ zK1e}Kpz%9ZYFjkxOa?P_M$zKzwXbYB{}YoT3vW@CXxrQ&G`BgmIg>M{(l&Gp#`0IK zt7|VP|G;>BEZFy{KXkYg2X1DgtMR7BVu( zk_S+wo<%D(8q+kavFr?u)Rk-nZNTPF>_$K5q1=g7l;|j4w!#%Nkygkr`Mi9*ZGVwz zP?lS1YbZG784f*&aLxG^i}oH9&bPR?{nMP9Hx>Gd^0GFfUi0$0jyG*MA*1H-lqVQD z;5m5M6N*G;BMqMLY}gl!M1u34{j-rnb2GsTy;>sW z-1UydgKpE;Ji2>8l<>*j4|499l|6g9@<(tOLG(Jp*@xLULLWKO9uz3cKVq5=}HdKPCh%)86Ac- z((}EtT3Sr@r^%$fFbA0UC0&Oz`h>mGQN3FG(owQa7^_v5)<~EGcY*;nEPjMjt4`Xm zQ7NEbTcj_0k>u5j^sp@tN&ZS){TLnxnfkz&0nmp(Md7N+Px!>p-T8Z=|lB9f!SEd_x+{l9@pYxE?{wwp7skOF)8!r4{ z^dn(f{%~rYgYP+R!D1yF{MY@(Tz=$0NiqrqI9^_P{EH(Gu9e;Bi%icQUI=M&*>s|* zEy0DO!EgwlhSQPI;rZpwb90ViIbzL7ElBc<=1MFUYsb9 delta 5168 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