This is an automated email from the ASF dual-hosted git repository. tledkov pushed a commit to branch sql-calcite in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/sql-calcite by this push: new 9c32f78 IGNITE-14549 Calcite. ORDER BY column not from SELECT LIST 9c32f78 is described below commit 9c32f7874331044e31bb6eb3baa06ef959a06bff Author: korlov42 <kor...@gridgain.com> AuthorDate: Wed Apr 21 16:38:20 2021 +0300 IGNITE-14549 Calcite. ORDER BY column not from SELECT LIST --- .../query/calcite/exec/ExecutionServiceImpl.java | 20 +++++++++++++++-- .../query/calcite/prepare/IgnitePlanner.java | 3 +-- .../query/calcite/CalciteQueryProcessorTest.java | 25 ++++++++++++++++++++++ .../query/calcite/planner/PlannerTest.java | 2 +- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/ExecutionServiceImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/ExecutionServiceImpl.java index b9ca57d..449ddb5 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/ExecutionServiceImpl.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/ExecutionServiceImpl.java @@ -41,6 +41,8 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.RelRoot; import org.apache.calcite.rel.hint.Hintable; import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rex.RexBuilder; +import org.apache.calcite.rex.RexNode; import org.apache.calcite.sql.SqlDdl; import org.apache.calcite.sql.SqlExplain; import org.apache.calcite.sql.SqlExplainLevel; @@ -50,6 +52,7 @@ import org.apache.calcite.sql.parser.SqlParseException; import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.tools.Frameworks; import org.apache.calcite.tools.ValidationException; +import org.apache.calcite.util.Pair; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.cache.query.FieldsQueryCursor; @@ -104,6 +107,7 @@ import org.apache.ignite.internal.processors.query.calcite.prepare.Splitter; import org.apache.ignite.internal.processors.query.calcite.prepare.ValidationResult; import org.apache.ignite.internal.processors.query.calcite.prepare.ddl.DdlSqlToCommandConverter; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteConvention; +import org.apache.ignite.internal.processors.query.calcite.rel.IgniteProject; import org.apache.ignite.internal.processors.query.calcite.rel.IgniteRel; import org.apache.ignite.internal.processors.query.calcite.schema.SchemaHolder; import org.apache.ignite.internal.processors.query.calcite.trait.CorrelationTraitDef; @@ -631,7 +635,7 @@ public class ExecutionServiceImpl<Row> extends AbstractService implements Execut // Convert to Relational operators graph RelRoot root = planner.rel(sqlNode); - RelNode rel = root.project(); + RelNode rel = root.rel; if (rel instanceof Hintable) planner.setDisabledRules(HintUtils.disabledRules((Hintable)rel)); @@ -645,7 +649,19 @@ public class ExecutionServiceImpl<Row> extends AbstractService implements Execut .replace(root.collation == null ? RelCollations.EMPTY : root.collation) .simplify(); - return planner.transform(PlannerPhase.OPTIMIZATION, desired, rel); + IgniteRel igniteRel = planner.transform(PlannerPhase.OPTIMIZATION, desired, rel); + + if (!root.isRefTrivial()) { + final List<RexNode> projects = new ArrayList<>(); + final RexBuilder rexBuilder = igniteRel.getCluster().getRexBuilder(); + + for (int field : Pair.left(root.fields)) + projects.add(rexBuilder.makeInputRef(igniteRel, field)); + + igniteRel = new IgniteProject(igniteRel.getCluster(), desired, igniteRel, projects, root.validatedRowType); + } + + return igniteRel; } catch (Throwable ex) { log.error("Unexpected error at query optimizer.", ex); diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java index ec7daaf..fdf9b73 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java @@ -208,7 +208,7 @@ public class IgnitePlanner implements Planner, RelOptTable.ViewExpander { /** {@inheritDoc} */ @Override public RelNode convert(SqlNode sql) { - return rel(sql).project(); + throw new UnsupportedOperationException(); } /** {@inheritDoc} */ @@ -216,7 +216,6 @@ public class IgnitePlanner implements Planner, RelOptTable.ViewExpander { SqlToRelConverter sqlToRelConverter = sqlToRelConverter(validator(), catalogReader, sqlToRelConverterCfg); RelRoot root = sqlToRelConverter.convertQuery(sql, false, true); root = root.withRel(sqlToRelConverter.decorrelate(sql, root.rel)); - root = root.withRel(root.project()); root = trimUnusedFields(root); return root; diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessorTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessorTest.java index e2a8617..dcaa953 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessorTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessorTest.java @@ -135,6 +135,11 @@ public class CalciteQueryProcessorTest extends GridCommonAbstractTest { cache.put(1, "1"); cache.put(2, "2"); + assertQuery(client, "select val from tbl order by id") + .returns("1") + .returns("2") + .check(); + assertQuery(client, "select id, val from tbl") .returns(1, "1") .returns(2, "2") @@ -463,6 +468,26 @@ public class CalciteQueryProcessorTest extends GridCommonAbstractTest { /** */ @Test + public void testOrderingByColumnOutsideSelectList() throws InterruptedException { + populateTables(); + + assertQuery(client, "select salary from account order by _key desc") + .returns(13d) + .returns(13d) + .returns(13d) + .returns(12d) + .returns(11d) + .returns(10d) + .check(); + + assertQuery(client, "select name, sum(salary) from account group by name order by count(salary)") + .returns("Roman", 46d) + .returns("Igor1", 26d) + .check(); + } + + /** */ + @Test public void testEqConditionWithDistinctSubquery() throws Exception { populateTables(); diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/PlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/PlannerTest.java index 42787033..1150d5e 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/PlannerTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/PlannerTest.java @@ -1955,7 +1955,7 @@ public class PlannerTest extends AbstractPlannerTest { sqlNode = planner.validate(sqlNode); // Convert to Relational operators graph - rel = planner.convert(sqlNode); + rel = planner.rel(sqlNode).rel; rel = planner.transform(PlannerPhase.HEURISTIC_OPTIMIZATION, rel.getTraitSet(), rel);