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;

Reply via email to