This is an automated email from the ASF dual-hosted git repository. jcamacho pushed a commit to branch branch-3.1 in repository https://gitbox.apache.org/repos/asf/hive.git
commit 560016b82d37775c090ef3f80ac92fe36c601b69 Author: Jesus Camacho Rodriguez <jcama...@apache.org> AuthorDate: Fri Apr 12 20:12:04 2019 -0700 HIVE-21613: Queries with join condition having timestamp or timestamp with local time zone literal throw SemanticException (Jesus Camacho Rodriguez, reviewed by Sankar Hariappan) --- .../test/resources/testconfiguration.properties | 2 + .../hadoop/hive/ql/parse/SemanticAnalyzer.java | 2 + ql/src/test/queries/clientpositive/timestamp_4.q | 15 ++++++ ql/src/test/queries/clientpositive/timestamptz_5.q | 16 ++++++ .../results/clientpositive/llap/timestamp_4.q.out | 58 ++++++++++++++++++++++ .../clientpositive/llap/timestamptz_5.q.out | 57 +++++++++++++++++++++ 6 files changed, 150 insertions(+) diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index c217b9b..52cca0c 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -738,6 +738,8 @@ minillaplocal.query.files=\ tez_union_multiinsert.q,\ tez_vector_dynpart_hashjoin_1.q,\ tez_vector_dynpart_hashjoin_2.q,\ + timestamp_4.q,\ + timestamptz_5.q,\ uber_reduce.q,\ udaf_collect_set_2.q,\ udaf_all_keyword.q,\ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 9d7d793..f8a4e11 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -2732,6 +2732,8 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { case HiveParser.KW_TRUE: case HiveParser.KW_FALSE: case HiveParser.TOK_DATELITERAL: + case HiveParser.TOK_TIMESTAMPLITERAL: + case HiveParser.TOK_TIMESTAMPLOCALTZLITERAL: break; case HiveParser.TOK_FUNCTION: diff --git a/ql/src/test/queries/clientpositive/timestamp_4.q b/ql/src/test/queries/clientpositive/timestamp_4.q new file mode 100644 index 0000000..b7a6dcc --- /dev/null +++ b/ql/src/test/queries/clientpositive/timestamp_4.q @@ -0,0 +1,15 @@ +drop table if exists timestamp_1; +drop table if exists timestamp_2; + +create table timestamp_1 (key int, dd timestamp); +create table timestamp_2 (key int, dd timestamp); + +-- between clause with timestamp literal in join condition +select d1.key, d2.dd + from (select key, dd as start_dd, current_timestamp as end_dd from timestamp_1) d1 + join timestamp_2 as d2 + on d1.key = d2.key + where d2.dd between start_dd and end_dd; + +drop table timestamp_1; +drop table timestamp_2; \ No newline at end of file diff --git a/ql/src/test/queries/clientpositive/timestamptz_5.q b/ql/src/test/queries/clientpositive/timestamptz_5.q new file mode 100644 index 0000000..d1e15ee --- /dev/null +++ b/ql/src/test/queries/clientpositive/timestamptz_5.q @@ -0,0 +1,16 @@ +set hive.cbo.enable=false; + +drop table if exists timestamplocaltz_n1; +drop table if exists timestamplocaltz_n2; + +create table timestamplocaltz_n1 (key int, dd timestamp with local time zone); +create table timestamplocaltz_n2 (key int, dd timestamp with local time zone); + +-- between clause with timestamp literal in join condition +select d1.key, d2.dd + from (select key, dd as start_dd, current_timestamp as end_dd from timestamplocaltz_n1) d1 + join timestamplocaltz_n2 as d2 + on d1.key = d2.key or d2.dd between timestamplocaltz '2010-04-01 00:00:00 America/Los_Angeles' and timestamplocaltz '2010-04-02 00:00:00 America/Los_Angeles'; + +drop table timestamplocaltz_n1; +drop table timestamplocaltz_n2; \ No newline at end of file diff --git a/ql/src/test/results/clientpositive/llap/timestamp_4.q.out b/ql/src/test/results/clientpositive/llap/timestamp_4.q.out new file mode 100644 index 0000000..54864de --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/timestamp_4.q.out @@ -0,0 +1,58 @@ +PREHOOK: query: drop table if exists timestamp_1 +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table if exists timestamp_1 +POSTHOOK: type: DROPTABLE +PREHOOK: query: drop table if exists timestamp_2 +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table if exists timestamp_2 +POSTHOOK: type: DROPTABLE +PREHOOK: query: create table timestamp_1 (key int, dd timestamp) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@timestamp_1 +POSTHOOK: query: create table timestamp_1 (key int, dd timestamp) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@timestamp_1 +PREHOOK: query: create table timestamp_2 (key int, dd timestamp) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@timestamp_2 +POSTHOOK: query: create table timestamp_2 (key int, dd timestamp) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@timestamp_2 +PREHOOK: query: select d1.key, d2.dd + from (select key, dd as start_dd, current_timestamp as end_dd from timestamp_1) d1 + join timestamp_2 as d2 + on d1.key = d2.key + where d2.dd between start_dd and end_dd +PREHOOK: type: QUERY +PREHOOK: Input: default@timestamp_1 +PREHOOK: Input: default@timestamp_2 +#### A masked pattern was here #### +POSTHOOK: query: select d1.key, d2.dd + from (select key, dd as start_dd, current_timestamp as end_dd from timestamp_1) d1 + join timestamp_2 as d2 + on d1.key = d2.key + where d2.dd between start_dd and end_dd +POSTHOOK: type: QUERY +POSTHOOK: Input: default@timestamp_1 +POSTHOOK: Input: default@timestamp_2 +#### A masked pattern was here #### +PREHOOK: query: drop table timestamp_1 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@timestamp_1 +PREHOOK: Output: default@timestamp_1 +POSTHOOK: query: drop table timestamp_1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@timestamp_1 +POSTHOOK: Output: default@timestamp_1 +PREHOOK: query: drop table timestamp_2 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@timestamp_2 +PREHOOK: Output: default@timestamp_2 +POSTHOOK: query: drop table timestamp_2 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@timestamp_2 +POSTHOOK: Output: default@timestamp_2 diff --git a/ql/src/test/results/clientpositive/llap/timestamptz_5.q.out b/ql/src/test/results/clientpositive/llap/timestamptz_5.q.out new file mode 100644 index 0000000..ca5ebe5 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/timestamptz_5.q.out @@ -0,0 +1,57 @@ +PREHOOK: query: drop table if exists timestamplocaltz_n1 +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table if exists timestamplocaltz_n1 +POSTHOOK: type: DROPTABLE +PREHOOK: query: drop table if exists timestamplocaltz_n2 +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table if exists timestamplocaltz_n2 +POSTHOOK: type: DROPTABLE +PREHOOK: query: create table timestamplocaltz_n1 (key int, dd timestamp with local time zone) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@timestamplocaltz_n1 +POSTHOOK: query: create table timestamplocaltz_n1 (key int, dd timestamp with local time zone) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@timestamplocaltz_n1 +PREHOOK: query: create table timestamplocaltz_n2 (key int, dd timestamp with local time zone) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@timestamplocaltz_n2 +POSTHOOK: query: create table timestamplocaltz_n2 (key int, dd timestamp with local time zone) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@timestamplocaltz_n2 +Warning: Shuffle Join MERGEJOIN[8][tables = [d1, d2]] in Stage 'Reducer 2' is a cross product +PREHOOK: query: select d1.key, d2.dd + from (select key, dd as start_dd, current_timestamp as end_dd from timestamplocaltz_n1) d1 + join timestamplocaltz_n2 as d2 + on d1.key = d2.key or d2.dd between timestamplocaltz '2010-04-01 00:00:00 America/Los_Angeles' and timestamplocaltz '2010-04-02 00:00:00 America/Los_Angeles' +PREHOOK: type: QUERY +PREHOOK: Input: default@timestamplocaltz_n1 +PREHOOK: Input: default@timestamplocaltz_n2 +#### A masked pattern was here #### +POSTHOOK: query: select d1.key, d2.dd + from (select key, dd as start_dd, current_timestamp as end_dd from timestamplocaltz_n1) d1 + join timestamplocaltz_n2 as d2 + on d1.key = d2.key or d2.dd between timestamplocaltz '2010-04-01 00:00:00 America/Los_Angeles' and timestamplocaltz '2010-04-02 00:00:00 America/Los_Angeles' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@timestamplocaltz_n1 +POSTHOOK: Input: default@timestamplocaltz_n2 +#### A masked pattern was here #### +PREHOOK: query: drop table timestamplocaltz_n1 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@timestamplocaltz_n1 +PREHOOK: Output: default@timestamplocaltz_n1 +POSTHOOK: query: drop table timestamplocaltz_n1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@timestamplocaltz_n1 +POSTHOOK: Output: default@timestamplocaltz_n1 +PREHOOK: query: drop table timestamplocaltz_n2 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@timestamplocaltz_n2 +PREHOOK: Output: default@timestamplocaltz_n2 +POSTHOOK: query: drop table timestamplocaltz_n2 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@timestamplocaltz_n2 +POSTHOOK: Output: default@timestamplocaltz_n2