From a6ef65d91b14328278f63fa91f65adb6e7b6ed1e Mon Sep 17 00:00:00 2001 From: Ashutosh Chauhan Date: Wed, 10 Jan 2018 16:23:39 -0800 Subject: [PATCH] HIVE-18434 : Type is not determined correctly for comparison between decimal column and string constant --- .../test/resources/testconfiguration.properties | 1 + .../hadoop/hive/ql/parse/TypeCheckProcFactory.java | 2 + ql/src/test/queries/clientpositive/dec_str.q | 6 ++ .../test/results/clientpositive/llap/dec_str.q.out | 113 +++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 ql/src/test/queries/clientpositive/dec_str.q create mode 100644 ql/src/test/results/clientpositive/llap/dec_str.q.out diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index ac81995bb6..9bb000cfb0 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -484,6 +484,7 @@ minillap.query.files=acid_bucket_pruning.q,\ minillaplocal.query.files=\ dp_counter_non_mm.q,\ dp_counter_mm.q,\ + dec_str.q,\ acid_no_buckets.q, \ acid_globallimit.q,\ acid_vectorization_missing_cols.q,\ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java index 67ea32c353..f656019848 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/TypeCheckProcFactory.java @@ -1075,6 +1075,8 @@ protected ExprNodeDesc getXpathOrFuncExprNodeDesc(ASTNode expr, children.set(constIdx, new ExprNodeConstantDesc(new Byte(constVal.toString()))); } else if (PrimitiveObjectInspectorUtils.shortTypeEntry.equals(colTypeInfo.getPrimitiveTypeEntry()) && (constVal instanceof Number || constVal instanceof String)) { children.set(constIdx, new ExprNodeConstantDesc(new Short(constVal.toString()))); + } else if (PrimitiveObjectInspectorUtils.decimalTypeEntry.equals(colTypeInfo.getPrimitiveTypeEntry()) && (constVal instanceof Number || constVal instanceof String)) { + children.set(constIdx, NumExprProcessor.createDecimal(constVal.toString(),false)); } } catch (NumberFormatException nfe) { LOG.trace("Failed to narrow type of constant", nfe); diff --git a/ql/src/test/queries/clientpositive/dec_str.q b/ql/src/test/queries/clientpositive/dec_str.q new file mode 100644 index 0000000000..6862553efa --- /dev/null +++ b/ql/src/test/queries/clientpositive/dec_str.q @@ -0,0 +1,6 @@ +create table t1 (a decimal (3,1)); +explain select * from t1 where a = '22.3'; +explain select * from t1 where a = '2.3'; +explain select * from t1 where a = '213.223'; +explain select * from t1 where a = ''; +explain select * from t1 where a = 'ab'; diff --git a/ql/src/test/results/clientpositive/llap/dec_str.q.out b/ql/src/test/results/clientpositive/llap/dec_str.q.out new file mode 100644 index 0000000000..d021433617 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/dec_str.q.out @@ -0,0 +1,113 @@ +PREHOOK: query: create table t1 (a decimal (3,1)) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@t1 +POSTHOOK: query: create table t1 (a decimal (3,1)) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@t1 +PREHOOK: query: explain select * from t1 where a = '22.3' +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where a = '22.3' +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: t1 + Filter Operator + predicate: (a = 22.3) (type: boolean) + Select Operator + expressions: 22.3 (type: decimal(3,1)) + outputColumnNames: _col0 + ListSink + +PREHOOK: query: explain select * from t1 where a = '2.3' +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where a = '2.3' +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: t1 + Filter Operator + predicate: (a = 2.3) (type: boolean) + Select Operator + expressions: 2.3 (type: decimal(3,1)) + outputColumnNames: _col0 + ListSink + +PREHOOK: query: explain select * from t1 where a = '213.223' +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where a = '213.223' +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: t1 + Filter Operator + predicate: (a = 213.223) (type: boolean) + Select Operator + expressions: null (type: decimal(3,1)) + outputColumnNames: _col0 + ListSink + +PREHOOK: query: explain select * from t1 where a = '' +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where a = '' +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: t1 + Filter Operator + predicate: (a = null) (type: boolean) + Select Operator + expressions: null (type: decimal(3,1)) + outputColumnNames: _col0 + ListSink + +PREHOOK: query: explain select * from t1 where a = 'ab' +PREHOOK: type: QUERY +POSTHOOK: query: explain select * from t1 where a = 'ab' +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: t1 + Filter Operator + predicate: (a = null) (type: boolean) + Select Operator + expressions: null (type: decimal(3,1)) + outputColumnNames: _col0 + ListSink + -- 2.14.3 (Apple Git-98)