diff --git itests/src/test/resources/testconfiguration.properties itests/src/test/resources/testconfiguration.properties index 2851720..0d3e1cc 100644 --- itests/src/test/resources/testconfiguration.properties +++ itests/src/test/resources/testconfiguration.properties @@ -192,6 +192,7 @@ minitez.query.files.shared=alter_merge_2_orc.q,\ vector_between_in.q,\ vector_binary_join_groupby.q,\ vector_bucket.q,\ + vector_char_cast.q,\ vector_cast_constant.q,\ vector_char_2.q,\ vector_char_4.q,\ diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java index 34f9329..2483196 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java @@ -1528,7 +1528,7 @@ private VectorExpression getCastToString(List childExpr, TypeInfo // Boolean must come before the integer family. It's a special case. return createVectorExpression(CastBooleanToStringViaLongToString.class, childExpr, Mode.PROJECTION, null); } else if (isIntFamily(inputType)) { - return createVectorExpression(CastLongToString.class, childExpr, Mode.PROJECTION, null); + return createVectorExpression(CastLongToString.class, childExpr, Mode.PROJECTION, returnType); } else if (isDecimalFamily(inputType)) { return createVectorExpression(CastDecimalToString.class, childExpr, Mode.PROJECTION, returnType); } else if (isDateFamily(inputType)) { @@ -1554,9 +1554,9 @@ private VectorExpression getCastToChar(List childExpr, TypeInfo re } if (inputType.equals("boolean")) { // Boolean must come before the integer family. It's a special case. - return createVectorExpression(CastBooleanToCharViaLongToChar.class, childExpr, Mode.PROJECTION, null); + return createVectorExpression(CastBooleanToCharViaLongToChar.class, childExpr, Mode.PROJECTION, returnType); } else if (isIntFamily(inputType)) { - return createVectorExpression(CastLongToChar.class, childExpr, Mode.PROJECTION, null); + return createVectorExpression(CastLongToChar.class, childExpr, Mode.PROJECTION, returnType); } else if (isDecimalFamily(inputType)) { return createVectorExpression(CastDecimalToChar.class, childExpr, Mode.PROJECTION, returnType); } else if (isDateFamily(inputType)) { @@ -1583,9 +1583,9 @@ private VectorExpression getCastToVarChar(List childExpr, TypeInfo } if (inputType.equals("boolean")) { // Boolean must come before the integer family. It's a special case. - return createVectorExpression(CastBooleanToVarCharViaLongToVarChar.class, childExpr, Mode.PROJECTION, null); + return createVectorExpression(CastBooleanToVarCharViaLongToVarChar.class, childExpr, Mode.PROJECTION, returnType); } else if (isIntFamily(inputType)) { - return createVectorExpression(CastLongToVarChar.class, childExpr, Mode.PROJECTION, null); + return createVectorExpression(CastLongToVarChar.class, childExpr, Mode.PROJECTION, returnType); } else if (isDecimalFamily(inputType)) { return createVectorExpression(CastDecimalToVarChar.class, childExpr, Mode.PROJECTION, returnType); } else if (isDateFamily(inputType)) { diff --git ql/src/test/queries/clientpositive/vector_char_cast.q ql/src/test/queries/clientpositive/vector_char_cast.q new file mode 100644 index 0000000..bc78d51 --- /dev/null +++ ql/src/test/queries/clientpositive/vector_char_cast.q @@ -0,0 +1,9 @@ +create table s1(id smallint) stored as orc; + +insert into table s1 values (1000),(1001),(1002),(1003),(1000); + +set hive.vectorized.execution.enabled=true; +select count(1) from s1 where cast(id as char(4))='1000'; + +set hive.vectorized.execution.enabled=false; +select count(1) from s1 where cast(id as char(4))='1000'; \ No newline at end of file diff --git ql/src/test/results/clientpositive/tez/vector_char_cast.q.out ql/src/test/results/clientpositive/tez/vector_char_cast.q.out new file mode 100644 index 0000000..dbeae74 --- /dev/null +++ ql/src/test/results/clientpositive/tez/vector_char_cast.q.out @@ -0,0 +1,35 @@ +PREHOOK: query: create table s1(id smallint) stored as orc +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@s1 +POSTHOOK: query: create table s1(id smallint) stored as orc +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@s1 +PREHOOK: query: insert into table s1 values (1000),(1001),(1002),(1003),(1000) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@s1 +POSTHOOK: query: insert into table s1 values (1000),(1001),(1002),(1003),(1000) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@s1 +POSTHOOK: Lineage: s1.id EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: select count(1) from s1 where cast(id as char(4))='1000' +PREHOOK: type: QUERY +PREHOOK: Input: default@s1 +#### A masked pattern was here #### +POSTHOOK: query: select count(1) from s1 where cast(id as char(4))='1000' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s1 +#### A masked pattern was here #### +2 +PREHOOK: query: select count(1) from s1 where cast(id as char(4))='1000' +PREHOOK: type: QUERY +PREHOOK: Input: default@s1 +#### A masked pattern was here #### +POSTHOOK: query: select count(1) from s1 where cast(id as char(4))='1000' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s1 +#### A masked pattern was here #### +2 diff --git ql/src/test/results/clientpositive/vector_char_cast.q.out ql/src/test/results/clientpositive/vector_char_cast.q.out new file mode 100644 index 0000000..dbeae74 --- /dev/null +++ ql/src/test/results/clientpositive/vector_char_cast.q.out @@ -0,0 +1,35 @@ +PREHOOK: query: create table s1(id smallint) stored as orc +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@s1 +POSTHOOK: query: create table s1(id smallint) stored as orc +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@s1 +PREHOOK: query: insert into table s1 values (1000),(1001),(1002),(1003),(1000) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@s1 +POSTHOOK: query: insert into table s1 values (1000),(1001),(1002),(1003),(1000) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@s1 +POSTHOOK: Lineage: s1.id EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +PREHOOK: query: select count(1) from s1 where cast(id as char(4))='1000' +PREHOOK: type: QUERY +PREHOOK: Input: default@s1 +#### A masked pattern was here #### +POSTHOOK: query: select count(1) from s1 where cast(id as char(4))='1000' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s1 +#### A masked pattern was here #### +2 +PREHOOK: query: select count(1) from s1 where cast(id as char(4))='1000' +PREHOOK: type: QUERY +PREHOOK: Input: default@s1 +#### A masked pattern was here #### +POSTHOOK: query: select count(1) from s1 where cast(id as char(4))='1000' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s1 +#### A masked pattern was here #### +2