From d8f99dee8d694c89a8a8a258f5b91503c77882e2 Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Tue, 16 Sep 2025 23:24:42 -0400 Subject: [PATCH 1/3] parser: fix some set related issues --- crates/squawk_parser/src/grammar.rs | 16 ++-- .../squawk_parser/tests/data/ok/schemas.sql | 13 +++ .../tests/snapshots/tests__schemas_ok.snap | 90 +++++++++++++++++++ 3 files changed, 114 insertions(+), 5 deletions(-) diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 2d628137..d8bb46c3 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -12986,15 +12986,21 @@ fn set(p: &mut Parser<'_>) -> CompletedMarker { if !p.eat(LOCAL_KW) && !config_value(p) { p.error(format!("expected config value, got {:?}", p.current())); } + } else if p.eat(CATALOG_KW) || p.eat(SCHEMA_KW) { + string_literal(p); // configuration_parameter { TO | = } { value | 'value' | DEFAULT } } else { // configuration_parameter path_name_ref(p); - // { TO | = } - let _ = p.eat(TO_KW) || p.expect(EQ); - // { value | 'value' | DEFAULT } - if !config_value(p) { - p.error(format!("expected config value, got {:?}", p.current())); + if p.eat(FROM_KW) { + p.expect(CURRENT_KW); + } else { + // { TO | = } + let _ = p.eat(TO_KW) || p.expect(EQ); + // { value | 'value' | DEFAULT } + if !config_value(p) { + p.error(format!("expected config value, got {:?}", p.current())); + } } } m.complete(p, SET) diff --git a/crates/squawk_parser/tests/data/ok/schemas.sql b/crates/squawk_parser/tests/data/ok/schemas.sql index d83fc195..46275efa 100644 --- a/crates/squawk_parser/tests/data/ok/schemas.sql +++ b/crates/squawk_parser/tests/data/ok/schemas.sql @@ -44,12 +44,25 @@ set search_path to myschema; set foo = bar; +set schema 'foo'; + +set catalog 'foo'; + +set xml option document; +set xml option content; + +set role foo; + set time zone 'America/Los_Angeles'; set time zone default; set time zone local; +set foo from current; +set foo.bar from current; + set foo = default; set foo to a, 10.0, 1, 'foo', true, false; +set foo to default; -- operator -- binary diff --git a/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap b/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap index 2f7f3267..40504fa0 100644 --- a/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap @@ -415,6 +415,52 @@ SOURCE_FILE IDENT "bar" SEMICOLON ";" WHITESPACE "\n\n" + SET + SET_KW "set" + WHITESPACE " " + SCHEMA_KW "schema" + WHITESPACE " " + LITERAL + STRING "'foo'" + SEMICOLON ";" + WHITESPACE "\n\n" + SET + SET_KW "set" + WHITESPACE " " + CATALOG_KW "catalog" + WHITESPACE " " + LITERAL + STRING "'foo'" + SEMICOLON ";" + WHITESPACE "\n\n" + SET + SET_KW "set" + WHITESPACE " " + XML_KW "xml" + WHITESPACE " " + OPTION_KW "option" + WHITESPACE " " + DOCUMENT_KW "document" + SEMICOLON ";" + WHITESPACE "\n" + SET + SET_KW "set" + WHITESPACE " " + XML_KW "xml" + WHITESPACE " " + OPTION_KW "option" + WHITESPACE " " + CONTENT_KW "content" + SEMICOLON ";" + WHITESPACE "\n\n" + SET_ROLE + SET_KW "set" + WHITESPACE " " + ROLE_KW "role" + WHITESPACE " " + IDENT "foo" + SEMICOLON ";" + WHITESPACE "\n\n" SET SET_KW "set" WHITESPACE " " @@ -446,6 +492,37 @@ SOURCE_FILE LOCAL_KW "local" SEMICOLON ";" WHITESPACE "\n\n" + SET + SET_KW "set" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + WHITESPACE " " + FROM_KW "from" + WHITESPACE " " + CURRENT_KW "current" + SEMICOLON ";" + WHITESPACE "\n" + SET + SET_KW "set" + WHITESPACE " " + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "bar" + WHITESPACE " " + FROM_KW "from" + WHITESPACE " " + CURRENT_KW "current" + SEMICOLON ";" + WHITESPACE "\n\n" SET SET_KW "set" WHITESPACE " " @@ -491,6 +568,19 @@ SOURCE_FILE LITERAL FALSE_KW "false" SEMICOLON ";" + WHITESPACE "\n" + SET + SET_KW "set" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + WHITESPACE " " + TO_KW "to" + WHITESPACE " " + DEFAULT_KW "default" + SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- operator" WHITESPACE "\n" From a1b2655ce22f698c92efe91238046e94f917dd9d Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Tue, 16 Sep 2025 23:32:52 -0400 Subject: [PATCH 2/3] fix tests --- crates/squawk_parser/tests/data/ok/schemas.sql | 2 -- crates/squawk_parser/tests/data/ok/schemas_pg17.sql | 1 + .../squawk_parser/tests/snapshots/tests__schemas_ok.snap | 9 --------- 3 files changed, 1 insertion(+), 11 deletions(-) create mode 100644 crates/squawk_parser/tests/data/ok/schemas_pg17.sql diff --git a/crates/squawk_parser/tests/data/ok/schemas.sql b/crates/squawk_parser/tests/data/ok/schemas.sql index 46275efa..a9079f07 100644 --- a/crates/squawk_parser/tests/data/ok/schemas.sql +++ b/crates/squawk_parser/tests/data/ok/schemas.sql @@ -46,8 +46,6 @@ set foo = bar; set schema 'foo'; -set catalog 'foo'; - set xml option document; set xml option content; diff --git a/crates/squawk_parser/tests/data/ok/schemas_pg17.sql b/crates/squawk_parser/tests/data/ok/schemas_pg17.sql new file mode 100644 index 00000000..902fb421 --- /dev/null +++ b/crates/squawk_parser/tests/data/ok/schemas_pg17.sql @@ -0,0 +1 @@ +set catalog 'foo'; diff --git a/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap b/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap index 40504fa0..554da2ef 100644 --- a/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap @@ -424,15 +424,6 @@ SOURCE_FILE STRING "'foo'" SEMICOLON ";" WHITESPACE "\n\n" - SET - SET_KW "set" - WHITESPACE " " - CATALOG_KW "catalog" - WHITESPACE " " - LITERAL - STRING "'foo'" - SEMICOLON ";" - WHITESPACE "\n\n" SET SET_KW "set" WHITESPACE " " From 4faca54adba395c6781bfc6baf27a2f09ac1b82d Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Tue, 16 Sep 2025 23:35:45 -0400 Subject: [PATCH 3/3] add missing snap --- .../tests/snapshots/tests__schemas_pg17_ok.snap | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 crates/squawk_parser/tests/snapshots/tests__schemas_pg17_ok.snap diff --git a/crates/squawk_parser/tests/snapshots/tests__schemas_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__schemas_pg17_ok.snap new file mode 100644 index 00000000..41eded25 --- /dev/null +++ b/crates/squawk_parser/tests/snapshots/tests__schemas_pg17_ok.snap @@ -0,0 +1,14 @@ +--- +source: crates/squawk_parser/tests/tests.rs +input_file: crates/squawk_parser/tests/data/ok/schemas_pg17.sql +--- +SOURCE_FILE + SET + SET_KW "set" + WHITESPACE " " + CATALOG_KW "catalog" + WHITESPACE " " + LITERAL + STRING "'foo'" + SEMICOLON ";" + WHITESPACE "\n"