pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andres Freund <andres@anarazel.de>
Cc: pgsql-committers@lists.postgresql.org, Andrew Dunstan <andrew@dunslane.net>
Subject: Re: pgsql: ecpg: Output dir, source dir, stamp file argument for preproc/*.
Date: Mon, 18 Jul 2022 18:06:22 -0400
Message-ID: <838180.1658181982@sss.pgh.pa.us> (raw)
In-Reply-To: <20220718215042.sl3hivoupdb7lkwv@awork3.anarazel.de>
References: <E1oDWqn-000ADD-Oh@gemulon.postgresql.org>
	<20220718211408.o2uyu5kvud56ihlj@awork3.anarazel.de>
	<822625.1658179641@sss.pgh.pa.us>
	<20220718215042.sl3hivoupdb7lkwv@awork3.anarazel.de>

Andres Freund <andres@anarazel.de> writes:
> That'd make some sense - but it doesn't look like perlcritic is digging that
> deep.

Meh, that's the other explanation :-(

> I'll push the obvious fix in a bit.

Cool.  While looking at this, I wondered if parse.pl's handy-dandy
little exception

no warnings 'uninitialized';

might be related to the issue.  Evidently it's not, but now that
I've noticed it I definitely think it's not up to project standard.
I took it out and fixed the half-dozen places where I got warnings,
as attached.  Seem like a good fix?

			regards, tom lane

Attachments:

avoid-uninitialized-variables-in-parse.pl.patch (text/x-diff, 2.2K) download diff --git a/src/interfaces/ecpg/preproc/parse.pl b/src/interfaces/ecpg/preproc/parse.pl index a15f563ad4..38548f24e6 100644 --- a/src/interfaces/ecpg/preproc/parse.pl +++ b/src/interfaces/ecpg/preproc/parse.pl @@ -14,7 +14,6 @@ use strict; use warnings; -no warnings 'uninitialized'; use Getopt::Long; my $srcdir = '.'; @@ -40,7 +39,8 @@ my $tokenmode = 0; my (%buff, $infield, $comment, %tokens, %addons); my ($stmt_mode, @fields); -my ($line, $non_term_id); +my $line = ''; +my $non_term_id; # some token have to be replaced by other symbols @@ -195,6 +195,16 @@ sub main # Now split the line into individual fields my @arr = split(' '); + if (!@arr) + { + # empty line: in tokenmode 1, emit an empty line, else ignore + if ($tokenmode == 1) + { + add_to_buffer('orig_tokens', ''); + } + next line; + } + if ($arr[0] eq '%token' && $tokenmode == 0) { $tokenmode = 1; @@ -341,7 +351,8 @@ sub main # Are we looking at a declaration of a non-terminal ? if (($arr[$fieldIndexer] =~ /[A-Za-z0-9]+:/) - || $arr[ $fieldIndexer + 1 ] eq ':') + || ( $fieldIndexer + 1 < scalar(@arr) + && $arr[ $fieldIndexer + 1 ] eq ':')) { $non_term_id = $arr[$fieldIndexer]; $non_term_id =~ tr/://d; @@ -409,11 +420,13 @@ sub main if ( $copymode && !$prec && !$comment + && $fieldIndexer < scalar(@arr) && length($arr[$fieldIndexer]) && $infield) { if ($arr[$fieldIndexer] ne 'Op' - && ( $tokens{ $arr[$fieldIndexer] } > 0 + && (( defined $tokens{ $arr[$fieldIndexer] } + && $tokens{ $arr[$fieldIndexer] } > 0) || $arr[$fieldIndexer] =~ /'.+'/) || $stmt_mode == 1) { @@ -472,11 +485,12 @@ sub include_addon my $rec = $addons{$block}; return 0 unless $rec; - if ($rec->{type} eq 'rule') + my $rectype = (defined $rec->{type}) ? $rec->{type} : ''; + if ($rectype eq 'rule') { dump_fields($stmt_mode, $fields, ' { '); } - elsif ($rec->{type} eq 'addon') + elsif ($rectype eq 'addon') { add_to_buffer('rules', ' { '); } @@ -487,7 +501,7 @@ sub include_addon push(@{ $buff{$buffer} }, @{ $rec->{lines} }); - if ($rec->{type} eq 'addon') + if ($rectype eq 'addon') { dump_fields($stmt_mode, $fields, ''); }

view thread (11+ messages)  latest in thread

Message-ID: <838180.1658181982@sss.pgh.pa.us>
Permalink:  ../838180.1658181982@sss.pgh.pa.us/
Also on:    postgresql.org/message-id/838180.1658181982@sss.pgh.pa.us

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-committers@postgresql.org
  Cc: tgl@sss.pgh.pa.us, andres@anarazel.de, andrew@dunslane.net
  Subject: Re: pgsql: ecpg: Output dir, source dir, stamp file argument for preproc/*.
  In-Reply-To: <838180.1658181982@sss.pgh.pa.us>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox