From ab2456c640640c44409a67330bc977427f1e36b5 Mon Sep 17 00:00:00 2001 From: mduggan-starburst Date: Wed, 2 Oct 2024 16:25:44 -0400 Subject: [PATCH] Add new error code and handling: QUERY_EXCEEDED_COMPILER_LIMIT --- .../io/trino/sql/gen/PageFunctionCompiler.java | 5 +++-- .../sql/gen/columnar/ColumnarFilterCompiler.java | 3 ++- .../trino/sql/planner/LocalExecutionPlanner.java | 14 +++++++++----- .../sql/planner/TestLocalExecutionPlanner.java | 6 +++--- .../main/java/io/trino/spi/StandardErrorCode.java | 1 + 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/core/trino-main/src/main/java/io/trino/sql/gen/PageFunctionCompiler.java b/core/trino-main/src/main/java/io/trino/sql/gen/PageFunctionCompiler.java index d8f982aaecbfc..23214eccf0c5e 100644 --- a/core/trino-main/src/main/java/io/trino/sql/gen/PageFunctionCompiler.java +++ b/core/trino-main/src/main/java/io/trino/sql/gen/PageFunctionCompiler.java @@ -92,6 +92,7 @@ import static io.trino.cache.SafeCaches.buildNonEvictableCache; import static io.trino.operator.project.PageFieldsToInputParametersRewriter.rewritePageFieldsToInputParameters; import static io.trino.spi.StandardErrorCode.COMPILER_ERROR; +import static io.trino.spi.StandardErrorCode.QUERY_EXCEEDED_COMPILER_LIMIT; import static io.trino.sql.gen.BytecodeUtils.generateWrite; import static io.trino.sql.gen.BytecodeUtils.invoke; import static io.trino.sql.gen.LambdaExpressionExtractor.extractLambdaExpressions; @@ -206,7 +207,7 @@ private Supplier compileProjectionInternal(RowExpression project } catch (Exception e) { if (Throwables.getRootCause(e) instanceof MethodTooLargeException) { - throw new TrinoException(COMPILER_ERROR, + throw new TrinoException(QUERY_EXCEEDED_COMPILER_LIMIT, "Query exceeded maximum columns. Please reduce the number of columns referenced and re-run the query.", e); } throw new TrinoException(COMPILER_ERROR, e); @@ -400,7 +401,7 @@ private Supplier compileFilterInternal(RowExpression filter, Optiona } catch (Exception e) { if (Throwables.getRootCause(e) instanceof MethodTooLargeException) { - throw new TrinoException(COMPILER_ERROR, + throw new TrinoException(QUERY_EXCEEDED_COMPILER_LIMIT, "Query exceeded maximum filters. Please reduce the number of filters referenced and re-run the query.", e); } throw new TrinoException(COMPILER_ERROR, filter.toString(), e.getCause()); diff --git a/core/trino-main/src/main/java/io/trino/sql/gen/columnar/ColumnarFilterCompiler.java b/core/trino-main/src/main/java/io/trino/sql/gen/columnar/ColumnarFilterCompiler.java index 534354bd5325c..5128b0c207e34 100644 --- a/core/trino-main/src/main/java/io/trino/sql/gen/columnar/ColumnarFilterCompiler.java +++ b/core/trino-main/src/main/java/io/trino/sql/gen/columnar/ColumnarFilterCompiler.java @@ -62,6 +62,7 @@ import static io.trino.cache.SafeCaches.buildNonEvictableCache; import static io.trino.operator.project.PageFieldsToInputParametersRewriter.rewritePageFieldsToInputParameters; import static io.trino.spi.StandardErrorCode.COMPILER_ERROR; +import static io.trino.spi.StandardErrorCode.QUERY_EXCEEDED_COMPILER_LIMIT; import static io.trino.sql.gen.BytecodeUtils.invoke; import static io.trino.sql.gen.columnar.FilterEvaluator.isNotExpression; import static io.trino.sql.gen.columnar.IsNotNullColumnarFilter.createIsNotNullColumnarFilter; @@ -179,7 +180,7 @@ static Supplier createClassInstance(CallSiteBinder binder, Class } catch (Exception e) { if (Throwables.getRootCause(e) instanceof MethodTooLargeException) { - throw new TrinoException(COMPILER_ERROR, + throw new TrinoException(QUERY_EXCEEDED_COMPILER_LIMIT, "Query exceeded maximum filters. Please reduce the number of filters referenced and re-run the query.", e); } throw new TrinoException(COMPILER_ERROR, e.getCause()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java b/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java index b7726994e3a19..10ed0de559566 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java @@ -13,6 +13,7 @@ */ package io.trino.sql.planner; +import com.google.common.base.Throwables; import com.google.common.base.VerifyException; import com.google.common.cache.CacheBuilder; import com.google.common.collect.ContiguousSet; @@ -270,6 +271,7 @@ import io.trino.sql.relational.SqlToRowExpressionTranslator; import io.trino.type.BlockTypeOperators; import io.trino.type.FunctionType; +import org.objectweb.asm.MethodTooLargeException; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; @@ -350,6 +352,7 @@ import static io.trino.operator.window.pattern.PhysicalValuePointer.CLASSIFIER; import static io.trino.operator.window.pattern.PhysicalValuePointer.MATCH_NUMBER; import static io.trino.spi.StandardErrorCode.COMPILER_ERROR; +import static io.trino.spi.StandardErrorCode.QUERY_EXCEEDED_COMPILER_LIMIT; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.TypeUtils.readNativeValue; import static io.trino.spi.type.TypeUtils.writeNativeValue; @@ -2067,11 +2070,12 @@ else if (sourceNode instanceof SampleNode sampleNode) { throw e; } catch (RuntimeException e) { - throw new TrinoException( - COMPILER_ERROR, - "Compiler failed. Possible reasons include: the query may have too many or too complex expressions, " + - "or the underlying tables may have too many columns", - e); + if (Throwables.getRootCause(e) instanceof MethodTooLargeException) { + throw new TrinoException(QUERY_EXCEEDED_COMPILER_LIMIT, + "Compiler failed. Possible reasons include: the query may have too many or too complex expressions, " + + "or the underlying tables may have too many columns", e); + } + throw new TrinoException(COMPILER_ERROR, e); } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestLocalExecutionPlanner.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestLocalExecutionPlanner.java index fb3faedf5e512..9dc212dbed891 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestLocalExecutionPlanner.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestLocalExecutionPlanner.java @@ -26,8 +26,8 @@ import static io.airlift.testing.Closeables.closeAllRuntimeException; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.spi.StandardErrorCode.COMPILER_ERROR; import static io.trino.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; +import static io.trino.spi.StandardErrorCode.QUERY_EXCEEDED_COMPILER_LIMIT; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; import static java.util.Collections.nCopies; import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS; @@ -61,7 +61,7 @@ public void testProjectionCompilerFailure() String outer = "x + x + " + Joiner.on(" + ").join(nCopies(100, inner)); assertTrinoExceptionThrownBy(() -> runner.execute("SELECT " + outer + " FROM (VALUES rand()) t(x)")) - .hasErrorCode(COMPILER_ERROR) + .hasErrorCode(QUERY_EXCEEDED_COMPILER_LIMIT) .hasMessage("Query exceeded maximum columns. Please reduce the number of columns referenced and re-run the query."); } @@ -75,7 +75,7 @@ public void testFilterCompilerFailure() + " OR " + Joiner.on(" AND ").join(nCopies(1000, " c3 = rand()")); assertTrinoExceptionThrownBy(() -> runner.execute("SELECT * " + filterQueryInner + filterQueryWhere)) - .hasErrorCode(COMPILER_ERROR) + .hasErrorCode(QUERY_EXCEEDED_COMPILER_LIMIT) .hasMessage("Query exceeded maximum filters. Please reduce the number of filters referenced and re-run the query."); } diff --git a/core/trino-spi/src/main/java/io/trino/spi/StandardErrorCode.java b/core/trino-spi/src/main/java/io/trino/spi/StandardErrorCode.java index 13e961fa4c226..f4397d4d013de 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/StandardErrorCode.java +++ b/core/trino-spi/src/main/java/io/trino/spi/StandardErrorCode.java @@ -153,6 +153,7 @@ public enum StandardErrorCode INVALID_PLAN(129, USER_ERROR), INVALID_VIEW_PROPERTY(130, USER_ERROR), INVALID_ENTITY_KIND(131, USER_ERROR), + QUERY_EXCEEDED_COMPILER_LIMIT(132, USER_ERROR), GENERIC_INTERNAL_ERROR(65536, INTERNAL_ERROR), TOO_MANY_REQUESTS_FAILED(65537, INTERNAL_ERROR),