diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index 32291223c5..8f28ca8fad 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -626,6 +626,7 @@ minillaplocal.query.files=\ mrr.q,\ multiMapJoin1.q,\ multiMapJoin2.q,\ + multi_in_clause.q,\ murmur_hash_migration.q,\ non_native_window_udf.q,\ optimize_join_ptp.q,\ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HivePointLookupOptimizerRule.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HivePointLookupOptimizerRule.java index 1e39a1bf79..733258721b 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HivePointLookupOptimizerRule.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HivePointLookupOptimizerRule.java @@ -719,6 +719,12 @@ private RexNode useStructIfNeeded(List columns) { stringToExpr.put(expr, inCall.getOperands().get(j)); } inLHSExprToRHSExprs.get(ref).retainAll(expressions); + if (!inLHSExprToRHSExprs.containsKey(ref)) { + // Note that Multimap does not keep a key if all its values are removed. + // Hence, since there are no common expressions and it is within an AND, + // we should return false + return rexBuilder.makeLiteral(false); + } } else { for (int j = 1; j < inCall.getOperands().size(); j++) { String expr = inCall.getOperands().get(j).toString(); diff --git a/ql/src/test/queries/clientpositive/multi_in_clause.q b/ql/src/test/queries/clientpositive/multi_in_clause.q new file mode 100644 index 0000000000..9752063065 --- /dev/null +++ b/ql/src/test/queries/clientpositive/multi_in_clause.q @@ -0,0 +1,7 @@ +create table very_simple_table_for_in_test (name STRING); +insert into very_simple_table_for_in_test values ('a'); + +explain cbo +select * from very_simple_table_for_in_test where name IN('g','r') AND name IN('a','b') ; + +select * from very_simple_table_for_in_test where name IN('g','r') AND name IN('a','b') ; diff --git a/ql/src/test/results/clientpositive/llap/multi_in_clause.q.out b/ql/src/test/results/clientpositive/llap/multi_in_clause.q.out new file mode 100644 index 0000000000..f3fefc4a65 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/multi_in_clause.q.out @@ -0,0 +1,40 @@ +PREHOOK: query: create table very_simple_table_for_in_test (name STRING) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@very_simple_table_for_in_test +POSTHOOK: query: create table very_simple_table_for_in_test (name STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@very_simple_table_for_in_test +PREHOOK: query: insert into very_simple_table_for_in_test values ('a') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@very_simple_table_for_in_test +POSTHOOK: query: insert into very_simple_table_for_in_test values ('a') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@very_simple_table_for_in_test +POSTHOOK: Lineage: very_simple_table_for_in_test.name SCRIPT [] +PREHOOK: query: explain cbo +select * from very_simple_table_for_in_test where name IN('g','r') AND name IN('a','b') +PREHOOK: type: QUERY +PREHOOK: Input: default@very_simple_table_for_in_test +#### A masked pattern was here #### +POSTHOOK: query: explain cbo +select * from very_simple_table_for_in_test where name IN('g','r') AND name IN('a','b') +POSTHOOK: type: QUERY +POSTHOOK: Input: default@very_simple_table_for_in_test +#### A masked pattern was here #### +CBO PLAN: +HiveProject(name=[$0]) + HiveFilter(condition=[false]) + HiveTableScan(table=[[default, very_simple_table_for_in_test]], table:alias=[very_simple_table_for_in_test]) + +PREHOOK: query: select * from very_simple_table_for_in_test where name IN('g','r') AND name IN('a','b') +PREHOOK: type: QUERY +PREHOOK: Input: default@very_simple_table_for_in_test +#### A masked pattern was here #### +POSTHOOK: query: select * from very_simple_table_for_in_test where name IN('g','r') AND name IN('a','b') +POSTHOOK: type: QUERY +POSTHOOK: Input: default@very_simple_table_for_in_test +#### A masked pattern was here ####