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) {
