[NO ISSUE][FUN] Improve type constructor functions
- user model changes: no
- storage format changes: no
- interface changes: no
Details:
- Enhance type constructor functions to handle
additional types and return NULL in case of
type mismatch (with warning)
- Add testcases
- Other minor refactoring
Change-Id: Id4e5ab9c3c17e55ad96847f6dda0af5c8151e674
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/12066
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Glenn Galvizo <ggalvizo@uci.edu>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_01/binary_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_01/binary_01.3.query.sqlpp
index 509d97d..75c4c53 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_01/binary_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_01/binary_01.3.query.sqlpp
@@ -17,20 +17,40 @@
* under the License.
*/
-use test;
+let
+test = [
+ 'ABCDEF0123456789',
+ 'abcdef0123456789',
+ '0A0B0C0D0E0F',
+ '01020304050607080900',
+ '',
+ test.hex('ABCDEF0123456789')
+],
+testNull = [
+ null,
+ '@#!',
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ double(0),
+ date('2020-01-01'),
+ datetime('2020-01-01T00:00:00Z'),
+ time("00:00:00"),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
-[
- test.hex('ABCDEF0123456789'),
- test.hex('abcdef0123456789'),
- test.hex('0A0B0C0D0E0F'),
- test.hex('01020304050607080900'),
- test.hex(''),
- test.hex(test.hex('ABCDEF0123456789')),
-
- test.base64('0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM+/'),
- test.base64(''),
- test.base64('QXN0ZXJpeA=='),
- test.base64('QXN0ZXJpeAE='),
- test.base64('QXN0ZXJpeAE8'),
- test.base64(test.base64('QXN0ZXJpeAE8'))
-];
+select 0 g, i, hex(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, hex(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, hex(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_01/binary_01.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_01/binary_01.4.query.sqlpp
new file mode 100644
index 0000000..3b929e8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_01/binary_01.4.query.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+let
+test = [
+ '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM+/',
+ '',
+ 'QXN0ZXJpeA==',
+ 'QXN0ZXJpeAE=',
+ 'QXN0ZXJpeAE8',
+ test.base64('QXN0ZXJpeAE8')
+],
+testNull = [
+ null,
+ '@#!',
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ double(0),
+ date('2020-01-01'),
+ datetime('2020-01-01T00:00:00Z'),
+ time("00:00:00"),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
+
+select 0 g, i, base64(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, base64(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, base64(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_02/binary_02.1.query.sqlpp
similarity index 82%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_02/binary_02.1.query.sqlpp
index a9fb88e..d150323 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_02/binary_02.1.query.sqlpp
@@ -17,4 +17,12 @@
* under the License.
*/
-uuid('12345'); // Invalid length
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": hex("@#!1"),
+ "null_1": hex(date("2020-01-01")),
+ "null_2": hex([]),
+ "null_3": hex({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_02/binary_02.2.query.sqlpp
similarity index 81%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_02/binary_02.2.query.sqlpp
index dbf9050..7e63bb1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/binary_02/binary_02.2.query.sqlpp
@@ -16,10 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": base64("@#!2"),
+ "null_1": base64(date("2020-01-01")),
+ "null_2": base64([]),
+ "null_3": base64({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/boolean_01/boolean_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/boolean_01/boolean_01.3.query.sqlpp
index e7eb630..6a2d6e0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/boolean_01/boolean_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/boolean_01/boolean_01.3.query.sqlpp
@@ -17,10 +17,67 @@
* under the License.
*/
-use test;
+let
+testFalse = [
+ false,
+ test.boolean('false'),
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ float("NaN"),
+ double(0),
+ double("NaN"),
+ 'false'
+],
+testTrue = [
+ true,
+ int8(1),
+ int8(2),
+ int16(1),
+ int16(-1),
+ int32(1),
+ int32(2),
+ int64(1),
+ int64(3),
+ float(1),
+ float("INF"),
+ float("-INF"),
+ double(1),
+ double("INF"),
+ double("-INF"),
+ 'true'
+],
+testNull = [
+ null,
+ 'TRUE',
+ 'FALSE',
+ 'abc',
+ date('1970-01-01'),
+ datetime('1970-01-01T00:00:00Z'),
+ time("00:00:00"),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ [null],
+ {},
+ {"a":null}
+],
+testMissing = [
+ missing
+]
-{
- 'boolean1':test.boolean('true'),
- 'boolean2':test.boolean('false'),
- 'boolean3':test.boolean(test.boolean('false'))
-};
+select 0 g, i, false expected, boolean(testFalse[i]) actual
+from range(0, len(testFalse)-1) i
+union all
+select 1 g, i, true expected, boolean(testTrue[i]) actual
+from range(0, len(testTrue)-1) i
+union all
+select 2 g, i, null expected, boolean(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 3 g, i, true expected, boolean(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/boolean_02/boolean_02.1.query.sqlpp
similarity index 78%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/boolean_02/boolean_02.1.query.sqlpp
index dbf9050..18e1859 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/boolean_02/boolean_02.1.query.sqlpp
@@ -16,10 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": boolean("FALSE"),
+ "null_1": boolean("TRUE"),
+ "null_2": boolean(date("2020-01-01")),
+ "null_3": boolean([]),
+ "null_4": boolean({})
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/date_01/date_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/date_01/date_01.3.query.sqlpp
index 8292dbd..a96ef28 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/date_01/date_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/date_01/date_01.3.query.sqlpp
@@ -17,18 +17,49 @@
* under the License.
*/
-use test;
+let
+test = [
+ '2010-10-30',
+ '1987-11-19',
+ '-1987-11-19',
+ '0001-12-27',
+ '-1951-12-27',
+ '-2043-11-19',
+ '-19280329',
+ '19280329',
+ '19000228',
+ '20000229',
+ test.date('20000229'),
+ datetime('2010-10-30T01:02:03Z')
+],
+testNull = [
+ null,
+ false,
+ true,
+ '@#!',
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ double(0),
+ time('01:02:03'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
-{
- 'date1':test.date('2010-10-30'),
- 'date2':test.date('1987-11-19'),
- 'date3':test.date('-1987-11-19'),
- 'date4':test.date('0001-12-27'),
- 'date5':test.date('-1951-12-27'),
- 'date6':test.date('-2043-11-19'),
- 'date7':test.date('-19280329'),
- 'date8':test.date('19280329'),
- 'date9':test.date('19000228'),
- 'date10':test.date('20000229'),
- 'date11':test.date(test.date('20000229'))
-};
+select 0 g, i, date(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, date(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, date(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/date_02/date_02.1.query.sqlpp
similarity index 78%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/date_02/date_02.1.query.sqlpp
index dbf9050..443aa80 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/date_02/date_02.1.query.sqlpp
@@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": date("@#!"),
+ "null_1": date(false),
+ "null_2": date(0),
+ "null_3": date(time("01:02:03")),
+ "null_4": date([]),
+ "null_5": date({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/datetime_01/datetime_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/datetime_01/datetime_01.3.query.sqlpp
index 7f91427..97a9955 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/datetime_01/datetime_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/datetime_01/datetime_01.3.query.sqlpp
@@ -17,22 +17,51 @@
* under the License.
*/
-use test;
+let
+test = [
+ '2010-10-30T10:50:56.999+05:45',
+ '2010-10-30T10:30:56.250-10:00',
+ '1987-11-19T09:20:00.200Z',
+ '1987-11-19T10:50:56Z',
+ '-1987-11-19T10:50:56.099-05:30',
+ '-0001-11-19T10:50:56.719Z',
+ '1951-12-27T12:20:15Z',
+ '2043-11-19T10:50:56.719Z',
+ '-19280329T174937374-0630',
+ '-19280329T174937374+0630',
+ '-19280329T174937374',
+ '-19280329T174937374+0630',
+ '-19280329T17493737+0630',
+ '-19280301T05493737+0630',
+ test.datetime('-19280301T05493737+0630'),
+ date('2020-01-02')
+],
+testNull = [
+ null,
+ false,
+ true,
+ '@#!',
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ double(0),
+ time('01:02:03'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D')
+],
+testMissing = [
+ missing
+]
-{
- 'datetime1':test.datetime('2010-10-30T10:50:56.999+05:45'),
- 'datetime2':test.datetime('2010-10-30T10:30:56.250-10:00'),
- 'datetime3':test.datetime('1987-11-19T09:20:00.200Z'),
- 'datetime4':test.datetime('1987-11-19T10:50:56Z'),
- 'datetime5':test.datetime('-1987-11-19T10:50:56.099-05:30'),
- 'datetime6':test.datetime('-0001-11-19T10:50:56.719Z'),
- 'datetime7':test.datetime('1951-12-27T12:20:15Z'),
- 'datetime8':test.datetime('2043-11-19T10:50:56.719Z'),
- 'datetime9':test.datetime('-19280329T174937374-0630'),
- 'datetime10':test.datetime('-19280329T174937374+0630'),
- 'datetime11':test.datetime('-19280329T174937374'),
- 'datetime12':test.datetime('-19280329T174937374+0630'),
- 'datetime13':test.datetime('-19280329T17493737+0630'),
- 'datetime14':test.datetime('-19280301T05493737+0630'),
- 'datetime15':test.datetime(test.datetime('-19280301T05493737+0630'))
-};
+select 0 g, i, datetime(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, datetime(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, datetime(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/datetime_02/datetime_02.1.query.sqlpp
similarity index 76%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/datetime_02/datetime_02.1.query.sqlpp
index dbf9050..1a9f391 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/datetime_02/datetime_02.1.query.sqlpp
@@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": datetime("@#!"),
+ "null_1": datetime(false),
+ "null_2": datetime(0),
+ "null_3": datetime(time("01:02:03")),
+ "null_4": datetime([]),
+ "null_5": datetime({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/double_01/double_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/double_01/double_01.3.query.sqlpp
index a6bdbc5..c7fd21c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/double_01/double_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/double_01/double_01.3.query.sqlpp
@@ -17,14 +17,45 @@
* under the License.
*/
-use test;
+let
+test = [
+ 'NaN',
+ 'INF',
+ '-INF',
+ '-80.20d',
+ '-20.56e-30',
+ '-20.56e-300',
+ test.double('-20.56e-300'),
+ int8(8),
+ int16(16),
+ int32(32),
+ int64(64),
+ float(2.5),
+ false,
+ true
+],
+testNull = [
+ null,
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
-{
- 'double1':test.double('NaN'),
- 'double2':test.double('INF'),
- 'double3':test.double('-INF'),
- 'double4':test.double('-80.20d'),
- 'double5':test.double('-20.56e-30'),
- 'double6':test.double('-20.56e-300'),
- 'double7':test.double(test.double('-20.56e-300'))
-};
+select 0 g, i, double(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, double(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, double(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/double_02/double_02.1.query.sqlpp
similarity index 74%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/double_02/double_02.1.query.sqlpp
index dbf9050..5a68610 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/double_02/double_02.1.query.sqlpp
@@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": double("@#!"),
+ "null_1": double(datetime('1987-11-19T10:50:56Z')),
+ "null_2": double(date('2020-01-02')),
+ "null_3": double(time("01:02:03")),
+ "null_4": double([]),
+ "null_5": double({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.3.query.sqlpp
index d0520df..db2913c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.3.query.sqlpp
@@ -22,20 +22,52 @@
* Date : 7 May 2013
*/
-use test;
+let
+test = [
+ 'P30Y10M25DT13H12M50S',
+ 'P25DT13H12M50S',
+ 'PT13H12M50S',
+ 'P30YT12MS',
+ 'PT13H',
+ '-P30Y10M25DT13H12M50S',
+ '-P25DT13H12M50S',
+ '-PT13H50S',
+ 'P120D',
+ '-P28M',
+ 'PT29M90.937S',
+ 'P300Y15M60DT300H98M482.435S',
+ test.duration('P300Y15M60DT300H98M482.435S'),
+ year_month_duration('P30Y10M'),
+ day_time_duration('P25DT13H12M50S')
+],
+testNull = [
+ null,
+ false,
+ true,
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ double(0),
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
-{
- 'duration1':test.duration('P30Y10M25DT13H12M50S'),
- 'duration2':test.duration('P25DT13H12M50S'),
- 'duration3':test.duration('PT13H12M50S'),
- 'duration4':test.duration('P30YT12MS'),
- 'duration5':test.duration('PT13H'),
- 'duration6':test.duration('-P30Y10M25DT13H12M50S'),
- 'duration7':test.duration('-P25DT13H12M50S'),
- 'duration8':test.duration('-PT13H50S'),
- 'duration9':test.duration('P120D'),
- 'duration10':test.duration('-P28M'),
- 'duration11':test.duration('PT29M90.937S'),
- 'duration12':test.duration('P300Y15M60DT300H98M482.435S'),
- 'duration13':test.duration(test.duration('P300Y15M60DT300H98M482.435S'))
-};
+select 0 g, i, duration(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, duration(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, duration(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.4.query.sqlpp
new file mode 100644
index 0000000..1f34234
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.4.query.sqlpp
@@ -0,0 +1,66 @@
+/*
+ * 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 : test year_month_duration constructors
+ * Expected Res : Success
+ * Date : 7 May 2013
+ * issue : 363
+ */
+
+let
+test = [
+ 'P30Y10M',
+ 'P30Y',
+ '-P30Y10M',
+ '-P28M',
+ 'P300Y15M',
+ test.year_month_duration('P300Y15M'),
+ duration('P300Y16M60DT300H98M482.435S')
+],
+testNull = [
+ null,
+ false,
+ true,
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ double(0),
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ day_time_duration('P25DT13H12M50S'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
+
+select 0 g, i, year_month_duration(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, year_month_duration(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, year_month_duration(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.5.query.sqlpp
new file mode 100644
index 0000000..4c081db
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_01/duration_01.5.query.sqlpp
@@ -0,0 +1,68 @@
+/*
+ * 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 : test day_time_duration constructors
+ * Expected Res : Success
+ * Date : 7 May 2013
+ * issue : 363
+ */
+
+let
+test = [
+ 'P25DT13H12M50S',
+ 'PT13H12M50S',
+ 'PT13H',
+ '-P25DT13H12M50S',
+ '-PT13H50S',
+ 'P120D',
+ 'PT29M90.937S',
+ test.day_time_duration('PT14H'),
+ duration('P1Y2M3DT4H5M6S')
+],
+testNull = [
+ null,
+ false,
+ true,
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ double(0),
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ year_month_duration('P1Y'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
+
+select 0 g, i, day_time_duration(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, day_time_duration(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, day_time_duration(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.1.ddl.sqlpp
deleted file mode 100644
index 2b48d01..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.1.ddl.sqlpp
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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 : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.1.query.sqlpp
similarity index 72%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.1.query.sqlpp
index dbf9050..548d6d0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.1.query.sqlpp
@@ -16,10 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": duration("@#!"),
+ "null_1": duration(0),
+ "null_2": duration(datetime('1987-11-19T10:50:56Z')),
+ "null_3": duration(date('2020-01-02')),
+ "null_4": duration(time("01:02:03")),
+ "null_5": duration([]),
+ "null_6": duration({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.query.sqlpp
similarity index 67%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.query.sqlpp
index dbf9050..6b268a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.query.sqlpp
@@ -16,10 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": year_month_duration("@#!"),
+ "null_1": year_month_duration(0),
+ "null_2": year_month_duration(datetime('1987-11-19T10:50:56Z')),
+ "null_3": year_month_duration(date('2020-01-02')),
+ "null_4": year_month_duration(time("01:02:03")),
+ "null_5": year_month_duration([]),
+ "null_6": year_month_duration({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.3.query.sqlpp
index e722070..dd82a21 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.3.query.sqlpp
@@ -16,27 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
-use test;
+// requesttype=application/json
+// param max-warnings:json=100
{
- 'duration1':test.`year_month_duration`('P30Y10M'),
- 'duration2':test.`day_time_duration`('P25DT13H12M50S'),
- 'duration3':test.`day_time_duration`('PT13H12M50S'),
- 'duration4':test.`year_month_duration`('P30Y'),
- 'duration5':test.`day_time_duration`('PT13H'),
- 'duration6':test.`year_month_duration`('-P30Y10M'),
- 'duration7':test.`day_time_duration`('-P25DT13H12M50S'),
- 'duration8':test.`day_time_duration`('-PT13H50S'),
- 'duration9':test.`day_time_duration`('P120D'),
- 'duration10':test.`year_month_duration`('-P28M'),
- 'duration11':test.`day_time_duration`('PT29M90.937S'),
- 'duration12':test.`year_month_duration`('P300Y15M'),
- 'duration13':test.`year_month_duration`(test.`year_month_duration`('P300Y15M'))
-};
+ "null_0": day_time_duration("@#!"),
+ "null_1": day_time_duration(0),
+ "null_2": day_time_duration(datetime('1987-11-19T10:50:56Z')),
+ "null_3": day_time_duration(date('2020-01-02')),
+ "null_4": day_time_duration(time("01:02:03")),
+ "null_5": day_time_duration([]),
+ "null_6": day_time_duration({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/float_01/float_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/float_01/float_01.3.query.sqlpp
index 2186a4c..bea0f0e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/float_01/float_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/float_01/float_01.3.query.sqlpp
@@ -17,13 +17,44 @@
* under the License.
*/
-use test;
+let
+test = [
+ 'NaN',
+ 'INF',
+ '-INF',
+ '-80.20',
+ '-20.56e-30',
+ test.float('-20.56e-30'),
+ int8(8),
+ int16(16),
+ int32(32),
+ int64(64),
+ double(2.5),
+ false,
+ true
+],
+testNull = [
+ null,
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
-{
- 'float1':test.float('NaN'),
- 'float2':test.float('INF'),
- 'float3':test.float('-INF'),
- 'float4':test.float('-80.20'),
- 'float5':test.float('-20.56e-30'),
- 'float6':test.float(test.float('-20.56e-30'))
-};
+select 0 g, i, float(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, float(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, float(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/float_02/float_02.1.query.sqlpp
similarity index 74%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/float_02/float_02.1.query.sqlpp
index dbf9050..d0a6ebe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/float_02/float_02.1.query.sqlpp
@@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": float("@#!"),
+ "null_1": float(datetime('1987-11-19T10:50:56Z')),
+ "null_2": float(date('2020-01-02')),
+ "null_3": float(time("01:02:03")),
+ "null_4": float([]),
+ "null_5": float({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.3.query.sqlpp
index 32d9c17..c394848 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.3.query.sqlpp
@@ -17,23 +17,41 @@
* under the License.
*/
-use test;
+let
+test = [
+ '+80i8',
+ '-80',
+ test.tinyint('+80i8'),
+ int16(16),
+ int32(32),
+ int64(64),
+ float(1.25),
+ double(2.25),
+ false,
+ true
+],
+testNull = [
+ null,
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
-{
- 'int8':test.tinyint('+80i8'),
- 'int16':test.smallint('160'),
- 'int32':test.integer('+320i32'),
- 'int64':test.bigint('640'),
-
- 'int8_2':test.tinyint('-80'),
- 'int16_2':test.smallint('-160i16'),
- 'int32_2':test.integer('-320'),
- 'int64_2':test.bigint('-640i64'),
-
- 'int64_min':test.bigint('-9223372036854775808'),
-
- 'int8_3':test.tinyint(test.tinyint('+80i8')),
- 'int16_3':test.smallint(test.smallint('160')),
- 'int32_3':test.integer(test.integer('+320i32')),
- 'int64_3':test.bigint(test.bigint('640'))
-};
+select 0 g, i, tinyint(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, tinyint(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, tinyint(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.4.query.sqlpp
new file mode 100644
index 0000000..c9e7459
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.4.query.sqlpp
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+let
+test = [
+ '160',
+ '-160i16',
+ test.smallint('160'),
+ int8(8),
+ int32(32),
+ int64(64),
+ float(1.25),
+ double(2.25),
+ false,
+ true
+],
+testNull = [
+ null,
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
+
+select 0 g, i, smallint(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, smallint(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, smallint(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.5.query.sqlpp
new file mode 100644
index 0000000..a097052
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.5.query.sqlpp
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+let
+test = [
+ '+320i32',
+ '-320',
+ test.integer('+320i32'),
+ int8(8),
+ int16(16),
+ int64(64),
+ float(1.25),
+ double(2.25),
+ false,
+ true
+],
+testNull = [
+ null,
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
+
+select 0 g, i, integer(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, integer(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, integer(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.6.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.6.query.sqlpp
new file mode 100644
index 0000000..4395da1
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_01/int_01.6.query.sqlpp
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+let
+test = [
+ '640',
+ '-640i64',
+ '-9223372036854775808',
+ test.bigint('640'),
+ int8(8),
+ int16(16),
+ int32(32),
+ float(1.25),
+ double(2.25),
+ false,
+ true
+],
+testNull = [
+ null,
+ '@#!',
+ datetime('1987-11-19T10:50:56Z'),
+ date('2020-01-02'),
+ time('01:02:03'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
+
+select 0 g, i, bigint(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, bigint(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, bigint(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.1.query.sqlpp
similarity index 74%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.1.query.sqlpp
index a9fb88e..83919c5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.1.query.sqlpp
@@ -17,4 +17,14 @@
* under the License.
*/
-uuid('12345'); // Invalid length
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": tinyint("@#!"),
+ "null_1": tinyint(datetime('1987-11-19T10:50:56Z')),
+ "null_2": tinyint(date('2020-01-02')),
+ "null_3": tinyint(time("01:02:03")),
+ "null_4": tinyint([]),
+ "null_5": tinyint({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.2.query.sqlpp
similarity index 73%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.2.query.sqlpp
index dbf9050..7d39f17 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.2.query.sqlpp
@@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": smallint("@#!"),
+ "null_1": smallint(datetime('1987-11-19T10:50:56Z')),
+ "null_2": smallint(date('2020-01-02')),
+ "null_3": smallint(time("01:02:03")),
+ "null_4": smallint([]),
+ "null_5": smallint({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.3.query.sqlpp
similarity index 74%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.3.query.sqlpp
index a9fb88e..c4e2b6b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.3.query.sqlpp
@@ -17,4 +17,14 @@
* under the License.
*/
-uuid('12345'); // Invalid length
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": integer("@#!"),
+ "null_1": integer(datetime('1987-11-19T10:50:56Z')),
+ "null_2": integer(date('2020-01-02')),
+ "null_3": integer(time("01:02:03")),
+ "null_4": integer([]),
+ "null_5": integer({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.4.query.sqlpp
similarity index 74%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.4.query.sqlpp
index dbf9050..2900811 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/int_02/int_02.4.query.sqlpp
@@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": bigint("@#!"),
+ "null_1": bigint(datetime('1987-11-19T10:50:56Z')),
+ "null_2": bigint(date('2020-01-02')),
+ "null_3": bigint(time("01:02:03")),
+ "null_4": bigint([]),
+ "null_5": bigint({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/string_01/string_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/string_01/string_01.3.query.sqlpp
index 81fbd1f..6181751 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/string_01/string_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/string_01/string_01.3.query.sqlpp
@@ -17,15 +17,42 @@
* under the License.
*/
-use test;
+let
+test = [
+ 'true',
+ 'false"',
+ int8('8'),
+ int16('16'),
+ int32('32'),
+ int64('64'),
+ float('1.25'),
+ double('2.5'),
+ true,
+ false,
+ datetime('2020-01-02T03:04:05Z'),
+ date('2021-01-02'),
+ time('01:02:03'),
+ duration('P30Y10M25DT13H12M50S'),
+ year_month_duration('P2Y'),
+ day_time_duration('P4S'),
+ uuid('02a199ca-bf58-412e-bd9f-60a0c975a8ac'),
+ base64('0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM+/')
+],
+testNull = [
+ null,
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
-{
- 'string1':test.string('true'),
- 'string2':test.string('false"'),
- 'string3':test.string(test.int8('8')),
- 'string4':test.string(test.int16('16')),
- 'string5':test.string(test.int32('32')),
- 'string6':test.string(test.int64('64')),
- 'string7':test.string(test.float('1.25')),
- 'string8':test.string(test.double('2.5'))
-};
+select 0 g, i, string(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, string(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, string(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/string_02/string_02.1.query.sqlpp
similarity index 87%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/string_02/string_02.1.query.sqlpp
index a9fb88e..006fa13 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_03/uuid_03.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/string_02/string_02.1.query.sqlpp
@@ -17,4 +17,10 @@
* under the License.
*/
-uuid('12345'); // Invalid length
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": string([]),
+ "null_1": string({})
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/time_01/time_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/time_01/time_01.3.query.sqlpp
index 1395d7d..24d2aad 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/time_01/time_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/time_01/time_01.3.query.sqlpp
@@ -17,19 +17,50 @@
* under the License.
*/
-use test;
+let
+test = [
+ '10:50:56.200+05:00',
+ '10:50:56.200-10:15',
+ '10:50:56',
+ '10:50:56.200Z',
+ '23:59:59.999-13:30',
+ '00:00:00.000+14:45',
+ '12:59:00.019-01:00',
+ '12:59:00.01-01:00',
+ '12:59:00.019-01:00',
+ '12590001-0100',
+ '125900019+0100',
+ test.time('125900019+0100'),
+ datetime('2010-10-30T01:02:03Z')
+],
+testNull = [
+ null,
+ false,
+ true,
+ '@#!',
+ int8(0),
+ int16(0),
+ int32(0),
+ int64(0),
+ float(0),
+ double(0),
+ date('2020-01-02'),
+ duration('PT0H'),
+ year_month_duration('P0Y0M'),
+ day_time_duration('P0D'),
+ [],
+ {}
+],
+testMissing = [
+ missing
+]
-{
- 'time1':test.time('10:50:56.200+05:00'),
- 'time2':test.time('10:50:56.200-10:15'),
- 'time3':test.time('10:50:56'),
- 'time4':test.time('10:50:56.200Z'),
- 'time5':test.time('23:59:59.999-13:30'),
- 'time6':test.time('00:00:00.000+14:45'),
- 'time7':test.time('12:59:00.019-01:00'),
- 'time8':test.time('12:59:00.01-01:00'),
- 'time9':test.time('12:59:00.019-01:00'),
- 'time10':test.time('12590001-0100'),
- 'time11':test.time('125900019+0100'),
- 'time12':test.time(test.time('125900019+0100'))
-};
+select 0 g, i, time(test[i]) actual
+from range(0, len(test)-1) i
+union all
+select 1 g, i, null expected, time(testNull[i]) actual
+from range(0, len(testNull)-1) i
+union all
+select 2 g, i, true expected, time(testMissing[i]) is missing actual
+from range(0, len(testMissing)-1) i
+order by g, i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/time_02/time_02.1.query.sqlpp
similarity index 78%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/time_02/time_02.1.query.sqlpp
index dbf9050..dbdcbc1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/duration_02/duration_02.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/time_02/time_02.1.query.sqlpp
@@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-/*
- * Description : test sub type duration (year_month_duration and day_time_duration) constructors
- * Expected Res : Success
- * Date : 7 May 2013
- * issue : 363
- */
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": time("@#!"),
+ "null_1": time(false),
+ "null_2": time(0),
+ "null_3": time(date("2020-01-02")),
+ "null_4": time([]),
+ "null_5": time({})
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.3.query.sqlpp
index 53d24c5..8bb6cda 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_01/uuid_01.3.query.sqlpp
@@ -17,8 +17,6 @@
* under the License.
*/
-use test;
-
{
'uuid1':test.uuid('02a199ca-bf58-412e-bd9f-60a0c975a8ac'),
'uuid2':test.uuid('8cea25ab-55f8-467e-929d-94888f754832'),
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_02/uuid_02.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_02/uuid_02.1.query.sqlpp
index a11fd8b..944830f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_02/uuid_02.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/constructor/uuid/uuid_02/uuid_02.1.query.sqlpp
@@ -17,4 +17,11 @@
* under the License.
*/
-uuid('02a199ca-bf58-412e-bd9f-60a0c975a8a-'); // Invalid format
+// requesttype=application/json
+// param max-warnings:json=100
+
+{
+ "null_0": uuid('02a199ca-bf58-412e-bd9f-60a0c975a8a-'), // Invalid format -> NULL
+ "null_1": uuid('12345') // Invalid length -> NULL
+};
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_bigint_02/to_bigint_02.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_bigint_02/to_bigint_02.1.query.sqlpp
index 13f482f..f83710f9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_bigint_02/to_bigint_02.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_bigint_02/to_bigint_02.1.query.sqlpp
@@ -16,6 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
+
+// requesttype=application/json
+// param max-warnings:json=100
+
{
"t": to_bigint(date("2017-06-30"))
}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_boolean_02/to_boolean_02.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_boolean_02/to_boolean_02.1.query.sqlpp
index 5be147e..78bc0d2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_boolean_02/to_boolean_02.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_boolean_02/to_boolean_02.1.query.sqlpp
@@ -16,6 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
+
+// requesttype=application/json
+// param max-warnings:json=100
+
{
"t": to_boolean(date("2017-06-30"))
}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_double_02/to_double_02.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_double_02/to_double_02.1.query.sqlpp
index 4a31e1c..78baae8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_double_02/to_double_02.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_double_02/to_double_02.1.query.sqlpp
@@ -16,6 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
+
+// requesttype=application/json
+// param max-warnings:json=100
+
{
"t": to_double(date("2017-06-30"))
}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_number_02/to_number_02.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_number_02/to_number_02.1.query.sqlpp
index 837750e..45190af 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_number_02/to_number_02.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_number_02/to_number_02.1.query.sqlpp
@@ -16,6 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
+
+// requesttype=application/json
+// param max-warnings:json=100
+
{
"t": to_number(date("2017-06-30"))
}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_string_02/to_string_02.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_string_02/to_string_02.1.query.sqlpp
index cdfec14..3075bf4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_string_02/to_string_02.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/to_string_02/to_string_02.1.query.sqlpp
@@ -16,6 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
+
+// requesttype=application/json
+// param max-warnings:json=100
+
{
"t": to_string(date("2017-06-30"))
}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_01/binary_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_01/binary_01.1.adm
index 7e08562..d5883d1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_01/binary_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_01/binary_01.1.adm
@@ -1 +1,20 @@
-[ hex("ABCDEF0123456789"), hex("ABCDEF0123456789"), hex("0A0B0C0D0E0F"), hex("01020304050607080900"), hex(""), hex("ABCDEF0123456789"), hex("D35DB7E39EBBF3DAB07ABB72BA2A296AC75F8218E4973C5CBDB9E64161114D850838F2CA2471850D20195C254134CFBF"), hex(""), hex("41737465726978"), hex("4173746572697801"), hex("41737465726978013C"), hex("41737465726978013C") ]
+{ "g": 0, "i": 0, "actual": hex("ABCDEF0123456789") }
+{ "g": 0, "i": 1, "actual": hex("ABCDEF0123456789") }
+{ "g": 0, "i": 2, "actual": hex("0A0B0C0D0E0F") }
+{ "g": 0, "i": 3, "actual": hex("01020304050607080900") }
+{ "g": 0, "i": 4, "actual": hex("") }
+{ "g": 0, "i": 5, "actual": hex("ABCDEF0123456789") }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 1, "i": 10, "expected": null, "actual": null }
+{ "g": 1, "i": 11, "expected": null, "actual": null }
+{ "g": 1, "i": 12, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_01/binary_01.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_01/binary_01.2.adm
new file mode 100644
index 0000000..4f206b3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_01/binary_01.2.adm
@@ -0,0 +1,20 @@
+{ "g": 0, "i": 0, "actual": hex("D35DB7E39EBBF3DAB07ABB72BA2A296AC75F8218E4973C5CBDB9E64161114D850838F2CA2471850D20195C254134CFBF") }
+{ "g": 0, "i": 1, "actual": hex("") }
+{ "g": 0, "i": 2, "actual": hex("41737465726978") }
+{ "g": 0, "i": 3, "actual": hex("4173746572697801") }
+{ "g": 0, "i": 4, "actual": hex("41737465726978013C") }
+{ "g": 0, "i": 5, "actual": hex("41737465726978013C") }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 1, "i": 10, "expected": null, "actual": null }
+{ "g": 1, "i": 11, "expected": null, "actual": null }
+{ "g": 1, "i": 12, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_02/binary_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_02/binary_02.1.adm
new file mode 100644
index 0000000..c01ae82
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_02/binary_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_02/binary_02.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_02/binary_02.2.adm
new file mode 100644
index 0000000..c01ae82
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/binary_02/binary_02.2.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/boolean_01/boolean_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/boolean_01/boolean_01.1.adm
index fd25362..65a40c1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/boolean_01/boolean_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/boolean_01/boolean_01.1.adm
@@ -1 +1,42 @@
-{ "boolean1": true, "boolean2": false, "boolean3": false }
+{ "g": 0, "i": 0, "expected": false, "actual": false }
+{ "g": 0, "i": 1, "expected": false, "actual": false }
+{ "g": 0, "i": 2, "expected": false, "actual": false }
+{ "g": 0, "i": 3, "expected": false, "actual": false }
+{ "g": 0, "i": 4, "expected": false, "actual": false }
+{ "g": 0, "i": 5, "expected": false, "actual": false }
+{ "g": 0, "i": 6, "expected": false, "actual": false }
+{ "g": 0, "i": 7, "expected": false, "actual": false }
+{ "g": 0, "i": 8, "expected": false, "actual": false }
+{ "g": 0, "i": 9, "expected": false, "actual": false }
+{ "g": 0, "i": 10, "expected": false, "actual": false }
+{ "g": 1, "i": 0, "expected": true, "actual": true }
+{ "g": 1, "i": 1, "expected": true, "actual": true }
+{ "g": 1, "i": 2, "expected": true, "actual": true }
+{ "g": 1, "i": 3, "expected": true, "actual": true }
+{ "g": 1, "i": 4, "expected": true, "actual": true }
+{ "g": 1, "i": 5, "expected": true, "actual": true }
+{ "g": 1, "i": 6, "expected": true, "actual": true }
+{ "g": 1, "i": 7, "expected": true, "actual": true }
+{ "g": 1, "i": 8, "expected": true, "actual": true }
+{ "g": 1, "i": 9, "expected": true, "actual": true }
+{ "g": 1, "i": 10, "expected": true, "actual": true }
+{ "g": 1, "i": 11, "expected": true, "actual": true }
+{ "g": 1, "i": 12, "expected": true, "actual": true }
+{ "g": 1, "i": 13, "expected": true, "actual": true }
+{ "g": 1, "i": 14, "expected": true, "actual": true }
+{ "g": 1, "i": 15, "expected": true, "actual": true }
+{ "g": 2, "i": 0, "expected": null, "actual": null }
+{ "g": 2, "i": 1, "expected": null, "actual": null }
+{ "g": 2, "i": 2, "expected": null, "actual": null }
+{ "g": 2, "i": 3, "expected": null, "actual": null }
+{ "g": 2, "i": 4, "expected": null, "actual": null }
+{ "g": 2, "i": 5, "expected": null, "actual": null }
+{ "g": 2, "i": 6, "expected": null, "actual": null }
+{ "g": 2, "i": 7, "expected": null, "actual": null }
+{ "g": 2, "i": 8, "expected": null, "actual": null }
+{ "g": 2, "i": 9, "expected": null, "actual": null }
+{ "g": 2, "i": 10, "expected": null, "actual": null }
+{ "g": 2, "i": 11, "expected": null, "actual": null }
+{ "g": 2, "i": 12, "expected": null, "actual": null }
+{ "g": 2, "i": 13, "expected": null, "actual": null }
+{ "g": 3, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/boolean_02/boolean_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/boolean_02/boolean_02.1.adm
new file mode 100644
index 0000000..adb44f0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/boolean_02/boolean_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/date_01/date_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/date_01/date_01.1.adm
index 527fc91..3b7f63c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/date_01/date_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/date_01/date_01.1.adm
@@ -1 +1,29 @@
-{ "date1": date("2010-10-30"), "date2": date("1987-11-19"), "date3": date("-1987-11-19"), "date4": date("0001-12-27"), "date5": date("-1951-12-27"), "date6": date("-2043-11-19"), "date7": date("-1928-03-29"), "date8": date("1928-03-29"), "date9": date("1900-02-28"), "date10": date("2000-02-29"), "date11": date("2000-02-29") }
+{ "g": 0, "i": 0, "actual": date("2010-10-30") }
+{ "g": 0, "i": 1, "actual": date("1987-11-19") }
+{ "g": 0, "i": 2, "actual": date("-1987-11-19") }
+{ "g": 0, "i": 3, "actual": date("0001-12-27") }
+{ "g": 0, "i": 4, "actual": date("-1951-12-27") }
+{ "g": 0, "i": 5, "actual": date("-2043-11-19") }
+{ "g": 0, "i": 6, "actual": date("-1928-03-29") }
+{ "g": 0, "i": 7, "actual": date("1928-03-29") }
+{ "g": 0, "i": 8, "actual": date("1900-02-28") }
+{ "g": 0, "i": 9, "actual": date("2000-02-29") }
+{ "g": 0, "i": 10, "actual": date("2000-02-29") }
+{ "g": 0, "i": 11, "actual": date("2010-10-30") }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 1, "i": 10, "expected": null, "actual": null }
+{ "g": 1, "i": 11, "expected": null, "actual": null }
+{ "g": 1, "i": 12, "expected": null, "actual": null }
+{ "g": 1, "i": 13, "expected": null, "actual": null }
+{ "g": 1, "i": 14, "expected": null, "actual": null }
+{ "g": 1, "i": 15, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/date_02/date_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/date_02/date_02.1.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/date_02/date_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/datetime_01/datetime_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/datetime_01/datetime_01.1.adm
index ad50e30..7a8589d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/datetime_01/datetime_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/datetime_01/datetime_01.1.adm
@@ -1 +1,31 @@
-{ "datetime1": datetime("2010-10-30T05:05:56.999Z"), "datetime2": datetime("2010-10-30T20:30:56.250Z"), "datetime3": datetime("1987-11-19T09:20:00.200Z"), "datetime4": datetime("1987-11-19T10:50:56.000Z"), "datetime5": datetime("-1987-11-19T16:20:56.099Z"), "datetime6": datetime("-0001-11-19T10:50:56.719Z"), "datetime7": datetime("1951-12-27T12:20:15.000Z"), "datetime8": datetime("2043-11-19T10:50:56.719Z"), "datetime9": datetime("-1928-03-30T00:19:37.374Z"), "datetime10": datetime("-1928-03-29T11:19:37.374Z"), "datetime11": datetime("-1928-03-29T17:49:37.374Z"), "datetime12": datetime("-1928-03-29T11:19:37.374Z"), "datetime13": datetime("-1928-03-29T11:19:37.370Z"), "datetime14": datetime("-1928-02-29T23:19:37.370Z"), "datetime15": datetime("-1928-02-29T23:19:37.370Z") }
+{ "g": 0, "i": 0, "actual": datetime("2010-10-30T05:05:56.999Z") }
+{ "g": 0, "i": 1, "actual": datetime("2010-10-30T20:30:56.250Z") }
+{ "g": 0, "i": 2, "actual": datetime("1987-11-19T09:20:00.200Z") }
+{ "g": 0, "i": 3, "actual": datetime("1987-11-19T10:50:56.000Z") }
+{ "g": 0, "i": 4, "actual": datetime("-1987-11-19T16:20:56.099Z") }
+{ "g": 0, "i": 5, "actual": datetime("-0001-11-19T10:50:56.719Z") }
+{ "g": 0, "i": 6, "actual": datetime("1951-12-27T12:20:15.000Z") }
+{ "g": 0, "i": 7, "actual": datetime("2043-11-19T10:50:56.719Z") }
+{ "g": 0, "i": 8, "actual": datetime("-1928-03-30T00:19:37.374Z") }
+{ "g": 0, "i": 9, "actual": datetime("-1928-03-29T11:19:37.374Z") }
+{ "g": 0, "i": 10, "actual": datetime("-1928-03-29T17:49:37.374Z") }
+{ "g": 0, "i": 11, "actual": datetime("-1928-03-29T11:19:37.374Z") }
+{ "g": 0, "i": 12, "actual": datetime("-1928-03-29T11:19:37.370Z") }
+{ "g": 0, "i": 13, "actual": datetime("-1928-02-29T23:19:37.370Z") }
+{ "g": 0, "i": 14, "actual": datetime("-1928-02-29T23:19:37.370Z") }
+{ "g": 0, "i": 15, "actual": datetime("2020-01-02T00:00:00.000Z") }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 1, "i": 10, "expected": null, "actual": null }
+{ "g": 1, "i": 11, "expected": null, "actual": null }
+{ "g": 1, "i": 12, "expected": null, "actual": null }
+{ "g": 1, "i": 13, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/datetime_02/datetime_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/datetime_02/datetime_02.1.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/datetime_02/datetime_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/double_01/double_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/double_01/double_01.1.adm
index 0f1f5df..9d4a13a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/double_01/double_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/double_01/double_01.1.adm
@@ -1 +1,25 @@
-{ "double1": NaN, "double2": INF, "double3": -INF, "double4": -80.2, "double5": -2.056E-29, "double6": -2.056E-299, "double7": -2.056E-299 }
+{ "g": 0, "i": 0, "actual": NaN }
+{ "g": 0, "i": 1, "actual": INF }
+{ "g": 0, "i": 2, "actual": -INF }
+{ "g": 0, "i": 3, "actual": -80.2 }
+{ "g": 0, "i": 4, "actual": -2.056E-29 }
+{ "g": 0, "i": 5, "actual": -2.056E-299 }
+{ "g": 0, "i": 6, "actual": -2.056E-299 }
+{ "g": 0, "i": 7, "actual": 8.0 }
+{ "g": 0, "i": 8, "actual": 16.0 }
+{ "g": 0, "i": 9, "actual": 32.0 }
+{ "g": 0, "i": 10, "actual": 64.0 }
+{ "g": 0, "i": 11, "actual": 2.5 }
+{ "g": 0, "i": 12, "actual": 0.0 }
+{ "g": 0, "i": 13, "actual": 1.0 }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/double_02/double_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/double_02/double_02.1.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/double_02/double_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.1.adm
index bba1507..b47b786 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.1.adm
@@ -1 +1,31 @@
-{ "duration1": duration("P30Y10M25DT13H12M50S"), "duration2": duration("P25DT13H12M50S"), "duration3": duration("PT13H12M50S"), "duration4": duration("P30YT12M"), "duration5": duration("PT13H"), "duration6": duration("-P30Y10M25DT13H12M50S"), "duration7": duration("-P25DT13H12M50S"), "duration8": duration("-PT13H50S"), "duration9": duration("P120D"), "duration10": duration("-P2Y4M"), "duration11": duration("PT30M30.937S"), "duration12": duration("P301Y3M72DT13H46M2.435S"), "duration13": duration("P301Y3M72DT13H46M2.435S") }
+{ "g": 0, "i": 0, "actual": duration("P30Y10M25DT13H12M50S") }
+{ "g": 0, "i": 1, "actual": duration("P25DT13H12M50S") }
+{ "g": 0, "i": 2, "actual": duration("PT13H12M50S") }
+{ "g": 0, "i": 3, "actual": duration("P30YT12M") }
+{ "g": 0, "i": 4, "actual": duration("PT13H") }
+{ "g": 0, "i": 5, "actual": duration("-P30Y10M25DT13H12M50S") }
+{ "g": 0, "i": 6, "actual": duration("-P25DT13H12M50S") }
+{ "g": 0, "i": 7, "actual": duration("-PT13H50S") }
+{ "g": 0, "i": 8, "actual": duration("P120D") }
+{ "g": 0, "i": 9, "actual": duration("-P2Y4M") }
+{ "g": 0, "i": 10, "actual": duration("PT30M30.937S") }
+{ "g": 0, "i": 11, "actual": duration("P301Y3M72DT13H46M2.435S") }
+{ "g": 0, "i": 12, "actual": duration("P301Y3M72DT13H46M2.435S") }
+{ "g": 0, "i": 13, "actual": duration("P30Y10M") }
+{ "g": 0, "i": 14, "actual": duration("P25DT13H12M50S") }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 1, "i": 10, "expected": null, "actual": null }
+{ "g": 1, "i": 11, "expected": null, "actual": null }
+{ "g": 1, "i": 12, "expected": null, "actual": null }
+{ "g": 1, "i": 13, "expected": null, "actual": null }
+{ "g": 1, "i": 14, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.2.adm
new file mode 100644
index 0000000..74c4b24
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.2.adm
@@ -0,0 +1,24 @@
+{ "g": 0, "i": 0, "actual": year-month-duration("P30Y10M") }
+{ "g": 0, "i": 1, "actual": year-month-duration("P30Y") }
+{ "g": 0, "i": 2, "actual": year-month-duration("-P30Y10M") }
+{ "g": 0, "i": 3, "actual": year-month-duration("-P2Y4M") }
+{ "g": 0, "i": 4, "actual": year-month-duration("P301Y3M") }
+{ "g": 0, "i": 5, "actual": year-month-duration("P301Y3M") }
+{ "g": 0, "i": 6, "actual": year-month-duration("P301Y4M") }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 1, "i": 10, "expected": null, "actual": null }
+{ "g": 1, "i": 11, "expected": null, "actual": null }
+{ "g": 1, "i": 12, "expected": null, "actual": null }
+{ "g": 1, "i": 13, "expected": null, "actual": null }
+{ "g": 1, "i": 14, "expected": null, "actual": null }
+{ "g": 1, "i": 15, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.3.adm
new file mode 100644
index 0000000..2f93b82
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_01/duration_01.3.adm
@@ -0,0 +1,26 @@
+{ "g": 0, "i": 0, "actual": day-time-duration("P25DT13H12M50S") }
+{ "g": 0, "i": 1, "actual": day-time-duration("PT13H12M50S") }
+{ "g": 0, "i": 2, "actual": day-time-duration("PT13H") }
+{ "g": 0, "i": 3, "actual": day-time-duration("-P25DT13H12M50S") }
+{ "g": 0, "i": 4, "actual": day-time-duration("-PT13H50S") }
+{ "g": 0, "i": 5, "actual": day-time-duration("P120D") }
+{ "g": 0, "i": 6, "actual": day-time-duration("PT30M30.937S") }
+{ "g": 0, "i": 7, "actual": day-time-duration("PT14H") }
+{ "g": 0, "i": 8, "actual": day-time-duration("P3DT4H5M6S") }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 1, "i": 10, "expected": null, "actual": null }
+{ "g": 1, "i": 11, "expected": null, "actual": null }
+{ "g": 1, "i": 12, "expected": null, "actual": null }
+{ "g": 1, "i": 13, "expected": null, "actual": null }
+{ "g": 1, "i": 14, "expected": null, "actual": null }
+{ "g": 1, "i": 15, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.1.adm
index f9e89d9..a7601ae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.1.adm
@@ -1 +1 @@
-{ "duration1": year-month-duration("P30Y10M"), "duration2": day-time-duration("P25DT13H12M50S"), "duration3": day-time-duration("PT13H12M50S"), "duration4": year-month-duration("P30Y"), "duration5": day-time-duration("PT13H"), "duration6": year-month-duration("-P30Y10M"), "duration7": day-time-duration("-P25DT13H12M50S"), "duration8": day-time-duration("-PT13H50S"), "duration9": day-time-duration("P120D"), "duration10": year-month-duration("-P2Y4M"), "duration11": day-time-duration("PT30M30.937S"), "duration12": year-month-duration("P301Y3M"), "duration13": year-month-duration("P301Y3M") }
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null, "null_6": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.2.adm
new file mode 100644
index 0000000..a7601ae
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.2.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null, "null_6": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.3.adm
new file mode 100644
index 0000000..a7601ae
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/duration_02/duration_02.3.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null, "null_6": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/float_01/float_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/float_01/float_01.1.adm
index 722697d..25f84ae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/float_01/float_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/float_01/float_01.1.adm
@@ -1 +1,24 @@
-{ "float1": NaN, "float2": INF, "float3": -INF, "float4": -80.2, "float5": -2.056E-29, "float6": -2.056E-29 }
+{ "g": 0, "i": 0, "actual": NaN }
+{ "g": 0, "i": 1, "actual": INF }
+{ "g": 0, "i": 2, "actual": -INF }
+{ "g": 0, "i": 3, "actual": -80.2 }
+{ "g": 0, "i": 4, "actual": -2.056E-29 }
+{ "g": 0, "i": 5, "actual": -2.056E-29 }
+{ "g": 0, "i": 6, "actual": 8.0 }
+{ "g": 0, "i": 7, "actual": 16.0 }
+{ "g": 0, "i": 8, "actual": 32.0 }
+{ "g": 0, "i": 9, "actual": 64.0 }
+{ "g": 0, "i": 10, "actual": 2.5 }
+{ "g": 0, "i": 11, "actual": 0.0 }
+{ "g": 0, "i": 12, "actual": 1.0 }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/float_02/float_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/float_02/float_02.1.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/float_02/float_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.1.adm
index 7945209..23d680c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.1.adm
@@ -1 +1,21 @@
-{ "int8": 80, "int16": 160, "int32": 320, "int64": 640, "int8_2": -80, "int16_2": -160, "int32_2": -320, "int64_2": -640, "int64_min": -9223372036854775808, "int8_3": 80, "int16_3": 160, "int32_3": 320, "int64_3": 640 }
+{ "g": 0, "i": 0, "actual": 80 }
+{ "g": 0, "i": 1, "actual": -80 }
+{ "g": 0, "i": 2, "actual": 80 }
+{ "g": 0, "i": 3, "actual": 16 }
+{ "g": 0, "i": 4, "actual": 32 }
+{ "g": 0, "i": 5, "actual": 64 }
+{ "g": 0, "i": 6, "actual": 1 }
+{ "g": 0, "i": 7, "actual": 2 }
+{ "g": 0, "i": 8, "actual": 0 }
+{ "g": 0, "i": 9, "actual": 1 }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.2.adm
new file mode 100644
index 0000000..9266743
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.2.adm
@@ -0,0 +1,21 @@
+{ "g": 0, "i": 0, "actual": 160 }
+{ "g": 0, "i": 1, "actual": -160 }
+{ "g": 0, "i": 2, "actual": 160 }
+{ "g": 0, "i": 3, "actual": 8 }
+{ "g": 0, "i": 4, "actual": 32 }
+{ "g": 0, "i": 5, "actual": 64 }
+{ "g": 0, "i": 6, "actual": 1 }
+{ "g": 0, "i": 7, "actual": 2 }
+{ "g": 0, "i": 8, "actual": 0 }
+{ "g": 0, "i": 9, "actual": 1 }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.3.adm
new file mode 100644
index 0000000..94f478b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.3.adm
@@ -0,0 +1,21 @@
+{ "g": 0, "i": 0, "actual": 320 }
+{ "g": 0, "i": 1, "actual": -320 }
+{ "g": 0, "i": 2, "actual": 320 }
+{ "g": 0, "i": 3, "actual": 8 }
+{ "g": 0, "i": 4, "actual": 16 }
+{ "g": 0, "i": 5, "actual": 64 }
+{ "g": 0, "i": 6, "actual": 1 }
+{ "g": 0, "i": 7, "actual": 2 }
+{ "g": 0, "i": 8, "actual": 0 }
+{ "g": 0, "i": 9, "actual": 1 }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.4.adm
new file mode 100644
index 0000000..fa67c50
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_01/int_01.4.adm
@@ -0,0 +1,22 @@
+{ "g": 0, "i": 0, "actual": 640 }
+{ "g": 0, "i": 1, "actual": -640 }
+{ "g": 0, "i": 2, "actual": -9223372036854775808 }
+{ "g": 0, "i": 3, "actual": 640 }
+{ "g": 0, "i": 4, "actual": 8 }
+{ "g": 0, "i": 5, "actual": 16 }
+{ "g": 0, "i": 6, "actual": 32 }
+{ "g": 0, "i": 7, "actual": 1 }
+{ "g": 0, "i": 8, "actual": 2 }
+{ "g": 0, "i": 9, "actual": 0 }
+{ "g": 0, "i": 10, "actual": 1 }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.1.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.2.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.2.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.3.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.3.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.4.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/int_02/int_02.4.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/string_01/string_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/string_01/string_01.1.adm
index 068d061..be85da9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/string_01/string_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/string_01/string_01.1.adm
@@ -1 +1,22 @@
-{ "string1": "true", "string2": "false\"", "string3": "8", "string4": "16", "string5": "32", "string6": "64", "string7": "1.25", "string8": "2.5" }
+{ "g": 0, "i": 0, "actual": "true" }
+{ "g": 0, "i": 1, "actual": "false\"" }
+{ "g": 0, "i": 2, "actual": "8" }
+{ "g": 0, "i": 3, "actual": "16" }
+{ "g": 0, "i": 4, "actual": "32" }
+{ "g": 0, "i": 5, "actual": "64" }
+{ "g": 0, "i": 6, "actual": "1.25" }
+{ "g": 0, "i": 7, "actual": "2.5" }
+{ "g": 0, "i": 8, "actual": "true" }
+{ "g": 0, "i": 9, "actual": "false" }
+{ "g": 0, "i": 10, "actual": "2020-01-02T03:04:05.000Z" }
+{ "g": 0, "i": 11, "actual": "2021-01-02" }
+{ "g": 0, "i": 12, "actual": "01:02:03.000" }
+{ "g": 0, "i": 13, "actual": "P30Y10M25DT13H12M50S" }
+{ "g": 0, "i": 14, "actual": "P2Y" }
+{ "g": 0, "i": 15, "actual": "PT4S" }
+{ "g": 0, "i": 16, "actual": "02a199ca-bf58-412e-bd9f-60a0c975a8ac" }
+{ "g": 0, "i": 17, "actual": "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM+/" }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/string_02/string_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/string_02/string_02.1.adm
new file mode 100644
index 0000000..746523d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/string_02/string_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/time_01/time_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/time_01/time_01.1.adm
index ade4e3b..b78f310 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/time_01/time_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/time_01/time_01.1.adm
@@ -1 +1,30 @@
-{ "time1": time("05:50:56.200Z"), "time2": time("21:05:56.200Z"), "time3": time("10:50:56.000Z"), "time4": time("10:50:56.200Z"), "time5": time("13:29:59.999Z"), "time6": time("09:15:00.000Z"), "time7": time("13:59:00.019Z"), "time8": time("13:59:00.010Z"), "time9": time("13:59:00.019Z"), "time10": time("13:59:00.010Z"), "time11": time("11:59:00.019Z"), "time12": time("11:59:00.019Z") }
+{ "g": 0, "i": 0, "actual": time("05:50:56.200Z") }
+{ "g": 0, "i": 1, "actual": time("21:05:56.200Z") }
+{ "g": 0, "i": 2, "actual": time("10:50:56.000Z") }
+{ "g": 0, "i": 3, "actual": time("10:50:56.200Z") }
+{ "g": 0, "i": 4, "actual": time("13:29:59.999Z") }
+{ "g": 0, "i": 5, "actual": time("09:15:00.000Z") }
+{ "g": 0, "i": 6, "actual": time("13:59:00.019Z") }
+{ "g": 0, "i": 7, "actual": time("13:59:00.010Z") }
+{ "g": 0, "i": 8, "actual": time("13:59:00.019Z") }
+{ "g": 0, "i": 9, "actual": time("13:59:00.010Z") }
+{ "g": 0, "i": 10, "actual": time("11:59:00.019Z") }
+{ "g": 0, "i": 11, "actual": time("11:59:00.019Z") }
+{ "g": 0, "i": 12, "actual": time("00:00:14.912Z") }
+{ "g": 1, "i": 0, "expected": null, "actual": null }
+{ "g": 1, "i": 1, "expected": null, "actual": null }
+{ "g": 1, "i": 2, "expected": null, "actual": null }
+{ "g": 1, "i": 3, "expected": null, "actual": null }
+{ "g": 1, "i": 4, "expected": null, "actual": null }
+{ "g": 1, "i": 5, "expected": null, "actual": null }
+{ "g": 1, "i": 6, "expected": null, "actual": null }
+{ "g": 1, "i": 7, "expected": null, "actual": null }
+{ "g": 1, "i": 8, "expected": null, "actual": null }
+{ "g": 1, "i": 9, "expected": null, "actual": null }
+{ "g": 1, "i": 10, "expected": null, "actual": null }
+{ "g": 1, "i": 11, "expected": null, "actual": null }
+{ "g": 1, "i": 12, "expected": null, "actual": null }
+{ "g": 1, "i": 13, "expected": null, "actual": null }
+{ "g": 1, "i": 14, "expected": null, "actual": null }
+{ "g": 1, "i": 15, "expected": null, "actual": null }
+{ "g": 2, "i": 0, "expected": true, "actual": true }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/time_02/time_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/time_02/time_02.1.adm
new file mode 100644
index 0000000..4d80977
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/time_02/time_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null, "null_2": null, "null_3": null, "null_4": null, "null_5": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/uuid/uuid_02/uuid_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/uuid/uuid_02/uuid_02.1.adm
new file mode 100644
index 0000000..746523d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/constructor/uuid/uuid_02/uuid_02.1.adm
@@ -0,0 +1 @@
+{ "null_0": null, "null_1": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_bigint_02/to_bigint_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_bigint_02/to_bigint_02.1.adm
new file mode 100644
index 0000000..ef236da
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_bigint_02/to_bigint_02.1.adm
@@ -0,0 +1 @@
+{ "t": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_boolean_02/to_boolean_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_boolean_02/to_boolean_02.1.adm
new file mode 100644
index 0000000..ef236da
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_boolean_02/to_boolean_02.1.adm
@@ -0,0 +1 @@
+{ "t": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_double_02/to_double_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_double_02/to_double_02.1.adm
new file mode 100644
index 0000000..ef236da
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_double_02/to_double_02.1.adm
@@ -0,0 +1 @@
+{ "t": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_string_02/to_string_02.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_string_02/to_string_02.1.adm
new file mode 100644
index 0000000..97101cc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/to_string_02/to_string_02.1.adm
@@ -0,0 +1 @@
+{ "t": "2017-06-30" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/binary_01/binary_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/binary_01/binary_01.3.ast
index a4d112a..62a4c3a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/binary_01/binary_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/binary_01/binary_01.3.ast
@@ -1,44 +1,157 @@
-DataverseUse test
Query:
-OrderedListConstructor [
- FunctionCall asterix.hex@1[
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
LiteralExpr [STRING] [ABCDEF0123456789]
- ]
- FunctionCall asterix.hex@1[
LiteralExpr [STRING] [abcdef0123456789]
- ]
- FunctionCall asterix.hex@1[
LiteralExpr [STRING] [0A0B0C0D0E0F]
- ]
- FunctionCall asterix.hex@1[
LiteralExpr [STRING] [01020304050607080900]
- ]
- FunctionCall asterix.hex@1[
LiteralExpr [STRING] []
- ]
- FunctionCall asterix.hex@1[
FunctionCall asterix.hex@1[
LiteralExpr [STRING] [ABCDEF0123456789]
]
]
- FunctionCall asterix.base64@1[
- LiteralExpr [STRING] [0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM+/]
- ]
- FunctionCall asterix.base64@1[
- LiteralExpr [STRING] []
- ]
- FunctionCall asterix.base64@1[
- LiteralExpr [STRING] [QXN0ZXJpeA==]
- ]
- FunctionCall asterix.base64@1[
- LiteralExpr [STRING] [QXN0ZXJpeAE=]
- ]
- FunctionCall asterix.base64@1[
- LiteralExpr [STRING] [QXN0ZXJpeAE8]
- ]
- FunctionCall asterix.base64@1[
- FunctionCall asterix.base64@1[
- LiteralExpr [STRING] [QXN0ZXJpeAE8]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-01]
+ ]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [2020-01-01T00:00:00Z]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [00:00:00]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
]
]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.hex@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.hex@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.hex@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/binary_01/binary_01.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/binary_01/binary_01.4.ast
new file mode 100644
index 0000000..0705c45
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/binary_01/binary_01.4.ast
@@ -0,0 +1,157 @@
+Query:
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM+/]
+ LiteralExpr [STRING] []
+ LiteralExpr [STRING] [QXN0ZXJpeA==]
+ LiteralExpr [STRING] [QXN0ZXJpeAE=]
+ LiteralExpr [STRING] [QXN0ZXJpeAE8]
+ FunctionCall asterix.base64@1[
+ LiteralExpr [STRING] [QXN0ZXJpeAE8]
+ ]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-01]
+ ]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [2020-01-01T00:00:00Z]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [00:00:00]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.base64@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.base64@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.base64@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/boolean_01/boolean_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/boolean_01/boolean_01.3.ast
index f2b6571..70dceef 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/boolean_01/boolean_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/boolean_01/boolean_01.3.ast
@@ -1,27 +1,259 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [boolean1]
- :
- FunctionCall asterix.boolean@1[
- LiteralExpr [STRING] [true]
- ]
- )
- (
- LiteralExpr [STRING] [boolean2]
- :
+Let Variable [ Name=$testFalse ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [FALSE]
FunctionCall asterix.boolean@1[
LiteralExpr [STRING] [false]
]
- )
- (
- LiteralExpr [STRING] [boolean3]
- :
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [STRING] [NaN]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [STRING] [NaN]
+ ]
+ LiteralExpr [STRING] [false]
+ ]
+Let Variable [ Name=$testTrue ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [TRUE]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [1]
+ ]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [2]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [1]
+ ]
+ FunctionCall asterix.int16@1[
+ - LiteralExpr [LONG] [1]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [1]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [2]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [1]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [3]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [1]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [STRING] [INF]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [STRING] [-INF]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [1]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [STRING] [INF]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [STRING] [-INF]
+ ]
+ LiteralExpr [STRING] [true]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [TRUE]
+ LiteralExpr [STRING] [FALSE]
+ LiteralExpr [STRING] [abc]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [1970-01-01]
+ ]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1970-01-01T00:00:00Z]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [00:00:00]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ OrderedListConstructor [
+ ]
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ ]
+ RecordConstructor [
+ ]
+ RecordConstructor [
+ (
+ LiteralExpr [STRING] [a]
+ :
+ LiteralExpr [NULL]
+ )
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [FALSE]
+ expected
FunctionCall asterix.boolean@1[
- FunctionCall asterix.boolean@1[
- LiteralExpr [STRING] [false]
+ IndexAccessor [
+ Variable [ Name=$testFalse ]
+ Index: Variable [ Name=$i ]
]
]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testFalse ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall asterix.boolean@1[
+ IndexAccessor [
+ Variable [ Name=$testTrue ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testTrue ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.boolean@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [3]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.boolean@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
)
+ AS Variable [ Name=#1 ]
]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/date_01/date_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/date_01/date_01.3.ast
index 93eda8c..38dce16 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/date_01/date_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/date_01/date_01.3.ast
@@ -1,83 +1,170 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [date1]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [2010-10-30]
- ]
- )
- (
- LiteralExpr [STRING] [date2]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [1987-11-19]
- ]
- )
- (
- LiteralExpr [STRING] [date3]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [-1987-11-19]
- ]
- )
- (
- LiteralExpr [STRING] [date4]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [0001-12-27]
- ]
- )
- (
- LiteralExpr [STRING] [date5]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [-1951-12-27]
- ]
- )
- (
- LiteralExpr [STRING] [date6]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [-2043-11-19]
- ]
- )
- (
- LiteralExpr [STRING] [date7]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [-19280329]
- ]
- )
- (
- LiteralExpr [STRING] [date8]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [19280329]
- ]
- )
- (
- LiteralExpr [STRING] [date9]
- :
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [19000228]
- ]
- )
- (
- LiteralExpr [STRING] [date10]
- :
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [2010-10-30]
+ LiteralExpr [STRING] [1987-11-19]
+ LiteralExpr [STRING] [-1987-11-19]
+ LiteralExpr [STRING] [0001-12-27]
+ LiteralExpr [STRING] [-1951-12-27]
+ LiteralExpr [STRING] [-2043-11-19]
+ LiteralExpr [STRING] [-19280329]
+ LiteralExpr [STRING] [19280329]
+ LiteralExpr [STRING] [19000228]
+ LiteralExpr [STRING] [20000229]
FunctionCall asterix.date@1[
LiteralExpr [STRING] [20000229]
]
- )
- (
- LiteralExpr [STRING] [date11]
- :
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [2010-10-30T01:02:03Z]
+ ]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
FunctionCall asterix.date@1[
- FunctionCall asterix.date@1[
- LiteralExpr [STRING] [20000229]
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
]
]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.date@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.date@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
)
+ AS Variable [ Name=#1 ]
]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/datetime_01/datetime_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/datetime_01/datetime_01.3.ast
index cbe87ec..b348fda 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/datetime_01/datetime_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/datetime_01/datetime_01.3.ast
@@ -1,111 +1,170 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [datetime1]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [2010-10-30T10:50:56.999+05:45]
- ]
- )
- (
- LiteralExpr [STRING] [datetime2]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [2010-10-30T10:30:56.250-10:00]
- ]
- )
- (
- LiteralExpr [STRING] [datetime3]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [1987-11-19T09:20:00.200Z]
- ]
- )
- (
- LiteralExpr [STRING] [datetime4]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [1987-11-19T10:50:56Z]
- ]
- )
- (
- LiteralExpr [STRING] [datetime5]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [-1987-11-19T10:50:56.099-05:30]
- ]
- )
- (
- LiteralExpr [STRING] [datetime6]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [-0001-11-19T10:50:56.719Z]
- ]
- )
- (
- LiteralExpr [STRING] [datetime7]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [1951-12-27T12:20:15Z]
- ]
- )
- (
- LiteralExpr [STRING] [datetime8]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [2043-11-19T10:50:56.719Z]
- ]
- )
- (
- LiteralExpr [STRING] [datetime9]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [-19280329T174937374-0630]
- ]
- )
- (
- LiteralExpr [STRING] [datetime10]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [-19280329T174937374+0630]
- ]
- )
- (
- LiteralExpr [STRING] [datetime11]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [-19280329T174937374]
- ]
- )
- (
- LiteralExpr [STRING] [datetime12]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [-19280329T174937374+0630]
- ]
- )
- (
- LiteralExpr [STRING] [datetime13]
- :
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [-19280329T17493737+0630]
- ]
- )
- (
- LiteralExpr [STRING] [datetime14]
- :
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [2010-10-30T10:50:56.999+05:45]
+ LiteralExpr [STRING] [2010-10-30T10:30:56.250-10:00]
+ LiteralExpr [STRING] [1987-11-19T09:20:00.200Z]
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ LiteralExpr [STRING] [-1987-11-19T10:50:56.099-05:30]
+ LiteralExpr [STRING] [-0001-11-19T10:50:56.719Z]
+ LiteralExpr [STRING] [1951-12-27T12:20:15Z]
+ LiteralExpr [STRING] [2043-11-19T10:50:56.719Z]
+ LiteralExpr [STRING] [-19280329T174937374-0630]
+ LiteralExpr [STRING] [-19280329T174937374+0630]
+ LiteralExpr [STRING] [-19280329T174937374]
+ LiteralExpr [STRING] [-19280329T174937374+0630]
+ LiteralExpr [STRING] [-19280329T17493737+0630]
+ LiteralExpr [STRING] [-19280301T05493737+0630]
FunctionCall asterix.datetime@1[
LiteralExpr [STRING] [-19280301T05493737+0630]
]
- )
- (
- LiteralExpr [STRING] [datetime15]
- :
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
FunctionCall asterix.datetime@1[
- FunctionCall asterix.datetime@1[
- LiteralExpr [STRING] [-19280301T05493737+0630]
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
]
]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.datetime@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.datetime@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
)
+ AS Variable [ Name=#1 ]
]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/double_01/double_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/double_01/double_01.3.ast
index ef36c04..70bfa5e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/double_01/double_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/double_01/double_01.3.ast
@@ -1,55 +1,166 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [double1]
- :
- FunctionCall asterix.double@1[
- LiteralExpr [STRING] [NaN]
- ]
- )
- (
- LiteralExpr [STRING] [double2]
- :
- FunctionCall asterix.double@1[
- LiteralExpr [STRING] [INF]
- ]
- )
- (
- LiteralExpr [STRING] [double3]
- :
- FunctionCall asterix.double@1[
- LiteralExpr [STRING] [-INF]
- ]
- )
- (
- LiteralExpr [STRING] [double4]
- :
- FunctionCall asterix.double@1[
- LiteralExpr [STRING] [-80.20d]
- ]
- )
- (
- LiteralExpr [STRING] [double5]
- :
- FunctionCall asterix.double@1[
- LiteralExpr [STRING] [-20.56e-30]
- ]
- )
- (
- LiteralExpr [STRING] [double6]
- :
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [NaN]
+ LiteralExpr [STRING] [INF]
+ LiteralExpr [STRING] [-INF]
+ LiteralExpr [STRING] [-80.20d]
+ LiteralExpr [STRING] [-20.56e-30]
+ LiteralExpr [STRING] [-20.56e-300]
FunctionCall asterix.double@1[
LiteralExpr [STRING] [-20.56e-300]
]
- )
- (
- LiteralExpr [STRING] [double7]
- :
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [8]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [16]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [32]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [64]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [DOUBLE] [2.5]
+ ]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
FunctionCall asterix.double@1[
- FunctionCall asterix.double@1[
- LiteralExpr [STRING] [-20.56e-300]
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
]
]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.double@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.double@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
)
+ AS Variable [ Name=#1 ]
]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.3.ast
index d65e33c..3b037bd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.3.ast
@@ -1,97 +1,172 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [duration1]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [P30Y10M25DT13H12M50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration2]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [P25DT13H12M50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration3]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [PT13H12M50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration4]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [P30YT12MS]
- ]
- )
- (
- LiteralExpr [STRING] [duration5]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [PT13H]
- ]
- )
- (
- LiteralExpr [STRING] [duration6]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [-P30Y10M25DT13H12M50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration7]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [-P25DT13H12M50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration8]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [-PT13H50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration9]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [P120D]
- ]
- )
- (
- LiteralExpr [STRING] [duration10]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [-P28M]
- ]
- )
- (
- LiteralExpr [STRING] [duration11]
- :
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [PT29M90.937S]
- ]
- )
- (
- LiteralExpr [STRING] [duration12]
- :
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [P30Y10M25DT13H12M50S]
+ LiteralExpr [STRING] [P25DT13H12M50S]
+ LiteralExpr [STRING] [PT13H12M50S]
+ LiteralExpr [STRING] [P30YT12MS]
+ LiteralExpr [STRING] [PT13H]
+ LiteralExpr [STRING] [-P30Y10M25DT13H12M50S]
+ LiteralExpr [STRING] [-P25DT13H12M50S]
+ LiteralExpr [STRING] [-PT13H50S]
+ LiteralExpr [STRING] [P120D]
+ LiteralExpr [STRING] [-P28M]
+ LiteralExpr [STRING] [PT29M90.937S]
+ LiteralExpr [STRING] [P300Y15M60DT300H98M482.435S]
FunctionCall asterix.duration@1[
LiteralExpr [STRING] [P300Y15M60DT300H98M482.435S]
]
- )
- (
- LiteralExpr [STRING] [duration13]
- :
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P30Y10M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P25DT13H12M50S]
+ ]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
FunctionCall asterix.duration@1[
- FunctionCall asterix.duration@1[
- LiteralExpr [STRING] [P300Y15M60DT300H98M482.435S]
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
]
]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.duration@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.duration@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
)
+ AS Variable [ Name=#1 ]
]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.4.ast
new file mode 100644
index 0000000..d1f7bc6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.4.ast
@@ -0,0 +1,165 @@
+Query:
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [P30Y10M]
+ LiteralExpr [STRING] [P30Y]
+ LiteralExpr [STRING] [-P30Y10M]
+ LiteralExpr [STRING] [-P28M]
+ LiteralExpr [STRING] [P300Y15M]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P300Y15M]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [P300Y16M60DT300H98M482.435S]
+ ]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P25DT13H12M50S]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.year-month-duration@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.year-month-duration@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.year-month-duration@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.5.ast
new file mode 100644
index 0000000..7d8f323
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_01/duration_01.5.ast
@@ -0,0 +1,167 @@
+Query:
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [P25DT13H12M50S]
+ LiteralExpr [STRING] [PT13H12M50S]
+ LiteralExpr [STRING] [PT13H]
+ LiteralExpr [STRING] [-P25DT13H12M50S]
+ LiteralExpr [STRING] [-PT13H50S]
+ LiteralExpr [STRING] [P120D]
+ LiteralExpr [STRING] [PT29M90.937S]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [PT14H]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [P1Y2M3DT4H5M6S]
+ ]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P1Y]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.day-time-duration@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.day-time-duration@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.day-time-duration@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.1.ast
deleted file mode 100644
index e69de29..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.1.ast
+++ /dev/null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.2.ast
deleted file mode 100644
index e69de29..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.2.ast
+++ /dev/null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.3.ast
deleted file mode 100644
index e615b56..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/duration_02/duration_02.3.ast
+++ /dev/null
@@ -1,97 +0,0 @@
-DataverseUse test
-Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [duration1]
- :
- FunctionCall asterix.year-month-duration@1[
- LiteralExpr [STRING] [P30Y10M]
- ]
- )
- (
- LiteralExpr [STRING] [duration2]
- :
- FunctionCall asterix.day-time-duration@1[
- LiteralExpr [STRING] [P25DT13H12M50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration3]
- :
- FunctionCall asterix.day-time-duration@1[
- LiteralExpr [STRING] [PT13H12M50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration4]
- :
- FunctionCall asterix.year-month-duration@1[
- LiteralExpr [STRING] [P30Y]
- ]
- )
- (
- LiteralExpr [STRING] [duration5]
- :
- FunctionCall asterix.day-time-duration@1[
- LiteralExpr [STRING] [PT13H]
- ]
- )
- (
- LiteralExpr [STRING] [duration6]
- :
- FunctionCall asterix.year-month-duration@1[
- LiteralExpr [STRING] [-P30Y10M]
- ]
- )
- (
- LiteralExpr [STRING] [duration7]
- :
- FunctionCall asterix.day-time-duration@1[
- LiteralExpr [STRING] [-P25DT13H12M50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration8]
- :
- FunctionCall asterix.day-time-duration@1[
- LiteralExpr [STRING] [-PT13H50S]
- ]
- )
- (
- LiteralExpr [STRING] [duration9]
- :
- FunctionCall asterix.day-time-duration@1[
- LiteralExpr [STRING] [P120D]
- ]
- )
- (
- LiteralExpr [STRING] [duration10]
- :
- FunctionCall asterix.year-month-duration@1[
- LiteralExpr [STRING] [-P28M]
- ]
- )
- (
- LiteralExpr [STRING] [duration11]
- :
- FunctionCall asterix.day-time-duration@1[
- LiteralExpr [STRING] [PT29M90.937S]
- ]
- )
- (
- LiteralExpr [STRING] [duration12]
- :
- FunctionCall asterix.year-month-duration@1[
- LiteralExpr [STRING] [P300Y15M]
- ]
- )
- (
- LiteralExpr [STRING] [duration13]
- :
- FunctionCall asterix.year-month-duration@1[
- FunctionCall asterix.year-month-duration@1[
- LiteralExpr [STRING] [P300Y15M]
- ]
- ]
- )
-]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/float_01/float_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/float_01/float_01.3.ast
index 6a8e42b..bf2f7e3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/float_01/float_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/float_01/float_01.3.ast
@@ -1,48 +1,165 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [float1]
- :
- FunctionCall asterix.float@1[
- LiteralExpr [STRING] [NaN]
- ]
- )
- (
- LiteralExpr [STRING] [float2]
- :
- FunctionCall asterix.float@1[
- LiteralExpr [STRING] [INF]
- ]
- )
- (
- LiteralExpr [STRING] [float3]
- :
- FunctionCall asterix.float@1[
- LiteralExpr [STRING] [-INF]
- ]
- )
- (
- LiteralExpr [STRING] [float4]
- :
- FunctionCall asterix.float@1[
- LiteralExpr [STRING] [-80.20]
- ]
- )
- (
- LiteralExpr [STRING] [float5]
- :
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [NaN]
+ LiteralExpr [STRING] [INF]
+ LiteralExpr [STRING] [-INF]
+ LiteralExpr [STRING] [-80.20]
+ LiteralExpr [STRING] [-20.56e-30]
FunctionCall asterix.float@1[
LiteralExpr [STRING] [-20.56e-30]
]
- )
- (
- LiteralExpr [STRING] [float6]
- :
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [8]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [16]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [32]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [64]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [DOUBLE] [2.5]
+ ]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
FunctionCall asterix.float@1[
- FunctionCall asterix.float@1[
- LiteralExpr [STRING] [-20.56e-30]
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
]
]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.float@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.float@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
)
+ AS Variable [ Name=#1 ]
]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.3.ast
index e346cec..7e5840a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.3.ast
@@ -1,103 +1,162 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [int8]
- :
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [+80i8]
+ LiteralExpr [STRING] [-80]
FunctionCall asterix.int8@1[
LiteralExpr [STRING] [+80i8]
]
- )
- (
- LiteralExpr [STRING] [int16]
- :
FunctionCall asterix.int16@1[
- LiteralExpr [STRING] [160]
+ LiteralExpr [LONG] [16]
]
- )
- (
- LiteralExpr [STRING] [int32]
- :
FunctionCall asterix.int32@1[
- LiteralExpr [STRING] [+320i32]
+ LiteralExpr [LONG] [32]
]
- )
- (
- LiteralExpr [STRING] [int64]
- :
FunctionCall asterix.int64@1[
- LiteralExpr [STRING] [640]
+ LiteralExpr [LONG] [64]
]
- )
- (
- LiteralExpr [STRING] [int8_2]
- :
- FunctionCall asterix.int8@1[
- LiteralExpr [STRING] [-80]
+ FunctionCall asterix.float@1[
+ LiteralExpr [DOUBLE] [1.25]
]
- )
- (
- LiteralExpr [STRING] [int16_2]
- :
- FunctionCall asterix.int16@1[
- LiteralExpr [STRING] [-160i16]
+ FunctionCall asterix.double@1[
+ LiteralExpr [DOUBLE] [2.25]
]
- )
- (
- LiteralExpr [STRING] [int32_2]
- :
- FunctionCall asterix.int32@1[
- LiteralExpr [STRING] [-320]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
]
- )
- (
- LiteralExpr [STRING] [int64_2]
- :
- FunctionCall asterix.int64@1[
- LiteralExpr [STRING] [-640i64]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
]
- )
- (
- LiteralExpr [STRING] [int64_min]
- :
- FunctionCall asterix.int64@1[
- LiteralExpr [STRING] [-9223372036854775808]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
]
- )
- (
- LiteralExpr [STRING] [int8_3]
- :
- FunctionCall asterix.int8@1[
- FunctionCall asterix.int8@1[
- LiteralExpr [STRING] [+80i8]
- ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
]
- )
- (
- LiteralExpr [STRING] [int16_3]
- :
- FunctionCall asterix.int16@1[
- FunctionCall asterix.int16@1[
- LiteralExpr [STRING] [160]
- ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
]
- )
- (
- LiteralExpr [STRING] [int32_3]
- :
- FunctionCall asterix.int32@1[
- FunctionCall asterix.int32@1[
- LiteralExpr [STRING] [+320i32]
- ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
]
- )
- (
- LiteralExpr [STRING] [int64_3]
- :
- FunctionCall asterix.int64@1[
- FunctionCall asterix.int64@1[
- LiteralExpr [STRING] [640]
- ]
+ OrderedListConstructor [
]
- )
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.int8@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.int8@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.int8@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.4.ast
new file mode 100644
index 0000000..c901269
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.4.ast
@@ -0,0 +1,162 @@
+Query:
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [160]
+ LiteralExpr [STRING] [-160i16]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [STRING] [160]
+ ]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [8]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [32]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [64]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [DOUBLE] [1.25]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [DOUBLE] [2.25]
+ ]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.int16@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.int16@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.int16@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.5.ast
new file mode 100644
index 0000000..f3fa67c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.5.ast
@@ -0,0 +1,162 @@
+Query:
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [+320i32]
+ LiteralExpr [STRING] [-320]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [STRING] [+320i32]
+ ]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [8]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [16]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [64]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [DOUBLE] [1.25]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [DOUBLE] [2.25]
+ ]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.int32@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.int32@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.int32@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.6.ast
new file mode 100644
index 0000000..2c793b6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/int_01/int_01.6.ast
@@ -0,0 +1,163 @@
+Query:
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [640]
+ LiteralExpr [STRING] [-640i64]
+ LiteralExpr [STRING] [-9223372036854775808]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [STRING] [640]
+ ]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [8]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [16]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [32]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [DOUBLE] [1.25]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [DOUBLE] [2.25]
+ ]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [1987-11-19T10:50:56Z]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.int64@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.int64@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.int64@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/string_01/string_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/string_01/string_01.3.ast
index 2696db5..5c6e26f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/string_01/string_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/string_01/string_01.3.ast
@@ -1,72 +1,167 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [string1]
- :
- FunctionCall asterix.string@1[
- LiteralExpr [STRING] [true]
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [true]
+ LiteralExpr [STRING] [false"]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [STRING] [8]
]
- )
- (
- LiteralExpr [STRING] [string2]
- :
- FunctionCall asterix.string@1[
- LiteralExpr [STRING] [false"]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [STRING] [16]
]
- )
- (
- LiteralExpr [STRING] [string3]
- :
- FunctionCall asterix.string@1[
- FunctionCall asterix.int8@1[
- LiteralExpr [STRING] [8]
- ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [STRING] [32]
]
- )
- (
- LiteralExpr [STRING] [string4]
- :
- FunctionCall asterix.string@1[
- FunctionCall asterix.int16@1[
- LiteralExpr [STRING] [16]
- ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [STRING] [64]
]
- )
- (
- LiteralExpr [STRING] [string5]
- :
- FunctionCall asterix.string@1[
- FunctionCall asterix.int32@1[
- LiteralExpr [STRING] [32]
- ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [STRING] [1.25]
]
- )
- (
- LiteralExpr [STRING] [string6]
- :
- FunctionCall asterix.string@1[
- FunctionCall asterix.int64@1[
- LiteralExpr [STRING] [64]
- ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [STRING] [2.5]
]
- )
- (
- LiteralExpr [STRING] [string7]
- :
- FunctionCall asterix.string@1[
- FunctionCall asterix.float@1[
- LiteralExpr [STRING] [1.25]
- ]
+ LiteralExpr [TRUE]
+ LiteralExpr [FALSE]
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [2020-01-02T03:04:05Z]
]
- )
- (
- LiteralExpr [STRING] [string8]
- :
- FunctionCall asterix.string@1[
- FunctionCall asterix.double@1[
- LiteralExpr [STRING] [2.5]
- ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2021-01-02]
]
- )
+ FunctionCall asterix.time@1[
+ LiteralExpr [STRING] [01:02:03]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [P30Y10M25DT13H12M50S]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P2Y]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P4S]
+ ]
+ FunctionCall asterix.uuid@1[
+ LiteralExpr [STRING] [02a199ca-bf58-412e-bd9f-60a0c975a8ac]
+ ]
+ FunctionCall asterix.base64@1[
+ LiteralExpr [STRING] [0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM+/]
+ ]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
+ FunctionCall asterix.string@1[
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.string@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.string@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ )
+ AS Variable [ Name=#1 ]
+]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/time_01/time_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/time_01/time_01.3.ast
index 6c688cb..5eb4fb1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/time_01/time_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/constructor/time_01/time_01.3.ast
@@ -1,90 +1,171 @@
-DataverseUse test
Query:
-RecordConstructor [
- (
- LiteralExpr [STRING] [time1]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [10:50:56.200+05:00]
- ]
- )
- (
- LiteralExpr [STRING] [time2]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [10:50:56.200-10:15]
- ]
- )
- (
- LiteralExpr [STRING] [time3]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [10:50:56]
- ]
- )
- (
- LiteralExpr [STRING] [time4]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [10:50:56.200Z]
- ]
- )
- (
- LiteralExpr [STRING] [time5]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [23:59:59.999-13:30]
- ]
- )
- (
- LiteralExpr [STRING] [time6]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [00:00:00.000+14:45]
- ]
- )
- (
- LiteralExpr [STRING] [time7]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [12:59:00.019-01:00]
- ]
- )
- (
- LiteralExpr [STRING] [time8]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [12:59:00.01-01:00]
- ]
- )
- (
- LiteralExpr [STRING] [time9]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [12:59:00.019-01:00]
- ]
- )
- (
- LiteralExpr [STRING] [time10]
- :
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [12590001-0100]
- ]
- )
- (
- LiteralExpr [STRING] [time11]
- :
+Let Variable [ Name=$test ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [STRING] [10:50:56.200+05:00]
+ LiteralExpr [STRING] [10:50:56.200-10:15]
+ LiteralExpr [STRING] [10:50:56]
+ LiteralExpr [STRING] [10:50:56.200Z]
+ LiteralExpr [STRING] [23:59:59.999-13:30]
+ LiteralExpr [STRING] [00:00:00.000+14:45]
+ LiteralExpr [STRING] [12:59:00.019-01:00]
+ LiteralExpr [STRING] [12:59:00.01-01:00]
+ LiteralExpr [STRING] [12:59:00.019-01:00]
+ LiteralExpr [STRING] [12590001-0100]
+ LiteralExpr [STRING] [125900019+0100]
FunctionCall asterix.time@1[
LiteralExpr [STRING] [125900019+0100]
]
- )
- (
- LiteralExpr [STRING] [time12]
- :
+ FunctionCall asterix.datetime@1[
+ LiteralExpr [STRING] [2010-10-30T01:02:03Z]
+ ]
+ ]
+Let Variable [ Name=$testNull ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [NULL]
+ LiteralExpr [FALSE]
+ LiteralExpr [TRUE]
+ LiteralExpr [STRING] [@#!]
+ FunctionCall asterix.int8@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int16@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int32@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.int64@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.float@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.double@1[
+ LiteralExpr [LONG] [0]
+ ]
+ FunctionCall asterix.date@1[
+ LiteralExpr [STRING] [2020-01-02]
+ ]
+ FunctionCall asterix.duration@1[
+ LiteralExpr [STRING] [PT0H]
+ ]
+ FunctionCall asterix.year-month-duration@1[
+ LiteralExpr [STRING] [P0Y0M]
+ ]
+ FunctionCall asterix.day-time-duration@1[
+ LiteralExpr [STRING] [P0D]
+ ]
+ OrderedListConstructor [
+ ]
+ RecordConstructor [
+ ]
+ ]
+Let Variable [ Name=$testMissing ]
+ :=
+ OrderedListConstructor [
+ LiteralExpr [MISSING]
+ ]
+SELECT ELEMENT [
+Variable [ Name=#1 ]
+]
+FROM [ (
+ SELECT [
+ LiteralExpr [LONG] [0]
+ g
+ Variable [ Name=$i ]
+ i
FunctionCall asterix.time@1[
- FunctionCall asterix.time@1[
- LiteralExpr [STRING] [125900019+0100]
+ IndexAccessor [
+ Variable [ Name=$test ]
+ Index: Variable [ Name=$i ]
]
]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$test ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [1]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [NULL]
+ expected
+ FunctionCall asterix.time@1[
+ IndexAccessor [
+ Variable [ Name=$testNull ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testNull ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
+ UNION
+ SELECT [
+ LiteralExpr [LONG] [2]
+ g
+ Variable [ Name=$i ]
+ i
+ LiteralExpr [TRUE]
+ expected
+ FunctionCall algebricks.is-missing@1[
+ FunctionCall asterix.time@1[
+ IndexAccessor [
+ Variable [ Name=$testMissing ]
+ Index: Variable [ Name=$i ]
+ ]
+ ]
+ ]
+ actual
+ ]
+ FROM [ FunctionCall asterix.range@2[
+ LiteralExpr [LONG] [0]
+ OperatorExpr [
+ FunctionCall asterix.len@1[
+ Variable [ Name=$testMissing ]
+ ]
+ -
+ LiteralExpr [LONG] [1]
+ ]
+ ]
+ AS Variable [ Name=$i ]
+ ]
)
+ AS Variable [ Name=#1 ]
]
+Orderby
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=g
+ ]
+ ASC
+ FieldAccessor [
+ Variable [ Name=#1 ]
+ Field=i
+ ]
+ ASC
+
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 402d353..72ad331 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -3586,6 +3586,19 @@
<output-dir compare="Text">binary_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="binary_02">
+ <output-dir compare="Text">binary_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for binary in @#!1 (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: hex() cannot process input type date (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: hex() cannot process input type array (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: hex() cannot process input type object (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0006: Invalid format for binary in @#!2 (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: base64() cannot process input type date (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: base64() cannot process input type array (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: base64() cannot process input type object (in line 27, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor">
<compilation-unit name="add-null">
<output-dir compare="Text">add-null</output-dir>
@@ -3596,6 +3609,16 @@
<output-dir compare="Text">boolean_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="boolean_02">
+ <output-dir compare="Text">boolean_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for boolean in FALSE (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0006: Invalid format for boolean in TRUE (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: boolean() cannot process input type date (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: boolean() cannot process input type array (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: boolean() cannot process input type object (in line 28, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor">
<compilation-unit name="circle_01">
<output-dir compare="Text">circle_01</output-dir>
@@ -3606,24 +3629,78 @@
<output-dir compare="Text">date_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="date_02">
+ <output-dir compare="Text">date_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for date in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: date() cannot process input type boolean (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: date() cannot process input type bigint (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: date() cannot process input type time (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: date() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: date() cannot process input type object (in line 29, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor">
<compilation-unit name="datetime_01">
<output-dir compare="Text">datetime_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="datetime_02">
+ <output-dir compare="Text">datetime_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for datetime in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: datetime() cannot process input type boolean (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: datetime() cannot process input type bigint (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: datetime() cannot process input type time (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: datetime() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: datetime() cannot process input type object (in line 29, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor">
<compilation-unit name="double_01">
<output-dir compare="Text">double_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="double_02">
+ <output-dir compare="Text">double_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for double in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: double() cannot process input type datetime (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: double() cannot process input type date (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: double() cannot process input type time (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: double() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: double() cannot process input type object (in line 29, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor">
<compilation-unit name="duration_01">
<output-dir compare="Text">duration_01</output-dir>
</compilation-unit>
</test-case>
- <test-case FilePath="constructor">
+ <test-case FilePath="constructor" check-warnings="true">
<compilation-unit name="duration_02">
<output-dir compare="Text">duration_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for duration in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: duration() cannot process input type bigint (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: duration() cannot process input type datetime (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: duration() cannot process input type date (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: duration() cannot process input type time (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: duration() cannot process input type array (in line 29, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: duration() cannot process input type object (in line 30, at column 13)</expected-warn>
+ <expected-warn>ASX0006: Invalid format for yearmonthduration in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: year-month-duration() cannot process input type bigint (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: year-month-duration() cannot process input type datetime (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: year-month-duration() cannot process input type date (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: year-month-duration() cannot process input type time (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: year-month-duration() cannot process input type array (in line 29, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: year-month-duration() cannot process input type object (in line 30, at column 13)</expected-warn>
+ <expected-warn>ASX0006: Invalid format for daytimeduration in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: day-time-duration() cannot process input type bigint (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: day-time-duration() cannot process input type datetime (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: day-time-duration() cannot process input type date (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: day-time-duration() cannot process input type time (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: day-time-duration() cannot process input type array (in line 29, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: day-time-duration() cannot process input type object (in line 30, at column 13)</expected-warn>
</compilation-unit>
</test-case>
<test-case FilePath="constructor">
@@ -3631,11 +3708,51 @@
<output-dir compare="Text">float_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="float_02">
+ <output-dir compare="Text">float_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for float in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: float() cannot process input type datetime (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: float() cannot process input type date (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: float() cannot process input type time (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: float() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: float() cannot process input type object (in line 29, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor">
<compilation-unit name="int_01">
<output-dir compare="Text">int_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="int_02">
+ <output-dir compare="Text">int_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for tinyint in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int8() cannot process input type datetime (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int8() cannot process input type date (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int8() cannot process input type time (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int8() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int8() cannot process input type object (in line 29, at column 13)</expected-warn>
+ <expected-warn>ASX0006: Invalid format for smallint in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int16() cannot process input type datetime (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int16() cannot process input type date (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int16() cannot process input type time (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int16() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int16() cannot process input type object (in line 29, at column 13)</expected-warn>
+ <expected-warn>ASX0006: Invalid format for integer in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int32() cannot process input type datetime (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int32() cannot process input type date (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int32() cannot process input type time (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int32() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int32() cannot process input type object (in line 29, at column 13)</expected-warn>
+ <expected-warn>ASX0006: Invalid format for bigint in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int64() cannot process input type datetime (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int64() cannot process input type date (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int64() cannot process input type time (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int64() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: int64() cannot process input type object (in line 29, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor">
<compilation-unit name="interval">
<output-dir compare="Text">interval</output-dir>
@@ -3686,26 +3803,39 @@
<output-dir compare="Text">string_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="string_02">
+ <output-dir compare="Text">string_02</output-dir>
+ <expected-warn>ASX0004: Unsupported type: string() cannot process input type array (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: string() cannot process input type object (in line 25, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor">
<compilation-unit name="time_01">
<output-dir compare="Text">time_01</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="constructor" check-warnings="true">
+ <compilation-unit name="time_02">
+ <output-dir compare="Text">time_02</output-dir>
+ <expected-warn>ASX0006: Invalid format for time in @#! (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: time() cannot process input type boolean (in line 25, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: time() cannot process input type bigint (in line 26, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: time() cannot process input type date (in line 27, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: time() cannot process input type array (in line 28, at column 13)</expected-warn>
+ <expected-warn>ASX0004: Unsupported type: time() cannot process input type object (in line 29, at column 13)</expected-warn>
+ </compilation-unit>
+ </test-case>
<test-case FilePath="constructor/uuid">
<compilation-unit name="uuid_01">
<output-dir compare="Text">uuid_01</output-dir>
</compilation-unit>
</test-case>
- <test-case FilePath="constructor/uuid">
+ <test-case FilePath="constructor/uuid" check-warnings="true">
<compilation-unit name="uuid_02">
<output-dir compare="Text">uuid_02</output-dir>
- <expected-error>Invalid format for uuid in 02a199ca-bf58-412e-bd9f-60a0c975a8a-</expected-error>
- </compilation-unit>
- </test-case>
- <test-case FilePath="constructor/uuid">
- <compilation-unit name="uuid_03">
- <output-dir compare="Text">uuid_03</output-dir>
- <expected-error>Invalid format for uuid in 12345</expected-error>
+ <expected-warn>ASX0006: Invalid format for uuid in 02a199ca-bf58-412e-bd9f-60a0c975a8a- (in line 24, at column 13)</expected-warn>
+ <expected-warn>ASX0006: Invalid format for uuid in 12345 (in line 25, at column 13)</expected-warn>
</compilation-unit>
</test-case>
<test-case FilePath="constructor">
@@ -13877,10 +14007,10 @@
<output-dir compare="Text">to_boolean_01</output-dir>
</compilation-unit>
</test-case>
- <test-case FilePath="types">
+ <test-case FilePath="types" check-warnings="true">
<compilation-unit name="to_boolean_02">
<output-dir compare="Text">to_boolean_02</output-dir>
- <expected-error>ASX0002: Type mismatch</expected-error>
+ <expected-warn>ASX0004: Unsupported type: to-boolean() cannot process input type date (in line 24, at column 8)</expected-warn>
</compilation-unit>
</test-case>
<test-case FilePath="types">
@@ -13888,10 +14018,10 @@
<output-dir compare="Text">to_bigint_01</output-dir>
</compilation-unit>
</test-case>
- <test-case FilePath="types">
+ <test-case FilePath="types" check-warnings="true">
<compilation-unit name="to_bigint_02">
<output-dir compare="Text">to_bigint_02</output-dir>
- <expected-error>ASX0002: Type mismatch</expected-error>
+ <expected-warn>ASX0004: Unsupported type: to-bigint() cannot process input type date (in line 24, at column 7)</expected-warn>
</compilation-unit>
</test-case>
<test-case FilePath="types">
@@ -13899,10 +14029,10 @@
<output-dir compare="Text">to_double_01</output-dir>
</compilation-unit>
</test-case>
- <test-case FilePath="types">
+ <test-case FilePath="types" check-warnings="true">
<compilation-unit name="to_double_02">
<output-dir compare="Text">to_double_02</output-dir>
- <expected-error>ASX0002: Type mismatch</expected-error>
+ <expected-warn>ASX0004: Unsupported type: to-double() cannot process input type date (in line 24, at column 7)</expected-warn>
</compilation-unit>
</test-case>
<test-case FilePath="types">
@@ -13929,7 +14059,6 @@
<test-case FilePath="types">
<compilation-unit name="to_string_02">
<output-dir compare="Text">to_string_02</output-dir>
- <expected-error>ASX0004: Unsupported type</expected-error>
</compilation-unit>
</test-case>
<test-case FilePath="types">
@@ -13940,10 +14069,11 @@
<test-case FilePath="types">
<compilation-unit name="domain_boundaries_error">
<output-dir compare="Text">domain_boundaries_error</output-dir>
- <expected-error>ASX0006: Invalid format for int8 in tinyint</expected-error>
- <expected-error>ASX0006: Invalid format for int16 in smallint</expected-error>
- <expected-error>ASX0006: Invalid format for int32 in integer</expected-error>
- <expected-error>ASX0006: Invalid format for int64 in bigint</expected-error>
+ <expected-error>ASX0001: Field type null cannot be promoted to type tinyint</expected-error>
+ <expected-error>ASX0001: Field type null cannot be promoted to type smallint</expected-error>
+ <expected-error>ASX0001: Field type null cannot be promoted to type integer</expected-error>
+ <expected-error>ASX0001: Field type null cannot be promoted to type bigint</expected-error>
+ <source-location>false</source-location>
</compilation-unit>
</test-case>
</test-group>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp_parser.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp_parser.xml
index 7177797..aff0dcd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp_parser.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp_parser.xml
@@ -1123,11 +1123,6 @@
</compilation-unit>
</test-case>
<test-case FilePath="constructor">
- <compilation-unit name="duration_02">
- <output-dir compare="AST">duration_02</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="constructor">
<compilation-unit name="float_01">
<output-dir compare="AST">float_01</output-dir>
</compilation-unit>
@@ -1138,12 +1133,6 @@
</compilation-unit>
</test-case>
<test-case FilePath="constructor">
- <compilation-unit name="int_02">
- <expected-error>Syntax error: Could not parse numeric literal</expected-error>
- <output-dir compare="AST">int_01</output-dir>
- </compilation-unit>
- </test-case>
- <test-case FilePath="constructor">
<compilation-unit name="interval">
<output-dir compare="AST">interval</output-dir>
</compilation-unit>
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ABinarySerializerDeserializer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ABinarySerializerDeserializer.java
index 016a632..c7b8340 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ABinarySerializerDeserializer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ABinarySerializerDeserializer.java
@@ -25,6 +25,7 @@
import org.apache.asterix.om.base.ABinary;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.primitive.ByteArrayPointable;
import org.apache.hyracks.dataflow.common.data.marshalling.ByteArraySerializerDeserializer;
public class ABinarySerializerDeserializer implements ISerializerDeserializer<ABinary> {
@@ -44,4 +45,12 @@
public void serialize(ABinary binary, DataOutput out) throws HyracksDataException {
ByteArraySerializerDeserializer.serialize(binary.getBytes(), binary.getStart(), binary.getLength(), out);
}
+
+ public static int getContentLength(byte[] bytes, int offset) {
+ return ByteArrayPointable.getContentLength(bytes, offset);
+ }
+
+ public static int getMetaLength(int contentLength) {
+ return ByteArrayPointable.getNumberBytesToStoreMeta(contentLength);
+ }
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADateParserFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADateParserFactory.java
index a4abbd6..ce2be26 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADateParserFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADateParserFactory.java
@@ -18,8 +18,6 @@
*/
package org.apache.asterix.om.base.temporal;
-import static org.apache.asterix.om.base.temporal.GregorianCalendarSystem.CHRONON_OF_DAY;
-
import java.io.DataOutput;
import java.io.IOException;
@@ -354,7 +352,7 @@
*/
public static int parseDatePartInDays(String dateString, int start, int length) throws HyracksDataException {
long chronon = parseDatePart(dateString, start, length);
- return convertParsedMillisecondsToDays(chronon);
+ return GregorianCalendarSystem.getInstance().getChrononInDays(chronon);
}
/**
@@ -368,18 +366,6 @@
*/
public static int parseDatePartInDays(char[] dateString, int start, int length) throws HyracksDataException {
long chronon = parseDatePart(dateString, start, length);
- return convertParsedMillisecondsToDays(chronon);
- }
-
- public static int convertParsedMillisecondsToDays(long chronon) throws HyracksDataException {
- if (chronon >= 0) {
- return (int) (chronon / CHRONON_OF_DAY);
- } else {
- if (chronon % CHRONON_OF_DAY != 0) {
- return (int) (chronon / CHRONON_OF_DAY - 1);
- } else {
- return (int) (chronon / CHRONON_OF_DAY);
- }
- }
+ return GregorianCalendarSystem.getInstance().getChrononInDays(chronon);
}
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/GregorianCalendarSystem.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/GregorianCalendarSystem.java
index deb15c8c..e342e8c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/GregorianCalendarSystem.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/GregorianCalendarSystem.java
@@ -254,15 +254,8 @@
}
public int getChrononInDays(long chronon) {
- if (chronon >= 0) {
- return (int) (chronon / CHRONON_OF_DAY);
- } else {
- if (chronon % CHRONON_OF_DAY != 0) {
- return (int) (chronon / CHRONON_OF_DAY - 1);
- } else {
- return (int) (chronon / CHRONON_OF_DAY);
- }
- }
+ int temp = (chronon < 0) && (chronon % CHRONON_OF_DAY != 0) ? 1 : 0;
+ return (int) (chronon / CHRONON_OF_DAY - temp);
}
/**
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 a2e235e..bd3b216 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
@@ -1640,7 +1640,7 @@
// and then, Asterix builtin functions
addPrivateFunction(CHECK_UNKNOWN, NotUnknownTypeComputer.INSTANCE, true);
addPrivateFunction(ANY_COLLECTION_MEMBER, CollectionMemberResultType.INSTANCE_MISSABLE, true);
- addFunction(BOOLEAN_CONSTRUCTOR, ABooleanTypeComputer.INSTANCE, true);
+ addFunction(BOOLEAN_CONSTRUCTOR, ABooleanTypeComputer.INSTANCE_NULLABLE, true);
addFunction(CIRCLE_CONSTRUCTOR, ACircleTypeComputer.INSTANCE, true);
addPrivateFunction(CONCAT_NON_NULL, ConcatNonNullTypeComputer.INSTANCE, true);
addFunction(GROUPING, AInt64TypeComputer.INSTANCE, true);
@@ -1656,23 +1656,23 @@
addFunction(CREATE_UUID, AUUIDTypeComputer.INSTANCE, false);
addFunction(UUID, AUUIDTypeComputer.INSTANCE, false);
addPrivateFunction(CREATE_QUERY_UID, ABinaryTypeComputer.INSTANCE, false);
- addFunction(UUID_CONSTRUCTOR, AUUIDTypeComputer.INSTANCE, true);
+ addFunction(UUID_CONSTRUCTOR, AUUIDTypeComputer.INSTANCE_NULLABLE, true);
addFunction(RANDOM, ADoubleTypeComputer.INSTANCE, false);
addFunction(RANDOM_WITH_SEED, NumericUnaryTypeComputer.INSTANCE_DOUBLE, false);
- addFunction(DATE_CONSTRUCTOR, ADateTypeComputer.INSTANCE, true);
- addFunction(DATETIME_CONSTRUCTOR, ADateTimeTypeComputer.INSTANCE, true);
- addFunction(DOUBLE_CONSTRUCTOR, ADoubleTypeComputer.INSTANCE, true);
- addFunction(DURATION_CONSTRUCTOR, ADurationTypeComputer.INSTANCE, true);
- addFunction(YEAR_MONTH_DURATION_CONSTRUCTOR, AYearMonthDurationTypeComputer.INSTANCE, true);
- addFunction(DAY_TIME_DURATION_CONSTRUCTOR, ADayTimeDurationTypeComputer.INSTANCE, true);
+ addFunction(DATE_CONSTRUCTOR, ADateTypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(DATETIME_CONSTRUCTOR, ADateTimeTypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(DOUBLE_CONSTRUCTOR, ADoubleTypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(DURATION_CONSTRUCTOR, ADurationTypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(YEAR_MONTH_DURATION_CONSTRUCTOR, AYearMonthDurationTypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(DAY_TIME_DURATION_CONSTRUCTOR, ADayTimeDurationTypeComputer.INSTANCE_NULLABLE, true);
addFunction(EDIT_DISTANCE, AInt64TypeComputer.INSTANCE, true);
addFunction(EDIT_DISTANCE_CHECK, OrderedListOfAnyTypeComputer.INSTANCE, true);
addPrivateFunction(EDIT_DISTANCE_STRING_IS_FILTERABLE, ABooleanTypeComputer.INSTANCE, true);
addPrivateFunction(EDIT_DISTANCE_LIST_IS_FILTERABLE, ABooleanTypeComputer.INSTANCE, true);
addPrivateFunction(EMPTY_STREAM, ABooleanTypeComputer.INSTANCE, true);
- addFunction(FLOAT_CONSTRUCTOR, AFloatTypeComputer.INSTANCE, true);
+ addFunction(FLOAT_CONSTRUCTOR, AFloatTypeComputer.INSTANCE_NULLABLE, true);
addPrivateFunction(FUZZY_EQ, BooleanFunctionTypeComputer.INSTANCE, true);
addPrivateFunction(GET_HANDLE, AnyTypeComputer.INSTANCE, true);
addPrivateFunction(GET_ITEM, NonTaggedGetItemResultType.INSTANCE, true);
@@ -1681,10 +1681,10 @@
addPrivateFunction(HASHED_GRAM_TOKENS, OrderedListOfAInt32TypeComputer.INSTANCE, true);
addPrivateFunction(HASHED_WORD_TOKENS, OrderedListOfAInt32TypeComputer.INSTANCE, true);
addPrivateFunction(INDEX_SEARCH, AnyTypeComputer.INSTANCE, true);
- addFunction(INT8_CONSTRUCTOR, AInt8TypeComputer.INSTANCE, true);
- addFunction(INT16_CONSTRUCTOR, AInt16TypeComputer.INSTANCE, true);
- addFunction(INT32_CONSTRUCTOR, AInt32TypeComputer.INSTANCE, true);
- addFunction(INT64_CONSTRUCTOR, AInt64TypeComputer.INSTANCE, true);
+ addFunction(INT8_CONSTRUCTOR, AInt8TypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(INT16_CONSTRUCTOR, AInt16TypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(INT32_CONSTRUCTOR, AInt32TypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(INT64_CONSTRUCTOR, AInt64TypeComputer.INSTANCE_NULLABLE, true);
addFunction(LEN, AInt64TypeComputer.INSTANCE, true);
addFunction(LINE_CONSTRUCTOR, ALineTypeComputer.INSTANCE, true);
addPrivateFunction(MAKE_FIELD_INDEX_HANDLE, AnyTypeComputer.INSTANCE, true);
@@ -2210,8 +2210,8 @@
addFunction(ST_POLYGONIZE, AGeometryTypeComputer.INSTANCE, true);
// Binary functions
- addFunction(BINARY_HEX_CONSTRUCTOR, ABinaryTypeComputer.INSTANCE, true);
- addFunction(BINARY_BASE64_CONSTRUCTOR, ABinaryTypeComputer.INSTANCE, true);
+ addFunction(BINARY_HEX_CONSTRUCTOR, ABinaryTypeComputer.INSTANCE_NULLABLE, true);
+ addFunction(BINARY_BASE64_CONSTRUCTOR, ABinaryTypeComputer.INSTANCE_NULLABLE, true);
addPrivateFunction(SUBSET_COLLECTION, SubsetCollectionTypeComputer.INSTANCE, true);
addFunction(SWITCH_CASE, SwitchCaseComputer.INSTANCE, true);
@@ -2221,7 +2221,7 @@
addPrivateFunction(CAST_TYPE_LAX, CastTypeLaxComputer.INSTANCE, true);
addFunction(TID, AInt64TypeComputer.INSTANCE, true);
- addFunction(TIME_CONSTRUCTOR, ATimeTypeComputer.INSTANCE, true);
+ addFunction(TIME_CONSTRUCTOR, ATimeTypeComputer.INSTANCE_NULLABLE, true);
addPrivateFunction(TYPE_OF, AnyTypeComputer.INSTANCE, true);
addPrivateFunction(UNORDERED_LIST_CONSTRUCTOR, UnorderedListConstructorTypeComputer.INSTANCE, true);
addFunction(WORD_TOKENS, OrderedListOfAStringTypeComputer.INSTANCE, true);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ABinaryTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ABinaryTypeComputer.java
index 9332633..f60268a 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ABinaryTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ABinaryTypeComputer.java
@@ -19,21 +19,15 @@
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
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;
-public class ABinaryTypeComputer extends AbstractResultTypeComputer {
- public static final ABinaryTypeComputer INSTANCE = new ABinaryTypeComputer();
+public class ABinaryTypeComputer extends AbstractConstructorTypeComputer {
- private ABinaryTypeComputer() {
+ public static final ABinaryTypeComputer INSTANCE = new ABinaryTypeComputer(false);
- }
+ public static final ABinaryTypeComputer INSTANCE_NULLABLE = new ABinaryTypeComputer(true);
- @Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.ABINARY;
+ private ABinaryTypeComputer(boolean nullable) {
+ super(BuiltinType.ABINARY, nullable);
}
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ABooleanTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ABooleanTypeComputer.java
index 2a054bf..16349d0 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ABooleanTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ABooleanTypeComputer.java
@@ -18,22 +18,23 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
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.asterix.om.types.hierachy.ATypeHierarchy;
-public class ABooleanTypeComputer extends AbstractResultTypeComputer {
+public class ABooleanTypeComputer extends AbstractConstructorTypeComputer {
- public static final ABooleanTypeComputer INSTANCE = new ABooleanTypeComputer();
+ public static final ABooleanTypeComputer INSTANCE = new ABooleanTypeComputer(false);
- private ABooleanTypeComputer() {
+ public static final ABooleanTypeComputer INSTANCE_NULLABLE = new ABooleanTypeComputer(true);
+
+ private ABooleanTypeComputer(boolean nullable) {
+ super(BuiltinType.ABOOLEAN, nullable);
}
@Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.ABOOLEAN;
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return super.isAlwaysCastable(inputType)
+ || ATypeHierarchy.getTypeDomain(inputType.getTypeTag()) == ATypeHierarchy.Domain.NUMERIC;
}
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADateTimeTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADateTimeTypeComputer.java
index 2e2667a..19915c6 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADateTimeTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADateTimeTypeComputer.java
@@ -18,22 +18,22 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.types.ATypeTag;
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;
-public class ADateTimeTypeComputer extends AbstractResultTypeComputer {
+public class ADateTimeTypeComputer extends AbstractConstructorTypeComputer {
- public static final ADateTimeTypeComputer INSTANCE = new ADateTimeTypeComputer();
+ public static final ADateTimeTypeComputer INSTANCE = new ADateTimeTypeComputer(false);
- private ADateTimeTypeComputer() {
+ public static final ADateTimeTypeComputer INSTANCE_NULLABLE = new ADateTimeTypeComputer(true);
+
+ private ADateTimeTypeComputer(boolean nullable) {
+ super(BuiltinType.ADATETIME, nullable);
}
@Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.ADATETIME;
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return super.isAlwaysCastable(inputType) || inputType.getTypeTag() == ATypeTag.DATE;
}
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADateTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADateTypeComputer.java
index 5ac7613..dc64137 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADateTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADateTypeComputer.java
@@ -18,22 +18,22 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.types.ATypeTag;
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;
-public class ADateTypeComputer extends AbstractResultTypeComputer {
+public class ADateTypeComputer extends AbstractConstructorTypeComputer {
- public static final ADateTypeComputer INSTANCE = new ADateTypeComputer();
+ public static final ADateTypeComputer INSTANCE = new ADateTypeComputer(false);
- private ADateTypeComputer() {
+ public static final ADateTypeComputer INSTANCE_NULLABLE = new ADateTypeComputer(true);
+
+ private ADateTypeComputer(boolean nullable) {
+ super(BuiltinType.ADATE, nullable);
}
@Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.ADATE;
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return super.isAlwaysCastable(inputType) || inputType.getTypeTag() == ATypeTag.DATETIME;
}
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADayTimeDurationTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADayTimeDurationTypeComputer.java
index b8cc9b4..d8d3065 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADayTimeDurationTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADayTimeDurationTypeComputer.java
@@ -18,23 +18,22 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.types.ATypeTag;
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;
-public class ADayTimeDurationTypeComputer extends AbstractResultTypeComputer {
+public class ADayTimeDurationTypeComputer extends AbstractConstructorTypeComputer {
- public static final ADayTimeDurationTypeComputer INSTANCE = new ADayTimeDurationTypeComputer();
+ public static final ADayTimeDurationTypeComputer INSTANCE = new ADayTimeDurationTypeComputer(false);
- private ADayTimeDurationTypeComputer() {
+ public static final ADayTimeDurationTypeComputer INSTANCE_NULLABLE = new ADayTimeDurationTypeComputer(true);
+ private ADayTimeDurationTypeComputer(boolean nullable) {
+ super(BuiltinType.ADAYTIMEDURATION, nullable);
}
@Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.ADAYTIMEDURATION;
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return super.isAlwaysCastable(inputType) || inputType.getTypeTag() == ATypeTag.DURATION;
}
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADoubleTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADoubleTypeComputer.java
index 00301b6..e1b71a6 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADoubleTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADoubleTypeComputer.java
@@ -18,28 +18,15 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-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;
-public class ADoubleTypeComputer extends AbstractResultTypeComputer {
+public class ADoubleTypeComputer extends AbstractNumericConstructorTypeComputer {
public static final ADoubleTypeComputer INSTANCE = new ADoubleTypeComputer(false);
public static final ADoubleTypeComputer INSTANCE_NULLABLE = new ADoubleTypeComputer(true);
- private final IAType type;
-
private ADoubleTypeComputer(boolean nullable) {
- IAType t = BuiltinType.ADOUBLE;
- type = nullable ? AUnionType.createNullableType(t) : t;
- }
-
- @Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return type;
+ super(BuiltinType.ADOUBLE, nullable);
}
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADurationTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADurationTypeComputer.java
index 4f23ed0..ecc21a3 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADurationTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ADurationTypeComputer.java
@@ -18,22 +18,23 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.types.ATypeTag;
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;
-public class ADurationTypeComputer extends AbstractResultTypeComputer {
+public class ADurationTypeComputer extends AbstractConstructorTypeComputer {
- public static final ADurationTypeComputer INSTANCE = new ADurationTypeComputer();
+ public static final ADurationTypeComputer INSTANCE = new ADurationTypeComputer(false);
- private ADurationTypeComputer() {
+ public static final ADurationTypeComputer INSTANCE_NULLABLE = new ADurationTypeComputer(true);
+
+ private ADurationTypeComputer(boolean nullable) {
+ super(BuiltinType.ADURATION, nullable);
}
@Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.ADURATION;
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return super.isAlwaysCastable(inputType) || inputType.getTypeTag() == ATypeTag.YEARMONTHDURATION
+ || inputType.getTypeTag() == ATypeTag.DAYTIMEDURATION;
}
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AFloatTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AFloatTypeComputer.java
index 77c01e1..29d2078 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AFloatTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AFloatTypeComputer.java
@@ -18,22 +18,15 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
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;
-public class AFloatTypeComputer extends AbstractResultTypeComputer {
+public class AFloatTypeComputer extends AbstractNumericConstructorTypeComputer {
- public static final AFloatTypeComputer INSTANCE = new AFloatTypeComputer();
+ public static final AFloatTypeComputer INSTANCE = new AFloatTypeComputer(false);
- private AFloatTypeComputer() {
+ public static final AFloatTypeComputer INSTANCE_NULLABLE = new AFloatTypeComputer(true);
+
+ private AFloatTypeComputer(boolean nullable) {
+ super(BuiltinType.AFLOAT, nullable);
}
-
- @Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.AFLOAT;
- }
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt16TypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt16TypeComputer.java
index 1fbc603..c5be15e 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt16TypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt16TypeComputer.java
@@ -18,22 +18,13 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
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;
-public class AInt16TypeComputer extends AbstractResultTypeComputer {
+public class AInt16TypeComputer extends AbstractNumericConstructorTypeComputer {
- public static final AInt16TypeComputer INSTANCE = new AInt16TypeComputer();
+ public static final AInt16TypeComputer INSTANCE_NULLABLE = new AInt16TypeComputer(true);
- private AInt16TypeComputer() {
+ private AInt16TypeComputer(boolean nullable) {
+ super(BuiltinType.AINT16, nullable);
}
-
- @Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.AINT16;
- }
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt32TypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt32TypeComputer.java
index 8f676ae..0edf633 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt32TypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt32TypeComputer.java
@@ -18,22 +18,15 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
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;
-public class AInt32TypeComputer extends AbstractResultTypeComputer {
+public class AInt32TypeComputer extends AbstractNumericConstructorTypeComputer {
- public static final AInt32TypeComputer INSTANCE = new AInt32TypeComputer();
+ public static final AInt32TypeComputer INSTANCE = new AInt32TypeComputer(false);
- private AInt32TypeComputer() {
+ public static final AInt32TypeComputer INSTANCE_NULLABLE = new AInt32TypeComputer(true);
+
+ private AInt32TypeComputer(boolean nullable) {
+ super(BuiltinType.AINT32, nullable);
}
-
- @Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.AINT32;
- }
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt64TypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt64TypeComputer.java
index d495acf..34699d2 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt64TypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt64TypeComputer.java
@@ -18,28 +18,15 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-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;
-public class AInt64TypeComputer extends AbstractResultTypeComputer {
+public class AInt64TypeComputer extends AbstractNumericConstructorTypeComputer {
public static final AInt64TypeComputer INSTANCE = new AInt64TypeComputer(false);
public static final AInt64TypeComputer INSTANCE_NULLABLE = new AInt64TypeComputer(true);
- private final IAType type;
-
private AInt64TypeComputer(boolean nullable) {
- IAType t = BuiltinType.AINT64;
- type = nullable ? AUnionType.createNullableType(t) : t;
- }
-
- @Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return type;
+ super(BuiltinType.AINT64, nullable);
}
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt8TypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt8TypeComputer.java
index 4fe6dc3..29e9843 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt8TypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AInt8TypeComputer.java
@@ -18,22 +18,13 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
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;
-public class AInt8TypeComputer extends AbstractResultTypeComputer {
+public class AInt8TypeComputer extends AbstractNumericConstructorTypeComputer {
- public static final AInt8TypeComputer INSTANCE = new AInt8TypeComputer();
+ public static final AInt8TypeComputer INSTANCE_NULLABLE = new AInt8TypeComputer(true);
- private AInt8TypeComputer() {
+ private AInt8TypeComputer(boolean nullable) {
+ super(BuiltinType.AINT8, nullable);
}
-
- @Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.AINT8;
- }
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AStringTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AStringTypeComputer.java
index d392e8d..cd7bd54 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AStringTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AStringTypeComputer.java
@@ -18,27 +18,43 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-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;
-public class AStringTypeComputer extends AbstractResultTypeComputer {
+public class AStringTypeComputer extends AbstractConstructorTypeComputer {
- public static final AStringTypeComputer INSTANCE = new AStringTypeComputer(BuiltinType.ASTRING);
- public static final AStringTypeComputer INSTANCE_NULLABLE =
- new AStringTypeComputer(AUnionType.createNullableType(BuiltinType.ASTRING));
+ public static final AStringTypeComputer INSTANCE = new AStringTypeComputer(false);
- private final IAType outputType;
+ public static final AStringTypeComputer INSTANCE_NULLABLE = new AStringTypeComputer(true);
- private AStringTypeComputer(IAType outputType) {
- this.outputType = outputType;
+ private AStringTypeComputer(boolean nullable) {
+ super(BuiltinType.ASTRING, nullable);
}
@Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return outputType;
+ protected boolean isAlwaysCastable(IAType inputType) {
+ if (super.isAlwaysCastable(inputType)) {
+ return true;
+ }
+ switch (inputType.getTypeTag()) {
+ case TINYINT:
+ case SMALLINT:
+ case INTEGER:
+ case BIGINT:
+ case FLOAT:
+ case DOUBLE:
+ case BOOLEAN:
+ case DATETIME:
+ case DATE:
+ case TIME:
+ case DURATION:
+ case YEARMONTHDURATION:
+ case DAYTIMEDURATION:
+ case UUID:
+ case BINARY:
+ return true;
+ default:
+ return false;
+ }
}
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ATimeTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ATimeTypeComputer.java
index 359a9e4..f395946 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ATimeTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ATimeTypeComputer.java
@@ -18,22 +18,22 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.types.ATypeTag;
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;
-public class ATimeTypeComputer extends AbstractResultTypeComputer {
+public class ATimeTypeComputer extends AbstractConstructorTypeComputer {
- public static final ATimeTypeComputer INSTANCE = new ATimeTypeComputer();
+ public static final ATimeTypeComputer INSTANCE = new ATimeTypeComputer(false);
- private ATimeTypeComputer() {
+ public static final ATimeTypeComputer INSTANCE_NULLABLE = new ATimeTypeComputer(true);
+
+ private ATimeTypeComputer(boolean nullable) {
+ super(BuiltinType.ATIME, nullable);
}
@Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.ATIME;
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return super.isAlwaysCastable(inputType) || inputType.getTypeTag() == ATypeTag.DATETIME;
}
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AUUIDTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AUUIDTypeComputer.java
index d241585..9063844 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AUUIDTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AUUIDTypeComputer.java
@@ -19,22 +19,15 @@
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
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;
-public class AUUIDTypeComputer extends AbstractResultTypeComputer {
+public class AUUIDTypeComputer extends AbstractConstructorTypeComputer {
- public static final AUUIDTypeComputer INSTANCE = new AUUIDTypeComputer();
+ public static final AUUIDTypeComputer INSTANCE = new AUUIDTypeComputer(false);
- private AUUIDTypeComputer() {
+ public static final AUUIDTypeComputer INSTANCE_NULLABLE = new AUUIDTypeComputer(true);
+
+ private AUUIDTypeComputer(boolean nullable) {
+ super(BuiltinType.AUUID, nullable);
}
-
- @Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.AUUID;
- }
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AYearMonthDurationTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AYearMonthDurationTypeComputer.java
index 7885a75..023f4d4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AYearMonthDurationTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AYearMonthDurationTypeComputer.java
@@ -18,23 +18,22 @@
*/
package org.apache.asterix.om.typecomputer.impl;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.types.ATypeTag;
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;
-public class AYearMonthDurationTypeComputer extends AbstractResultTypeComputer {
+public class AYearMonthDurationTypeComputer extends AbstractConstructorTypeComputer {
- public static final AYearMonthDurationTypeComputer INSTANCE = new AYearMonthDurationTypeComputer();
+ public static final AYearMonthDurationTypeComputer INSTANCE = new AYearMonthDurationTypeComputer(false);
- private AYearMonthDurationTypeComputer() {
+ public static final AYearMonthDurationTypeComputer INSTANCE_NULLABLE = new AYearMonthDurationTypeComputer(true);
+ private AYearMonthDurationTypeComputer(boolean nullable) {
+ super(BuiltinType.AYEARMONTHDURATION, nullable);
}
@Override
- protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
- return BuiltinType.AYEARMONTHDURATION;
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return super.isAlwaysCastable(inputType) || inputType.getTypeTag() == ATypeTag.DURATION;
}
-
}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractConstructorTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractConstructorTypeComputer.java
new file mode 100644
index 0000000..a1db49f
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractConstructorTypeComputer.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+package org.apache.asterix.om.typecomputer.impl;
+
+import java.util.Objects;
+
+import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.types.AUnionType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+
+public abstract class AbstractConstructorTypeComputer extends AbstractResultTypeComputer {
+
+ protected final IAType primeType;
+
+ protected final boolean nullable;
+
+ protected AbstractConstructorTypeComputer(IAType primeType, boolean nullable) {
+ this.primeType = Objects.requireNonNull(primeType);
+ this.nullable = nullable;
+ }
+
+ @Override
+ protected final IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes)
+ throws AlgebricksException {
+ if (!nullable || (strippedInputTypes.length == 1 && isAlwaysCastable(strippedInputTypes[0]))) {
+ return primeType;
+ } else {
+ return AUnionType.createNullableType(primeType);
+ }
+ }
+
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return primeType.deepEqual(inputType);
+ }
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractNumericConstructorTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractNumericConstructorTypeComputer.java
new file mode 100644
index 0000000..080dc7b
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractNumericConstructorTypeComputer.java
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+package org.apache.asterix.om.typecomputer.impl;
+
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
+
+public abstract class AbstractNumericConstructorTypeComputer extends AbstractConstructorTypeComputer {
+
+ protected AbstractNumericConstructorTypeComputer(IAType primeType, boolean nullable) {
+ super(primeType, nullable);
+ }
+
+ @Override
+ protected boolean isAlwaysCastable(IAType inputType) {
+ return super.isAlwaysCastable(inputType)
+ || ATypeHierarchy.getTypeDomain(inputType.getTypeTag()) == ATypeHierarchy.Domain.NUMERIC;
+ }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/NumberUtils.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/NumberUtils.java
index 5fd7892..7a02fd2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/NumberUtils.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/NumberUtils.java
@@ -20,7 +20,11 @@
package org.apache.asterix.runtime.evaluators.common;
import org.apache.asterix.om.base.AMutableDouble;
+import org.apache.asterix.om.base.AMutableFloat;
+import org.apache.asterix.om.base.AMutableInt16;
+import org.apache.asterix.om.base.AMutableInt32;
import org.apache.asterix.om.base.AMutableInt64;
+import org.apache.asterix.om.base.AMutableInt8;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
/**
@@ -66,6 +70,31 @@
}
/**
+ * Parses string as float
+ * @param textPtr input string
+ * @param result placeholder for the result
+ * @return {@code true} if parsing was successful, {@code false} otherwise
+ */
+ public static boolean parseFloat(UTF8StringPointable textPtr, AMutableFloat result) {
+ float v;
+ if (POSITIVE_INF.compareTo(textPtr) == 0) {
+ v = Float.POSITIVE_INFINITY;
+ } else if (NEGATIVE_INF.compareTo(textPtr) == 0) {
+ v = Float.NEGATIVE_INFINITY;
+ } else if (NAN.compareTo(textPtr) == 0) {
+ v = Float.NaN;
+ } else {
+ try {
+ v = Float.parseFloat(textPtr.toString());
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ }
+ result.setValue(v);
+ return true;
+ }
+
+ /**
* Parses string as bigint
* @param textPtr input string
* @param result placeholder for the result
@@ -109,7 +138,149 @@
if (value < 0 && positive) {
value *= -1;
}
+ result.setValue(value);
+ return true;
+ }
+ /**
+ * Parses string as integer
+ * @param textPtr input string
+ * @param result placeholder for the result
+ * @return {@code true} if parsing was successful, {@code false} otherwise
+ */
+ public static boolean parseInt32(UTF8StringPointable textPtr, AMutableInt32 result) {
+ byte[] bytes = textPtr.getByteArray();
+ int offset = textPtr.getCharStartOffset();
+ //accumulating value in negative domain
+ //otherwise Integer.MIN_VALUE = -(Integer.MAX_VALUE + 1) would have caused overflow
+ int value = 0;
+ boolean positive = true;
+ int limit = -Integer.MAX_VALUE;
+ if (bytes[offset] == '+') {
+ offset++;
+ } else if (bytes[offset] == '-') {
+ offset++;
+ positive = false;
+ limit = Integer.MIN_VALUE;
+ }
+ int end = textPtr.getStartOffset() + textPtr.getLength();
+ for (; offset < end; offset++) {
+ int digit;
+ if (bytes[offset] >= '0' && bytes[offset] <= '9') {
+ value *= 10;
+ digit = bytes[offset] - '0';
+ } else if (bytes[offset] == 'i' && bytes[offset + 1] == '3' && bytes[offset + 2] == '2'
+ && offset + 3 == end) {
+ break;
+ } else {
+ return false;
+ }
+ if (value < limit + digit) {
+ return false;
+ }
+ value -= digit;
+ }
+ if (value > 0) {
+ return false;
+ }
+ if (value < 0 && positive) {
+ value *= -1;
+ }
+ result.setValue(value);
+ return true;
+ }
+
+ /**
+ * Parses string as smallint
+ * @param textPtr input string
+ * @param result placeholder for the result
+ * @return {@code true} if parsing was successful, {@code false} otherwise
+ */
+ public static boolean parseInt16(UTF8StringPointable textPtr, AMutableInt16 result) {
+ byte[] bytes = textPtr.getByteArray();
+ int offset = textPtr.getCharStartOffset();
+ //accumulating value in negative domain
+ //otherwise Short.MIN_VALUE = -(Short.MAX_VALUE + 1) would have caused overflow
+ short value = 0;
+ boolean positive = true;
+ short limit = -Short.MAX_VALUE;
+ if (bytes[offset] == '+') {
+ offset++;
+ } else if (bytes[offset] == '-') {
+ offset++;
+ positive = false;
+ limit = Short.MIN_VALUE;
+ }
+ int end = textPtr.getStartOffset() + textPtr.getLength();
+ for (; offset < end; offset++) {
+ int digit;
+ if (bytes[offset] >= '0' && bytes[offset] <= '9') {
+ value = (short) (value * 10);
+ digit = bytes[offset] - '0';
+ } else if (bytes[offset] == 'i' && bytes[offset + 1] == '1' && bytes[offset + 2] == '6'
+ && offset + 3 == end) {
+ break;
+ } else {
+ return false;
+ }
+ if (value < limit + digit) {
+ return false;
+ }
+ value = (short) (value - digit);
+ }
+ if (value > 0) {
+ return false;
+ }
+ if (value < 0 && positive) {
+ value *= -1;
+ }
+ result.setValue(value);
+ return true;
+ }
+
+ /**
+ * Parses string as tinyint
+ * @param textPtr input string
+ * @param result placeholder for the result
+ * @return {@code true} if parsing was successful, {@code false} otherwise
+ */
+ public static boolean parseInt8(UTF8StringPointable textPtr, AMutableInt8 result) {
+ byte[] bytes = textPtr.getByteArray();
+ int offset = textPtr.getCharStartOffset();
+ //accumulating value in negative domain
+ //otherwise Byte.MIN_VALUE = -(Byte.MAX_VALUE + 1) would have caused overflow
+ byte value = 0;
+ boolean positive = true;
+ byte limit = -Byte.MAX_VALUE;
+ if (bytes[offset] == '+') {
+ offset++;
+ } else if (bytes[offset] == '-') {
+ offset++;
+ positive = false;
+ limit = Byte.MIN_VALUE;
+ }
+ int end = textPtr.getStartOffset() + textPtr.getLength();
+ for (; offset < end; offset++) {
+ int digit;
+ if (bytes[offset] >= '0' && bytes[offset] <= '9') {
+ value = (byte) (value * 10);
+ digit = bytes[offset] - '0';
+ } else if (bytes[offset] == 'i' && bytes[offset + 1] == '8' && offset + 2 == end) {
+ break;
+ } else {
+ return false;
+ }
+ if (value < limit + digit) {
+ return false;
+ }
+ value = (byte) (value - digit);
+ }
+ if (value > 0) {
+ return false;
+ }
+ if (value < 0 && positive) {
+ value *= -1;
+ }
result.setValue(value);
return true;
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryBase64StringConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryBase64StringConstructorDescriptor.java
index d2f7665..737fcb7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryBase64StringConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryBase64StringConstructorDescriptor.java
@@ -19,6 +19,7 @@
package org.apache.asterix.runtime.evaluators.constructors;
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.base.AMutableBinary;
import org.apache.asterix.om.functions.BuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
@@ -28,7 +29,8 @@
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.dataflow.common.data.parsers.ByteArrayBase64ParserFactory;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
+import org.apache.hyracks.util.bytes.Base64Parser;
@MissingNullInOutFunction
public class ABinaryBase64StringConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -47,8 +49,27 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new ABinaryHexStringConstructorDescriptor.ABinaryConstructorEvaluator(args[0],
- ByteArrayBase64ParserFactory.INSTANCE, ctx, sourceLoc);
+ return new AbstractBinaryConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
+
+ private final Base64Parser parser = new Base64Parser();
+
+ @Override
+ protected boolean parseBinary(UTF8StringPointable textPtr, AMutableBinary result) {
+ try {
+ parser.generatePureByteArrayFromBase64String(textPtr.getByteArray(),
+ textPtr.getCharStartOffset(), textPtr.getUTF8Length());
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ result.setValue(parser.getByteArray(), 0, parser.getLength());
+ return true;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return ABinaryBase64StringConstructorDescriptor.this.getIdentifier();
+ }
+ };
}
};
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryHexStringConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryHexStringConstructorDescriptor.java
index 505b650..04bf5be 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryHexStringConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABinaryHexStringConstructorDescriptor.java
@@ -19,32 +19,19 @@
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.om.base.AMutableBinary;
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.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.exceptions.SourceLocation;
-import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
-import org.apache.hyracks.dataflow.common.data.parsers.ByteArrayHexParserFactory;
-import org.apache.hyracks.dataflow.common.data.parsers.IValueParser;
-import org.apache.hyracks.dataflow.common.data.parsers.IValueParserFactory;
+import org.apache.hyracks.util.bytes.HexParser;
@MissingNullInOutFunction
public class ABinaryHexStringConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -63,7 +50,26 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new ABinaryConstructorEvaluator(args[0], ByteArrayHexParserFactory.INSTANCE, ctx, sourceLoc);
+ return new AbstractBinaryConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
+ private final HexParser parser = new HexParser();
+
+ @Override
+ protected boolean parseBinary(UTF8StringPointable textPtr, AMutableBinary result) {
+ try {
+ parser.generateByteArrayFromHexString(textPtr.getByteArray(), textPtr.getCharStartOffset(),
+ textPtr.getUTF8Length());
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ result.setValue(parser.getByteArray(), 0, parser.getLength());
+ return true;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return ABinaryHexStringConstructorDescriptor.this.getIdentifier();
+ }
+ };
}
};
}
@@ -72,59 +78,4 @@
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.BINARY_HEX_CONSTRUCTOR;
}
-
- static class ABinaryConstructorEvaluator implements IScalarEvaluator {
- private final SourceLocation sourceLoc;
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private final DataOutput out = resultStorage.getDataOutput();
- private final IPointable inputArg = new VoidPointable();
- private final IScalarEvaluator eval;
- private IValueParser byteArrayParser;
- private UTF8StringPointable utf8Ptr = new UTF8StringPointable();
-
- public ABinaryConstructorEvaluator(IScalarEvaluatorFactory copyEvaluatorFactory,
- IValueParserFactory valueParserFactory, IEvaluatorContext context, SourceLocation sourceLoc)
- throws HyracksDataException {
- this.sourceLoc = sourceLoc;
- eval = copyEvaluatorFactory.createScalarEvaluator(context);
- byteArrayParser = valueParserFactory.createValueParser();
- }
-
- @Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] binary = inputArg.getByteArray();
- int startOffset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = binary[startOffset];
- if (tt == ATypeTag.SERIALIZED_BINARY_TYPE_TAG) {
- result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
- resultStorage.reset();
- utf8Ptr.set(inputArg.getByteArray(), startOffset + 1, len - 1);
- char[] buffer = utf8Ptr.toString().toCharArray();
- out.write(ATypeTag.BINARY.serialize());
- if (!byteArrayParser.parse(buffer, 0, buffer.length, out)) {
- PointableHelper.setNull(result);
- return;
- }
- result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, BuiltinFunctions.BINARY_HEX_CONSTRUCTOR, 0, tt,
- ATypeTag.SERIALIZED_BINARY_TYPE_TAG, ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, BuiltinFunctions.BINARY_HEX_CONSTRUCTOR, e,
- ATypeTag.SERIALIZED_BINARY_TYPE_TAG);
- }
- }
- }
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABooleanConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABooleanConstructorDescriptor.java
index b08ae46..977524c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABooleanConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ABooleanConstructorDescriptor.java
@@ -46,7 +46,7 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractBooleanConstructorEvaluator(args[0].createScalarEvaluator(ctx), sourceLoc) {
+ return new AbstractBooleanConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
@Override
protected FunctionIdentifier getIdentifier() {
return ABooleanConstructorDescriptor.this.getIdentifier();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
index 90ec400..9dcc0a4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
@@ -18,10 +18,8 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADateTimeSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ADate;
import org.apache.asterix.om.base.AMutableDate;
@@ -32,10 +30,8 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -44,9 +40,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class ADateConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -65,82 +58,79 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableDate aDate = new AMutableDate(0);
+ private final AMutableDate aDate = new AMutableDate(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ADate> dateSerde =
+ private final ISerializerDeserializer<ADate> dateSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
-
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- resultStorage.reset();
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[offset];
- if (tt == ATypeTag.SERIALIZED_DATE_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case DATE:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
- utf8Ptr.set(serString, offset + 1, len - 1);
- int stringLength = utf8Ptr.getUTF8Length();
-
- // the string to be parsed should be at least 8 characters: YYYYMMDD
- if (stringLength < 8) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_DATE_TYPE_TAG);
- }
-
- int startOffset = utf8Ptr.getCharStartOffset();
- while (serString[startOffset] == ' ') {
- startOffset++;
- }
- int endOffset = startOffset + stringLength - 1;
- while (serString[endOffset] == ' ') {
- endOffset--;
- }
-
- long chrononTimeInMs = ADateParserFactory.parseDatePart(serString, startOffset,
- endOffset - startOffset + 1);
- short temp = 0;
- if (chrononTimeInMs < 0
- && chrononTimeInMs % GregorianCalendarSystem.CHRONON_OF_DAY != 0) {
- temp = 1;
- }
- aDate.setValue((int) (chrononTimeInMs / GregorianCalendarSystem.CHRONON_OF_DAY) - temp);
+ break;
+ case DATETIME:
+ long chronon = ADateTimeSerializerDeserializer.getChronon(bytes, startOffset + 1);
+ aDate.setValue(GregorianCalendarSystem.getInstance().getChrononInDays(chronon));
+ resultStorage.reset();
dateSerde.serialize(aDate, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_DATE_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (parseDate(utf8Ptr, aDate)) {
+ resultStorage.reset();
+ dateSerde.serialize(aDate, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return ADateConstructorDescriptor.this.getIdentifier();
+ }
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ADATE;
+ }
};
}
};
}
+ private static boolean parseDate(UTF8StringPointable textPtr, AMutableDate result) {
+ int stringLength = textPtr.getUTF8Length();
+ if (stringLength < 8) {
+ return false;
+ }
+ try {
+ long chronon = ADateParserFactory.parseDatePart(textPtr.getByteArray(), textPtr.getCharStartOffset(),
+ stringLength);
+ int chrononInDays = GregorianCalendarSystem.getInstance().getChrononInDays(chronon);
+ result.setValue(chrononInDays);
+ return true;
+ } catch (HyracksDataException e) {
+ return false;
+ }
+ }
+
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.DATE_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
index 8d6d151..aa1068b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
@@ -18,24 +18,21 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADateSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ADateTime;
import org.apache.asterix.om.base.AMutableDateTime;
import org.apache.asterix.om.base.temporal.ADateParserFactory;
import org.apache.asterix.om.base.temporal.ATimeParserFactory;
+import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
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.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -44,9 +41,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class ADateTimeConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -65,82 +59,92 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableDateTime aDateTime = new AMutableDateTime(0L);
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
+
+ private final AMutableDateTime aDateTime = new AMutableDateTime(0L);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ADateTime> datetimeSerde =
+ private final ISerializerDeserializer<ADateTime> datetimeSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- resultStorage.reset();
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[offset];
- if (tt == ATypeTag.SERIALIZED_DATETIME_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case DATETIME:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
- utf8Ptr.set(serString, offset + 1, len - 1);
- int stringLength = utf8Ptr.getUTF8Length();
- int startOffset = utf8Ptr.getCharStartOffset();
- // the string to be parsed should be at least 14 characters: YYYYMMDDhhmmss
- if (stringLength < 14) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_DATETIME_TYPE_TAG);
- }
- // +1 if it is negative (-)
- short timeOffset = (short) ((serString[startOffset] == '-') ? 1 : 0);
-
- timeOffset += 8;
-
- if (serString[startOffset + timeOffset] != 'T') {
- timeOffset += 2;
- if (serString[startOffset + timeOffset] != 'T') {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_DATETIME_TYPE_TAG);
- }
- }
-
- long chrononTimeInMs =
- ADateParserFactory.parseDatePart(serString, startOffset, timeOffset);
-
- chrononTimeInMs += ATimeParserFactory.parseTimePart(serString,
- startOffset + timeOffset + 1, stringLength - timeOffset - 1);
-
- aDateTime.setValue(chrononTimeInMs);
+ break;
+ case DATE:
+ int chrononInDays = ADateSerializerDeserializer.getChronon(bytes, startOffset + 1);
+ aDateTime.setValue(chrononInDays * GregorianCalendarSystem.CHRONON_OF_DAY);
+ resultStorage.reset();
datetimeSerde.serialize(aDateTime, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_DATETIME_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (parseDateTime(utf8Ptr, aDateTime)) {
+ resultStorage.reset();
+ datetimeSerde.serialize(aDateTime, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ADATETIME;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return ADateTimeConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
}
+ private static boolean parseDateTime(UTF8StringPointable textPtr, AMutableDateTime result) {
+ int stringLength = textPtr.getUTF8Length();
+ // the string to be parsed should be at least 14 characters: YYYYMMDDhhmmss
+ if (stringLength < 14) {
+ return false;
+ }
+ byte[] bytes = textPtr.getByteArray();
+ int charStartOffset = textPtr.getCharStartOffset();
+ // +1 if it is negative (-)
+ short timeOffset = (short) ((bytes[charStartOffset] == '-') ? 1 : 0);
+ timeOffset += 8;
+ if (bytes[charStartOffset + timeOffset] != 'T') {
+ timeOffset += 2;
+ if (bytes[charStartOffset + timeOffset] != 'T') {
+ return false;
+ }
+ }
+ try {
+ long chronon = ADateParserFactory.parseDatePart(bytes, charStartOffset, timeOffset);
+ int timeInMs = ATimeParserFactory.parseTimePart(bytes, charStartOffset + timeOffset + 1,
+ stringLength - timeOffset - 1);
+ chronon += timeInMs;
+ result.setValue(chronon);
+ return true;
+ } catch (HyracksDataException e) {
+ return false;
+ }
+ }
+
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.DATETIME_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADayTimeDurationConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADayTimeDurationConstructorDescriptor.java
index fde5c23..c7d4a34 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADayTimeDurationConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADayTimeDurationConstructorDescriptor.java
@@ -18,9 +18,8 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADurationSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ADayTimeDuration;
import org.apache.asterix.om.base.AMutableDayTimeDuration;
@@ -31,10 +30,8 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -43,9 +40,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class ADayTimeDurationConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -66,67 +60,74 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableDayTimeDuration aDayTimeDuration = new AMutableDayTimeDuration(0);
+ private final AMutableDayTimeDuration aDayTimeDuration = new AMutableDayTimeDuration(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ADayTimeDuration> dayTimeDurationSerde =
+ private final ISerializerDeserializer<ADayTimeDuration> dayTimeDurationSerde =
SerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.ADAYTIMEDURATION);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[offset];
- if (tt == ATypeTag.SERIALIZED_DAY_TIME_DURATION_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case DAYTIMEDURATION:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ break;
+ case DURATION:
+ long millis = ADurationSerializerDeserializer.getDayTime(bytes, startOffset + 1);
+ aDayTimeDuration.setMilliseconds(millis);
resultStorage.reset();
- utf8Ptr.set(serString, offset + 1, len - 1);
- int stringLength = utf8Ptr.getUTF8Length();
- int startOffset = utf8Ptr.getCharStartOffset();
-
- ADurationParserFactory.parseDuration(serString, startOffset, stringLength,
- aDayTimeDuration, ADurationParseOption.DAY_TIME);
-
dayTimeDurationSerde.serialize(aDayTimeDuration, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (Exception e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_DAY_TIME_DURATION_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (parseDayTimeDuration(utf8Ptr, aDayTimeDuration)) {
+ resultStorage.reset();
+ dayTimeDurationSerde.serialize(aDayTimeDuration, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ADAYTIMEDURATION;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return ADayTimeDurationConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
}
- /* (non-Javadoc)
- * @see org.apache.asterix.om.functions.AbstractFunctionDescriptor#getIdentifier()
- */
+ private static boolean parseDayTimeDuration(UTF8StringPointable textPtr, ADayTimeDuration result) {
+ try {
+ ADurationParserFactory.parseDuration(textPtr.getByteArray(), textPtr.getCharStartOffset(),
+ textPtr.getUTF8Length(), result, ADurationParseOption.DAY_TIME);
+ return true;
+ } catch (HyracksDataException e) {
+ return false;
+ }
+ }
+
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.DAY_TIME_DURATION_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADoubleConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADoubleConstructorDescriptor.java
index 700fbfe..b67382e 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADoubleConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADoubleConstructorDescriptor.java
@@ -46,7 +46,7 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractDoubleConstructorEvaluator(args[0].createScalarEvaluator(ctx), sourceLoc) {
+ return new AbstractDoubleConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
@Override
protected FunctionIdentifier getIdentifier() {
return ADoubleConstructorDescriptor.this.getIdentifier();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADurationConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADurationConstructorDescriptor.java
index d87ce13..cc3fec8 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADurationConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ADurationConstructorDescriptor.java
@@ -18,10 +18,9 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADayTimeDurationSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AYearMonthDurationSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ADuration;
import org.apache.asterix.om.base.AMutableDuration;
@@ -32,10 +31,8 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -44,9 +41,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class ADurationConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -65,58 +59,81 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableDuration aDuration = new AMutableDuration(0, 0);
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
+
+ private final AMutableDuration aDuration = new AMutableDuration(0, 0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ADuration> durationSerde =
+ private final ISerializerDeserializer<ADuration> durationSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[offset];
- if (tt == ATypeTag.SERIALIZED_DURATION_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case DURATION:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ break;
+ case YEARMONTHDURATION:
+ int months =
+ AYearMonthDurationSerializerDeserializer.getYearMonth(bytes, startOffset + 1);
+ aDuration.setValue(months, 0);
resultStorage.reset();
- utf8Ptr.set(serString, offset + 1, len - 1);
- int stringLength = utf8Ptr.getUTF8Length();
- ADurationParserFactory.parseDuration(serString, utf8Ptr.getCharStartOffset(),
- stringLength, aDuration, ADurationParseOption.All);
durationSerde.serialize(aDuration, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_DURATION_TYPE_TAG);
+ break;
+ case DAYTIMEDURATION:
+ long millis = ADayTimeDurationSerializerDeserializer.getDayTime(bytes, startOffset + 1);
+ aDuration.setValue(0, millis);
+ resultStorage.reset();
+ durationSerde.serialize(aDuration, out);
+ result.set(resultStorage);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (parseDuration(utf8Ptr, aDuration)) {
+ resultStorage.reset();
+ durationSerde.serialize(aDuration, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ADURATION;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return ADurationConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
}
+ private static boolean parseDuration(UTF8StringPointable textPtr, ADuration result) {
+ try {
+ ADurationParserFactory.parseDuration(textPtr.getByteArray(), textPtr.getCharStartOffset(),
+ textPtr.getUTF8Length(), result, ADurationParseOption.All);
+ return true;
+ } catch (HyracksDataException e) {
+ return false;
+ }
+ }
+
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.DURATION_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AFloatConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AFloatConstructorDescriptor.java
index 05abb30..5596be6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AFloatConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AFloatConstructorDescriptor.java
@@ -18,10 +18,10 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
import java.io.IOException;
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AFloat;
import org.apache.asterix.om.base.AMutableFloat;
@@ -30,11 +30,10 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.asterix.runtime.evaluators.common.NumberUtils;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -43,9 +42,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class AFloatConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -64,58 +60,79 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableFloat aFloat = new AMutableFloat(0);
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
+
+ private final AMutableFloat aFloat = new AMutableFloat(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<AFloat> floatSerde =
+ private final ISerializerDeserializer<AFloat> floatSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AFLOAT);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[offset];
- if (tt == ATypeTag.SERIALIZED_FLOAT_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case FLOAT:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ break;
+ case TINYINT:
+ case SMALLINT:
+ case INTEGER:
+ case BIGINT:
resultStorage.reset();
- int utf8offset = offset + 1;
- int utf8len = len - 1;
- if (NumberUtils.POSITIVE_INF.compareTo(serString, utf8offset, utf8len) == 0) {
- aFloat.setValue(Float.POSITIVE_INFINITY);
- } else if (NumberUtils.NEGATIVE_INF.compareTo(serString, utf8offset, utf8len) == 0) {
- aFloat.setValue(Float.NEGATIVE_INFINITY);
- } else if (NumberUtils.NAN.compareTo(serString, utf8offset, utf8len) == 0) {
- aFloat.setValue(Float.NaN);
- } else {
- utf8Ptr.set(serString, utf8offset, utf8len);
- aFloat.setValue(Float.parseFloat(utf8Ptr.toString()));
+ try {
+ ATypeHierarchy.getTypePromoteComputer(inputType, ATypeTag.FLOAT).convertType(bytes,
+ startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
}
+ result.set(resultStorage);
+ break;
+ case DOUBLE:
+ resultStorage.reset();
+ try {
+ ATypeHierarchy.getTypeDemoteComputer(inputType, ATypeTag.FLOAT, false)
+ .convertType(bytes, startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
+ }
+ result.set(resultStorage);
+ break;
+ case BOOLEAN:
+ boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, startOffset + 1);
+ aFloat.setValue(b ? 1 : 0);
+ resultStorage.reset();
floatSerde.serialize(aFloat, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_FLOAT_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (NumberUtils.parseFloat(utf8Ptr, aFloat)) {
+ resultStorage.reset();
+ floatSerde.serialize(aFloat, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.AFLOAT;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return AFloatConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt16ConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt16ConstructorDescriptor.java
index a55db9f..7aedcc0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt16ConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt16ConstructorDescriptor.java
@@ -18,10 +18,10 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
import java.io.IOException;
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AInt16;
import org.apache.asterix.om.base.AMutableInt16;
@@ -30,10 +30,10 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
+import org.apache.asterix.runtime.evaluators.common.NumberUtils;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -42,9 +42,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class AInt16ConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -64,100 +61,86 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private short value;
- private int offset;
- private boolean positive;
- private AMutableInt16 aInt16 = new AMutableInt16((short) 0);
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
+
+ private final AMutableInt16 aInt16 = new AMutableInt16((short) 0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<AInt16> int16Serde =
+ private final ISerializerDeserializer<AInt16> int16Serde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT16);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int startOffset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[startOffset];
- if (tt == ATypeTag.SERIALIZED_INT16_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case SMALLINT:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ break;
+ case TINYINT:
resultStorage.reset();
- utf8Ptr.set(serString, startOffset + 1, len - 1);
- offset = utf8Ptr.getCharStartOffset();
- //accumulating value in negative domain
- //otherwise Short.MIN_VALUE = -(Short.MAX_VALUE + 1) would have caused overflow
- value = 0;
- positive = true;
- short limit = -Short.MAX_VALUE;
- if (serString[offset] == '+') {
- offset++;
- } else if (serString[offset] == '-') {
- offset++;
- positive = false;
- limit = Short.MIN_VALUE;
+ try {
+ ATypeHierarchy.getTypePromoteComputer(inputType, ATypeTag.SMALLINT)
+ .convertType(bytes, startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
}
- int end = startOffset + len;
- for (; offset < end; offset++) {
- int digit;
- if (serString[offset] >= '0' && serString[offset] <= '9') {
- value = (short) (value * 10);
- digit = serString[offset] - '0';
- } else if (serString[offset] == 'i' && serString[offset + 1] == '1'
- && serString[offset + 2] == '6' && offset + 3 == end) {
- break;
- } else {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT16_TYPE_TAG);
- }
- if (value < limit + digit) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT16_TYPE_TAG);
- }
- value = (short) (value - digit);
+ result.set(resultStorage);
+ break;
+ case INTEGER:
+ case BIGINT:
+ case FLOAT:
+ case DOUBLE:
+ resultStorage.reset();
+ try {
+ ATypeHierarchy.getTypeDemoteComputer(inputType, ATypeTag.SMALLINT, false)
+ .convertType(bytes, startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
}
- if (value > 0) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT16_TYPE_TAG);
- }
- if (value < 0 && positive) {
- value *= -1;
- }
-
- aInt16.setValue(value);
+ result.set(resultStorage);
+ break;
+ case BOOLEAN:
+ boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, startOffset + 1);
+ aInt16.setValue((short) (b ? 1 : 0));
+ resultStorage.reset();
int16Serde.serialize(aInt16, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_INT16_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (NumberUtils.parseInt16(utf8Ptr, aInt16)) {
+ resultStorage.reset();
+ int16Serde.serialize(aInt16, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.AINT16;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return AInt16ConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
-
}
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.INT16_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt32ConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt32ConstructorDescriptor.java
index 8a9c91c..06512aa 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt32ConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt32ConstructorDescriptor.java
@@ -18,10 +18,10 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
import java.io.IOException;
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AInt32;
import org.apache.asterix.om.base.AMutableInt32;
@@ -30,10 +30,10 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
+import org.apache.asterix.runtime.evaluators.common.NumberUtils;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -42,9 +42,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class AInt32ConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -63,91 +60,79 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private int value, offset;
- private boolean positive;
- private AMutableInt32 aInt32 = new AMutableInt32(0);
+ private final AMutableInt32 aInt32 = new AMutableInt32(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<AInt32> int32Serde =
+ private final ISerializerDeserializer<AInt32> int32Serde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int startOffset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[startOffset];
- if (tt == ATypeTag.SERIALIZED_INT32_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case INTEGER:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ break;
+ case TINYINT:
+ case SMALLINT:
resultStorage.reset();
- utf8Ptr.set(serString, startOffset + 1, len - 1);
- offset = utf8Ptr.getCharStartOffset();
- //accumulating value in negative domain
- //otherwise Integer.MIN_VALUE = -(Integer.MAX_VALUE + 1) would have caused overflow
- value = 0;
- positive = true;
- int limit = -Integer.MAX_VALUE;
- if (serString[offset] == '+') {
- offset++;
- } else if (serString[offset] == '-') {
- offset++;
- positive = false;
- limit = Integer.MIN_VALUE;
+ try {
+ ATypeHierarchy.getTypePromoteComputer(inputType, ATypeTag.INTEGER)
+ .convertType(bytes, startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
}
- int end = startOffset + len;
- for (; offset < end; offset++) {
- int digit;
- if (serString[offset] >= '0' && serString[offset] <= '9') {
- value *= 10;
- digit = serString[offset] - '0';
- } else if (serString[offset] == 'i' && serString[offset + 1] == '3'
- && serString[offset + 2] == '2' && offset + 3 == end) {
- break;
- } else {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT32_TYPE_TAG);
- }
- if (value < limit + digit) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT32_TYPE_TAG);
- }
- value -= digit;
+ result.set(resultStorage);
+ break;
+ case BIGINT:
+ case FLOAT:
+ case DOUBLE:
+ resultStorage.reset();
+ try {
+ ATypeHierarchy.getTypeDemoteComputer(inputType, ATypeTag.INTEGER, false)
+ .convertType(bytes, startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
}
- if (value > 0) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT32_TYPE_TAG);
- }
- if (value < 0 && positive) {
- value *= -1;
- }
-
- aInt32.setValue(value);
+ result.set(resultStorage);
+ break;
+ case BOOLEAN:
+ boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, startOffset + 1);
+ aInt32.setValue(b ? 1 : 0);
+ resultStorage.reset();
int32Serde.serialize(aInt32, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_INT32_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (NumberUtils.parseInt32(utf8Ptr, aInt32)) {
+ resultStorage.reset();
+ int32Serde.serialize(aInt32, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.AINT32;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return AInt32ConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
@@ -157,5 +142,4 @@
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.INT32_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt64ConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt64ConstructorDescriptor.java
index 265ccf6..fface7b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt64ConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt64ConstructorDescriptor.java
@@ -46,7 +46,7 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractInt64ConstructorEvaluator(args[0].createScalarEvaluator(ctx), sourceLoc) {
+ return new AbstractInt64ConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
@Override
public FunctionIdentifier getIdentifier() {
return AInt64ConstructorDescriptor.this.getIdentifier();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt8ConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt8ConstructorDescriptor.java
index c2986fe..5ee0186 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt8ConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AInt8ConstructorDescriptor.java
@@ -18,10 +18,10 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
import java.io.IOException;
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AInt8;
import org.apache.asterix.om.base.AMutableInt8;
@@ -30,10 +30,10 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
+import org.apache.asterix.runtime.evaluators.common.NumberUtils;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -42,9 +42,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class AInt8ConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -63,101 +60,77 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private byte value;
- private int offset;
- private boolean positive;
- private AMutableInt8 aInt8 = new AMutableInt8((byte) 0);
+ private final AMutableInt8 aInt8 = new AMutableInt8((byte) 0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<AInt8> int8Serde =
+ private final ISerializerDeserializer<AInt8> int8Serde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT8);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int startOffset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[startOffset];
- if (tt == ATypeTag.SERIALIZED_INT8_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case TINYINT:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ break;
+ case SMALLINT:
+ case INTEGER:
+ case BIGINT:
+ case FLOAT:
+ case DOUBLE:
resultStorage.reset();
- utf8Ptr.set(serString, startOffset + 1, len - 1);
- offset = utf8Ptr.getCharStartOffset();
- //accumulating value in negative domain
- //otherwise Byte.MIN_VALUE = -(Byte.MAX_VALUE + 1) would have caused overflow
- value = 0;
- positive = true;
- byte limit = -Byte.MAX_VALUE;
- if (serString[offset] == '+') {
- offset++;
- } else if (serString[offset] == '-') {
- offset++;
- positive = false;
- limit = Byte.MIN_VALUE;
+ try {
+ ATypeHierarchy.getTypeDemoteComputer(inputType, ATypeTag.TINYINT, false)
+ .convertType(bytes, startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
}
- int end = startOffset + len;
- for (; offset < end; offset++) {
- int digit;
- if (serString[offset] >= '0' && serString[offset] <= '9') {
- value = (byte) (value * 10);
- digit = serString[offset] - '0';
- } else if (serString[offset] == 'i' && serString[offset + 1] == '8'
- && offset + 2 == end) {
- break;
- } else {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT8_TYPE_TAG);
- }
- if (value < limit + digit) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT8_TYPE_TAG);
- }
- value = (byte) (value - digit);
- }
- if (value > 0) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_INT8_TYPE_TAG);
- }
- if (value < 0 && positive) {
- value *= -1;
- }
-
- aInt8.setValue(value);
+ result.set(resultStorage);
+ break;
+ case BOOLEAN:
+ boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, startOffset + 1);
+ aInt8.setValue((byte) (b ? 1 : 0));
+ resultStorage.reset();
int8Serde.serialize(aInt8, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e1) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e1,
- ATypeTag.SERIALIZED_INT8_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (NumberUtils.parseInt8(utf8Ptr, aInt8)) {
+ resultStorage.reset();
+ int8Serde.serialize(aInt8, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.AINT8;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return AInt8ConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
-
}
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.INT8_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java
index 1ed8d43..f2fda66 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AStringConstructorDescriptor.java
@@ -47,7 +47,7 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractStringConstructorEvaluator(args[0].createScalarEvaluator(ctx), sourceLoc) {
+ return new AbstractStringConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
@Override
protected FunctionIdentifier getIdentifier() {
return AStringConstructorDescriptor.this.getIdentifier();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
index 277cf6a..714abad 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
@@ -18,10 +18,8 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADateTimeSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AMutableTime;
import org.apache.asterix.om.base.ATime;
@@ -32,10 +30,8 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -44,9 +40,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class ATimeConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -65,73 +58,83 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableTime aTime = new AMutableTime(0);
+ private final AMutableTime aTime = new AMutableTime(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<ATime> timeSerde =
+ private final ISerializerDeserializer<ATime> timeSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[offset];
- if (tt == ATypeTag.SERIALIZED_TIME_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case TIME:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ break;
+ case DATETIME:
+ long chronon = ADateTimeSerializerDeserializer.getChronon(bytes, startOffset + 1);
+ int chrononTime = (int) (chronon / GregorianCalendarSystem.CHRONON_OF_DAY);
+ aTime.setValue(chrononTime);
resultStorage.reset();
- utf8Ptr.set(serString, offset + 1, len - 1);
- int stringLength = utf8Ptr.getUTF8Length();
- int startOffset = utf8Ptr.getCharStartOffset();
-
- // the string to be parsed should be at least 6 characters: hhmmss
- if (stringLength < 6) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(),
- ATypeTag.SERIALIZED_TIME_TYPE_TAG);
- }
-
- int chrononTimeInMs =
- ATimeParserFactory.parseTimePart(serString, startOffset, stringLength);
-
- if (chrononTimeInMs < 0) {
- chrononTimeInMs += GregorianCalendarSystem.CHRONON_OF_DAY;
- }
-
- aTime.setValue(chrononTimeInMs);
timeSerde.serialize(aTime, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_POLYGON_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (parseTime(utf8Ptr, aTime)) {
+ resultStorage.reset();
+ timeSerde.serialize(aTime, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ATIME;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return ATimeConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
}
+ private static boolean parseTime(UTF8StringPointable textPtr, AMutableTime result) {
+ int stringLength = textPtr.getUTF8Length();
+ // the string to be parsed should be at least 6 characters: hhmmss
+ if (stringLength < 6) {
+ return false;
+ }
+ try {
+ int chronon = ATimeParserFactory.parseTimePart(textPtr.getByteArray(), textPtr.getCharStartOffset(),
+ stringLength);
+ if (chronon < 0) {
+ chronon += GregorianCalendarSystem.CHRONON_OF_DAY;
+ }
+ result.setValue(chronon);
+ return true;
+ } catch (HyracksDataException e) {
+ return false;
+ }
+ }
+
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.TIME_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
index 6693877..ec2b9db 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AUUIDFromStringConstructorDescriptor.java
@@ -18,8 +18,6 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AMutableUUID;
@@ -28,9 +26,8 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -39,9 +36,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
/**
* Receives a canonical representation of UUID and construct a UUID value.
@@ -61,61 +55,66 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableUUID uuid = new AMutableUUID();
+ private final AMutableUUID uuid = new AMutableUUID();
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<AUUID> uuidSerde =
+ private final ISerializerDeserializer<AUUID> uuidSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AUUID);
-
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int start = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[start];
- if (tt == ATypeTag.SERIALIZED_UUID_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case UUID:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
- resultStorage.reset();
- utf8Ptr.set(serString, start + 1, len - 1);
-
- // first byte: tag, next x bytes: length
- int offset = utf8Ptr.getCharStartOffset();
- uuid.parseUUIDHexBytes(serString, offset);
- uuidSerde.serialize(uuid, out);
- result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (HyracksDataException e) {
- e.setSourceLocation(sourceLoc);
- throw e;
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (parseUUID(utf8Ptr, uuid)) {
+ resultStorage.reset();
+ uuidSerde.serialize(uuid, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.AUUID;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return AUUIDFromStringConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
}
+ private static boolean parseUUID(UTF8StringPointable textPtr, AMutableUUID result) {
+ try {
+ // first byte: tag, next x bytes: length
+ result.parseUUIDHexBytes(textPtr.getByteArray(), textPtr.getCharStartOffset());
+ return true;
+ } catch (HyracksDataException e) {
+ return false;
+ }
+ }
+
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.UUID_CONSTRUCTOR;
}
-
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
index aa304ce..d423559 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AYearMonthDurationConstructorDescriptor.java
@@ -18,10 +18,8 @@
*/
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADurationSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AMutableYearMonthDuration;
import org.apache.asterix.om.base.AYearMonthDuration;
@@ -32,10 +30,8 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
@@ -44,9 +40,6 @@
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
@MissingNullInOutFunction
public class AYearMonthDurationConstructorDescriptor extends AbstractScalarFunctionDynamicDescriptor {
@@ -66,61 +59,72 @@
@Override
public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
- return new IScalarEvaluator() {
+ return new AbstractConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
- private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
- private DataOutput out = resultStorage.getDataOutput();
- private IPointable inputArg = new VoidPointable();
- private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
- private AMutableYearMonthDuration aYearMonthDuration = new AMutableYearMonthDuration(0);
+ private final AMutableYearMonthDuration aYearMonthDuration = new AMutableYearMonthDuration(0);
@SuppressWarnings("unchecked")
- private ISerializerDeserializer<AYearMonthDuration> yearMonthDurationSerde =
+ private final ISerializerDeserializer<AYearMonthDuration> yearMonthDurationSerde =
SerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.AYEARMONTHDURATION);
private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- eval.evaluate(tuple, inputArg);
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- byte[] serString = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- int len = inputArg.getLength();
-
- byte tt = serString[offset];
- if (tt == ATypeTag.SERIALIZED_YEAR_MONTH_DURATION_TYPE_TAG) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case YEARMONTHDURATION:
result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
+ break;
+ case DURATION:
+ int months = ADurationSerializerDeserializer.getYearMonth(bytes, startOffset + 1);
+ aYearMonthDuration.setMonths(months);
resultStorage.reset();
- utf8Ptr.set(serString, offset + 1, len - 1);
- int stringLength = utf8Ptr.getUTF8Length();
- ADurationParserFactory.parseDuration(serString, utf8Ptr.getCharStartOffset(),
- stringLength, aYearMonthDuration, ADurationParseOption.YEAR_MONTH);
yearMonthDurationSerde.serialize(aYearMonthDuration, out);
result.set(resultStorage);
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt,
- ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e,
- ATypeTag.SERIALIZED_YEAR_MONTH_DURATION_TYPE_TAG);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (parseYearMonthDuration(utf8Ptr, aYearMonthDuration)) {
+ resultStorage.reset();
+ yearMonthDurationSerde.serialize(aYearMonthDuration, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.AYEARMONTHDURATION;
+ }
+
+ @Override
+ protected FunctionIdentifier getIdentifier() {
+ return AYearMonthDurationConstructorDescriptor.this.getIdentifier();
+ }
};
}
};
}
- /* (non-Javadoc)
- * @see org.apache.asterix.om.functions.AbstractFunctionDescriptor#getIdentifier()
- */
+ private static boolean parseYearMonthDuration(UTF8StringPointable textPtr, AMutableYearMonthDuration result) {
+ try {
+ ADurationParserFactory.parseDuration(textPtr.getByteArray(), textPtr.getCharStartOffset(),
+ textPtr.getUTF8Length(), result, ADurationParseOption.YEAR_MONTH);
+ return true;
+ } catch (HyracksDataException e) {
+ return false;
+ }
+ }
+
@Override
public FunctionIdentifier getIdentifier() {
return BuiltinFunctions.YEAR_MONTH_DURATION_CONSTRUCTOR;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBinaryConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBinaryConstructorEvaluator.java
new file mode 100644
index 0000000..6960273
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBinaryConstructorEvaluator.java
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.constructors;
+
+import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
+import org.apache.asterix.om.base.ABinary;
+import org.apache.asterix.om.base.AMutableBinary;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
+
+abstract class AbstractBinaryConstructorEvaluator extends AbstractConstructorEvaluator {
+
+ protected final AMutableBinary aBinary = new AMutableBinary(new byte[0], 0, 0);
+ @SuppressWarnings("unchecked")
+ protected final ISerializerDeserializer<ABinary> binarySerde =
+ SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABINARY);
+ protected final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
+
+ protected AbstractBinaryConstructorEvaluator(IEvaluatorContext ctx, IScalarEvaluator inputEval,
+ SourceLocation sourceLoc) {
+ super(ctx, inputEval, sourceLoc);
+ }
+
+ @Override
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case BINARY:
+ result.set(inputArg);
+ break;
+ case STRING:
+ utf8Ptr.set(inputArg.getByteArray(), startOffset + 1, len - 1);
+ if (parseBinary(utf8Ptr, aBinary)) {
+ resultStorage.reset();
+ binarySerde.serialize(aBinary, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
+ }
+ }
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ABINARY;
+ }
+
+ protected abstract boolean parseBinary(UTF8StringPointable textPtr, AMutableBinary result);
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBooleanConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBooleanConstructorEvaluator.java
index 7e1e35b..6777feb 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBooleanConstructorEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractBooleanConstructorEvaluator.java
@@ -19,32 +19,33 @@
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
-import java.io.IOException;
-
+import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ABoolean;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.runtime.evaluators.common.NumberUtils;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.exceptions.SourceLocation;
import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
import org.apache.hyracks.util.string.UTF8StringUtil;
-public abstract class AbstractBooleanConstructorEvaluator implements IScalarEvaluator {
+public abstract class AbstractBooleanConstructorEvaluator extends AbstractConstructorEvaluator {
+
@SuppressWarnings("unchecked")
- protected static final ISerializerDeserializer<ABoolean> BOOLEAN_SERDE =
+ protected final ISerializerDeserializer<ABoolean> booleanSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
protected static final IBinaryComparator UTF8_BINARY_CMP =
@@ -53,60 +54,85 @@
protected static final byte[] TRUE = UTF8StringUtil.writeStringToBytes("true");
protected static final byte[] FALSE = UTF8StringUtil.writeStringToBytes("false");
- protected final IScalarEvaluator inputEval;
- protected final SourceLocation sourceLoc;
- protected final IPointable inputArg;
- protected final ArrayBackedValueStorage resultStorage;
- protected final DataOutput out;
+ private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
- protected AbstractBooleanConstructorEvaluator(IScalarEvaluator inputEval, SourceLocation sourceLoc) {
- this.inputEval = inputEval;
- this.sourceLoc = sourceLoc;
- inputArg = new VoidPointable();
- resultStorage = new ArrayBackedValueStorage();
- out = resultStorage.getDataOutput();
+ protected AbstractBooleanConstructorEvaluator(IEvaluatorContext ctx, IScalarEvaluator inputEval,
+ SourceLocation sourceLoc) {
+ super(ctx, inputEval, sourceLoc);
}
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- inputEval.evaluate(tuple, inputArg);
- resultStorage.reset();
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- evaluateImpl(result);
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e, ATypeTag.SERIALIZED_BOOLEAN_TYPE_TAG);
- }
- }
-
protected void evaluateImpl(IPointable result) throws HyracksDataException {
byte[] bytes = inputArg.getByteArray();
int startOffset = inputArg.getStartOffset();
- byte tt = bytes[startOffset];
- if (tt == ATypeTag.SERIALIZED_BOOLEAN_TYPE_TAG) {
- result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
- int len = inputArg.getLength();
- if (UTF8_BINARY_CMP.compare(bytes, startOffset + 1, len - 1, TRUE, 0, TRUE.length) == 0) {
- setBoolean(result, true);
- } else if (UTF8_BINARY_CMP.compare(bytes, startOffset + 1, len - 1, FALSE, 0, FALSE.length) == 0) {
- setBoolean(result, false);
- } else {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_BOOLEAN_TYPE_TAG);
- }
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt, ATypeTag.SERIALIZED_STRING_TYPE_TAG);
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case BOOLEAN:
+ result.set(inputArg);
+ break;
+ case TINYINT:
+ setInteger(AInt8SerializerDeserializer.getByte(bytes, startOffset + 1), result);
+ break;
+ case SMALLINT:
+ setInteger(AInt16SerializerDeserializer.getShort(bytes, startOffset + 1), result);
+ break;
+ case INTEGER:
+ setInteger(AInt32SerializerDeserializer.getInt(bytes, startOffset + 1), result);
+ break;
+ case BIGINT:
+ setInteger(AInt64SerializerDeserializer.getLong(bytes, startOffset + 1), result);
+ break;
+ case FLOAT:
+ setDouble(AFloatSerializerDeserializer.getFloat(bytes, startOffset + 1), result);
+ break;
+ case DOUBLE:
+ setDouble(ADoubleSerializerDeserializer.getDouble(bytes, startOffset + 1), result);
+ break;
+ case STRING:
+ Boolean v = parseBoolean(bytes, startOffset, len);
+ if (v != null) {
+ setBoolean(result, v);
+ } else {
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
- protected void setBoolean(IPointable result, boolean value) throws HyracksDataException {
- BOOLEAN_SERDE.serialize(ABoolean.valueOf(value), out);
+ protected Boolean parseBoolean(byte[] bytes, int offset, int len) throws HyracksDataException {
+ if (UTF8_BINARY_CMP.compare(bytes, offset + 1, len - 1, TRUE, 0, TRUE.length) == 0) {
+ return true;
+ } else if (UTF8_BINARY_CMP.compare(bytes, offset + 1, len - 1, FALSE, 0, FALSE.length) == 0) {
+ return false;
+ } else {
+ return null;
+ }
+ }
+
+ protected final void setBoolean(IPointable result, boolean value) throws HyracksDataException {
+ resultStorage.reset();
+ booleanSerde.serialize(ABoolean.valueOf(value), out);
result.set(resultStorage);
}
- protected abstract FunctionIdentifier getIdentifier();
+ protected final void setInteger(long v, IPointable result) throws HyracksDataException {
+ setBoolean(result, v != 0);
+ }
+
+ protected final void setDouble(double v, IPointable result) throws HyracksDataException {
+ long bits = Double.doubleToLongBits(v);
+ boolean zeroOrNaN = bits == NumberUtils.POSITIVE_ZERO_BITS || bits == NumberUtils.NEGATIVE_ZERO_BITS
+ || bits == NumberUtils.NAN_BITS;
+ setBoolean(result, !zeroOrNaN);
+ }
+
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ABOOLEAN;
+ }
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractConstructorEvaluator.java
new file mode 100644
index 0000000..6287fe6
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractConstructorEvaluator.java
@@ -0,0 +1,98 @@
+/*
+ * 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.
+ */
+
+package org.apache.asterix.runtime.evaluators.constructors;
+
+import java.io.DataOutput;
+
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.om.exceptions.ExceptionUtil;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.exceptions.IWarningCollector;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+import org.apache.hyracks.api.exceptions.Warning;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+import org.apache.hyracks.util.LogRedactionUtil;
+
+public abstract class AbstractConstructorEvaluator implements IScalarEvaluator {
+
+ protected final IEvaluatorContext ctx;
+ protected final IScalarEvaluator inputEval;
+ protected final SourceLocation sourceLoc;
+ protected final IPointable inputArg;
+ protected final ArrayBackedValueStorage resultStorage;
+ protected final DataOutput out;
+
+ protected AbstractConstructorEvaluator(IEvaluatorContext ctx, IScalarEvaluator inputEval,
+ SourceLocation sourceLoc) {
+ this.ctx = ctx;
+ this.inputEval = inputEval;
+ this.sourceLoc = sourceLoc;
+ this.inputArg = new VoidPointable();
+ this.resultStorage = new ArrayBackedValueStorage();
+ this.out = resultStorage.getDataOutput();
+ }
+
+ @Override
+ public final void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+ inputEval.evaluate(tuple, inputArg);
+ if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
+ return;
+ }
+ evaluateImpl(result);
+ }
+
+ protected abstract void evaluateImpl(IPointable result) throws HyracksDataException;
+
+ protected abstract FunctionIdentifier getIdentifier();
+
+ protected abstract BuiltinType getTargetType();
+
+ protected void handleUnsupportedType(ATypeTag inputType, IPointable result) throws HyracksDataException {
+ warnUnsupportedType(inputType);
+ PointableHelper.setNull(result);
+ }
+
+ protected void warnUnsupportedType(ATypeTag inputType) {
+ ExceptionUtil.warnUnsupportedType(ctx, sourceLoc, getIdentifier().getName() + "()", inputType);
+ }
+
+ protected void handleParseError(UTF8StringPointable textPtr, IPointable result) {
+ warnParseError(textPtr);
+ PointableHelper.setNull(result);
+ }
+
+ protected void warnParseError(UTF8StringPointable textPtr) {
+ IWarningCollector warningCollector = ctx.getWarningCollector();
+ if (warningCollector.shouldWarn()) {
+ warningCollector.warn(Warning.of(sourceLoc, ErrorCode.INVALID_FORMAT,
+ getTargetType().getTypeTag().toString(), LogRedactionUtil.userData(textPtr.toString())));
+ }
+ }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractDoubleConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractDoubleConstructorEvaluator.java
index 04220ce..b38b5e2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractDoubleConstructorEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractDoubleConstructorEvaluator.java
@@ -19,90 +19,87 @@
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
import java.io.IOException;
+import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.ADouble;
import org.apache.asterix.om.base.AMutableDouble;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
import org.apache.asterix.runtime.evaluators.common.NumberUtils;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.exceptions.SourceLocation;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
-public abstract class AbstractDoubleConstructorEvaluator implements IScalarEvaluator {
+public abstract class AbstractDoubleConstructorEvaluator extends AbstractConstructorEvaluator {
+
+ protected final AMutableDouble aDouble = new AMutableDouble(0);
@SuppressWarnings("unchecked")
- protected static final ISerializerDeserializer<ADouble> DOUBLE_SERDE =
+ protected final ISerializerDeserializer<ADouble> doubleSerde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
+ protected final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
- protected final IScalarEvaluator inputEval;
- protected final SourceLocation sourceLoc;
- protected final ArrayBackedValueStorage resultStorage;
- protected final DataOutput out;
- protected final IPointable inputArg;
- protected final AMutableDouble aDouble;
- protected final UTF8StringPointable utf8Ptr;
-
- protected AbstractDoubleConstructorEvaluator(IScalarEvaluator inputEval, SourceLocation sourceLoc) {
- this.inputEval = inputEval;
- this.sourceLoc = sourceLoc;
- resultStorage = new ArrayBackedValueStorage();
- out = resultStorage.getDataOutput();
- inputArg = new VoidPointable();
- aDouble = new AMutableDouble(0);
- utf8Ptr = new UTF8StringPointable();
+ protected AbstractDoubleConstructorEvaluator(IEvaluatorContext ctx, IScalarEvaluator inputEval,
+ SourceLocation sourceLoc) {
+ super(ctx, inputEval, sourceLoc);
}
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- inputEval.evaluate(tuple, inputArg);
- resultStorage.reset();
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- evaluateImpl(result);
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e, ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG);
- }
- }
-
- protected void evaluateImpl(IPointable result) throws IOException {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
byte[] bytes = inputArg.getByteArray();
int startOffset = inputArg.getStartOffset();
- byte tt = bytes[startOffset];
- if (tt == ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG) {
- result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
- utf8Ptr.set(bytes, startOffset + 1, inputArg.getLength() - 1);
- if (NumberUtils.parseDouble(utf8Ptr, aDouble)) {
- DOUBLE_SERDE.serialize(aDouble, out);
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case DOUBLE:
+ result.set(inputArg);
+ break;
+ case TINYINT:
+ case SMALLINT:
+ case INTEGER:
+ case BIGINT:
+ case FLOAT:
+ resultStorage.reset();
+ try {
+ ATypeHierarchy.getTypePromoteComputer(inputType, ATypeTag.DOUBLE).convertType(bytes,
+ startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
+ }
result.set(resultStorage);
- } else {
- handleUparseableString(result);
- }
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt, ATypeTag.SERIALIZED_STRING_TYPE_TAG);
+ break;
+ case BOOLEAN:
+ resultStorage.reset();
+ boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, startOffset + 1);
+ aDouble.setValue(b ? 1 : 0);
+ doubleSerde.serialize(aDouble, out);
+ result.set(resultStorage);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (NumberUtils.parseDouble(utf8Ptr, aDouble)) {
+ resultStorage.reset();
+ doubleSerde.serialize(aDouble, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
- protected void handleUparseableString(IPointable result) throws HyracksDataException {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG);
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ADOUBLE;
}
-
- protected abstract FunctionIdentifier getIdentifier();
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractInt64ConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractInt64ConstructorEvaluator.java
index cab2db4..b751cae 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractInt64ConstructorEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractInt64ConstructorEvaluator.java
@@ -19,91 +19,96 @@
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
import java.io.IOException;
+import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
import org.apache.asterix.om.base.AInt64;
import org.apache.asterix.om.base.AMutableInt64;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
import org.apache.asterix.runtime.evaluators.common.NumberUtils;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.exceptions.SourceLocation;
import org.apache.hyracks.data.std.api.IPointable;
import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
-public abstract class AbstractInt64ConstructorEvaluator implements IScalarEvaluator {
+public abstract class AbstractInt64ConstructorEvaluator extends AbstractConstructorEvaluator {
+
+ protected final AMutableInt64 aInt64 = new AMutableInt64(0);
@SuppressWarnings("unchecked")
- protected static final ISerializerDeserializer<AInt64> INT64_SERDE =
+ protected final ISerializerDeserializer<AInt64> int64Serde =
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
+ protected final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
- protected final IScalarEvaluator inputEval;
- protected final SourceLocation sourceLoc;
- protected final IPointable inputArg;
- protected final ArrayBackedValueStorage resultStorage;
- protected final DataOutput out;
- protected final AMutableInt64 aInt64;
- protected final UTF8StringPointable utf8Ptr;
-
- protected AbstractInt64ConstructorEvaluator(IScalarEvaluator inputEval, SourceLocation sourceLoc) {
- this.inputEval = inputEval;
- this.sourceLoc = sourceLoc;
- inputArg = new VoidPointable();
- resultStorage = new ArrayBackedValueStorage();
- out = resultStorage.getDataOutput();
- aInt64 = new AMutableInt64(0);
- utf8Ptr = new UTF8StringPointable();
+ protected AbstractInt64ConstructorEvaluator(IEvaluatorContext ctx, IScalarEvaluator inputEval,
+ SourceLocation sourceLoc) {
+ super(ctx, inputEval, sourceLoc);
}
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- inputEval.evaluate(tuple, inputArg);
- resultStorage.reset();
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- evaluateImpl(result);
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e, ATypeTag.SERIALIZED_INT64_TYPE_TAG);
- }
- }
-
- protected void evaluateImpl(IPointable result) throws IOException {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
byte[] bytes = inputArg.getByteArray();
int startOffset = inputArg.getStartOffset();
-
- byte tt = bytes[startOffset];
- if (tt == ATypeTag.SERIALIZED_INT64_TYPE_TAG) {
- result.set(inputArg);
- } else if (tt == ATypeTag.SERIALIZED_STRING_TYPE_TAG) {
- utf8Ptr.set(bytes, startOffset + 1, inputArg.getLength() - 1);
- if (NumberUtils.parseInt64(utf8Ptr, aInt64)) {
- INT64_SERDE.serialize(aInt64, out);
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ switch (inputType) {
+ case BIGINT:
+ result.set(inputArg);
+ break;
+ case TINYINT:
+ case SMALLINT:
+ case INTEGER:
+ resultStorage.reset();
+ try {
+ ATypeHierarchy.getTypePromoteComputer(inputType, ATypeTag.BIGINT).convertType(bytes,
+ startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
+ }
result.set(resultStorage);
- } else {
- handleUnparseableString(result);
- }
- } else {
- throw new TypeMismatchException(sourceLoc, getIdentifier(), 0, tt, ATypeTag.SERIALIZED_STRING_TYPE_TAG);
+ break;
+ case FLOAT:
+ case DOUBLE:
+ resultStorage.reset();
+ try {
+ ATypeHierarchy.getTypeDemoteComputer(inputType, ATypeTag.BIGINT, false).convertType(bytes,
+ startOffset + 1, len - 1, out);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
+ }
+ result.set(resultStorage);
+ break;
+ case BOOLEAN:
+ resultStorage.reset();
+ boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, startOffset + 1);
+ aInt64.setValue(b ? 1 : 0);
+ int64Serde.serialize(aInt64, out);
+ result.set(resultStorage);
+ break;
+ case STRING:
+ utf8Ptr.set(bytes, startOffset + 1, len - 1);
+ if (NumberUtils.parseInt64(utf8Ptr, aInt64)) {
+ resultStorage.reset();
+ int64Serde.serialize(aInt64, out);
+ result.set(resultStorage);
+ } else {
+ handleParseError(utf8Ptr, result);
+ }
+ break;
+ default:
+ handleUnsupportedType(inputType, result);
+ break;
}
}
- protected void handleUnparseableString(IPointable result) throws HyracksDataException {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), ATypeTag.SERIALIZED_INT64_TYPE_TAG);
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.AINT64;
}
-
- protected abstract FunctionIdentifier getIdentifier();
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractStringConstructorEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractStringConstructorEvaluator.java
index 5ce7853..f306e86 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractStringConstructorEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AbstractStringConstructorEvaluator.java
@@ -19,103 +19,85 @@
package org.apache.asterix.runtime.evaluators.constructors;
-import java.io.DataOutput;
import java.io.IOException;
+import org.apache.asterix.dataflow.data.nontagged.serde.ABinarySerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADateSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADateTimeSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADayTimeDurationSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.ADurationSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.ATimeSerializerDeserializer;
+import org.apache.asterix.dataflow.data.nontagged.serde.AYearMonthDurationSerializerDeserializer;
+import org.apache.asterix.om.base.AUUID;
+import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.EnumDeserializer;
import org.apache.asterix.runtime.evaluators.common.NumberUtils;
-import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
-import org.apache.asterix.runtime.exceptions.InvalidDataFormatException;
-import org.apache.asterix.runtime.exceptions.UnsupportedTypeException;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.api.exceptions.SourceLocation;
import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
import org.apache.hyracks.data.std.util.GrowableArray;
import org.apache.hyracks.data.std.util.UTF8StringBuilder;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+import org.apache.hyracks.util.bytes.Base64Printer;
-public abstract class AbstractStringConstructorEvaluator implements IScalarEvaluator {
+public abstract class AbstractStringConstructorEvaluator extends AbstractConstructorEvaluator {
- protected final IScalarEvaluator inputEval;
- protected final SourceLocation sourceLoc;
- protected final IPointable inputArg;
- protected final ArrayBackedValueStorage resultStorage;
- protected final DataOutput out;
- protected final UTF8StringBuilder builder;
- protected final GrowableArray baaos;
+ protected final UTF8StringBuilder builder = new UTF8StringBuilder();
+ protected final GrowableArray baaos = new GrowableArray();
+ protected final StringBuilder sb = new StringBuilder(32);
- protected AbstractStringConstructorEvaluator(IScalarEvaluator inputEval, SourceLocation sourceLoc) {
- this.inputEval = inputEval;
- this.sourceLoc = sourceLoc;
- resultStorage = new ArrayBackedValueStorage();
- out = resultStorage.getDataOutput();
- inputArg = new VoidPointable();
- builder = new UTF8StringBuilder();
- baaos = new GrowableArray();
+ protected AbstractStringConstructorEvaluator(IEvaluatorContext ctx, IScalarEvaluator inputEval,
+ SourceLocation sourceLoc) {
+ super(ctx, inputEval, sourceLoc);
}
@Override
- public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
- try {
- inputEval.evaluate(tuple, inputArg);
- resultStorage.reset();
-
- if (PointableHelper.checkAndSetMissingOrNull(result, inputArg)) {
- return;
- }
-
- evaluateImpl(result);
- } catch (IOException e) {
- throw new InvalidDataFormatException(sourceLoc, getIdentifier(), e, ATypeTag.SERIALIZED_STRING_TYPE_TAG);
- }
- }
-
- protected void evaluateImpl(IPointable result) throws IOException {
- byte[] serString = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
-
- ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[serString[offset]];
- if (tt == ATypeTag.STRING) {
+ protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ byte[] bytes = inputArg.getByteArray();
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ ATypeTag inputType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes[startOffset]);
+ if (inputType == ATypeTag.STRING) {
result.set(inputArg);
- } else {
- int len = inputArg.getLength();
+ return;
+ }
+ try {
baaos.reset();
builder.reset(baaos, len);
- int startOffset = offset + 1;
- switch (tt) {
- case TINYINT: {
- int i = AInt8SerializerDeserializer.getByte(serString, startOffset);
- builder.appendString(String.valueOf(i));
+ sb.setLength(0);
+ switch (inputType) {
+ case TINYINT:
+ int i = AInt8SerializerDeserializer.getByte(bytes, startOffset + 1);
+ sb.append(i);
+ builder.appendString(sb);
break;
- }
- case SMALLINT: {
- int i = AInt16SerializerDeserializer.getShort(serString, startOffset);
- builder.appendString(String.valueOf(i));
+ case SMALLINT:
+ i = AInt16SerializerDeserializer.getShort(bytes, startOffset + 1);
+ sb.append(i);
+ builder.appendString(sb);
break;
- }
- case INTEGER: {
- int i = AInt32SerializerDeserializer.getInt(serString, startOffset);
- builder.appendString(String.valueOf(i));
+ case INTEGER:
+ i = AInt32SerializerDeserializer.getInt(bytes, startOffset + 1);
+ sb.append(i);
+ builder.appendString(sb);
break;
- }
- case BIGINT: {
- long l = AInt64SerializerDeserializer.getLong(serString, startOffset);
- builder.appendString(String.valueOf(l));
+ case BIGINT:
+ long l = AInt64SerializerDeserializer.getLong(bytes, startOffset + 1);
+ sb.append(l);
+ builder.appendString(sb);
break;
- }
- case DOUBLE: {
- double d = ADoubleSerializerDeserializer.getDouble(serString, startOffset);
+ case DOUBLE:
+ double d = ADoubleSerializerDeserializer.getDouble(bytes, startOffset + 1);
if (Double.isNaN(d)) {
builder.appendUtf8StringPointable(NumberUtils.NAN);
} else if (d == Double.POSITIVE_INFINITY) { // NOSONAR
@@ -123,12 +105,12 @@
} else if (d == Double.NEGATIVE_INFINITY) { // NOSONAR
builder.appendUtf8StringPointable(NumberUtils.NEGATIVE_INF);
} else {
- builder.appendString(String.valueOf(d));
+ sb.append(d);
+ builder.appendString(sb);
}
break;
- }
- case FLOAT: {
- float f = AFloatSerializerDeserializer.getFloat(serString, startOffset);
+ case FLOAT:
+ float f = AFloatSerializerDeserializer.getFloat(bytes, startOffset + 1);
if (Float.isNaN(f)) {
builder.appendUtf8StringPointable(NumberUtils.NAN);
} else if (f == Float.POSITIVE_INFINITY) { // NOSONAR
@@ -136,43 +118,75 @@
} else if (f == Float.NEGATIVE_INFINITY) { // NOSONAR
builder.appendUtf8StringPointable(NumberUtils.NEGATIVE_INF);
} else {
- builder.appendString(String.valueOf(f));
+ sb.append(f);
+ builder.appendString(sb);
}
break;
- }
- case BOOLEAN: {
- boolean b = ABooleanSerializerDeserializer.getBoolean(serString, startOffset);
+ case BOOLEAN:
+ boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, startOffset + 1);
builder.appendString(String.valueOf(b));
break;
- }
-
- // NotYetImplemented
- case CIRCLE:
case DATE:
- case DATETIME:
- case LINE:
+ l = ADateSerializerDeserializer.getChronon(bytes, startOffset + 1)
+ * GregorianCalendarSystem.CHRONON_OF_DAY;
+ GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(l, 0, sb,
+ GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.DAY, false);
+ builder.appendString(sb);
+ break;
case TIME:
- case DURATION:
+ i = ATimeSerializerDeserializer.getChronon(bytes, startOffset + 1);
+ GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(i, 0, sb,
+ GregorianCalendarSystem.Fields.HOUR, GregorianCalendarSystem.Fields.MILLISECOND, false);
+ builder.appendString(sb);
+ break;
+ case DATETIME:
+ l = ADateTimeSerializerDeserializer.getChronon(bytes, startOffset + 1);
+ GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(l, 0, sb,
+ GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.MILLISECOND, true);
+ builder.appendString(sb);
+ break;
case YEARMONTHDURATION:
+ i = AYearMonthDurationSerializerDeserializer.getYearMonth(bytes, startOffset + 1);
+ GregorianCalendarSystem.getInstance().getDurationExtendStringRepWithTimezoneUntilField(0, i, sb);
+ builder.appendString(sb);
+ break;
case DAYTIMEDURATION:
- case INTERVAL:
- case ARRAY:
- case POINT:
- case POINT3D:
- case RECTANGLE:
- case POLYGON:
- case OBJECT:
- case MULTISET:
+ l = ADayTimeDurationSerializerDeserializer.getDayTime(bytes, startOffset + 1);
+ GregorianCalendarSystem.getInstance().getDurationExtendStringRepWithTimezoneUntilField(l, 0, sb);
+ builder.appendString(sb);
+ break;
+ case DURATION:
+ i = ADurationSerializerDeserializer.getYearMonth(bytes, startOffset + 1);
+ l = ADurationSerializerDeserializer.getDayTime(bytes, startOffset + 1);
+ GregorianCalendarSystem.getInstance().getDurationExtendStringRepWithTimezoneUntilField(l, i, sb);
+ builder.appendString(sb);
+ break;
case UUID:
+ AUUID.appendLiteralOnly(bytes, startOffset + 1, sb);
+ builder.appendString(sb);
+ break;
+ case BINARY:
+ int contentLength = ABinarySerializerDeserializer.getContentLength(bytes, startOffset + 1);
+ int metaLength = ABinarySerializerDeserializer.getMetaLength(contentLength);
+ Base64Printer.printBase64Binary(bytes, startOffset + 1 + metaLength, contentLength, sb);
+ builder.appendString(sb);
+ break;
default:
- throw new UnsupportedTypeException(sourceLoc, getIdentifier(), serString[offset]);
+ handleUnsupportedType(inputType, result);
+ return;
}
builder.finish();
+ resultStorage.reset();
out.write(ATypeTag.SERIALIZED_STRING_TYPE_TAG);
out.write(baaos.getByteArray(), 0, baaos.getLength());
result.set(resultStorage);
+ } catch (IOException e) {
+ throw HyracksDataException.create(e);
}
}
- protected abstract FunctionIdentifier getIdentifier();
+ @Override
+ protected BuiltinType getTargetType() {
+ return BuiltinType.ASTRING;
+ }
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeDescriptor.java
index c27423b..6a0d6fb 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeDescriptor.java
@@ -23,7 +23,6 @@
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.functions.IFunctionTypeInferer;
-import org.apache.asterix.om.typecomputer.impl.TypeComputeUtils;
import org.apache.asterix.om.types.IAType;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.asterix.runtime.functions.FunctionTypeInferers;
@@ -64,14 +63,6 @@
public void setImmutableStates(Object... states) {
reqType = (IAType) states[0];
inputType = (IAType) states[1];
- // If reqType or inputType is null, or they are the same, it indicates there is a bug in the compiler.
- if (reqType == null || inputType == null || reqType.equals(inputType)) {
- throw new IllegalStateException(
- "Invalid types for casting, required type " + reqType + ", input type " + inputType);
- }
- // NULLs and MISSINGs are handled by the generated code, therefore we only need to handle actual types here.
- this.reqType = TypeComputeUtils.getActualType(reqType);
- this.inputType = TypeComputeUtils.getActualType(inputType);
}
@Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBigIntDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBigIntDescriptor.java
index 6040e1c..23c8adc 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBigIntDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBigIntDescriptor.java
@@ -19,16 +19,11 @@
package org.apache.asterix.runtime.evaluators.functions;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
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.om.types.hierachy.ATypeHierarchy;
-import org.apache.asterix.om.types.hierachy.ITypeConvertComputer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.asterix.runtime.evaluators.constructors.AbstractInt64ConstructorEvaluator;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -55,54 +50,23 @@
@Override
public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractInt64ConstructorEvaluator(args[0].createScalarEvaluator(ctx), sourceLoc) {
+ return new AbstractInt64ConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
@Override
- protected void evaluateImpl(IPointable result) throws IOException {
- byte[] bytes = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[bytes[offset]];
- switch (tt) {
- case BOOLEAN:
- boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, offset + 1);
- aInt64.setValue(b ? 1 : 0);
- INT64_SERDE.serialize(aInt64, out);
- result.set(resultStorage);
- break;
-
- case TINYINT:
- case SMALLINT:
- case INTEGER:
- ITypeConvertComputer tpcc = ATypeHierarchy.getTypePromoteComputer(tt, ATypeTag.BIGINT);
- tpcc.convertType(bytes, offset + 1, inputArg.getLength() - 1, out);
- result.set(resultStorage);
- break;
-
- case FLOAT:
- case DOUBLE:
- ITypeConvertComputer tdcc =
- ATypeHierarchy.getTypeDemoteComputer(tt, ATypeTag.BIGINT, false);
- tdcc.convertType(bytes, offset + 1, inputArg.getLength() - 1, out);
- result.set(resultStorage);
- break;
-
+ protected void handleUnsupportedType(ATypeTag inputType, IPointable result)
+ throws HyracksDataException {
+ switch (inputType) {
case ARRAY:
case MULTISET:
case OBJECT:
PointableHelper.setNull(result);
break;
-
default:
- super.evaluateImpl(result);
+ super.handleUnsupportedType(inputType, result);
break;
}
}
@Override
- protected void handleUnparseableString(IPointable result) {
- PointableHelper.setNull(result);
- }
-
- @Override
protected FunctionIdentifier getIdentifier() {
return ToBigIntDescriptor.this.getIdentifier();
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBooleanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBooleanDescriptor.java
index 594b6d8..5fa8424 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBooleanDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBooleanDescriptor.java
@@ -20,12 +20,6 @@
package org.apache.asterix.runtime.evaluators.functions;
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
-import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AOrderedListSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ARecordSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AUnorderedListSerializerDeserializer;
@@ -34,7 +28,6 @@
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
-import org.apache.asterix.runtime.evaluators.common.NumberUtils;
import org.apache.asterix.runtime.evaluators.constructors.AbstractBooleanConstructorEvaluator;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
@@ -47,7 +40,6 @@
@MissingNullInOutFunction
public class ToBooleanDescriptor extends AbstractScalarFunctionDynamicDescriptor {
private static final long serialVersionUID = 1L;
-
public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@Override
public IFunctionDescriptor createFunctionDescriptor() {
@@ -62,61 +54,35 @@
@Override
public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractBooleanConstructorEvaluator(args[0].createScalarEvaluator(ctx), sourceLoc) {
+ return new AbstractBooleanConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
@Override
- protected void evaluateImpl(IPointable result) throws HyracksDataException {
+ protected void handleUnsupportedType(ATypeTag inputType, IPointable result)
+ throws HyracksDataException {
byte[] bytes = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
-
- ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[bytes[offset]];
- switch (tt) {
- case TINYINT:
- setInteger(AInt8SerializerDeserializer.getByte(bytes, offset + 1), result);
- break;
- case SMALLINT:
- setInteger(AInt16SerializerDeserializer.getShort(bytes, offset + 1), result);
- break;
- case INTEGER:
- setInteger(AInt32SerializerDeserializer.getInt(bytes, offset + 1), result);
- break;
- case BIGINT:
- setInteger(AInt64SerializerDeserializer.getLong(bytes, offset + 1), result);
- break;
- case FLOAT:
- setDouble(AFloatSerializerDeserializer.getFloat(bytes, offset + 1), result);
- break;
- case DOUBLE:
- setDouble(ADoubleSerializerDeserializer.getDouble(bytes, offset + 1), result);
- break;
- case STRING:
- setInteger(UTF8StringUtil.getStringLength(bytes, offset + 1), result);
- break;
+ int startOffset = inputArg.getStartOffset();
+ int len = inputArg.getLength();
+ switch (inputType) {
case ARRAY:
- setInteger(AOrderedListSerializerDeserializer.getNumberOfItems(bytes, offset), result);
+ int n = AOrderedListSerializerDeserializer.getNumberOfItems(bytes, startOffset);
+ setInteger(n, result);
break;
case MULTISET:
- setInteger(AUnorderedListSerializerDeserializer.getNumberOfItems(bytes, offset),
- result);
+ n = AUnorderedListSerializerDeserializer.getNumberOfItems(bytes, startOffset);
+ setInteger(n, result);
break;
case OBJECT:
- setBoolean(result, !ARecordSerializerDeserializer.hasNoFields(bytes, offset,
- inputArg.getLength()));
+ boolean empty = ARecordSerializerDeserializer.hasNoFields(bytes, startOffset, len);
+ setBoolean(result, !empty);
break;
default:
- super.evaluateImpl(result);
+ super.handleUnsupportedType(inputType, result);
break;
}
}
- private void setInteger(long v, IPointable result) throws HyracksDataException {
- setBoolean(result, v != 0);
- }
-
- private void setDouble(double v, IPointable result) throws HyracksDataException {
- long bits = Double.doubleToLongBits(v);
- boolean zeroOrNaN = bits == NumberUtils.POSITIVE_ZERO_BITS
- || bits == NumberUtils.NEGATIVE_ZERO_BITS || bits == NumberUtils.NAN_BITS;
- setBoolean(result, !zeroOrNaN);
+ @Override
+ protected Boolean parseBoolean(byte[] bytes, int offset, int len) {
+ return UTF8StringUtil.getStringLength(bytes, offset + 1) != 0;
}
@Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToDoubleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToDoubleDescriptor.java
index 70ed398..95874c6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToDoubleDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToDoubleDescriptor.java
@@ -19,16 +19,11 @@
package org.apache.asterix.runtime.evaluators.functions;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
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.om.types.hierachy.ATypeHierarchy;
-import org.apache.asterix.om.types.hierachy.ITypeConvertComputer;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.asterix.runtime.evaluators.constructors.AbstractDoubleConstructorEvaluator;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -55,48 +50,23 @@
@Override
public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractDoubleConstructorEvaluator(args[0].createScalarEvaluator(ctx), sourceLoc) {
+ return new AbstractDoubleConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
@Override
- protected void evaluateImpl(IPointable result) throws IOException {
- byte[] bytes = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[bytes[offset]];
- switch (tt) {
- case BOOLEAN:
- boolean b = ABooleanSerializerDeserializer.getBoolean(bytes, offset + 1);
- aDouble.setValue(b ? 1 : 0);
- DOUBLE_SERDE.serialize(aDouble, out);
- result.set(resultStorage);
- break;
-
- case TINYINT:
- case SMALLINT:
- case INTEGER:
- case BIGINT:
- case FLOAT:
- ITypeConvertComputer tcc = ATypeHierarchy.getTypePromoteComputer(tt, ATypeTag.DOUBLE);
- tcc.convertType(bytes, offset + 1, inputArg.getLength() - 1, out);
- result.set(resultStorage);
- break;
-
+ protected void handleUnsupportedType(ATypeTag inputType, IPointable result)
+ throws HyracksDataException {
+ switch (inputType) {
case ARRAY:
case MULTISET:
case OBJECT:
PointableHelper.setNull(result);
break;
-
default:
- super.evaluateImpl(result);
+ super.handleUnsupportedType(inputType, result);
break;
}
}
@Override
- protected void handleUparseableString(IPointable result) {
- PointableHelper.setNull(result);
- }
-
- @Override
protected FunctionIdentifier getIdentifier() {
return ToDoubleDescriptor.this.getIdentifier();
}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToStringDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToStringDescriptor.java
index 6635082..de9224d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToStringDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToStringDescriptor.java
@@ -19,23 +19,17 @@
package org.apache.asterix.runtime.evaluators.functions;
-import java.io.IOException;
-
import org.apache.asterix.common.annotations.MissingNullInOutFunction;
-import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
-import org.apache.asterix.om.base.ANull;
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.om.types.BuiltinType;
import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
import org.apache.asterix.runtime.evaluators.constructors.AbstractStringConstructorEvaluator;
import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.data.std.api.IPointable;
@@ -56,33 +50,21 @@
@Override
public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
- return new AbstractStringConstructorEvaluator(args[0].createScalarEvaluator(ctx), sourceLoc) {
- @SuppressWarnings("unchecked")
- private final ISerializerDeserializer<ANull> nullSerde =
- SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
-
+ return new AbstractStringConstructorEvaluator(ctx, args[0].createScalarEvaluator(ctx), sourceLoc) {
@Override
- protected void evaluateImpl(IPointable result) throws IOException {
- byte[] bytes = inputArg.getByteArray();
- int offset = inputArg.getStartOffset();
- ATypeTag tt = ATypeTag.VALUE_TYPE_MAPPING[bytes[offset]];
- switch (tt) {
+ protected void handleUnsupportedType(ATypeTag inputType, IPointable result)
+ throws HyracksDataException {
+ switch (inputType) {
case ARRAY:
case MULTISET:
case OBJECT:
- setNull(result);
+ PointableHelper.setNull(result);
break;
default:
- super.evaluateImpl(result);
- break;
+ super.handleUnsupportedType(inputType, result);
}
}
- private void setNull(IPointable result) throws HyracksDataException {
- nullSerde.serialize(ANull.NULL, out);
- result.set(resultStorage);
- }
-
@Override
protected FunctionIdentifier getIdentifier() {
return ToStringDescriptor.this.getIdentifier();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryConcatDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryConcatDescriptor.java
index 907b591..ff19458 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryConcatDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryConcatDescriptor.java
@@ -100,10 +100,10 @@
}
try {
listAccessor.reset(data, offset);
+ boolean itemsAreSelfDescribing = listAccessor.itemsAreSelfDescribing();
int concatLength = 0;
boolean itemIsNull = false;
for (int i = 0; i < listAccessor.size(); i++) {
- // TODO(ali): itemOffset should be adjusted if list is heterogeneous like string_concat
int itemOffset = listAccessor.getItemOffset(i);
ATypeTag itemType = listAccessor.getItemType(itemOffset);
if (itemType != ATypeTag.BINARY) {
@@ -119,6 +119,9 @@
throw new UnsupportedItemTypeException(sourceLoc, getIdentifier(),
itemType.serialize());
}
+ if (itemsAreSelfDescribing) {
+ itemOffset++;
+ }
concatLength += ByteArrayPointable.getContentLength(data, itemOffset);
}
if (itemIsNull) {
@@ -132,6 +135,9 @@
for (int i = 0; i < listAccessor.size(); i++) {
int itemOffset = listAccessor.getItemOffset(i);
+ if (itemsAreSelfDescribing) {
+ itemOffset++;
+ }
int length = ByteArrayPointable.getContentLength(data, itemOffset);
dataOutput.write(data,
itemOffset + ByteArrayPointable.getNumberBytesToStoreMeta(length), length);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
index 3882222..f5deda0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
@@ -23,6 +23,8 @@
import java.util.List;
import org.apache.asterix.common.config.CompilerProperties;
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
import org.apache.asterix.om.base.AOrderedList;
import org.apache.asterix.om.base.AString;
import org.apache.asterix.om.constants.AsterixConstantValue;
@@ -118,8 +120,15 @@
public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
CompilerProperties compilerProps) throws AlgebricksException {
AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
- IAType rt = TypeCastUtils.getRequiredType(funcExpr);
- IAType it = (IAType) context.getType(funcExpr.getArguments().get(0).getValue());
+ IAType reqType = TypeCastUtils.getRequiredType(funcExpr);
+ IAType inputType = (IAType) context.getType(funcExpr.getArguments().get(0).getValue());
+ // If reqType or inputType is null it indicates there is a bug in the compiler.
+ if (reqType == null || inputType == null) {
+ throw new CompilationException(ErrorCode.COMPILATION_ERROR, expr.getSourceLocation(),
+ "Invalid types for casting, required type " + reqType + ", input type " + inputType);
+ }
+ IAType rt = TypeComputeUtils.getActualType(reqType);
+ IAType it = TypeComputeUtils.getActualType(inputType);
fd.setImmutableStates(rt, it);
}
}