This is an automated email from the ASF dual-hosted git repository.

laszlog pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git

commit a2ea1be22fdf79ce58bd1bf19ecd18918d828ce9
Author: Steve Carlin <[email protected]>
AuthorDate: Fri Aug 29 09:34:45 2025 -0700

    IMPALA-14409: Calcite planner: support statement_expression_limit
    
    Added a counter in the place where the Calcite planner handles
    expressions.  A RexNode in Calcite is similar to an Expr object
    in Impala.
    
    The test for this exists in
    test_exprs.py::TestExprLimits::test_max_statement_size and will be
    run once all jenkins tests are run through Calcite.
    
    Change-Id: I9210a9a86eb98b5923295b846cb29f10acf459ce
    Reviewed-on: http://gerrit.cloudera.org:8080/23765
    Reviewed-by: Impala Public Jenkins <[email protected]>
    Tested-by: Impala Public Jenkins <[email protected]>
---
 .../impala/calcite/rel/util/CreateExprVisitor.java    | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git 
a/java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/util/CreateExprVisitor.java
 
b/java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/util/CreateExprVisitor.java
index 1cd30d4f2..c4545ae68 100644
--- 
a/java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/util/CreateExprVisitor.java
+++ 
b/java/calcite-planner/src/main/java/org/apache/impala/calcite/rel/util/CreateExprVisitor.java
@@ -56,6 +56,8 @@ public class CreateExprVisitor extends RexVisitorImpl<Expr> {
 
   private final Analyzer analyzer_;
 
+  private int numExprs_ = 0;
+
   public CreateExprVisitor(RexBuilder rexBuilder, List<Expr> inputExprs,
       Analyzer analyzer) {
     super(false);
@@ -68,6 +70,14 @@ public class CreateExprVisitor extends RexVisitorImpl<Expr> {
     return rexBuilder_;
   }
 
+  public int getNumExprs() {
+    return numExprs_;
+  }
+
+  public void reset() {
+    numExprs_ = 0;
+  }
+
   @Override
   public Expr visitInputRef(RexInputRef rexInputRef) {
     return inputExprs_.get(rexInputRef.getIndex());
@@ -75,6 +85,7 @@ public class CreateExprVisitor extends RexVisitorImpl<Expr> {
 
   @Override
   public Expr visitCall(RexCall rexCall) {
+    numExprs_++;
     List<Expr> params = Lists.newArrayList();
     for (RexNode operand : rexCall.getOperands()) {
       params.add(operand.accept(this));
@@ -147,9 +158,17 @@ public class CreateExprVisitor extends 
RexVisitorImpl<Expr> {
       // be expanded.  A custom ImpalaRexUtil was made to handle
       // the IN operator and is needed until at least CALCITE-7226
       // is fixed.
+      visitor.reset();
       RexNode expandedOperand =
           ImpalaRexUtil.expandSearch(visitor.getRexBuilder(), operand);
       Expr expr = expandedOperand.accept(visitor);
+      int maxExprsAllowed =
+          visitor.analyzer_.getQueryOptions().getStatement_expression_limit();
+      if (visitor.getNumExprs() > maxExprsAllowed) {
+        String errorStr = String.format("Exceeded the statement expression 
limit (%d)\n" +
+          "Statement has %d expressions.", maxExprsAllowed, 
visitor.getNumExprs());
+        throw new AnalysisException(errorStr);
+      }
       expr.analyze(visitor.analyzer_);
       return expr;
     } catch (Exception e) {

Reply via email to