diff --git a/crates/pgls_statement_splitter/src/lib.rs b/crates/pgls_statement_splitter/src/lib.rs index 15275b64c..26f3b4a9b 100644 --- a/crates/pgls_statement_splitter/src/lib.rs +++ b/crates/pgls_statement_splitter/src/lib.rs @@ -607,4 +607,31 @@ VALUES // does not panic let _ = Tester::from("select case "); } + + #[test] + fn with_cte_as_materialized() { + Tester::from( + "WITH latest AS MATERIALIZED (SELECT id FROM submissions) SELECT * FROM latest;", + ) + .assert_single_statement() + .assert_no_errors(); + } + + #[test] + fn with_cte_as_not_materialized() { + Tester::from( + "WITH latest AS NOT MATERIALIZED (SELECT id FROM submissions) SELECT * FROM latest;", + ) + .assert_single_statement() + .assert_no_errors(); + } + + #[test] + fn with_multiple_materialized_ctes() { + Tester::from( + "WITH a AS (SELECT 1), b AS MATERIALIZED (SELECT 2), c AS NOT MATERIALIZED (SELECT 3) SELECT * FROM a, b, c;", + ) + .assert_single_statement() + .assert_no_errors(); + } } diff --git a/crates/pgls_statement_splitter/src/splitter/dml.rs b/crates/pgls_statement_splitter/src/splitter/dml.rs index d28c44a58..9af68593a 100644 --- a/crates/pgls_statement_splitter/src/splitter/dml.rs +++ b/crates/pgls_statement_splitter/src/splitter/dml.rs @@ -14,6 +14,9 @@ pub(crate) fn cte(p: &mut Splitter) -> SplitterResult { loop { p.expect(SyntaxKind::IDENT)?; p.expect(SyntaxKind::AS_KW)?; + // Handle optional [NOT] MATERIALIZED hint (PostgreSQL 12+) + p.eat(SyntaxKind::NOT_KW)?; + p.eat(SyntaxKind::MATERIALIZED_KW)?; parenthesis(p)?; if p.current() == SyntaxKind::COMMA {