diff --git a/babel/src/test/java/org/apache/calcite/test/BabelQuidemTest.java b/babel/src/test/java/org/apache/calcite/test/BabelQuidemTest.java index 54058f67cec..623f52bee8d 100644 --- a/babel/src/test/java/org/apache/calcite/test/BabelQuidemTest.java +++ b/babel/src/test/java/org/apache/calcite/test/BabelQuidemTest.java @@ -120,6 +120,7 @@ public static void main(String[] args) throws Exception { ConnectionFactories.addType("TIMESTAMP", typeFactory -> typeFactory.createSqlType( SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE))) + .with(CalciteConnectionProperty.TIME_ZONE, "UTC") .connect(); case "scott-postgresql": return CalciteAssert.that() diff --git a/babel/src/test/resources/sql/big-query.iq b/babel/src/test/resources/sql/big-query.iq index 5ffa0bdf66d..834bd65dd8d 100755 --- a/babel/src/test/resources/sql/big-query.iq +++ b/babel/src/test/resources/sql/big-query.iq @@ -410,14 +410,12 @@ SELECT # In the following example, EXTRACT returns values corresponding to # different date parts from a column of dates near the end of the # year. - -!if (false) { SELECT d, EXTRACT(ISOYEAR FROM d) AS isoyear, - EXTRACT(ISOWEEK FROM d) AS isoweek, - EXTRACT(YEAR FROM d) AS year, - EXTRACT(WEEK FROM d) AS week + EXTRACT(ISOWEEK FROM d) as isoweek, + EXTRACT(WEEK(TUESDAY) FROM d) AS week_tues, + EXTRACT(YEAR FROM d) AS year FROM UNNEST( ARRAY [DATE '2015-12-23', DATE '2015-12-24', @@ -438,48 +436,62 @@ FROM UNNEST( DATE '2016-01-08', DATE '2016-01-09']) AS d ORDER BY d; -+------------+---------+---------+------+------+ -| date | isoyear | isoweek | year | week | -+------------+---------+---------+------+------+ -| 2015-12-23 | 2015 | 52 | 2015 | 51 | -| 2015-12-24 | 2015 | 52 | 2015 | 51 | -| 2015-12-25 | 2015 | 52 | 2015 | 51 | -| 2015-12-26 | 2015 | 52 | 2015 | 51 | -| 2015-12-27 | 2015 | 52 | 2015 | 52 | -| 2015-12-28 | 2015 | 53 | 2015 | 52 | -| 2015-12-29 | 2015 | 53 | 2015 | 52 | -| 2015-12-30 | 2015 | 53 | 2015 | 52 | -| 2015-12-31 | 2015 | 53 | 2015 | 52 | -| 2016-01-01 | 2015 | 53 | 2016 | 0 | -| 2016-01-02 | 2015 | 53 | 2016 | 0 | -| 2016-01-03 | 2015 | 53 | 2016 | 1 | -| 2016-01-04 | 2016 | 1 | 2016 | 1 | -| 2016-01-05 | 2016 | 1 | 2016 | 1 | -| 2016-01-06 | 2016 | 1 | 2016 | 1 | -| 2016-01-07 | 2016 | 1 | 2016 | 1 | -| 2016-01-08 | 2016 | 1 | 2016 | 1 | -| 2016-01-09 | 2016 | 1 | 2016 | 1 | -+------------+---------+---------+------+------+ ++------------+---------+---------+-----------+------+ +| d | isoyear | isoweek | week_tues | year | ++------------+---------+---------+-----------+------+ +| 2015-12-23 | 2015 | 52 | 51 | 2015 | +| 2015-12-24 | 2015 | 52 | 51 | 2015 | +| 2015-12-25 | 2015 | 52 | 51 | 2015 | +| 2015-12-26 | 2015 | 52 | 51 | 2015 | +| 2015-12-27 | 2015 | 52 | 51 | 2015 | +| 2015-12-28 | 2015 | 53 | 51 | 2015 | +| 2015-12-29 | 2015 | 53 | 52 | 2015 | +| 2015-12-30 | 2015 | 53 | 52 | 2015 | +| 2015-12-31 | 2015 | 53 | 52 | 2015 | +| 2016-01-01 | 2015 | 53 | 0 | 2016 | +| 2016-01-02 | 2015 | 53 | 0 | 2016 | +| 2016-01-03 | 2015 | 53 | 0 | 2016 | +| 2016-01-04 | 2016 | 1 | 0 | 2016 | +| 2016-01-05 | 2016 | 1 | 1 | 2016 | +| 2016-01-06 | 2016 | 1 | 1 | 2016 | +| 2016-01-07 | 2016 | 1 | 1 | 2016 | +| 2016-01-08 | 2016 | 1 | 1 | 2016 | +| 2016-01-09 | 2016 | 1 | 1 | 2016 | ++------------+---------+---------+-----------+------+ +(18 rows) + !ok -!} + # In the following example, date_expression falls on a Sunday. EXTRACT # calculates the first column using weeks that begin on Sunday, and it # calculates the second column using weeks that begin on Monday. -!if (false) { WITH t AS (SELECT DATE('2017-11-05') AS d) SELECT d, + EXTRACT(ISOWEEK FROM d) AS isoweek, EXTRACT(WEEK(SUNDAY) FROM d) AS week_sunday, EXTRACT(WEEK(MONDAY) FROM d) AS week_monday FROM t; -+------------+-------------+-------------+ -| date | week_sunday | week_monday | -+------------+-------------+-------------+ -| 2017-11-05 | 45 | 44 | -+------------+-------------+-------------+ ++------------+---------+-------------+-------------+ +| d | isoweek | week_sunday | week_monday | ++------------+---------+-------------+-------------+ +| 2017-11-05 | 44 | 45 | 44 | ++------------+---------+-------------+-------------+ +(1 row) + +!ok + +SELECT EXTRACT(DAYOFWEEK FROM DATE '2008-12-25') as dow, + EXTRACT(DAYOFYEAR FROM DATE '2008-12-25') as doy; ++-----+-----+ +| dow | doy | ++-----+-----+ +| 5 | 360 | ++-----+-----+ +(1 row) + !ok -!} # In the following example, EXTRACT returns a value corresponding to # the HOUR time part. @@ -2708,6 +2720,18 @@ SELECT TIMESTAMP(DATE "2008-12-25") AS timestamp_date; !ok +# This tests the no-op TIMESTAMP and DATETIME functions. +select TIMESTAMP(TIMESTAMP "2008-01-01 01:03:05") as ts, + DATETIME(DATETIME "2008-01-01 01:03:05") as dt; ++---------------------+---------------------+ +| ts | dt | ++---------------------+---------------------+ +| 2008-01-01 01:03:05 | 2008-01-01 01:03:05 | ++---------------------+---------------------+ +(1 row) + +!ok + # All these timestamps should be equal. # This tests the BQ timestamp literal string formatter # (optional 'T', optional leading zeros, optional offset with conversion). @@ -3428,7 +3452,8 @@ SELECT (1 row) !ok - +# Bug.CALCITE_2539_FIXED +!if (false) { ##################################################################### # DATE_DIFF # @@ -3739,6 +3764,8 @@ SELECT TIMESTAMP_DIFF(TIMESTAMP '2008-12-25', TIMESTAMP '2008-09-25', `quarter`) (1 row) !ok + +!} ##################################################################### # DATE_TRUNC # diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj index 93fda1d8a05..d29de207978 100644 --- a/core/src/main/codegen/templates/Parser.jj +++ b/core/src/main/codegen/templates/Parser.jj @@ -6127,6 +6127,15 @@ SqlTypeNameSpec DateTimeTypeName() : typeName = SqlTypeName.DATE; return new SqlBasicTypeNameSpec(typeName, getPos()); } +| + // DATETIME is the BigQuery-specific name for ISO SQL's TIMESTAMP type. + // In order to support this, the schema UDT map must be properly configued. + // See the BigQuery Quidem tests in the babel component for an example. + { + s = span(); + return new SqlUserDefinedTypeNameSpec( + unquotedIdentifier(), precision, s.end(this)); + } | LOOKAHEAD(2)