Repository: hive Updated Branches: refs/heads/master c08490b74 -> 78a90a62d
HIVE-14393: Tuple in list feature fails if there's only 1 tuple in the list (Pengcheng Xiong, reviewed by Ashutosh Chauhan) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/78a90a62 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/78a90a62 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/78a90a62 Branch: refs/heads/master Commit: 78a90a62d0823b5d25be26d5b03e0c2e4be3b58c Parents: c08490b Author: Pengcheng Xiong <pxi...@apache.org> Authored: Tue Aug 2 09:11:03 2016 -0700 Committer: Pengcheng Xiong <pxi...@apache.org> Committed: Tue Aug 2 09:11:03 2016 -0700 ---------------------------------------------------------------------- .../hadoop/hive/ql/parse/IdentifiersParser.g | 8 +- .../clientpositive/multi_column_in_single.q | 67 ++++ .../clientpositive/multi_column_in_single.q.out | 372 +++++++++++++++++++ 3 files changed, 443 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/78a90a62/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g index 16251d3..0bbc4b6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/IdentifiersParser.g @@ -470,10 +470,10 @@ expressions precedenceEqualExpressionMutiple : (LPAREN precedenceBitwiseOrExpression (COMMA precedenceBitwiseOrExpression)+ RPAREN -> ^(TOK_FUNCTION Identifier["struct"] precedenceBitwiseOrExpression+)) - ( (KW_IN LPAREN expressionsToStruct (COMMA expressionsToStruct)+ RPAREN) - -> ^(TOK_FUNCTION KW_IN $precedenceEqualExpressionMutiple expressionsToStruct+) - | (KW_NOT KW_IN LPAREN expressionsToStruct (COMMA expressionsToStruct)+ RPAREN) - -> ^(KW_NOT ^(TOK_FUNCTION KW_IN $precedenceEqualExpressionMutiple expressionsToStruct+))) + ( (KW_IN LPAREN expressionsToStruct (COMMA expressionsToStruct)* RPAREN) + -> ^(TOK_FUNCTION KW_IN $precedenceEqualExpressionMutiple expressionsToStruct*) + | (KW_NOT KW_IN LPAREN expressionsToStruct (COMMA expressionsToStruct)* RPAREN) + -> ^(KW_NOT ^(TOK_FUNCTION KW_IN $precedenceEqualExpressionMutiple expressionsToStruct*))) ; expressionsToStruct http://git-wip-us.apache.org/repos/asf/hive/blob/78a90a62/ql/src/test/queries/clientpositive/multi_column_in_single.q ---------------------------------------------------------------------- diff --git a/ql/src/test/queries/clientpositive/multi_column_in_single.q b/ql/src/test/queries/clientpositive/multi_column_in_single.q new file mode 100644 index 0000000..ca2d16c --- /dev/null +++ b/ql/src/test/queries/clientpositive/multi_column_in_single.q @@ -0,0 +1,67 @@ +set hive.mapred.mode=nonstrict; + +select * from src where (key, value) in (('238','val_238')); + +drop table emps; + +create table emps (empno int, deptno int, empname string); + +insert into table emps values (1,2,"11"),(1,2,"11"),(3,4,"33"),(1,3,"11"),(2,5,"22"),(2,5,"22"); + +select * from emps; + +select * from emps where (int(empno+deptno/2), int(deptno/3)) in ((3,2)); + +select * from emps where (int(empno+deptno/2), int(deptno/3)) not in ((3,2)); + +select * from emps where (empno,deptno) in ((3,2)); + +select * from emps where (empno,deptno) not in ((3,2)); + +select * from emps where (empno,deptno) in ((1,3)); + +select * from emps where (empno,deptno) not in ((1,3)); + +explain +select * from emps where (empno+1,deptno) in ((3,2)); + +explain +select * from emps where (empno+1,deptno) not in ((3,2)); + +explain select * from emps where ((empno*2)|1,deptno) in ((empno+2,2)); + +select * from emps where ((empno*2)|1,deptno) in ((empno+2,2)); + +select (empno*2)|1,substr(empname,1,1) from emps; + +select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+2,'2')); + +select * from emps where ((empno*2)|1,substr(empname,1,1)) not in ((empno+2,'2')); + +select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')); + +select * from emps where ((empno*2)|1,substr(empname,1,1)) not in ((empno+3,'2')); + + +select sum(empno), empname from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +group by empname; + +select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +union +select * from emps where (empno,deptno) in ((3,2)); + +drop view v; + +create view v as +select * from( +select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +union +select * from emps where (empno,deptno) in ((3,2)))subq order by empno desc; + +select * from v; + +select subq.e1 from +(select (empno*2)|1 as e1, substr(empname,1,1) as n1 from emps)subq +join +(select empno as e2 from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')))subq2 +on e1=e2+1; http://git-wip-us.apache.org/repos/asf/hive/blob/78a90a62/ql/src/test/results/clientpositive/multi_column_in_single.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/multi_column_in_single.q.out b/ql/src/test/results/clientpositive/multi_column_in_single.q.out new file mode 100644 index 0000000..b2941b6 --- /dev/null +++ b/ql/src/test/results/clientpositive/multi_column_in_single.q.out @@ -0,0 +1,372 @@ +PREHOOK: query: select * from src where (key, value) in (('238','val_238')) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select * from src where (key, value) in (('238','val_238')) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +238 val_238 +238 val_238 +PREHOOK: query: drop table emps +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table emps +POSTHOOK: type: DROPTABLE +PREHOOK: query: create table emps (empno int, deptno int, empname string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@emps +POSTHOOK: query: create table emps (empno int, deptno int, empname string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@emps +PREHOOK: query: insert into table emps values (1,2,"11"),(1,2,"11"),(3,4,"33"),(1,3,"11"),(2,5,"22"),(2,5,"22") +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@emps +POSTHOOK: query: insert into table emps values (1,2,"11"),(1,2,"11"),(3,4,"33"),(1,3,"11"),(2,5,"22"),(2,5,"22") +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@emps +POSTHOOK: Lineage: emps.deptno EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: emps.empname SIMPLE [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ] +POSTHOOK: Lineage: emps.empno EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: select * from emps +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +1 2 11 +1 2 11 +3 4 33 +1 3 11 +2 5 22 +2 5 22 +PREHOOK: query: select * from emps where (int(empno+deptno/2), int(deptno/3)) in ((3,2)) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where (int(empno+deptno/2), int(deptno/3)) in ((3,2)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +PREHOOK: query: select * from emps where (int(empno+deptno/2), int(deptno/3)) not in ((3,2)) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where (int(empno+deptno/2), int(deptno/3)) not in ((3,2)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +1 2 11 +1 2 11 +3 4 33 +1 3 11 +2 5 22 +2 5 22 +PREHOOK: query: select * from emps where (empno,deptno) in ((3,2)) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where (empno,deptno) in ((3,2)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +PREHOOK: query: select * from emps where (empno,deptno) not in ((3,2)) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where (empno,deptno) not in ((3,2)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +1 2 11 +1 2 11 +3 4 33 +1 3 11 +2 5 22 +2 5 22 +PREHOOK: query: select * from emps where (empno,deptno) in ((1,3)) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where (empno,deptno) in ((1,3)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +1 3 11 +PREHOOK: query: select * from emps where (empno,deptno) not in ((1,3)) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where (empno,deptno) not in ((1,3)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +1 2 11 +1 2 11 +3 4 33 +2 5 22 +2 5 22 +PREHOOK: query: explain +select * from emps where (empno+1,deptno) in ((3,2)) +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * from emps where (empno+1,deptno) in ((3,2)) +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: emps + Statistics: Num rows: 6 Data size: 36 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (struct((empno + 1),deptno)) IN (const struct(3,2)) (type: boolean) + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: empno (type: int), deptno (type: int), empname (type: string) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: explain +select * from emps where (empno+1,deptno) not in ((3,2)) +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * from emps where (empno+1,deptno) not in ((3,2)) +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: emps + Statistics: Num rows: 6 Data size: 36 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (not (struct((empno + 1),deptno)) IN (const struct(3,2))) (type: boolean) + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: empno (type: int), deptno (type: int), empname (type: string) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: explain select * from emps where ((empno*2)|1,deptno) in ((empno+2,2)) +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from emps where ((empno*2)|1,deptno) in ((empno+2,2)) +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: emps + Statistics: Num rows: 6 Data size: 36 Basic stats: COMPLETE Column stats: NONE + Filter Operator + predicate: (struct(((empno * 2) | 1),deptno)) IN (struct((empno + 2),2)) (type: boolean) + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: empno (type: int), deptno (type: int), empname (type: string) + outputColumnNames: _col0, _col1, _col2 + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 3 Data size: 18 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.SequenceFileInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select * from emps where ((empno*2)|1,deptno) in ((empno+2,2)) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where ((empno*2)|1,deptno) in ((empno+2,2)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +1 2 11 +1 2 11 +PREHOOK: query: select (empno*2)|1,substr(empname,1,1) from emps +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select (empno*2)|1,substr(empname,1,1) from emps +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +3 1 +3 1 +7 3 +3 1 +5 2 +5 2 +PREHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+2,'2')) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+2,'2')) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +PREHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) not in ((empno+2,'2')) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) not in ((empno+2,'2')) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +1 2 11 +1 2 11 +3 4 33 +1 3 11 +2 5 22 +2 5 22 +PREHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +2 5 22 +2 5 22 +PREHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) not in ((empno+3,'2')) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) not in ((empno+3,'2')) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +1 2 11 +1 2 11 +3 4 33 +1 3 11 +PREHOOK: query: select sum(empno), empname from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +group by empname +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select sum(empno), empname from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +group by empname +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +4 22 +PREHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +union +select * from emps where (empno,deptno) in ((3,2)) +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +union +select * from emps where (empno,deptno) in ((3,2)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +2 5 22 +PREHOOK: query: drop view v +PREHOOK: type: DROPVIEW +POSTHOOK: query: drop view v +POSTHOOK: type: DROPVIEW +PREHOOK: query: create view v as +select * from( +select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +union +select * from emps where (empno,deptno) in ((3,2)))subq order by empno desc +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@emps +PREHOOK: Output: database:default +PREHOOK: Output: default@v +POSTHOOK: query: create view v as +select * from( +select * from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')) +union +select * from emps where (empno,deptno) in ((3,2)))subq order by empno desc +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@emps +POSTHOOK: Output: database:default +POSTHOOK: Output: default@v +PREHOOK: query: select * from v +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +PREHOOK: Input: default@v +#### A masked pattern was here #### +POSTHOOK: query: select * from v +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +POSTHOOK: Input: default@v +#### A masked pattern was here #### +2 5 22 +PREHOOK: query: select subq.e1 from +(select (empno*2)|1 as e1, substr(empname,1,1) as n1 from emps)subq +join +(select empno as e2 from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')))subq2 +on e1=e2+1 +PREHOOK: type: QUERY +PREHOOK: Input: default@emps +#### A masked pattern was here #### +POSTHOOK: query: select subq.e1 from +(select (empno*2)|1 as e1, substr(empname,1,1) as n1 from emps)subq +join +(select empno as e2 from emps where ((empno*2)|1,substr(empname,1,1)) in ((empno+3,'2')))subq2 +on e1=e2+1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@emps +#### A masked pattern was here #### +3 +3 +3 +3 +3 +3