-- WITH common_table_expression [ , ... ]
-- expression_name [ ( column_name [ , ... ] ) ] [ AS ] ( query )


-- CTE with multiple column aliases
WITH t(x, y) AS (SELECT 1, 2)
SELECT * FROM t WHERE x = 1 AND y = 2;

-- CTE in CTE definition
WITH t AS (WITH t2 AS (SELECT 1) SELECT * FROM t2) SELECT * FROM t;

-- CTE in subquery expression
SELECT (WITH t AS (SELECT 1) SELECT * FROM t);

-- CTE in CREATE VIEW statement
CREATE VIEW v AS WITH t(a, b, c, d) AS (SELECT 1, 2, 3, 4) SELECT * FROM t;
SELECT * FROM v;

-- If name conflict is detected in nested CTE, then AnalysisException is thrown by default.
-- SET spark.sql.legacy.ctePrecedencePolicy = CORRECTED (which is recommended),
-- inner CTE definitions take precedence over outer definitions.
SET spark.sql.legacy.ctePrecedencePolicy = CORRECTED;
WITH
    t AS (SELECT 1),
    t2 AS (
        WITH t AS (SELECT 2)
        SELECT * FROM t
    )
SELECT * FROM t2;
