This is an automated email from the ASF dual-hosted git repository. alexpl pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push: new af425e3c9a5 IGNITE-25236 SQL Calcite: Fix excessive log output on planning error (#12047) af425e3c9a5 is described below commit af425e3c9a5263ccd56e75f0b025207cd2cc35ee Author: Vladislav Novikov <47698772+vladnovo...@users.noreply.github.com> AuthorDate: Wed Jun 11 10:59:57 2025 +0300 IGNITE-25236 SQL Calcite: Fix excessive log output on planning error (#12047) --- .../query/calcite/CalciteQueryProcessor.java | 9 +++ .../integration/CalcitePlanningDumpTest.java | 77 ++++++++++++++++++++++ .../query/calcite/planner/AbstractPlannerTest.java | 8 ++- .../ignite/testsuites/IntegrationTestSuite.java | 2 + 4 files changed, 94 insertions(+), 2 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessor.java index 39af2506e80..24e6099e854 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessor.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessor.java @@ -132,6 +132,15 @@ import static org.apache.ignite.events.EventType.EVT_SQL_QUERY_EXECUTION; /** */ public class CalciteQueryProcessor extends GridProcessorAdapter implements QueryEngine { + static { + // Required to avoid excessive dump message of Calcite VolcanoPlanner + // + // Note, Calcite system properties must be overriden here, because the properties are finalized while the class + // org.apache.calcite.config.CalciteSystemProperty is loaded. + System.setProperty("calcite.volcano.dump.graphviz", "false"); + System.setProperty("calcite.volcano.dump.sets", "false"); + } + /** * Default planner timeout, in ms. */ diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/CalcitePlanningDumpTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/CalcitePlanningDumpTest.java new file mode 100644 index 00000000000..409dc4c3893 --- /dev/null +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/CalcitePlanningDumpTest.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.ignite.internal.processors.query.calcite.integration; + +import java.util.stream.Stream; + +import org.apache.calcite.plan.RelOptPlanner; +import org.apache.calcite.rel.RelCollation; +import org.apache.ignite.internal.processors.query.QueryUtils; +import org.apache.ignite.internal.processors.query.calcite.schema.IgniteTable; +import org.apache.ignite.internal.util.typedef.X; +import org.apache.ignite.testframework.junits.WithSystemProperty; +import org.junit.Test; + +import static org.apache.ignite.IgniteCommonsSystemProperties.getLong; +import static org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor.IGNITE_CALCITE_PLANNER_TIMEOUT; +import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause; + +/** + * This test assumes no Calcite classes are loaded in the current JVM before CalciteQueryProcessor. + * Violating this invariant may cause the test to fail due to premature Calcite initialization. + */ +@WithSystemProperty(key = IGNITE_CALCITE_PLANNER_TIMEOUT, value = "1000") +public class CalcitePlanningDumpTest extends AbstractBasicIntegrationTest { + /** */ + private static final long PLANNER_TIMEOUT = getLong(IGNITE_CALCITE_PLANNER_TIMEOUT, 0); + + /** */ + @Test + public void testTruncatedCalciteDump() { + Stream.of("T1", "T2").forEach(tblName -> { + sql(String.format("CREATE TABLE %s(A INT, B INT)", tblName)); + + IgniteTable tbl = (IgniteTable)queryProcessor(client).schemaHolder().schema("PUBLIC").getTable(tblName); + + tbl.addIndex(new DelegatingIgniteIndex(tbl.getIndex(QueryUtils.PRIMARY_KEY_INDEX)) { + @Override public RelCollation collation() { + doSleep(PLANNER_TIMEOUT); + + return delegate.collation(); + } + }); + + sql(String.format("INSERT INTO %s(A, B) VALUES (1, 1)", tblName)); + }); + + String longJoinQry = "SELECT * FROM T1 JOIN T2 ON T1.A = T2.A"; + + Throwable thrown = assertThrowsWithCause(() -> sql(longJoinQry), RelOptPlanner.CannotPlanException.class); + + Throwable cannotPlanE = X.cause(thrown, RelOptPlanner.CannotPlanException.class); + + String cannotPlanMsg = cannotPlanE.getMessage(); + + assertTrue(cannotPlanMsg.contains("Original rel:")); + + assertFalse(cannotPlanMsg.contains("Sets:")); + + assertFalse(cannotPlanMsg.contains("Graphviz:")); + } +} diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java index 850e50ac3f1..4dd43a9c807 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java @@ -43,6 +43,7 @@ import org.apache.calcite.rel.core.TableModify; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeField; +import org.apache.calcite.rel.type.RelDataTypeSystem; import org.apache.calcite.rex.RexNode; import org.apache.calcite.schema.ColumnStrategy; import org.apache.calcite.schema.SchemaPlus; @@ -63,6 +64,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheContextInfo; import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow; import org.apache.ignite.internal.processors.failure.FailureProcessor; import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; +import org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor; import org.apache.ignite.internal.processors.query.calcite.exec.ExecutionContext; import org.apache.ignite.internal.processors.query.calcite.exec.RowHandler; import org.apache.ignite.internal.processors.query.calcite.exec.task.StripedQueryTaskExecutor; @@ -88,7 +90,6 @@ import org.apache.ignite.internal.processors.query.calcite.schema.IgniteSchema; import org.apache.ignite.internal.processors.query.calcite.schema.ModifyTuple; import org.apache.ignite.internal.processors.query.calcite.trait.IgniteDistribution; import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; -import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeSystem; import org.apache.ignite.internal.processors.query.calcite.util.Commons; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.CU; @@ -113,7 +114,10 @@ import static org.apache.ignite.internal.processors.query.calcite.externalize.Re @SuppressWarnings({"TooBroadScope", "FieldCanBeLocal", "TypeMayBeWeakened"}) public abstract class AbstractPlannerTest extends GridCommonAbstractTest { /** */ - protected static final IgniteTypeFactory TYPE_FACTORY = new IgniteTypeFactory(IgniteTypeSystem.INSTANCE); + private static final RelDataTypeSystem TYPE_SYSTEM = CalciteQueryProcessor.FRAMEWORK_CONFIG.getTypeSystem(); + + /** */ + protected static final IgniteTypeFactory TYPE_FACTORY = new IgniteTypeFactory(TYPE_SYSTEM); /** */ protected static final int DEFAULT_TBL_SIZE = 500_000; diff --git a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java index ba8210203ce..973c2040011 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java +++ b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java @@ -27,6 +27,7 @@ import org.apache.ignite.internal.processors.query.calcite.integration.Aggregate import org.apache.ignite.internal.processors.query.calcite.integration.AuthorizationIntegrationTest; import org.apache.ignite.internal.processors.query.calcite.integration.CalciteBasicSecondaryIndexIntegrationTest; import org.apache.ignite.internal.processors.query.calcite.integration.CalciteErrorHandlilngIntegrationTest; +import org.apache.ignite.internal.processors.query.calcite.integration.CalcitePlanningDumpTest; import org.apache.ignite.internal.processors.query.calcite.integration.CorrelatesIntegrationTest; import org.apache.ignite.internal.processors.query.calcite.integration.DataTypesTest; import org.apache.ignite.internal.processors.query.calcite.integration.DateTimeTest; @@ -161,6 +162,7 @@ import org.junit.runners.Suite; ScalarInIntegrationTest.class, TpchTest.class, UnnestIntegrationTest.class, + CalcitePlanningDumpTest.class, }) public class IntegrationTestSuite { }