This is an automated email from the ASF dual-hosted git repository. michaelsmith pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/impala.git
commit b449381cc8ff1f31ab73ad34dee73733d9ef1e74 Author: Steve Carlin <[email protected]> AuthorDate: Fri Nov 8 13:34:57 2024 -0800 IMPALA-13575: Calcite planner: Fix exception when null is in values clause The following query was failing with an exception: select * from (values(0), (null)) The null type was not being assigned a type correctly. After this fix, the null type will be created as an AnalyzedNullLiteral with the correct type. Change-Id: I4e78fb0ed63b9525540ad537cfb7aabd8bbfe7ea Reviewed-on: http://gerrit.cloudera.org:8080/22109 Reviewed-by: Aman Sinha <[email protected]> Reviewed-by: Michael Smith <[email protected]> Tested-by: Impala Public Jenkins <[email protected]> --- .../impala/calcite/rel/node/ImpalaValuesRel.java | 32 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/node/ImpalaValuesRel.java b/java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/node/ImpalaValuesRel.java index 51b3953e6..cd9f8afa4 100644 --- a/java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/node/ImpalaValuesRel.java +++ b/java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/node/ImpalaValuesRel.java @@ -21,10 +21,14 @@ import org.apache.calcite.rel.core.Values; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexLiteral; +import org.apache.impala.analysis.Analyzer; import org.apache.impala.analysis.Expr; import org.apache.impala.analysis.LiteralExpr; +import org.apache.impala.analysis.NullLiteral; import org.apache.impala.calcite.rel.util.ExprConjunctsConverter; import org.apache.impala.calcite.type.ImpalaTypeConverter; +import org.apache.impala.calcite.functions.AnalyzedNullLiteral; +import org.apache.impala.catalog.Type; import org.apache.impala.common.ImpalaException; import org.apache.impala.planner.PlanNode; import org.apache.impala.planner.PlanNodeId; @@ -100,12 +104,17 @@ public class ImpalaValuesRel extends Values new ArrayList<>(), getCluster().getRexBuilder(), context.ctx_.getRootAnalyzer()); + // If the parentRowType_ is set, that means there is a passthrough "Project" + // RelNode on top of this Values RelNode. This Project will contain the type we + // need to use. This happens because Calcite treats literal strings as "char" + // and smaller integers (e.g. tinyint) as "int", if (context.parentRowType_ != null) { - LiteralExpr e = (LiteralExpr) converter.getImpalaConjuncts().get(0); - LiteralExpr f = LiteralExpr.createFromUnescapedStr(e.getStringValue(), - ImpalaTypeConverter.createImpalaType( - context.parentRowType_.getFieldList().get(i).getType())); - outputExprs.add(f); + LiteralExpr literalExpr = + getLiteralExprWithType( + (LiteralExpr) converter.getImpalaConjuncts().get(0), + context.parentRowType_.getFieldList().get(i).getType(), + context.ctx_.getRootAnalyzer()); + outputExprs.add(literalExpr); } else { outputExprs.addAll(converter.getImpalaConjuncts()); } @@ -115,6 +124,19 @@ public class ImpalaValuesRel extends Values return new NodeWithExprs(retNode, outputExprs); } + private LiteralExpr getLiteralExprWithType(LiteralExpr expr, RelDataType type, + Analyzer analyzer) throws ImpalaException { + Type impalaType = ImpalaTypeConverter.createImpalaType(type); + + if (expr instanceof NullLiteral) { + NullLiteral nullLiteral = new AnalyzedNullLiteral(impalaType); + nullLiteral.analyze(analyzer); + return nullLiteral; + } + + return LiteralExpr.createFromUnescapedStr(expr.getStringValue(), impalaType); + } + @Override public RelNodeType relNodeType() { return RelNodeType.VALUES;
