Repository: asterixdb Updated Branches: refs/heads/master 511e1c83d -> c006a000f
[NO ISSUE][FUN][COMP] fix ifnan(), ifnanorinf(), ifinf() - user model changes: no - storage format changes: no - interface changes: no Details: This patch is to fix the mentioned functions. The fix is to make ifnan() & ifnanorinf() skip the argument being inspected if it's a missing value and check the next one. For ifinf(), it should return missing if the argument being inspected is a missing value. Also, number of args is checked now. Change-Id: Ib7cc3d18ca0443857ae271b6e14f2c9e920f1c1f Reviewed-on: https://asterix-gerrit.ics.uci.edu/2981 Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: Dmitry Lychagin <dmitry.lycha...@couchbase.com> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/c006a000 Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/c006a000 Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/c006a000 Branch: refs/heads/master Commit: c006a000fe0c826a927b58a40322bdaa9692b492 Parents: 511e1c8 Author: Ali Alsuliman <ali.al.solai...@gmail.com> Authored: Mon Oct 1 14:15:16 2018 -0700 Committer: Ali Alsuliman <ali.al.solai...@gmail.com> Committed: Tue Oct 2 10:51:17 2018 -0700 ---------------------------------------------------------------------- .../numeric/ifinf/ifinf.1.query.sqlpp | 25 ++++++++++---------- .../numeric/ifinf/ifinf.2.query.sqlpp | 25 ++++++++++++++++++++ .../numeric/ifnan/ifnan.1.query.sqlpp | 25 ++++++++++---------- .../numeric/ifnan/ifnan.2.query.sqlpp | 25 ++++++++++++++++++++ .../numeric/ifnanorinf/ifnanorinf.1.query.sqlpp | 25 ++++++++++---------- .../numeric/ifnanorinf/ifnanorinf.2.query.sqlpp | 25 ++++++++++++++++++++ .../runtimets/results/numeric/ifinf/ifinf.1.adm | 1 - .../runtimets/results/numeric/ifnan/ifnan.1.adm | 3 +-- .../results/numeric/ifnanorinf/ifnanorinf.1.adm | 3 +-- .../resources/runtimets/testsuite_sqlpp.xml | 3 +++ .../asterix/om/functions/BuiltinFunctions.java | 4 ++-- .../impl/IfNanOrInfTypeComputer.java | 24 +++++++++++++++---- .../evaluators/functions/IfInfDescriptor.java | 12 +++++++++- .../evaluators/functions/IfNanDescriptor.java | 11 ++++++++- .../functions/IfNanOrInfDescriptor.java | 22 ++++++++++++++--- 15 files changed, 178 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.1.query.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.1.query.sqlpp index 479e290..243663f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.1.query.sqlpp @@ -19,19 +19,18 @@ select value t from [ - [ 0, isnull(ifinf()) ], - [ 1, isnull(ifinf(null)) ], - [ 2, ismissing(ifinf(missing)) ], - [ 3, isnull(ifinf(double("INF"))) ], - [ 4, isnull(ifinf(double("-INF"))) ], - [ 5, isnull(ifinf(float("INF"))) ], - [ 6, isnull(ifinf(float("-INF"))) ], - [ 7, ifinf(tinyint("1")) ], - [ 8, ifinf(smallint("2")) ], - [ 9, ifinf(integer("3")) ], - [ 10, ifinf(bigint("4")) ], - [ 11, ifinf(float("1.5")) ], - [ 12, ifinf(double("2.5")) ], + [ 1, isnull(ifinf(null, null)) ], + [ 2, ismissing(ifinf(missing, null)) ], + [ 3, isnull(ifinf(double("INF"), double("INF"))) ], + [ 4, isnull(ifinf(double("-INF"), double("-INF"))) ], + [ 5, isnull(ifinf(float("INF"), float("INF"))) ], + [ 6, isnull(ifinf(float("-INF"), float("-INF"))) ], + [ 7, ifinf(tinyint("1"), 5) ], + [ 8, ifinf(smallint("2"), 5) ], + [ 9, ifinf(integer("3"), 5) ], + [ 10, ifinf(bigint("4"), 5) ], + [ 11, ifinf(float("1.5"), 5) ], + [ 12, ifinf(double("2.5"), 5) ], [ 13, ifinf(2, null, missing) ], [ 14, isnull(ifinf(null, missing, 2)) ], [ 15, ismissing(ifinf(missing, null, 2)) ], http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.2.query.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.2.query.sqlpp new file mode 100644 index 0000000..d1daed0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifinf/ifinf.2.query.sqlpp @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* +* Description : Testing correct number of arguments required +* Expected Res : Error, min is 2 +*/ + +select value ifinf(15); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.1.query.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.1.query.sqlpp index 40a55d1..d20468e 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.1.query.sqlpp @@ -19,24 +19,23 @@ select value t from [ - [ 0, isnull(ifnan()) ], - [ 1, isnull(ifnan(null)) ], - [ 2, ismissing(ifnan(missing)) ], - [ 3, isnull(ifnan(double("NaN"))) ], - [ 5, isnull(ifnan(float("NaN"))) ], - [ 7, ifnan(tinyint("1")) ], - [ 8, ifnan(smallint("2")) ], - [ 9, ifnan(integer("3")) ], - [ 10, ifnan(bigint("4")) ], - [ 11, ifnan(float("1.5")) ], - [ 12, ifnan(double("2.5")) ], + [ 1, isnull(ifnan(null, null)) ], + [ 2, isnull(ifnan(missing, missing)) ], + [ 3, isnull(ifnan(double("NaN"), double("NaN"))) ], + [ 5, isnull(ifnan(float("NaN"), float("NaN"))) ], + [ 7, ifnan(tinyint("1"), 14) ], + [ 8, ifnan(smallint("2"), 14) ], + [ 9, ifnan(integer("3"), 14) ], + [ 10, ifnan(bigint("4"), 14) ], + [ 11, ifnan(float("1.5"), 2.4) ], + [ 12, ifnan(double("2.5"), 4.4) ], [ 13, ifnan(2, null, missing) ], [ 14, isnull(ifnan(null, missing, 2)) ], - [ 15, ismissing(ifnan(missing, null, 2)) ], + [ 15, isnull(ifnan(missing, null, 2)) ], [ 16, ifnan(double("NaN"), 2) ], [ 17, ifnan(float("NaN"), 2) ], [ 18, isnull(ifnan(double("NaN"), [], 2)) ], - [ 19, ismissing(if_nan(double("NaN"), missing, 2)) ], + [ 19, if_nan(double("NaN"), missing, 2) ], [ 20, tostring(ifnan(double("NaN"), double("INF"), 2)) ], [ 21, tostring(ifnan(float("NaN"), float("-INF"), 2)) ] ] t http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.2.query.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.2.query.sqlpp new file mode 100644 index 0000000..a2a018f --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnan/ifnan.2.query.sqlpp @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* +* Description : Testing correct number of arguments required +* Expected Res : Error, min is 2 +*/ + +select value ifnan(12); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.1.query.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.1.query.sqlpp index d4b1863..34db5c2 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.1.query.sqlpp @@ -19,24 +19,23 @@ select value t from [ - [ 0, isnull(ifnanorinf()) ], - [ 1, isnull(ifnanorinf(null)) ], - [ 2, ismissing(ifnanorinf(missing)) ], - [ 3, isnull(ifnanorinf(double("NaN"))) ], - [ 5, isnull(ifnanorinf(float("INF"))) ], - [ 7, ifnanorinf(tinyint("1")) ], - [ 8, ifnanorinf(smallint("2")) ], - [ 9, ifnanorinf(integer("3")) ], - [ 10, ifnanorinf(bigint("4")) ], - [ 11, ifnanorinf(float("1.5")) ], - [ 12, ifnanorinf(double("2.5")) ], + [ 1, isnull(ifnanorinf(null, null)) ], + [ 2, isnull(ifnanorinf(missing, missing)) ], + [ 3, isnull(ifnanorinf(double("NaN"), double("NaN"))) ], + [ 5, isnull(ifnanorinf(float("INF"), float("NaN"))) ], + [ 7, ifnanorinf(tinyint("1"), 5) ], + [ 8, ifnanorinf(smallint("2"), 5) ], + [ 9, ifnanorinf(integer("3"), 5) ], + [ 10, ifnanorinf(bigint("4"), 5) ], + [ 11, ifnanorinf(float("1.5"), 5) ], + [ 12, ifnanorinf(double("2.5"), "5") ], [ 13, ifnanorinf(2, null, missing) ], [ 14, isnull(ifnanorinf(null, missing, 2)) ], - [ 15, ismissing(ifnanorinf(missing, null, 2)) ], + [ 15, isnull(ifnanorinf(missing, null, 2)) ], [ 16, ifnanorinf(double("-INF"), 2) ], [ 17, ifnanorinf(float("NaN"), 2) ], [ 18, isnull(ifnanorinf(double("NaN"), [], 2)) ], - [ 19, ismissing(if_nan_or_inf(double("NaN"), missing, 2)) ], + [ 19, if_nan_or_inf(double("NaN"), missing, 2) ], [ 20, ifnanorinf(double("NaN"), double("INF"), 2) ], [ 21, ifnanorinf(float("NaN"), float("-INF"), 2) ] ] t http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.2.query.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.2.query.sqlpp new file mode 100644 index 0000000..9c1f5c4 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/ifnanorinf/ifnanorinf.2.query.sqlpp @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* +* Description : Testing correct number of arguments required +* Expected Res : Error, min is 2 +*/ + +select value ifnanorinf(15); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm index 852db4b..8b239c2 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifinf/ifinf.1.adm @@ -1,4 +1,3 @@ -[ 0, true ] [ 1, true ] [ 2, true ] [ 3, true ] http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm index ec02746..5680b0d 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnan/ifnan.1.adm @@ -1,4 +1,3 @@ -[ 0, true ] [ 1, true ] [ 2, true ] [ 3, true ] @@ -15,6 +14,6 @@ [ 16, 2 ] [ 17, 2 ] [ 18, true ] -[ 19, true ] +[ 19, 2 ] [ 20, "INF" ] [ 21, "-INF" ] \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm index 34476cc..d49ebcb 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/ifnanorinf/ifnanorinf.1.adm @@ -1,4 +1,3 @@ -[ 0, true ] [ 1, true ] [ 2, true ] [ 3, true ] @@ -15,6 +14,6 @@ [ 16, 2 ] [ 17, 2 ] [ 18, true ] -[ 19, true ] +[ 19, 2 ] [ 20, 2 ] [ 21, 2 ] \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index 18e93e1..35b1a93 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -5142,16 +5142,19 @@ <test-case FilePath="numeric"> <compilation-unit name="ifinf"> <output-dir compare="Text">ifinf</output-dir> + <expected-error>Invalid number of arguments for function if-inf (in line 25, at column 14)</expected-error> </compilation-unit> </test-case> <test-case FilePath="numeric"> <compilation-unit name="ifnan"> <output-dir compare="Text">ifnan</output-dir> + <expected-error>Invalid number of arguments for function if-nan (in line 25, at column 14)</expected-error> </compilation-unit> </test-case> <test-case FilePath="numeric"> <compilation-unit name="ifnanorinf"> <output-dir compare="Text">ifnanorinf</output-dir> + <expected-error>Invalid number of arguments for function if-nan-or-inf (in line 25, at column 14)</expected-error> </compilation-unit> </test-case> <test-case FilePath="numeric"> http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java index 49db062..f2be330 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java @@ -1309,8 +1309,8 @@ public class BuiltinFunctions { addFunction(IF_MISSING, IfMissingTypeComputer.INSTANCE, true); addFunction(IF_MISSING_OR_NULL, IfMissingOrNullTypeComputer.INSTANCE, true); addFunction(IF_NULL, IfNullTypeComputer.INSTANCE, true); - addFunction(IF_NAN, IfNanOrInfTypeComputer.INSTANCE, true); - addFunction(IF_NAN_OR_INF, IfNanOrInfTypeComputer.INSTANCE, true); + addFunction(IF_NAN, IfNanOrInfTypeComputer.INSTANCE_SKIP_MISSING, true); + addFunction(IF_NAN_OR_INF, IfNanOrInfTypeComputer.INSTANCE_SKIP_MISSING, true); addFunction(MISSING_IF, MissingIfTypeComputer.INSTANCE, true); addFunction(NULL_IF, NullIfTypeComputer.INSTANCE, true); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java index bb9fa38..a0423cd 100644 --- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java +++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/IfNanOrInfTypeComputer.java @@ -19,21 +19,33 @@ package org.apache.asterix.om.typecomputer.impl; +import org.apache.asterix.common.exceptions.CompilationException; +import org.apache.asterix.common.exceptions.ErrorCode; import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer; import org.apache.asterix.om.types.AUnionType; import org.apache.asterix.om.types.BuiltinType; import org.apache.asterix.om.types.IAType; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression; +import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression; public class IfNanOrInfTypeComputer extends AbstractResultTypeComputer { - public static final IfNanOrInfTypeComputer INSTANCE = new IfNanOrInfTypeComputer(); + public static final IfNanOrInfTypeComputer INSTANCE = new IfNanOrInfTypeComputer(false); + public static final IfNanOrInfTypeComputer INSTANCE_SKIP_MISSING = new IfNanOrInfTypeComputer(true); + + private final boolean skipMissing; + + private IfNanOrInfTypeComputer(boolean skipMissing) { + this.skipMissing = skipMissing; + } @Override protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException { - if (strippedInputTypes.length == 0) { - return BuiltinType.ANULL; + if (strippedInputTypes.length < 2 || strippedInputTypes.length > Short.MAX_VALUE) { + String functionName = ((AbstractFunctionCallExpression) expr).getFunctionIdentifier().getName(); + throw new CompilationException(ErrorCode.COMPILATION_INVALID_NUM_OF_ARGS, expr.getSourceLocation(), + functionName); } boolean any = false; @@ -50,8 +62,12 @@ public class IfNanOrInfTypeComputer extends AbstractResultTypeComputer { } switch (currentType.getTypeTag()) { - case ANY: case MISSING: + if (skipMissing) { + // i.e. all args have been inspected and couldn't find a candidate value, so return null + return BuiltinType.ANULL; + } + case ANY: case BIGINT: case INTEGER: case SMALLINT: http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java index 0ff08a4..ee26b62 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfInfDescriptor.java @@ -28,6 +28,16 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; import org.apache.hyracks.api.context.IHyracksTaskContext; import org.apache.hyracks.api.exceptions.HyracksDataException; +/** + * ifinf(arg1, arg2, ...) scans the list of arguments in order and returns the first numeric argument it encounters. + * If the argument being inspected is infinity as determined by the mathematical definition of floating-points, then + * it skips the argument and inspects the next one. It returns missing if the argument being inspected is missing. + * It returns null if: + * 1. the argument being inspected is not numeric. + * 2. all the arguments have been inspected and no candidate value has been found. + * + * Number of arguments: Min is 2. Max is {@link Short#MAX_VALUE} + */ public class IfInfDescriptor extends AbstractScalarFunctionDynamicDescriptor { private static final long serialVersionUID = 1L; @@ -40,7 +50,7 @@ public class IfInfDescriptor extends AbstractScalarFunctionDynamicDescriptor { @Override public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { - return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args) { + return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args, false) { @Override protected boolean skipDouble(double d) { return Double.isInfinite(d); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java index 9c1f024..e811190 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanDescriptor.java @@ -28,6 +28,15 @@ import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; import org.apache.hyracks.api.context.IHyracksTaskContext; import org.apache.hyracks.api.exceptions.HyracksDataException; +/** + * ifnan(arg1, arg2, ...) scans the list of arguments in order and returns the first numeric argument it encounters. + * If the argument being inspected is missing or NaN as determined by the mathematical definition of floating-points, + * then it skips the argument and inspects the next one. It returns null if: + * 1. the argument being inspected is not numeric. + * 2. all the arguments have been inspected and no candidate value has been found. + * + * Number of arguments: Min is 2. Max is {@link Short#MAX_VALUE} + */ public class IfNanDescriptor extends AbstractScalarFunctionDynamicDescriptor { private static final long serialVersionUID = 1L; @@ -40,7 +49,7 @@ public class IfNanDescriptor extends AbstractScalarFunctionDynamicDescriptor { @Override public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { - return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args) { + return new IfNanOrInfDescriptor.AbstractIfInfOrNanEval(ctx, args, true) { @Override protected boolean skipDouble(double d) { return Double.isNaN(d); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/c006a000/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java index bf61922..375da4f 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IfNanOrInfDescriptor.java @@ -36,6 +36,16 @@ import org.apache.hyracks.data.std.primitive.FloatPointable; import org.apache.hyracks.data.std.primitive.VoidPointable; import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference; +/** + * ifnanorinf(arg1, arg2, ...) scans the list of arguments in order and returns the first numeric argument it + * encounters. + * If the argument being inspected is missing or NaN/Infinity as determined by the mathematical definition of + * floating-points, then it skips the argument and inspects the next one. It returns null if: + * 1. the argument being inspected is not numeric. + * 2. all the arguments have been inspected and no candidate value has been found. + * + * Number of arguments: Min is 2. Max is {@link Short#MAX_VALUE} + */ public class IfNanOrInfDescriptor extends AbstractScalarFunctionDynamicDescriptor { private static final long serialVersionUID = 1L; @@ -48,7 +58,7 @@ public class IfNanOrInfDescriptor extends AbstractScalarFunctionDynamicDescripto @Override public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { - return new AbstractIfInfOrNanEval(ctx, args) { + return new AbstractIfInfOrNanEval(ctx, args, true) { @Override protected boolean skipDouble(double d) { return Double.isInfinite(d) || Double.isNaN(d); @@ -78,13 +88,16 @@ public class IfNanOrInfDescriptor extends AbstractScalarFunctionDynamicDescripto private final IScalarEvaluator[] argEvals; private final IPointable argPtr; + private final boolean skipMissing; - AbstractIfInfOrNanEval(IHyracksTaskContext ctx, IScalarEvaluatorFactory[] args) throws HyracksDataException { + AbstractIfInfOrNanEval(IHyracksTaskContext ctx, IScalarEvaluatorFactory[] args, boolean skipMissing) + throws HyracksDataException { argEvals = new IScalarEvaluator[args.length]; for (int i = 0; i < argEvals.length; i++) { argEvals[i] = args[i].createScalarEvaluator(ctx); } argPtr = new VoidPointable(); + this.skipMissing = skipMissing; } @Override @@ -110,11 +123,14 @@ public class IfNanOrInfDescriptor extends AbstractScalarFunctionDynamicDescripto } result.set(argPtr); return; + case MISSING: + if (skipMissing) { + continue; + } case BIGINT: case INTEGER: case SMALLINT: case TINYINT: - case MISSING: result.set(argPtr); return; default: