Re: [Bug Fix] ECPG: could not use set xxx to default statement - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: [Bug Fix] ECPG: could not use set xxx to default statement |
Date | |
Msg-id | 22431.1550864192@sss.pgh.pa.us Whole thread Raw |
In response to | Re: [Bug Fix] ECPG: could not use set xxx to default statement (Andrew Dunstan <andrew.dunstan@2ndquadrant.com>) |
Responses |
Re: [Bug Fix] ECPG: could not use set xxx to default statement
|
List | pgsql-hackers |
Andrew Dunstan <andrew.dunstan@2ndquadrant.com> writes: > On 2/19/19 9:29 AM, Tom Lane wrote: >> Probably, somebody who's a better Perl programmer than me >> ought to take point on improving that. > Agreed. Not seeing any motion on this, here's a draft patch to make these scripts complain about missing semicolons. Against the current gram.y (which contains 2 such errors, as Michael noted) you get output like '/usr/bin/perl' ./parse.pl . < ../../../backend/parser/gram.y > preproc.y unterminated rule at ./parse.pl line 370, <> line 1469. make: *** [preproc.y] Error 255 make: *** Deleting file `preproc.y' That's not *super* friendly, but it does give you the right line number to look at in gram.y. We could adjust the script (and the Makefile) further so that the message would cite the gram.y filename, but I'm not sure if it's worth the trouble. Thoughts? regards, tom lane diff --git a/src/interfaces/ecpg/preproc/check_rules.pl b/src/interfaces/ecpg/preproc/check_rules.pl index 1388d05..3daff88 100644 --- a/src/interfaces/ecpg/preproc/check_rules.pl +++ b/src/interfaces/ecpg/preproc/check_rules.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl # src/interfaces/ecpg/preproc/check_rules.pl # test parser generator for ecpg -# call with backend parser as stdin +# call with backend grammar as stdin # # Copyright (c) 2009-2019, PostgreSQL Global Development Group # @@ -47,6 +47,7 @@ my %replace_line = ( my $block = ''; my $yaccmode = 0; +my $in_rule = 0; my $brace_indent = 0; my (@arr, %found); my $comment = 0; @@ -131,10 +132,13 @@ while (<$parser_fh>) $found{$block} = 1; $cc++; $block = ''; + $in_rule = 0 if $arr[$fieldIndexer] eq ';'; } elsif (($arr[$fieldIndexer] =~ '[A-Za-z0-9]+:') || $arr[ $fieldIndexer + 1 ] eq ':') { + die "unterminated rule" if $in_rule; + $in_rule = 1; $non_term_id = $arr[$fieldIndexer]; $non_term_id =~ tr/://d; } @@ -145,6 +149,8 @@ while (<$parser_fh>) } } +die "unterminated rule" if $in_rule; + close $parser_fh; if ($verbose) { diff --git a/src/interfaces/ecpg/preproc/parse.pl b/src/interfaces/ecpg/preproc/parse.pl index 6dee500..e219398 100644 --- a/src/interfaces/ecpg/preproc/parse.pl +++ b/src/interfaces/ecpg/preproc/parse.pl @@ -22,6 +22,7 @@ $path = "." unless $path; my $copymode = 0; my $brace_indent = 0; my $yaccmode = 0; +my $in_rule = 0; my $header_included = 0; my $feature_not_supported = 0; my $tokenmode = 0; @@ -288,6 +289,7 @@ sub main @fields = (); $infield = 0; $line = ''; + $in_rule = 0; next; } @@ -365,6 +367,8 @@ sub main $line = ''; @fields = (); $infield = 1; + die "unterminated rule" if $in_rule; + $in_rule = 1; next; } elsif ($copymode) @@ -415,6 +419,7 @@ sub main } } } + die "unterminated rule" if $in_rule; return; }
pgsql-hackers by date: