Skip to content

Commit cdd89b1

Browse files
authored
parser: fix xml parsing in pg regression suite (#542)
1 parent 6f44981 commit cdd89b1

File tree

6 files changed

+205
-397
lines changed

6 files changed

+205
-397
lines changed

crates/squawk_parser/src/generated/syntax_kind.rs

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/squawk_parser/src/grammar.rs

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -882,9 +882,6 @@ fn opt_xml_passing_mech(p: &mut Parser<'_>) -> bool {
882882
}
883883

884884
fn xmlexists_arg(p: &mut Parser<'_>) {
885-
if expr(p).is_none() {
886-
p.error("expected expression");
887-
}
888885
p.expect(PASSING_KW);
889886
opt_xml_passing_mech(p);
890887
if expr(p).is_none() {
@@ -905,6 +902,9 @@ fn xmlexists_arg(p: &mut Parser<'_>) {
905902
fn xmlexists_fn(p: &mut Parser<'_>) -> CompletedMarker {
906903
assert!(p.at(XMLEXISTS_KW));
907904
custom_fn(p, XMLEXISTS_KW, |p| {
905+
if expr(p).is_none() {
906+
p.error("expected expression");
907+
}
908908
xmlexists_arg(p);
909909
})
910910
}
@@ -979,7 +979,7 @@ fn xmlserialize_fn(p: &mut Parser<'_>) -> CompletedMarker {
979979
p.error("expected expression");
980980
}
981981
p.expect(AS_KW);
982-
simple_type_name(p);
982+
type_name(p);
983983
if p.eat(NO_KW) {
984984
p.expect(INDENT_KW);
985985
} else {
@@ -2898,14 +2898,15 @@ fn data_source(p: &mut Parser<'_>) {
28982898
p.expect(L_PAREN);
28992899
xml_namespace_list(p);
29002900
p.expect(R_PAREN);
2901+
p.expect(COMMA);
29012902
}
29022903
if expr(p).is_none() {
29032904
p.error("expected expression");
29042905
}
29052906
xmlexists_arg(p);
2906-
p.expect(COLUMNS_KW);
29072907
xmltable_column_list(p);
29082908
p.expect(R_PAREN);
2909+
opt_alias(p);
29092910
}
29102911
ROWS_KW if p.nth_at(1, FROM_KW) => {
29112912
p.bump(ROWS_KW);
@@ -2940,34 +2941,39 @@ fn data_source(p: &mut Parser<'_>) {
29402941
}
29412942

29422943
fn xmltable_column_list(p: &mut Parser<'_>) {
2944+
let m = p.start();
2945+
p.expect(COLUMNS_KW);
29432946
xmltable_column_el(p);
29442947
while !p.at(EOF) && p.eat(COMMA) {
29452948
xmltable_column_el(p);
29462949
}
2950+
m.complete(p, XML_TABLE_COLUMN_LIST);
29472951
}
29482952

29492953
fn xmltable_column_el(p: &mut Parser<'_>) {
2954+
let m = p.start();
29502955
name(p);
29512956
if p.eat(FOR_KW) {
29522957
p.expect(ORDINALITY_KW);
29532958
} else {
29542959
type_name(p);
29552960
opt_xmltable_column_option_list(p);
29562961
}
2962+
m.complete(p, XML_TABLE_COLUMN);
29572963
}
29582964

29592965
fn opt_xmltable_column_option_list(p: &mut Parser<'_>) {
2960-
if opt_xmltable_column_option_el(p) {
2966+
let m = p.start();
2967+
if opt_xmltable_column_option_el(p).is_none() {
2968+
m.abandon(p);
29612969
return;
29622970
}
2963-
while !p.at(EOF) && p.eat(COMMA) {
2964-
if !opt_xmltable_column_option_el(p) {
2965-
p.error("expected column option");
2966-
}
2967-
}
2971+
while !p.at(EOF) && opt_xmltable_column_option_el(p).is_some() {}
2972+
m.complete(p, XML_COLUMN_OPTION_LIST);
29682973
}
29692974

2970-
fn opt_xmltable_column_option_el(p: &mut Parser<'_>) -> bool {
2975+
fn opt_xmltable_column_option_el(p: &mut Parser<'_>) -> Option<CompletedMarker> {
2976+
let m = p.start();
29712977
match p.current() {
29722978
DEFAULT_KW | PATH_KW | IDENT => {
29732979
p.bump_any();
@@ -2982,9 +2988,12 @@ fn opt_xmltable_column_option_el(p: &mut Parser<'_>) -> bool {
29822988
NULL_KW => {
29832989
p.bump(NULL_KW);
29842990
}
2985-
_ => return false,
2991+
_ => {
2992+
m.abandon(p);
2993+
return None;
2994+
}
29862995
}
2987-
true
2996+
Some(m.complete(p, XML_COLUMN_OPTION))
29882997
}
29892998

29902999
fn xml_namespace_list(p: &mut Parser<'_>) {
@@ -13098,6 +13107,10 @@ fn set(p: &mut Parser<'_>) -> CompletedMarker {
1309813107
let m = p.start();
1309913108
p.bump(SET_KW);
1310013109
let _ = p.eat(SESSION_KW) || p.eat(LOCAL_KW);
13110+
if p.eat(XML_KW) {
13111+
p.expect(OPTION_KW);
13112+
let _ = p.eat(DOCUMENT_KW) || p.eat(CONTENT_KW);
13113+
} else
1310113114
// TIME ZONE { value | 'value' | LOCAL | DEFAULT }
1310213115
if p.eat(TIME_KW) {
1310313116
p.expect(ZONE_KW);

crates/squawk_parser/tests/snapshots/tests__regression_suite_errors.snap

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,3 @@ source: crates/squawk_parser/tests/tests.rs
33
expression: "out.join(\"\\n\")"
44
---
55
tests/snapshots/tests__regression_strings.snap:49
6-
tests/snapshots/tests__regression_xml.snap:382

0 commit comments

Comments
 (0)