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 83fbc5138264..75eb3637edd0 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 150dbdf7853c..8f0d1c002f74 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 65fe7f085da4..8193bc2f29a2 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));
+---+---+
@@ -2555,4 +2583,33 @@ select decimal'12.3' + 5.6;
!ok
+
+# [CALCITE-6007] Subquery that contains WITH and has no alias throws
+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
+
# End misc.iq