From 82d482d5c6a02a8b3dbf0febd92b523ccea30a29 Mon Sep 17 00:00:00 2001 From: SparksFyz Date: Thu, 18 Nov 2021 14:14:07 +0800 Subject: [PATCH] HIVE-25721: Outer join result is wrong --- .../org/apache/hadoop/hive/ql/exec/JoinUtil.java | 11 ++-- .../test/queries/clientpositive/sort_merge_join.q | 17 ++++++ .../results/clientpositive/sort_merge_join.q.out | 60 ++++++++++++++++++++++ 3 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 ql/src/test/queries/clientpositive/sort_merge_join.q create mode 100644 ql/src/test/results/clientpositive/sort_merge_join.q.out diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/JoinUtil.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/JoinUtil.java index be8f374cae..e9920d6566 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/JoinUtil.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/JoinUtil.java @@ -324,7 +324,7 @@ public static AbstractSerDe getSpillSerDe(byte alias, TableDesc[] spillTableDesc int columnSize = valueCols.size(); StringBuilder colNames = new StringBuilder(); StringBuilder colTypes = new StringBuilder(); - if (columnSize <= 0) { + if (columnSize <= 0 && noFilter) { continue; } for (int k = 0; k < columnSize; k++) { @@ -341,9 +341,12 @@ public static AbstractSerDe getSpillSerDe(byte alias, TableDesc[] spillTableDesc colTypes.append(TypeInfoFactory.shortTypeInfo.getTypeName()); colTypes.append(','); } - // remove the last ',' - colNames.setLength(colNames.length() - 1); - colTypes.setLength(colTypes.length() - 1); + if (colNames.length() > 0) { + // remove the last ',' + colNames.setLength(colNames.length() - 1); + colTypes.setLength(colTypes.length() - 1); + } + Properties props = new Properties(); props.put(org.apache.hadoop.hive.serde.serdeConstants.SERIALIZATION_FORMAT, "" + Utilities.ctrlaCode); props.put(org.apache.hadoop.hive.serde.serdeConstants.LIST_COLUMNS, colNames.toString()); diff --git a/ql/src/test/queries/clientpositive/sort_merge_join.q b/ql/src/test/queries/clientpositive/sort_merge_join.q new file mode 100644 index 0000000000..abd1b64374 --- /dev/null +++ b/ql/src/test/queries/clientpositive/sort_merge_join.q @@ -0,0 +1,17 @@ +set hive.auto.convert.join=false; + +create table t_smj_left (key string, value int); + +insert into t_smj_left values +('key1', 1), +('key1', 2); + +create table t_smj_right (key string, value int); + +insert into t_smj_right values +('key1', 1); + +select + t2.value +from t_smj_left t1 +left join t_smj_right t2 on t1.key=t2.key and t1.value=2; diff --git a/ql/src/test/results/clientpositive/sort_merge_join.q.out b/ql/src/test/results/clientpositive/sort_merge_join.q.out new file mode 100644 index 0000000000..8a4986a6e5 --- /dev/null +++ b/ql/src/test/results/clientpositive/sort_merge_join.q.out @@ -0,0 +1,60 @@ +PREHOOK: query: create table t_smj_left (key string, value int) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t_smj_left +POSTHOOK: query: create table t_smj_left (key string, value int) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t_smj_left +PREHOOK: query: insert into t_smj_left values +('key1', 1), +('key1', 2) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@t_smj_left +POSTHOOK: query: insert into t_smj_left values +('key1', 1), +('key1', 2) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@t_smj_left +POSTHOOK: Lineage: t_smj_left.key SCRIPT [] +POSTHOOK: Lineage: t_smj_left.value SCRIPT [] +PREHOOK: query: create table t_smj_right (key string, value int) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t_smj_right +POSTHOOK: query: create table t_smj_right (key string, value int) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t_smj_right +PREHOOK: query: insert into t_smj_right values +('key1', 1) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@t_smj_right +POSTHOOK: query: insert into t_smj_right values +('key1', 1) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@t_smj_right +POSTHOOK: Lineage: t_smj_right.key SCRIPT [] +POSTHOOK: Lineage: t_smj_right.value SCRIPT [] +PREHOOK: query: select + t2.value +from t_smj_left t1 +left join t_smj_right t2 on t1.key=t2.key and t1.value=2 +PREHOOK: type: QUERY +PREHOOK: Input: default@t_smj_left +PREHOOK: Input: default@t_smj_right +#### A masked pattern was here #### +POSTHOOK: query: select + t2.value +from t_smj_left t1 +left join t_smj_right t2 on t1.key=t2.key and t1.value=2 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@t_smj_left +POSTHOOK: Input: default@t_smj_right +#### A masked pattern was here #### +1 +NULL -- 2.13.0