This is an automated email from the ASF dual-hosted git repository.
mihaibudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 740a0bc4c2 [CALCITE-7506] RelWriterImpl does not output hints
740a0bc4c2 is described below
commit 740a0bc4c20173f74ed2bb781f790fe39cf1a6a3
Author: Mihai Budiu <[email protected]>
AuthorDate: Thu May 7 22:25:23 2026 -0700
[CALCITE-7506] RelWriterImpl does not output hints
Signed-off-by: Mihai Budiu <[email protected]>
---
.../calcite/rel/externalize/RelWriterImpl.java | 8 ++++++
.../java/org/apache/calcite/tools/PlannerTest.java | 30 ++++++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git
a/core/src/main/java/org/apache/calcite/rel/externalize/RelWriterImpl.java
b/core/src/main/java/org/apache/calcite/rel/externalize/RelWriterImpl.java
index 8d52ffbe38..25af2ed3af 100644
--- a/core/src/main/java/org/apache/calcite/rel/externalize/RelWriterImpl.java
+++ b/core/src/main/java/org/apache/calcite/rel/externalize/RelWriterImpl.java
@@ -20,6 +20,8 @@
import org.apache.calcite.linq4j.Ord;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.RelWriter;
+import org.apache.calcite.rel.hint.Hintable;
+import org.apache.calcite.rel.hint.RelHint;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.sql.SqlExplainLevel;
import org.apache.calcite.util.Pair;
@@ -105,6 +107,12 @@ protected void explain_(RelNode rel,
}
switch (detailLevel) {
case ALL_ATTRIBUTES:
+ if (rel instanceof Hintable) {
+ List<RelHint> hints = ((Hintable) rel).getHints();
+ if (!hints.isEmpty()) {
+ s.append(hints);
+ }
+ }
s.append(": rowcount = ")
.append(mq.getRowCount(rel))
.append(", cumulative cost = ")
diff --git a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
index 9a367f37ab..2907bd3f22 100644
--- a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
@@ -44,6 +44,8 @@
import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.core.RelFactories;
import org.apache.calcite.rel.core.TableScan;
+import org.apache.calcite.rel.hint.HintPredicates;
+import org.apache.calcite.rel.hint.HintStrategyTable;
import org.apache.calcite.rel.logical.LogicalFilter;
import org.apache.calcite.rel.logical.LogicalProject;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
@@ -75,6 +77,7 @@
import org.apache.calcite.sql.util.SqlOperatorTables;
import org.apache.calcite.sql.validate.SqlValidator;
import org.apache.calcite.sql.validate.SqlValidatorScope;
+import org.apache.calcite.sql2rel.SqlToRelConverter;
import org.apache.calcite.test.CalciteAssert;
import org.apache.calcite.test.RelBuilderTest;
import org.apache.calcite.test.schemata.tpch.TpchSchema;
@@ -556,6 +559,33 @@ private void checkUnionPruning(String sql, String plan,
RelOptRule... extraRules
+ " EnumerableTableScan(table=[[hr, emps]])\n"));
}
+ /** Test case for <a
href="https://issues.apache.org/jira/browse/CALCITE-7506">[CALCITE-7506]
+ * RelWriterImpl does not output hints</a>. */
+ @Test void testHints() throws Exception {
+ HintStrategyTable hintTable = HintStrategyTable.builder()
+ .hintStrategy("hint", HintPredicates.PROJECT).build();
+ final SchemaPlus rootSchema = Frameworks.createRootSchema(true);
+ final FrameworkConfig config = Frameworks.newConfigBuilder()
+ .parserConfig(SqlParser.Config.DEFAULT)
+ .defaultSchema(CalciteAssert.addSchema(rootSchema,
CalciteAssert.SchemaSpec.HR))
+
.sqlToRelConverterConfig(SqlToRelConverter.CONFIG.withHintStrategyTable(hintTable))
+ .build();
+ Planner planner = Frameworks.getPlanner(config);
+ final String sql = "select /*+ hint */ * from \"emps\" order by
\"emps\".\"deptno\"";
+ SqlNode parse = planner.parse(sql);
+ SqlNode validate = planner.validate(parse);
+ RelNode convert = planner.rel(validate).project();
+ String explain =
+ Util.toLinux(
+ RelOptUtil.dumpPlan("", convert, SqlExplainFormat.TEXT,
+ SqlExplainLevel.ALL_ATTRIBUTES));
+ // Cannot check for exact equality since ALL_ATTRIBUTES prints node ids,
+ // which change from run to run
+ assertThat(explain,
+ containsString("LogicalSort(sort0=[$1], dir0=[ASC])[[HINT
inheritPath:[]]]: "
+ + "rowcount = 100.0, cumulative cost = {300.0 rows,
15337.544595161893 cpu, 0.0 io}"));
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-2554">[CALCITE-2554]
* Enrich EnumerableHashJoin operator with order preserving information</a>.