From 352f5a034c12d09756deac2a32ccf9770c39a664 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sun, 25 Oct 2020 07:21:45 +0000 Subject: [PATCH] Fix bug 64238: Make LOOKUP functions deal with empty last arg correctly git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1882827 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/formula/functions/LookupUtils.java | 24 +++++++++++------- .../LookupFunctionsTestCaseData.xls | Bin 68096 -> 70144 bytes 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/poi/ss/formula/functions/LookupUtils.java b/src/java/org/apache/poi/ss/formula/functions/LookupUtils.java index cccb6d64ad..9af09c301b 100644 --- a/src/java/org/apache/poi/ss/formula/functions/LookupUtils.java +++ b/src/java/org/apache/poi/ss/formula/functions/LookupUtils.java @@ -25,6 +25,7 @@ import org.apache.poi.ss.formula.eval.BlankEval; import org.apache.poi.ss.formula.eval.BoolEval; import org.apache.poi.ss.formula.eval.ErrorEval; import org.apache.poi.ss.formula.eval.EvaluationException; +import org.apache.poi.ss.formula.eval.MissingArgEval; import org.apache.poi.ss.formula.eval.NumberEval; import org.apache.poi.ss.formula.eval.NumericValueEval; import org.apache.poi.ss.formula.eval.OperandResolver; @@ -133,7 +134,7 @@ final class LookupUtils { return new ColumnVector(tableArray, relativeColumnIndex); } /** - * @return null if the supplied area is neither a single row nor a single colum + * @return null if the supplied area is neither a single row nor a single column */ public static ValueVector createVector(TwoDEval ae) { if (ae.isColumn()) { @@ -144,7 +145,7 @@ final class LookupUtils { } return null; } - + public static ValueVector createVector(RefEval re) { return new SheetVector(re); } @@ -276,11 +277,11 @@ final class LookupUtils { private static final class StringLookupComparer extends LookupValueComparerBase { - - private String _value; + + private final String _value; private final Pattern _wildCardPattern; - private boolean _matchExact; - private boolean _isMatchFunction; + private final boolean _matchExact; + private final boolean _isMatchFunction; protected StringLookupComparer(StringEval se, boolean matchExact, boolean isMatchFunction) { super(se); @@ -311,7 +312,7 @@ final class LookupUtils { } } private static final class NumberLookupComparer extends LookupValueComparerBase { - private double _value; + private final double _value; protected NumberLookupComparer(NumberEval ne) { super(ne); @@ -326,7 +327,7 @@ final class LookupUtils { } } private static final class BooleanLookupComparer extends LookupValueComparerBase { - private boolean _value; + private final boolean _value; protected BooleanLookupComparer(BoolEval be) { super(be); @@ -434,6 +435,11 @@ final class LookupUtils { public static boolean resolveRangeLookupArg(ValueEval rangeLookupArg, int srcCellRow, int srcCellCol) throws EvaluationException { ValueEval valEval = OperandResolver.getSingleValue(rangeLookupArg, srcCellRow, srcCellCol); + if(valEval == MissingArgEval.instance) { + // Tricky: + // forth arg exists but is not supplied: "=VLOOKUP(A1,A2:A4,2,)" + return false; + } if(valEval instanceof BlankEval) { // Tricky: // fourth arg supplied but evaluates to blank @@ -457,7 +463,7 @@ final class LookupUtils { Boolean b = Countif.parseBoolean(stringValue); if(b != null) { // string converted to boolean OK - return b.booleanValue(); + return b; } // Even more trickiness: // Note - even if the StringEval represents a number value (for example "1"), diff --git a/test-data/spreadsheet/LookupFunctionsTestCaseData.xls b/test-data/spreadsheet/LookupFunctionsTestCaseData.xls index 56b6f12a00bdeff9cccf0b6282209ca4cf1a8b54..d9e9b517d8c69e813445b65ff1160c2dfb7745e0 100644 GIT binary patch delta 8026 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 delta 6100 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