This is an automated email from the ASF dual-hosted git repository. szita pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push: new a5a5a4ba391 HIVE-26550: Const struct equality operator throws error when CBO is off and vectorization is on (#3638) (Gergely Hanko, reviewed by Teddy Choi, Alessandro Solimando and Adam Szita) a5a5a4ba391 is described below commit a5a5a4ba391ced22a262add885a934862fce7e73 Author: ghanko <54805928+gha...@users.noreply.github.com> AuthorDate: Thu Oct 6 10:28:40 2022 +0200 HIVE-26550: Const struct equality operator throws error when CBO is off and vectorization is on (#3638) (Gergely Hanko, reviewed by Teddy Choi, Alessandro Solimando and Adam Szita) --- .../clientpositive/vector_const_struct_equal.q | 15 +++++ .../llap/vector_const_struct_equal.q.out | 68 ++++++++++++++++++++++ .../objectinspector/ObjectInspectorUtils.java | 12 +++- 3 files changed, 93 insertions(+), 2 deletions(-) diff --git a/ql/src/test/queries/clientpositive/vector_const_struct_equal.q b/ql/src/test/queries/clientpositive/vector_const_struct_equal.q new file mode 100644 index 00000000000..5fe17ccb089 --- /dev/null +++ b/ql/src/test/queries/clientpositive/vector_const_struct_equal.q @@ -0,0 +1,15 @@ +set hive.fetch.task.conversion=none; +set hive.cbo.enable=false; + +create table test (a string); +insert into test values ('aa'); + +--expect all rows +select * from test where (struct(2022) = struct(2022)); +select * from test where (struct('2022') = struct('2022')); +select * from test where (struct(2022.0D) = struct(2022.0D)); + +--expect empty result +select * from test where (struct(2022) = struct(2023)); +select * from test where (struct('2022') = struct('2023')); +select * from test where (struct(2022.0D) = struct(2023.0D)); diff --git a/ql/src/test/results/clientpositive/llap/vector_const_struct_equal.q.out b/ql/src/test/results/clientpositive/llap/vector_const_struct_equal.q.out new file mode 100644 index 00000000000..d68fe2acb52 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/vector_const_struct_equal.q.out @@ -0,0 +1,68 @@ +PREHOOK: query: create table test (a string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@test +POSTHOOK: query: create table test (a string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@test +PREHOOK: query: insert into test values ('aa') +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@test +POSTHOOK: query: insert into test values ('aa') +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@test +POSTHOOK: Lineage: test.a SCRIPT [] +PREHOOK: query: select * from test where (struct(2022) = struct(2022)) +PREHOOK: type: QUERY +PREHOOK: Input: default@test +#### A masked pattern was here #### +POSTHOOK: query: select * from test where (struct(2022) = struct(2022)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test +#### A masked pattern was here #### +aa +PREHOOK: query: select * from test where (struct('2022') = struct('2022')) +PREHOOK: type: QUERY +PREHOOK: Input: default@test +#### A masked pattern was here #### +POSTHOOK: query: select * from test where (struct('2022') = struct('2022')) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test +#### A masked pattern was here #### +aa +PREHOOK: query: select * from test where (struct(2022.0D) = struct(2022.0D)) +PREHOOK: type: QUERY +PREHOOK: Input: default@test +#### A masked pattern was here #### +POSTHOOK: query: select * from test where (struct(2022.0D) = struct(2022.0D)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test +#### A masked pattern was here #### +aa +PREHOOK: query: select * from test where (struct(2022) = struct(2023)) +PREHOOK: type: QUERY +PREHOOK: Input: default@test +#### A masked pattern was here #### +POSTHOOK: query: select * from test where (struct(2022) = struct(2023)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test +#### A masked pattern was here #### +PREHOOK: query: select * from test where (struct('2022') = struct('2023')) +PREHOOK: type: QUERY +PREHOOK: Input: default@test +#### A masked pattern was here #### +POSTHOOK: query: select * from test where (struct('2022') = struct('2023')) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test +#### A masked pattern was here #### +PREHOOK: query: select * from test where (struct(2022.0D) = struct(2023.0D)) +PREHOOK: type: QUERY +PREHOOK: Input: default@test +#### A masked pattern was here #### +POSTHOOK: query: select * from test where (struct(2022.0D) = struct(2023.0D)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test +#### A masked pattern was here #### diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java index 747564ad08a..d25282a6855 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/ObjectInspectorUtils.java @@ -1203,9 +1203,17 @@ public final class ObjectInspectorUtils { List<? extends StructField> fields1 = soi1.getAllStructFieldRefs(); List<? extends StructField> fields2 = soi2.getAllStructFieldRefs(); int minimum = Math.min(fields1.size(), fields2.size()); + Object data1 = + soi1 instanceof ConstantObjectInspector + ? ((ConstantObjectInspector) soi1).getWritableConstantValue() + : o1; + Object data2 = + soi2 instanceof ConstantObjectInspector + ? ((ConstantObjectInspector) soi2).getWritableConstantValue() + : o2; for (int i = 0; i < minimum; i++) { - int r = compare(soi1.getStructFieldData(o1, fields1.get(i)), fields1 - .get(i).getFieldObjectInspector(), soi2.getStructFieldData(o2, + int r = compare(soi1.getStructFieldData(data1, fields1.get(i)), fields1 + .get(i).getFieldObjectInspector(), soi2.getStructFieldData(data2, fields2.get(i)), fields2.get(i).getFieldObjectInspector(), mapEqualComparer, nullValueOpt); if (r != 0) {