From 1245db620114ee5174641ad540af6b27dcd772e3 Mon Sep 17 00:00:00 2001 From: wenrui Date: Fri, 22 Sep 2023 22:56:53 -0700 Subject: [PATCH] [CALCITE-6007] Sub-query that contains WITH and has no alias generates invalid SQL after expansion Add Quidem test (Julian Hyde). Close apache/calcite#3440 --- .../sql/validate/SqlValidatorImpl.java | 2 +- .../apache/calcite/test/SqlValidatorTest.java | 19 +++++++++++++ core/src/test/resources/sql/misc.iq | 28 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java index 83fbc513826..75eb3637edd 100644 --- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java +++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java @@ -2350,7 +2350,7 @@ private SqlNode registerFrom( case PIVOT: case UNPIVOT: case MATCH_RECOGNIZE: - + case WITH: // give this anonymous construct a name since later // query processing stages rely on it alias = SqlValidatorUtil.alias(node, nextGeneratedId++); diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java index 150dbdf7853..8f0d1c002f7 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java @@ -7993,6 +7993,25 @@ void testGroupExpressionEquivalenceParams() { + "FROM `DEPT`"); } + /** Test case for + * [CALCITE-6007] + * Sub-query that contains WITH and has no alias generates invalid SQL after + * expansion. */ + @Test void testSubQueryWithoutAlias() { + // Note the 'AS `EXPR$0`' in the rewritten form of each query. + // Before [CALCITE-6007] was fixed, that alias was missing. + sql("select a from (select 1 as a)") + .withValidatorIdentifierExpansion(true) + .rewritesTo("SELECT `EXPR$0`.`A`\n" + + "FROM (SELECT 1 AS `A`) AS `EXPR$0`"); + sql("select a from (with sub as (select 1 as a) select a from sub)") + .withValidatorIdentifierExpansion(true) + .rewritesTo("SELECT `EXPR$0`.`A`\n" + + "FROM (WITH `SUB` AS (SELECT 1 AS `A`) " + + "SELECT `SUB`.`A`\n" + + "FROM `SUB` AS `SUB`) AS `EXPR$0`"); + } + /** Test case for * [CALCITE-1238] * Unparsing LIMIT without ORDER BY after validation. */ diff --git a/core/src/test/resources/sql/misc.iq b/core/src/test/resources/sql/misc.iq index 65fe7f085da..9876587d196 100644 --- a/core/src/test/resources/sql/misc.iq +++ b/core/src/test/resources/sql/misc.iq @@ -796,6 +796,34 @@ having exists !ok +# [CALCITE-6007] Sub-query that contains WITH and has no alias generates invalid SQL after expansion +SELECT a, b +FROM ( + WITH sub AS (SELECT 1 AS a, 2 AS b) + SELECT * FROM sub) +WHERE a IS NOT NULL; ++---+---+ +| A | B | ++---+---+ +| 1 | 2 | ++---+---+ +(1 row) + +!ok + +# Similar pattern to previous, without WITH +SELECT a, b +FROM (SELECT 1 AS a, 2 AS b) +WHERE a IS NOT NULL; ++---+---+ +| A | B | ++---+---+ +| 1 | 2 | ++---+---+ +(1 row) + +!ok + # [CALCITE-411] Duplicate aliases select 1 as a, 2 as a from (values (true)); +---+---+