[ASTERIXDB-2423][RT] Division by zero should return NULL
- user model changes: yes
- storage format changes: no
- interface changes: no
Details:
- Make DIV, /, MOD operators return NULL if the divisor is 0
- Add test case for if_inf() function
Change-Id: If2a45e842b840f721435b0715945a209e55b9dd4
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2813
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_double/divide_double.1.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_double/divide_double.1.query.aql
index 62b1112..f86aae9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_double/divide_double.1.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_double/divide_double.1.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c6/$c1,"result2": $c6/$c2,"result3": $c6/$c3,"result4": $c6/$c4,"result5": $c6/$c5, "result6": $c6/$c6, "result7": $c6/$c8, "result8": $c6/[1][1]}
+return {"result1": $c6/$c1,"result2": $c6/$c2,"result3": $c6/$c3,"result4": $c6/$c4,"result5": $c6/$c5, "result6": $c6/$c6, "result7": $c6/$c8, "result8": $c6/[1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_float/divide_float.1.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_float/divide_float.1.query.aql
index 0f938e3..dde8291 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_float/divide_float.1.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_float/divide_float.1.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c5/$c1,"result2": $c5/$c2,"result3": $c5/$c3,"result4": $c5/$c4,"result5": $c5/$c5, "result6": $c5/$c6, "result7": $c6/$c8, "result8": $c6/[1][1]}
+return {"result1": $c5/$c1,"result2": $c5/$c2,"result3": $c5/$c3,"result4": $c5/$c4,"result5": $c5/$c5, "result6": $c5/$c6, "result7": $c6/$c8, "result8": $c6/[1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int16/divide_int16.1.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int16/divide_int16.1.query.aql
index 17f19c0..e4993d4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int16/divide_int16.1.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int16/divide_int16.1.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c2/$c1,"result2": $c2/$c2,"result3": $c2/$c3,"result4": $c2/$c4,"result5": $c2/$c5, "result6": $c2/$c6, "result7": $c6/$c8, "result8": $c6/[1][1]}
+return {"result1": $c2/$c1,"result2": $c2/$c2,"result3": $c2/$c3,"result4": $c2/$c4,"result5": $c2/$c5, "result6": $c2/$c6, "result7": $c6/$c8, "result8": $c6/[1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int16/divide_int16.2.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int16/divide_int16.2.query.aql
index b59be3b..1771d70 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int16/divide_int16.2.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int16/divide_int16.2.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c2 div $c1,"result2": $c2 div $c2,"result3": $c2 div $c3,"result4": $c2 div $c4,"result5": $c2 div $c5, "result6": $c2 div $c6, "result7": $c6 div $c8, "result8": $c6 div [1][1]}
+return {"result1": $c2 div $c1,"result2": $c2 div $c2,"result3": $c2 div $c3,"result4": $c2 div $c4,"result5": $c2 div $c5, "result6": $c2 div $c6, "result7": $c6 div $c8, "result8": $c6 div [1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int32/divide_int32.1.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int32/divide_int32.1.query.aql
index 0026e24..e9adbc2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int32/divide_int32.1.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int32/divide_int32.1.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c3/$c1,"result2": $c3/$c2,"result3": $c3/$c3,"result4": $c3/$c4,"result5": $c3/$c5, "result6": $c3/$c6, "result7": $c6/$c8, "result8": $c6/[1][1]}
+return {"result1": $c3/$c1,"result2": $c3/$c2,"result3": $c3/$c3,"result4": $c3/$c4,"result5": $c3/$c5, "result6": $c3/$c6, "result7": $c6/$c8, "result8": $c6/[1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int32/divide_int32.2.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int32/divide_int32.2.query.aql
index d8ad04a..349211a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int32/divide_int32.2.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int32/divide_int32.2.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c3 div $c1,"result2": $c3 div $c2,"result3": $c3 div $c3,"result4": $c3 div $c4,"result5": $c3 div $c5, "result6": $c3 div $c6, "result7": $c6 div $c8, "result8": $c6 div [1][1]}
+return {"result1": $c3 div $c1,"result2": $c3 div $c2,"result3": $c3 div $c3,"result4": $c3 div $c4,"result5": $c3 div $c5, "result6": $c3 div $c6, "result7": $c6 div $c8, "result8": $c6 div [1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int64/divide_int64.1.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int64/divide_int64.1.query.aql
index b3e11be..b7b99a7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int64/divide_int64.1.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int64/divide_int64.1.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c4/$c1,"result2": $c4/$c2,"result3": $c4/$c3,"result4": $c4/$c4,"result5": $c4/$c5, "result6": $c4/$c6, "result7": $c6/$c8, "result8": $c6/[1][1]}
+return {"result1": $c4/$c1,"result2": $c4/$c2,"result3": $c4/$c3,"result4": $c4/$c4,"result5": $c4/$c5, "result6": $c4/$c6, "result7": $c6/$c8, "result8": $c6/[1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int64/divide_int64.2.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int64/divide_int64.2.query.aql
index 32c72ed..c6694a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int64/divide_int64.2.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int64/divide_int64.2.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c4 div $c1,"result2": $c4 div $c2,"result3": $c4 div $c3,"result4": $c4 div $c4,"result5": $c4 div $c5, "result6": $c4 div $c6, "result7": $c6 div $c8, "result8": $c6 div [1][1]}
+return {"result1": $c4 div $c1,"result2": $c4 div $c2,"result3": $c4 div $c3,"result4": $c4 div $c4,"result5": $c4 div $c5, "result6": $c4 div $c6, "result7": $c6 div $c8, "result8": $c6 div [1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int8/divide_int8.1.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int8/divide_int8.1.query.aql
index a3cf2ee..afb1488 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int8/divide_int8.1.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int8/divide_int8.1.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c1/$c1,"result2": $c1/$c2,"result3": $c1/$c3,"result4": $c1/$c4,"result5": $c1/$c5, "result6": $c1/$c6, "result7": $c6/$c8, "result8": $c6/[1][1]}
+return {"result1": $c1/$c1,"result2": $c1/$c2,"result3": $c1/$c3,"result4": $c1/$c4,"result5": $c1/$c5, "result6": $c1/$c6, "result7": $c6/$c8, "result8": $c6/[1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int8/divide_int8.2.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int8/divide_int8.2.query.aql
index 5adb1b4..07a1910 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int8/divide_int8.2.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/numeric/divide_int8/divide_int8.2.query.aql
@@ -24,4 +24,4 @@
let $c5 := float("-5.5f")
let $c6 := double("-6.5d")
let $c8 := null
-return {"result1": $c1 div $c1,"result2": $c1 div $c2,"result3": $c1 div $c3,"result4": $c1 div $c4,"result5": $c1 div $c5, "result6": $c1 div $c6, "result7": $c6 div $c8, "result8": $c6 div [1][1]}
+return {"result1": $c1 div $c1,"result2": $c1 div $c2,"result3": $c1 div $c3,"result4": $c1 div $c4,"result5": $c1 div $c5, "result6": $c1 div $c6, "result7": $c6 div $c8, "result8": $c6 div [1][1], "result9": $c6/0}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_double/divide_double.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_double/divide_double.1.query.sqlpp
index 901be61..31e2399 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_double/divide_double.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_double/divide_double.1.query.sqlpp
@@ -18,4 +18,4 @@
*/
-{'result1':(double('-6.5d') / tinyint('+1')),'result2':(double('-6.5d') / smallint('2')),'result3':(double('-6.5d') / integer('+3')),'result4':(double('-6.5d') / bigint('-4')),'result5':(double('-6.5d') / float('-5.5f')),'result6':(double('-6.5d') / double('-6.5d')),'result7':(double('-6.5d') / null), 'result8':double('-6.5d') / {}.a};
+{'result1':(double('-6.5d') / tinyint('+1')),'result2':(double('-6.5d') / smallint('2')),'result3':(double('-6.5d') / integer('+3')),'result4':(double('-6.5d') / bigint('-4')),'result5':(double('-6.5d') / float('-5.5f')),'result6':(double('-6.5d') / double('-6.5d')),'result7':(double('-6.5d') / null), 'result8':double('-6.5d') / {}.a, 'result9':double('1') / 0 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_float/divide_float.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_float/divide_float.1.query.sqlpp
index 7dfdcd2..107fed1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_float/divide_float.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_float/divide_float.1.query.sqlpp
@@ -17,4 +17,4 @@
* under the License.
*/
-{'result1':(float('-5.5f') / tinyint('+1')),'result2':(float('-5.5f') / smallint('2')),'result3':(float('-5.5f') / integer('+3')),'result4':(float('-5.5f') / bigint('-4')),'result5':(float('-5.5f') / float('-5.5f')),'result6':(float('-5.5f') / double('-6.5d')),'result7':(double('-6.5d') / null), 'result8':double('-6.5d') / {}.a};
+{'result1':(float('-5.5f') / tinyint('+1')),'result2':(float('-5.5f') / smallint('2')),'result3':(float('-5.5f') / integer('+3')),'result4':(float('-5.5f') / bigint('-4')),'result5':(float('-5.5f') / float('-5.5f')),'result6':(float('-5.5f') / double('-6.5d')),'result7':(double('-6.5d') / null), 'result8':double('-6.5d') / {}.a, 'result9':double('1') / 0 };
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int16/divide_int16.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int16/divide_int16.1.query.sqlpp
index b0f315d..1e1237d7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int16/divide_int16.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int16/divide_int16.1.query.sqlpp
@@ -17,4 +17,4 @@
* under the License.
*/
-{'result1':(smallint('2') / tinyint('+1')),'result2':(smallint('2') / smallint('2')),'result3':(smallint('2') / integer('+3')),'result4':(smallint('2') / bigint('-4')),'result5':(smallint('2') / float('-5.5f')),'result6':(smallint('2') / double('-6.5d')),'result7':(double('-6.5d') / null), 'result8':double('-6.5d') / {}.a};
+{'result1':(smallint('2') / tinyint('+1')),'result2':(smallint('2') / smallint('2')),'result3':(smallint('2') / integer('+3')),'result4':(smallint('2') / bigint('-4')),'result5':(smallint('2') / float('-5.5f')),'result6':(smallint('2') / double('-6.5d')),'result7':(smallint('-6') / null), 'result8':smallint('-6') / {}.a, 'result9': smallint('1') / 0 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int16/divide_int16.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int16/divide_int16.2.query.sqlpp
index cca3dcf..f5bf6fe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int16/divide_int16.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int16/divide_int16.2.query.sqlpp
@@ -17,4 +17,4 @@
* under the License.
*/
-{'result1':(smallint('2') div tinyint('+1')),'result2':(smallint('2') div smallint('2')),'result3':(smallint('2') div integer('+3')),'result4':(smallint('2') div bigint('-4')),'result5':(smallint('2') div float('-5.5f')),'result6':(smallint('2') div double('-6.5d')),'result7':(double('-6.5d') div null), 'result8':double('-6.5d') div {}.a};
+{'result1':(smallint('2') div tinyint('+1')),'result2':(smallint('2') div smallint('2')),'result3':(smallint('2') div integer('+3')),'result4':(smallint('2') div bigint('-4')),'result5':(smallint('2') div float('-5.5f')),'result6':(smallint('2') div double('-6.5d')),'result7':(smallint('-6') div null), 'result8':smallint('-6') div {}.a, 'result9': smallint('1') div 0 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int32/divide_int32.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int32/divide_int32.1.query.sqlpp
index 4a9810d..3e22be1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int32/divide_int32.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int32/divide_int32.1.query.sqlpp
@@ -18,4 +18,4 @@
*/
-{'result1':(integer('+3') / tinyint('+1')),'result2':(integer('+3') / smallint('2')),'result3':(integer('+3') / integer('+3')),'result4':(integer('+3') / bigint('-4')),'result5':(integer('+3') / float('-5.5f')),'result6':(integer('+3') / double('-6.5d')),'result7':(double('-6.5d') / null), 'result8':double('-6.5d') / {}.a};
+{'result1':(integer('+3') / tinyint('+1')),'result2':(integer('+3') / smallint('2')),'result3':(integer('+3') / integer('+3')),'result4':(integer('+3') / bigint('-4')),'result5':(integer('+3') / float('-5.5f')),'result6':(integer('+3') / double('-6.5d')),'result7':(integer('-6') / null), 'result8':integer('-6') / {}.a, 'result9': integer('1') / 0 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int32/divide_int32.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int32/divide_int32.2.query.sqlpp
index 7ce0f9e..dec8444 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int32/divide_int32.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int32/divide_int32.2.query.sqlpp
@@ -18,4 +18,4 @@
*/
-{'result1':(integer('+3') div tinyint('+1')),'result2':(integer('+3') div smallint('2')),'result3':(integer('+3') div integer('+3')),'result4':(integer('+3') div bigint('-4')),'result5':(integer('+3') div float('-5.5f')),'result6':(integer('+3') div double('-6.5d')),'result7':(double('-6.5d') div null), 'result8':double('-6.5d') div {}.a};
+{'result1':(integer('+3') div tinyint('+1')),'result2':(integer('+3') div smallint('2')),'result3':(integer('+3') div integer('+3')),'result4':(integer('+3') div bigint('-4')),'result5':(integer('+3') div float('-5.5f')),'result6':(integer('+3') div double('-6.5d')),'result7':(integer('-6') div null), 'result8':integer('-6') div {}.a, 'result9': integer('1') div 0 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int64/divide_int64.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int64/divide_int64.1.query.sqlpp
index 5b7d8f5..abdbe08 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int64/divide_int64.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int64/divide_int64.1.query.sqlpp
@@ -17,4 +17,4 @@
* under the License.
*/
-{'result1':(bigint('-4') / tinyint('+1')),'result2':(bigint('-4') / smallint('2')),'result3':(bigint('-4') / integer('+3')),'result4':(bigint('-4') / bigint('-4')),'result5':(bigint('-4') / float('-5.5f')),'result6':(bigint('-4') / double('-6.5d')),'result7':(double('-6.5d') / null), 'result8':double('-6.5d') / {}.a};
+{'result1':(bigint('-4') / tinyint('+1')),'result2':(bigint('-4') / smallint('2')),'result3':(bigint('-4') / integer('+3')),'result4':(bigint('-4') / bigint('-4')),'result5':(bigint('-4') / float('-5.5f')),'result6':(bigint('-4') / double('-6.5d')),'result7':(bigint('-6') / null), 'result8':bigint('-6') / {}.a, 'result9': bigint('1') / 0 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int64/divide_int64.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int64/divide_int64.2.query.sqlpp
index 2f850c2..d3bb58c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int64/divide_int64.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int64/divide_int64.2.query.sqlpp
@@ -17,4 +17,4 @@
* under the License.
*/
-{'result1':(bigint('-4') div tinyint('+1')),'result2':(bigint('-4') div smallint('2')),'result3':(bigint('-4') div integer('+3')),'result4':(bigint('-4') div bigint('-4')),'result5':(bigint('-4') div float('-5.5f')),'result6':(bigint('-4') div double('-6.5d')),'result7':(double('-6.5d') div null), 'result8':double('-6.5d') div {}.a};
+{'result1':(bigint('-4') div tinyint('+1')),'result2':(bigint('-4') div smallint('2')),'result3':(bigint('-4') div integer('+3')),'result4':(bigint('-4') div bigint('-4')),'result5':(bigint('-4') div float('-5.5f')),'result6':(bigint('-4') div double('-6.5d')),'result7':(bigint('-6') div null), 'result8':bigint('-6') div {}.a, 'result9': bigint('1') div 0 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int8/divide_int8.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int8/divide_int8.1.query.sqlpp
index dd6917d..a4049ae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int8/divide_int8.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int8/divide_int8.1.query.sqlpp
@@ -18,4 +18,4 @@
*/
-{'result1':(tinyint('+1') / tinyint('+1')),'result2':(tinyint('+1') / smallint('2')),'result3':(tinyint('+1') / integer('+3')),'result4':(tinyint('+1') / bigint('-4')),'result5':(tinyint('+1') / float('-5.5f')),'result6':(tinyint('+1') / double('-6.5d')),'result7':(double('-6.5d') / null), 'result8':double('-6.5d') / {}.a};
+{'result1':(tinyint('+1') / tinyint('+1')),'result2':(tinyint('+1') / smallint('2')),'result3':(tinyint('+1') / integer('+3')),'result4':(tinyint('+1') / bigint('-4')),'result5':(tinyint('+1') / float('-5.5f')),'result6':(tinyint('+1') / double('-6.5d')),'result7':(tinyint('-6') / null), 'result8':tinyint('-6') / {}.a, 'result9': tinyint('1') / 0 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int8/divide_int8.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int8/divide_int8.2.query.sqlpp
index 5cf4b1b..5d577a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int8/divide_int8.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/numeric/divide_int8/divide_int8.2.query.sqlpp
@@ -18,4 +18,4 @@
*/
-{'result1':(tinyint('+1') div tinyint('+1')),'result2':(tinyint('+1') div smallint('2')),'result3':(tinyint('+1') div integer('+3')),'result4':(tinyint('+1') div bigint('-4')),'result5':(tinyint('+1') div float('-5.5f')),'result6':(tinyint('+1') div double('-6.5d')),'result7':(double('-6.5d') div null), 'result8':double('-6.5d') div {}.a};
+{'result1':(tinyint('+1') div tinyint('+1')),'result2':(tinyint('+1') div smallint('2')),'result3':(tinyint('+1') div integer('+3')),'result4':(tinyint('+1') div bigint('-4')),'result5':(tinyint('+1') div float('-5.5f')),'result6':(tinyint('+1') div double('-6.5d')),'result7':(tinyint('-6') div null), 'result8':tinyint('-6') div {}.a, 'result9': tinyint('1') div 0 };
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 3b395bc..479e290 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
@@ -40,6 +40,7 @@
[ 18, isnull(ifinf(double("INF"), double("-INF"), [], 2)) ],
[ 19, ismissing(if_inf(double("INF"), double("-INF"), missing, 2)) ],
[ 20, tostring(ifinf(float("INF"), float("NaN"), 2)) ],
- [ 21, if_inf(2, 1/0) ]
+ [ 21, if_inf(2, 1/0) ],
+ [ 22, if_inf(1/0, 2) ]
] t
order by t[0]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_double/divide_double.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_double/divide_double.1.adm
index b371d5b..3f20110 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_double/divide_double.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_double/divide_double.1.adm
@@ -1 +1 @@
-{ "result1": -6.5, "result2": -3.25, "result3": -2.1666666666666665, "result4": 1.625, "result5": 1.1818181818181819, "result6": 1.0, "result7": null }
+{ "result1": -6.5, "result2": -3.25, "result3": -2.1666666666666665, "result4": 1.625, "result5": 1.1818181818181819, "result6": 1.0, "result7": null, "result9": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_float/divide_float.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_float/divide_float.1.adm
index ccbe5be..560f641 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_float/divide_float.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_float/divide_float.1.adm
@@ -1 +1 @@
-{ "result1": -5.5, "result2": -2.75, "result3": -1.8333334, "result4": 1.375, "result5": 1.0, "result6": 0.8461538461538461, "result7": null }
+{ "result1": -5.5, "result2": -2.75, "result3": -1.8333334, "result4": 1.375, "result5": 1.0, "result6": 0.8461538461538461, "result7": null, "result9": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int16/divide_int16.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int16/divide_int16.1.adm
index 775745b..0e5450b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int16/divide_int16.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int16/divide_int16.1.adm
@@ -1 +1 @@
-{ "result1": 2.0, "result2": 1.0, "result3": 0.6666666666666666, "result4": -0.5, "result5": -0.36363637, "result6": -0.3076923076923077, "result7": null }
+{ "result1": 2.0, "result2": 1.0, "result3": 0.6666666666666666, "result4": -0.5, "result5": -0.36363637, "result6": -0.3076923076923077, "result7": null, "result9": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int16/divide_int16.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int16/divide_int16.2.adm
index c3d22c3..c25ec67 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int16/divide_int16.2.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int16/divide_int16.2.adm
@@ -1 +1 @@
-{ "result1": 2, "result2": 1, "result3": 0, "result4": 0, "result5": -0.36363637, "result6": -0.3076923076923077, "result7": null }
\ No newline at end of file
+{ "result1": 2, "result2": 1, "result3": 0, "result4": 0, "result5": -0.36363637, "result6": -0.3076923076923077, "result7": null, "result9": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int32/divide_int32.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int32/divide_int32.1.adm
index 890417b..96e5114 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int32/divide_int32.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int32/divide_int32.1.adm
@@ -1 +1 @@
-{ "result1": 3.0, "result2": 1.5, "result3": 1.0, "result4": -0.75, "result5": -0.54545456, "result6": -0.46153846153846156, "result7": null }
+{ "result1": 3.0, "result2": 1.5, "result3": 1.0, "result4": -0.75, "result5": -0.54545456, "result6": -0.46153846153846156, "result7": null, "result9": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int32/divide_int32.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int32/divide_int32.2.adm
index 788a291..9d8efd9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int32/divide_int32.2.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int32/divide_int32.2.adm
@@ -1 +1 @@
-{ "result1": 3, "result2": 1, "result3": 1, "result4": 0, "result5": -0.54545456, "result6": -0.46153846153846156, "result7": null }
\ No newline at end of file
+{ "result1": 3, "result2": 1, "result3": 1, "result4": 0, "result5": -0.54545456, "result6": -0.46153846153846156, "result7": null, "result9": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int64/divide_int64.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int64/divide_int64.1.adm
index 582b44d..5e8ec2c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int64/divide_int64.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int64/divide_int64.1.adm
@@ -1 +1 @@
-{ "result1": -4.0, "result2": -2.0, "result3": -1.3333333333333333, "result4": 1.0, "result5": 0.72727275, "result6": 0.6153846153846154, "result7": null }
+{ "result1": -4.0, "result2": -2.0, "result3": -1.3333333333333333, "result4": 1.0, "result5": 0.72727275, "result6": 0.6153846153846154, "result7": null, "result9": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int64/divide_int64.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int64/divide_int64.2.adm
index af75a4e..79799d5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int64/divide_int64.2.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int64/divide_int64.2.adm
@@ -1 +1 @@
-{ "result1": -4, "result2": -2, "result3": -1, "result4": 1, "result5": 0.72727275, "result6": 0.6153846153846154, "result7": null }
\ No newline at end of file
+{ "result1": -4, "result2": -2, "result3": -1, "result4": 1, "result5": 0.72727275, "result6": 0.6153846153846154, "result7": null, "result9": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int8/divide_int8.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int8/divide_int8.1.adm
index 591ed6d..4309a1a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int8/divide_int8.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int8/divide_int8.1.adm
@@ -1 +1 @@
-{ "result1": 1.0, "result2": 0.5, "result3": 0.3333333333333333, "result4": -0.25, "result5": -0.18181819, "result6": -0.15384615384615385, "result7": null }
+{ "result1": 1.0, "result2": 0.5, "result3": 0.3333333333333333, "result4": -0.25, "result5": -0.18181819, "result6": -0.15384615384615385, "result7": null, "result9": null }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int8/divide_int8.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int8/divide_int8.2.adm
index f232ecf..9233e8c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int8/divide_int8.2.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/numeric/divide_int8/divide_int8.2.adm
@@ -1 +1 @@
-{ "result1": 1, "result2": 0, "result3": 0, "result4": 0, "result5": -0.18181819, "result6": -0.15384615384615385, "result7": null }
\ No newline at end of file
+{ "result1": 1, "result2": 0, "result3": 0, "result4": 0, "result5": -0.18181819, "result6": -0.15384615384615385, "result7": null, "result9": null }
\ No newline at end of file
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 9f56be4..852db4b 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
@@ -19,4 +19,5 @@
[ 18, true ]
[ 19, true ]
[ 20, "NaN" ]
-[ 21, 2 ]
\ No newline at end of file
+[ 21, 2 ]
+[ 22, null ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_double/divide_double.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_double/divide_double.1.ast
index a2c5adc..67d0694 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_double/divide_double.1.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_double/divide_double.1.ast
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.double@1[
+ LiteralExpr [STRING] [1]
+ ]
+ /
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_float/divide_float.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_float/divide_float.1.ast
index 928fc8e..958937c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_float/divide_float.1.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_float/divide_float.1.ast
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.double@1[
+ LiteralExpr [STRING] [1]
+ ]
+ /
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int16/divide_int16.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int16/divide_int16.1.ast
index aa1ac9a..21f2d7f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int16/divide_int16.1.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int16/divide_int16.1.ast
@@ -82,8 +82,8 @@
LiteralExpr [STRING] [result7]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int16@1[
+ LiteralExpr [STRING] [-6]
]
/
LiteralExpr [NULL]
@@ -93,8 +93,8 @@
LiteralExpr [STRING] [result8]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int16@1[
+ LiteralExpr [STRING] [-6]
]
/
FieldAccessor [
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.int16@1[
+ LiteralExpr [STRING] [1]
+ ]
+ /
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int16/divide_int16.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int16/divide_int16.2.ast
index 90fd039..f92b4c2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int16/divide_int16.2.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int16/divide_int16.2.ast
@@ -82,8 +82,8 @@
LiteralExpr [STRING] [result7]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int16@1[
+ LiteralExpr [STRING] [-6]
]
div
LiteralExpr [NULL]
@@ -93,8 +93,8 @@
LiteralExpr [STRING] [result8]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int16@1[
+ LiteralExpr [STRING] [-6]
]
div
FieldAccessor [
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.int16@1[
+ LiteralExpr [STRING] [1]
+ ]
+ div
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int32/divide_int32.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int32/divide_int32.1.ast
index 3b24726..37785cf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int32/divide_int32.1.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int32/divide_int32.1.ast
@@ -82,8 +82,8 @@
LiteralExpr [STRING] [result7]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int32@1[
+ LiteralExpr [STRING] [-6]
]
/
LiteralExpr [NULL]
@@ -93,8 +93,8 @@
LiteralExpr [STRING] [result8]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int32@1[
+ LiteralExpr [STRING] [-6]
]
/
FieldAccessor [
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.int32@1[
+ LiteralExpr [STRING] [1]
+ ]
+ /
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int32/divide_int32.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int32/divide_int32.2.ast
index 05bd4a7..75eb726 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int32/divide_int32.2.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int32/divide_int32.2.ast
@@ -82,8 +82,8 @@
LiteralExpr [STRING] [result7]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int32@1[
+ LiteralExpr [STRING] [-6]
]
div
LiteralExpr [NULL]
@@ -93,8 +93,8 @@
LiteralExpr [STRING] [result8]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int32@1[
+ LiteralExpr [STRING] [-6]
]
div
FieldAccessor [
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.int32@1[
+ LiteralExpr [STRING] [1]
+ ]
+ div
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int64/divide_int64.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int64/divide_int64.1.ast
index 1570f6b..22a3401 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int64/divide_int64.1.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int64/divide_int64.1.ast
@@ -82,8 +82,8 @@
LiteralExpr [STRING] [result7]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int64@1[
+ LiteralExpr [STRING] [-6]
]
/
LiteralExpr [NULL]
@@ -93,8 +93,8 @@
LiteralExpr [STRING] [result8]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int64@1[
+ LiteralExpr [STRING] [-6]
]
/
FieldAccessor [
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.int64@1[
+ LiteralExpr [STRING] [1]
+ ]
+ /
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int64/divide_int64.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int64/divide_int64.2.ast
index 5e1007a..8f295f3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int64/divide_int64.2.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int64/divide_int64.2.ast
@@ -82,8 +82,8 @@
LiteralExpr [STRING] [result7]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int64@1[
+ LiteralExpr [STRING] [-6]
]
div
LiteralExpr [NULL]
@@ -93,8 +93,8 @@
LiteralExpr [STRING] [result8]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int64@1[
+ LiteralExpr [STRING] [-6]
]
div
FieldAccessor [
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.int64@1[
+ LiteralExpr [STRING] [1]
+ ]
+ div
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int8/divide_int8.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int8/divide_int8.1.ast
index 96b5942..2243ace 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int8/divide_int8.1.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int8/divide_int8.1.ast
@@ -82,8 +82,8 @@
LiteralExpr [STRING] [result7]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int8@1[
+ LiteralExpr [STRING] [-6]
]
/
LiteralExpr [NULL]
@@ -93,8 +93,8 @@
LiteralExpr [STRING] [result8]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int8@1[
+ LiteralExpr [STRING] [-6]
]
/
FieldAccessor [
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.int8@1[
+ LiteralExpr [STRING] [1]
+ ]
+ /
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int8/divide_int8.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int8/divide_int8.2.ast
index 6442d38..f1e7dab 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int8/divide_int8.2.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/numeric/divide_int8/divide_int8.2.ast
@@ -82,8 +82,8 @@
LiteralExpr [STRING] [result7]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int8@1[
+ LiteralExpr [STRING] [-6]
]
div
LiteralExpr [NULL]
@@ -93,8 +93,8 @@
LiteralExpr [STRING] [result8]
:
OperatorExpr [
- FunctionCall null.double@1[
- LiteralExpr [STRING] [-6.5d]
+ FunctionCall null.int8@1[
+ LiteralExpr [STRING] [-6]
]
div
FieldAccessor [
@@ -104,4 +104,15 @@
]
]
)
+ (
+ LiteralExpr [STRING] [result9]
+ :
+ OperatorExpr [
+ FunctionCall null.int8@1[
+ LiteralExpr [STRING] [1]
+ ]
+ div
+ LiteralExpr [LONG] [0]
+ ]
+ )
]
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
index d8f3f7d..8af1ec7 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
@@ -74,7 +74,6 @@
public static final int INVALID_TYPE_CASTING_MATH_FUNCTION = 31;
public static final int REJECT_BAD_CLUSTER_STATE = 32;
public static final int REJECT_NODE_UNREGISTERED = 33;
- public static final int DIVISION_BY_ZERO = 34;
public static final int UNSUPPORTED_MULTIPLE_STATEMENTS = 35;
public static final int CANNOT_COMPARE_COMPLEX = 36;
public static final int TYPE_MISMATCH_GENERIC = 37;
diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
index 4adf979..ee88010 100644
--- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
+++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
@@ -69,7 +69,6 @@
31 = Invalid type-casting math function: %1$s for converting %2$s to %3$s
32 = Cannot execute request, cluster is %1$s
33 = Node is not registered with the CC
-34 = Division by zero.
35 = Unsupported multiple statements.
36 = Cannot compare non-primitive values
38 = Input contains different list types
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 4afeef1..d2c8269 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
@@ -1210,8 +1210,8 @@
addPrivateFunction(NUMERIC_SUBTRACT, NumericAddSubMulDivTypeComputer.INSTANCE, true);
addPrivateFunction(NUMERIC_MULTIPLY, NumericAddSubMulDivTypeComputer.INSTANCE, true);
addPrivateFunction(NUMERIC_DIVIDE, NumericDivideTypeComputer.INSTANCE, true);
- addPrivateFunction(NUMERIC_MOD, NumericAddSubMulDivTypeComputer.INSTANCE, true);
- addPrivateFunction(NUMERIC_DIV, NumericAddSubMulDivTypeComputer.INSTANCE, true);
+ addPrivateFunction(NUMERIC_MOD, NumericAddSubMulDivTypeComputer.INSTANCE_NULLABLE, true);
+ addPrivateFunction(NUMERIC_DIV, NumericAddSubMulDivTypeComputer.INSTANCE_NULLABLE, true);
addFunction(NUMERIC_ABS, NumericUnaryFunctionTypeComputer.INSTANCE, true);
addFunction(NUMERIC_ACOS, NumericDoubleOutputFunctionTypeComputer.INSTANCE, true);
addFunction(NUMERIC_ASIN, NumericDoubleOutputFunctionTypeComputer.INSTANCE, true);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericAddSubMulDivTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericAddSubMulDivTypeComputer.java
index b311b6e..47ad411 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericAddSubMulDivTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericAddSubMulDivTypeComputer.java
@@ -21,6 +21,7 @@
import org.apache.asterix.om.exceptions.IncompatibleTypeException;
import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
import org.apache.asterix.om.types.ATypeTag;
+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;
@@ -28,10 +29,20 @@
import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
public class NumericAddSubMulDivTypeComputer extends AbstractResultTypeComputer {
+ /**
+ * For those functions that do not return NULL if both arguments are not NULL
+ */
+ public static final NumericAddSubMulDivTypeComputer INSTANCE = new NumericAddSubMulDivTypeComputer(false);
- public static final NumericAddSubMulDivTypeComputer INSTANCE = new NumericAddSubMulDivTypeComputer();
+ /**
+ * For those functions that may return NULL even if both arguments are not NULL (e.g. division by zero)
+ */
+ public static final NumericAddSubMulDivTypeComputer INSTANCE_NULLABLE = new NumericAddSubMulDivTypeComputer(true);
- private NumericAddSubMulDivTypeComputer() {
+ private final boolean nullable;
+
+ private NumericAddSubMulDivTypeComputer(boolean nullable) {
+ this.nullable = nullable;
}
@Override
@@ -303,6 +314,11 @@
default:
throw new IncompatibleTypeException(funcExpr.getSourceLocation(), funcName, tag1, tag2);
}
+
+ if (nullable && type.getTypeTag() != ATypeTag.ANY) {
+ type = AUnionType.createNullableType(type);
+ }
+
return type;
}
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericDivideTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericDivideTypeComputer.java
index 5e2ebae..c94a22b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericDivideTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericDivideTypeComputer.java
@@ -22,6 +22,7 @@
import org.apache.asterix.om.exceptions.IncompatibleTypeException;
import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
import org.apache.asterix.om.types.ATypeTag;
+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;
@@ -232,6 +233,12 @@
default:
throw new IncompatibleTypeException(funcExpr.getSourceLocation(), funcName, tag1, tag2);
}
+
+ if (type.getTypeTag() != ATypeTag.ANY) {
+ // returns NULL if division by 0
+ type = AUnionType.createNullableType(type);
+ }
+
return type;
}
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
index b6cec11..746273f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
@@ -43,6 +43,7 @@
import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.base.AMutableInt8;
import org.apache.asterix.om.base.AMutableTime;
+import org.apache.asterix.om.base.ANull;
import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
@@ -66,32 +67,50 @@
@SuppressWarnings("serial")
public abstract class AbstractNumericArithmeticEval extends AbstractScalarFunctionDynamicDescriptor {
- abstract protected long evaluateInteger(long lhs, long rhs) throws HyracksDataException;
+ /**
+ * abstract method for arithmetic operation between two integer values
+ *
+ * @param lhs first operand
+ * @param rhs second operand
+ * @param result result holder
+ * @return {@code false} if the result is {@code NULL}, otherwise {@code true}
+ */
+ abstract protected boolean evaluateInteger(long lhs, long rhs, AMutableInt64 result) throws HyracksDataException;
- abstract protected double evaluateDouble(double lhs, double rhs) throws HyracksDataException;
+ /**
+ * abstract method for arithmetic operation between two floating point values
+ *
+ * @param lhs first operand
+ * @param rhs second operand
+ * @param result result holder
+ * @return {@code false} if the result is {@code NULL}, otherwise {@code true}
+ */
+ abstract protected boolean evaluateDouble(double lhs, double rhs, AMutableDouble result)
+ throws HyracksDataException;
/**
* abstract method for arithmetic operation between a time instance (date/time/datetime)
* and a duration (duration/year-month-duration/day-time-duration)
*
- * @param chronon
- * @param yearMonth
- * @param dayTime
- * @return
- * @throws HyracksDataException
+ * @param chronon first operand
+ * @param yearMonth year-month component of the second operand
+ * @param dayTime day-time component of the second operand
+ * @param result result holder
+ * @return {@code false} if the result is {@code NULL}, otherwise {@code true}
*/
- abstract protected long evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime,
- boolean isTimeOnly) throws HyracksDataException;
+ abstract protected boolean evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime,
+ boolean isTimeOnly, AMutableInt64 result) throws HyracksDataException;
/**
* abstract method for arithmetic operation between two time instances (date/time/datetime)
*
- * @param chronon0
- * @param chronon1
- * @return
- * @throws HyracksDataException
+ * @param chronon0 first operand
+ * @param chronon1 second operand
+ * @param result result holder
+ * @return {@code false} if the result is {@code NULL}, otherwise {@code true}
*/
- abstract protected long evaluateTimeInstanceArithmetic(long chronon0, long chronon1) throws HyracksDataException;
+ abstract protected boolean evaluateTimeInstanceArithmetic(long chronon0, long chronon1, AMutableInt64 result)
+ throws HyracksDataException;
@Override
public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
@@ -153,6 +172,9 @@
@SuppressWarnings("rawtypes")
private final ISerializerDeserializer durationSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
+ @SuppressWarnings("rawtypes")
+ private final ISerializerDeserializer nullSerde =
+ SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
@Override
@SuppressWarnings("unchecked")
@@ -232,58 +254,78 @@
double dres;
switch (resultType) {
case TINYINT:
- lres = evaluateInteger(operandsInteger[0], operandsInteger[1]);
- if (lres > Byte.MAX_VALUE) {
- throw new OverflowException(sourceLoc, getIdentifier());
+ if (evaluateInteger(operandsInteger[0], operandsInteger[1], aInt64)) {
+ lres = aInt64.getLongValue();
+ if (lres > Byte.MAX_VALUE) {
+ throw new OverflowException(sourceLoc, getIdentifier());
+ }
+ if (lres < Byte.MIN_VALUE) {
+ throw new UnderflowException(sourceLoc, getIdentifier());
+ }
+ aInt8.setValue((byte) lres);
+ int8Serde.serialize(aInt8, out);
+ } else {
+ nullSerde.serialize(ANull.NULL, out);
}
- if (lres < Byte.MIN_VALUE) {
- throw new UnderflowException(sourceLoc, getIdentifier());
- }
- aInt8.setValue((byte) lres);
- int8Serde.serialize(aInt8, out);
break;
case SMALLINT:
- lres = evaluateInteger(operandsInteger[0], operandsInteger[1]);
- if (lres > Short.MAX_VALUE) {
- throw new OverflowException(sourceLoc, getIdentifier());
+ if (evaluateInteger(operandsInteger[0], operandsInteger[1], aInt64)) {
+ lres = aInt64.getLongValue();
+ if (lres > Short.MAX_VALUE) {
+ throw new OverflowException(sourceLoc, getIdentifier());
+ }
+ if (lres < Short.MIN_VALUE) {
+ throw new UnderflowException(sourceLoc, getIdentifier());
+ }
+ aInt16.setValue((short) lres);
+ int16Serde.serialize(aInt16, out);
+ } else {
+ nullSerde.serialize(ANull.NULL, out);
}
- if (lres < Short.MIN_VALUE) {
- throw new UnderflowException(sourceLoc, getIdentifier());
- }
- aInt16.setValue((short) lres);
- int16Serde.serialize(aInt16, out);
break;
case INTEGER:
- lres = evaluateInteger(operandsInteger[0], operandsInteger[1]);
- if (lres > Integer.MAX_VALUE) {
- throw new OverflowException(sourceLoc, getIdentifier());
+ if (evaluateInteger(operandsInteger[0], operandsInteger[1], aInt64)) {
+ lres = aInt64.getLongValue();
+ if (lres > Integer.MAX_VALUE) {
+ throw new OverflowException(sourceLoc, getIdentifier());
+ }
+ if (lres < Integer.MIN_VALUE) {
+ throw new UnderflowException(sourceLoc, getIdentifier());
+ }
+ aInt32.setValue((int) lres);
+ int32Serde.serialize(aInt32, out);
+ } else {
+ nullSerde.serialize(ANull.NULL, out);
}
- if (lres < Integer.MIN_VALUE) {
- throw new UnderflowException(sourceLoc, getIdentifier());
- }
- aInt32.setValue((int) lres);
- int32Serde.serialize(aInt32, out);
break;
case BIGINT:
- lres = evaluateInteger(operandsInteger[0], operandsInteger[1]);
- aInt64.setValue(lres);
- int64Serde.serialize(aInt64, out);
+ if (evaluateInteger(operandsInteger[0], operandsInteger[1], aInt64)) {
+ int64Serde.serialize(aInt64, out);
+ } else {
+ nullSerde.serialize(ANull.NULL, out);
+ }
break;
case FLOAT:
- dres = evaluateDouble(operandsFloating[0], operandsFloating[1]);
- if (dres > Float.MAX_VALUE) {
- throw new OverflowException(sourceLoc, getIdentifier());
+ if (evaluateDouble(operandsFloating[0], operandsFloating[1], aDouble)) {
+ dres = aDouble.getDoubleValue();
+ if (dres > Float.MAX_VALUE) {
+ throw new OverflowException(sourceLoc, getIdentifier());
+ }
+ if (dres < -Float.MAX_VALUE) {
+ throw new UnderflowException(sourceLoc, getIdentifier());
+ }
+ aFloat.setValue((float) dres);
+ floatSerde.serialize(aFloat, out);
+ } else {
+ nullSerde.serialize(ANull.NULL, out);
}
- if (dres < -Float.MAX_VALUE) {
- throw new UnderflowException(sourceLoc, getIdentifier());
- }
- aFloat.setValue((float) dres);
- floatSerde.serialize(aFloat, out);
break;
case DOUBLE:
- dres = evaluateDouble(operandsFloating[0], operandsFloating[1]);
- aDouble.setValue(dres);
- doubleSerde.serialize(aDouble, out);
+ if (evaluateDouble(operandsFloating[0], operandsFloating[1], aDouble)) {
+ doubleSerde.serialize(aDouble, out);
+ } else {
+ nullSerde.serialize(ANull.NULL, out);
+ }
break;
}
result.set(resultStorage);
@@ -298,10 +340,9 @@
int offset0 = argPtr0.getStartOffset();
if (rightType == leftType) {
-
- long leftChronon = 0, rightChronon = 0, dayTime;
-
+ long leftChronon = 0, rightChronon = 0, dayTime = 0;
int yearMonth = 0;
+ boolean yearMonthIsNull = false, dayTimeIsNull = false;
switch (leftType) {
case DATE:
@@ -319,9 +360,14 @@
rightChronon = ADateTimeSerializerDeserializer.getChronon(bytes1, offset1 + 1);
break;
case YEARMONTHDURATION:
- yearMonth = (int) evaluateTimeInstanceArithmetic(
+ if (evaluateTimeInstanceArithmetic(
AYearMonthDurationSerializerDeserializer.getYearMonth(bytes0, offset0 + 1),
- AYearMonthDurationSerializerDeserializer.getYearMonth(bytes1, offset1 + 1));
+ AYearMonthDurationSerializerDeserializer.getYearMonth(bytes1, offset1 + 1),
+ aInt64)) {
+ yearMonth = (int) aInt64.getLongValue();
+ } else {
+ yearMonthIsNull = true;
+ }
break;
case DAYTIMEDURATION:
leftChronon =
@@ -333,10 +379,18 @@
throw new UnsupportedTypeException(sourceLoc, getIdentifier(), bytes1[offset1]);
}
- dayTime = evaluateTimeInstanceArithmetic(leftChronon, rightChronon);
+ if (evaluateTimeInstanceArithmetic(leftChronon, rightChronon, aInt64)) {
+ dayTime = aInt64.getLongValue();
+ } else {
+ dayTimeIsNull = true;
+ }
- aDuration.setValue(yearMonth, dayTime);
- durationSerde.serialize(aDuration, out);
+ if (yearMonthIsNull || dayTimeIsNull) {
+ nullSerde.serialize(ANull.NULL, out);
+ } else {
+ aDuration.setValue(yearMonth, dayTime);
+ durationSerde.serialize(aDuration, out);
+ }
} else {
long chronon = 0, dayTime = 0;
@@ -455,29 +509,32 @@
bytes1[offset1]);
}
- chronon = evaluateTimeDurationArithmetic(chronon, yearMonth, dayTime, isTimeOnly);
-
- switch (resultType) {
- case DATE:
- if (chronon < 0 && chronon % GregorianCalendarSystem.CHRONON_OF_DAY != 0) {
- chronon = chronon / GregorianCalendarSystem.CHRONON_OF_DAY - 1;
- } else {
- chronon = chronon / GregorianCalendarSystem.CHRONON_OF_DAY;
- }
- aDate.setValue((int) chronon);
- serde.serialize(aDate, out);
- break;
- case TIME:
- aTime.setValue((int) chronon);
- serde.serialize(aTime, out);
- break;
- case DATETIME:
- aDatetime.setValue(chronon);
- serde.serialize(aDatetime, out);
- break;
- default:
- throw new IncompatibleTypeException(sourceLoc, getIdentifier(), bytes0[offset0],
- bytes1[offset1]);
+ if (evaluateTimeDurationArithmetic(chronon, yearMonth, dayTime, isTimeOnly, aInt64)) {
+ chronon = aInt64.getLongValue();
+ switch (resultType) {
+ case DATE:
+ if (chronon < 0 && chronon % GregorianCalendarSystem.CHRONON_OF_DAY != 0) {
+ chronon = chronon / GregorianCalendarSystem.CHRONON_OF_DAY - 1;
+ } else {
+ chronon = chronon / GregorianCalendarSystem.CHRONON_OF_DAY;
+ }
+ aDate.setValue((int) chronon);
+ serde.serialize(aDate, out);
+ break;
+ case TIME:
+ aTime.setValue((int) chronon);
+ serde.serialize(aTime, out);
+ break;
+ case DATETIME:
+ aDatetime.setValue(chronon);
+ serde.serialize(aDatetime, out);
+ break;
+ default:
+ throw new IncompatibleTypeException(sourceLoc, getIdentifier(), bytes0[offset0],
+ bytes1[offset1]);
+ }
+ } else {
+ nullSerde.serialize(ANull.NULL, out);
}
}
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericAddDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericAddDescriptor.java
index f64b829..9b8ffeb 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericAddDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericAddDescriptor.java
@@ -18,11 +18,14 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
+import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.base.temporal.DurationArithmeticOperations;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.exceptions.OverflowException;
import org.apache.asterix.runtime.exceptions.UnsupportedTypeException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -42,23 +45,34 @@
}
@Override
- protected long evaluateInteger(long x, long y) throws HyracksDataException {
- return Math.addExact(x, y);
+ protected boolean evaluateInteger(long x, long y, AMutableInt64 result) throws HyracksDataException {
+ try {
+ long res = Math.addExact(x, y);
+ result.setValue(res);
+ return true;
+ } catch (ArithmeticException e) {
+ throw new OverflowException(sourceLoc, getIdentifier());
+ }
}
@Override
- protected double evaluateDouble(double lhs, double rhs) throws HyracksDataException {
- return lhs + rhs;
+ protected boolean evaluateDouble(double lhs, double rhs, AMutableDouble result) throws HyracksDataException {
+ double res = lhs + rhs;
+ result.setValue(res);
+ return true;
}
@Override
- protected long evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly)
+ protected boolean evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly,
+ AMutableInt64 result) throws HyracksDataException {
+ long res = DurationArithmeticOperations.addDuration(chronon, yearMonth, dayTime, isTimeOnly);
+ result.setValue(res);
+ return true;
+ }
+
+ @Override
+ protected boolean evaluateTimeInstanceArithmetic(long chronon0, long chronon1, AMutableInt64 result)
throws HyracksDataException {
- return DurationArithmeticOperations.addDuration(chronon, yearMonth, dayTime, isTimeOnly);
- }
-
- @Override
- protected long evaluateTimeInstanceArithmetic(long chronon0, long chronon1) throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_TIME_TYPE_TAG);
}
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivDescriptor.java
index 56d90f7..2eeefe8 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivDescriptor.java
@@ -19,8 +19,8 @@
package org.apache.asterix.runtime.evaluators.functions;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.RuntimeDataException;
+import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -46,28 +46,37 @@
}
@Override
- protected double evaluateDouble(double lhs, double rhs) {
- return lhs / rhs;
+ protected boolean evaluateDouble(double lhs, double rhs, AMutableDouble result) {
+ if (rhs == 0) {
+ return false; // result = NULL
+ }
+ double res = lhs / rhs;
+ result.setValue(res);
+ return true;
}
@Override
- protected long evaluateInteger(long lhs, long rhs) throws HyracksDataException {
+ protected boolean evaluateInteger(long lhs, long rhs, AMutableInt64 result) throws HyracksDataException {
if (rhs == 0) {
- throw new RuntimeDataException(ErrorCode.DIVISION_BY_ZERO);
+ return false; // result = NULL
}
if ((lhs == Long.MIN_VALUE) && (rhs == -1L)) {
throw new OverflowException(sourceLoc, getIdentifier());
}
- return lhs / rhs;
+ long res = lhs / rhs;
+ result.setValue(res);
+ return true;
}
@Override
- protected long evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly) {
+ protected boolean evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly,
+ AMutableInt64 result) {
throw new NotImplementedException("Divide operation is not defined for temporal types");
}
@Override
- protected long evaluateTimeInstanceArithmetic(long chronon0, long chronon1) throws HyracksDataException {
+ protected boolean evaluateTimeInstanceArithmetic(long chronon0, long chronon1, AMutableInt64 result)
+ throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_TIME_TYPE_TAG);
}
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivideDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivideDescriptor.java
index 0c1a3eb..6e6b5a8 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivideDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivideDescriptor.java
@@ -18,6 +18,8 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
+import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -47,22 +49,29 @@
}
@Override
- protected double evaluateDouble(double lhs, double rhs) {
- return lhs / rhs;
+ protected boolean evaluateDouble(double lhs, double rhs, AMutableDouble result) {
+ if (rhs == 0) {
+ return false; // result = NULL
+ }
+ double res = lhs / rhs;
+ result.setValue(res);
+ return true;
}
@Override
- protected long evaluateInteger(long lhs, long rhs) {
+ protected boolean evaluateInteger(long lhs, long rhs, AMutableInt64 result) {
throw new IllegalStateException();
}
@Override
- protected long evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly) {
+ protected boolean evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly,
+ AMutableInt64 result) {
throw new NotImplementedException("Divide operation is not defined for temporal types");
}
@Override
- protected long evaluateTimeInstanceArithmetic(long chronon0, long chronon1) throws HyracksDataException {
+ protected boolean evaluateTimeInstanceArithmetic(long chronon0, long chronon1, AMutableInt64 result)
+ throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_TIME_TYPE_TAG);
}
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericModuloDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericModuloDescriptor.java
index a967162..e737841 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericModuloDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericModuloDescriptor.java
@@ -18,6 +18,8 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
+import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -43,23 +45,34 @@
}
@Override
- protected long evaluateInteger(long lhs, long rhs) throws HyracksDataException {
- return lhs % rhs;
+ protected boolean evaluateInteger(long lhs, long rhs, AMutableInt64 result) throws HyracksDataException {
+ if (rhs == 0) {
+ return false; // result = NULL
+ }
+ long res = lhs % rhs;
+ result.setValue(res);
+ return true;
}
@Override
- protected double evaluateDouble(double lhs, double rhs) throws HyracksDataException {
- return lhs % rhs;
+ protected boolean evaluateDouble(double lhs, double rhs, AMutableDouble result) throws HyracksDataException {
+ if (rhs == 0) {
+ return false; // result = NULL
+ }
+ double res = lhs % rhs;
+ result.setValue(res);
+ return true;
}
@Override
- protected long evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly)
- throws HyracksDataException {
+ protected boolean evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly,
+ AMutableInt64 result) throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_DURATION_TYPE_TAG);
}
@Override
- protected long evaluateTimeInstanceArithmetic(long chronon0, long chronon1) throws HyracksDataException {
+ protected boolean evaluateTimeInstanceArithmetic(long chronon0, long chronon1, AMutableInt64 result)
+ throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_TIME_TYPE_TAG);
}
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericMultiplyDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericMultiplyDescriptor.java
index 57de132..64fa2b2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericMultiplyDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericMultiplyDescriptor.java
@@ -18,10 +18,13 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
+import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.exceptions.OverflowException;
import org.apache.asterix.runtime.exceptions.UnsupportedTypeException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -41,23 +44,32 @@
}
@Override
- protected long evaluateInteger(long lhs, long rhs) throws HyracksDataException {
- return Math.multiplyExact(lhs, rhs);
+ protected boolean evaluateInteger(long lhs, long rhs, AMutableInt64 result) throws HyracksDataException {
+ try {
+ long res = Math.multiplyExact(lhs, rhs);
+ result.setValue(res);
+ return true;
+ } catch (ArithmeticException e) {
+ throw new OverflowException(sourceLoc, getIdentifier());
+ }
}
@Override
- protected double evaluateDouble(double lhs, double rhs) throws HyracksDataException {
- return lhs * rhs;
+ protected boolean evaluateDouble(double lhs, double rhs, AMutableDouble result) throws HyracksDataException {
+ double res = lhs * rhs;
+ result.setValue(res);
+ return true;
}
@Override
- protected long evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly)
- throws HyracksDataException {
+ protected boolean evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly,
+ AMutableInt64 result) throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_DURATION_TYPE_TAG);
}
@Override
- protected long evaluateTimeInstanceArithmetic(long chronon0, long chronon1) throws HyracksDataException {
+ protected boolean evaluateTimeInstanceArithmetic(long chronon0, long chronon1, AMutableInt64 result)
+ throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_TIME_TYPE_TAG);
}
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericPowerDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericPowerDescriptor.java
index a5312b9..68ed6e8 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericPowerDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericPowerDescriptor.java
@@ -18,6 +18,8 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
+import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -43,19 +45,27 @@
* @see org.apache.asterix.runtime.evaluators.functions.AbstractNumericArithmeticEval#evaluateInteger(long, long)
*/
@Override
- protected long evaluateInteger(long lhs, long rhs) throws HyracksDataException {
+ protected boolean evaluateInteger(long lhs, long rhs, AMutableInt64 result) throws HyracksDataException {
if (rhs > Integer.MAX_VALUE) {
throw new OverflowException(sourceLoc, getIdentifier());
}
- return LongMath.checkedPow(lhs, (int) rhs);
+ try {
+ long res = LongMath.checkedPow(lhs, (int) rhs);
+ result.setValue(res);
+ return true;
+ } catch (ArithmeticException e) {
+ throw new OverflowException(sourceLoc, getIdentifier());
+ }
}
/* (non-Javadoc)
* @see org.apache.asterix.runtime.evaluators.functions.AbstractNumericArithmeticEval#evaluateDouble(double, double)
*/
@Override
- protected double evaluateDouble(double lhs, double rhs) throws HyracksDataException {
- return Math.pow(lhs, rhs);
+ protected boolean evaluateDouble(double lhs, double rhs, AMutableDouble result) throws HyracksDataException {
+ double res = Math.pow(lhs, rhs);
+ result.setValue(res);
+ return true;
}
/* (non-Javadoc)
@@ -67,14 +77,14 @@
}
@Override
- protected long evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly)
- throws HyracksDataException {
+ protected boolean evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly,
+ AMutableInt64 result) throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier().getName(), ATypeTag.SERIALIZED_DURATION_TYPE_TAG);
}
@Override
- protected long evaluateTimeInstanceArithmetic(long chronon0, long chronon1) throws HyracksDataException {
+ protected boolean evaluateTimeInstanceArithmetic(long chronon0, long chronon1, AMutableInt64 result)
+ throws HyracksDataException {
throw new UnsupportedTypeException(sourceLoc, getIdentifier().getName(), ATypeTag.SERIALIZED_TIME_TYPE_TAG);
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSubDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSubDescriptor.java
index f694226..30f6dda 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSubDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericSubDescriptor.java
@@ -18,10 +18,13 @@
*/
package org.apache.asterix.runtime.evaluators.functions;
+import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.base.temporal.DurationArithmeticOperations;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.exceptions.OverflowException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -43,33 +46,43 @@
* @see org.apache.asterix.runtime.evaluators.functions.AbstractNumericArithmeticEval#evaluateInteger(long, long)
*/
@Override
- protected long evaluateInteger(long lhs, long rhs) throws HyracksDataException {
- return Math.subtractExact(lhs, rhs);
+ protected boolean evaluateInteger(long lhs, long rhs, AMutableInt64 result) throws HyracksDataException {
+ try {
+ long res = Math.subtractExact(lhs, rhs);
+ result.setValue(res);
+ return true;
+ } catch (ArithmeticException e) {
+ throw new OverflowException(sourceLoc, getIdentifier());
+ }
}
/* (non-Javadoc)
* @see org.apache.asterix.runtime.evaluators.functions.AbstractNumericArithmeticEval#evaluateDouble(double, double)
*/
@Override
- protected double evaluateDouble(double lhs, double rhs) throws HyracksDataException {
- return lhs - rhs;
+ protected boolean evaluateDouble(double lhs, double rhs, AMutableDouble result) throws HyracksDataException {
+ double res = lhs - rhs;
+ result.setValue(res);
+ return true;
}
/* (non-Javadoc)
* @see org.apache.asterix.runtime.evaluators.functions.AbstractNumericArithmeticEval#evaluateTimeDurationArithmetic(long, int, long, boolean)
*/
@Override
- protected long evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly)
- throws HyracksDataException {
- return DurationArithmeticOperations.addDuration(chronon, -1 * yearMonth, -1 * dayTime, isTimeOnly);
+ protected boolean evaluateTimeDurationArithmetic(long chronon, int yearMonth, long dayTime, boolean isTimeOnly,
+ AMutableInt64 result) throws HyracksDataException {
+ long res = DurationArithmeticOperations.addDuration(chronon, -1 * yearMonth, -1 * dayTime, isTimeOnly);
+ result.setValue(res);
+ return true;
}
/* (non-Javadoc)
* @see org.apache.asterix.runtime.evaluators.functions.AbstractNumericArithmeticEval#evaluateTimeInstanceArithmetic(long, long)
*/
@Override
- protected long evaluateTimeInstanceArithmetic(long chronon0, long chronon1) throws HyracksDataException {
- return evaluateInteger(chronon0, chronon1);
+ protected boolean evaluateTimeInstanceArithmetic(long chronon0, long chronon1, AMutableInt64 result)
+ throws HyracksDataException {
+ return evaluateInteger(chronon0, chronon1, result);
}
-
}