Re: pgsql: ecpg: Output dir, source dir, stamp file argument for preproc/*.

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: pgsql: ecpg: Output dir, source dir, stamp file argument for preproc/*.
Дата
Msg-id 838180.1658181982@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: pgsql: ecpg: Output dir, source dir, stamp file argument for preproc/*.  (Andres Freund <andres@anarazel.de>)
Ответы Re: pgsql: ecpg: Output dir, source dir, stamp file argument for preproc/*.  (Andres Freund <andres@anarazel.de>)
Список pgsql-committers
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

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, '');
     }

В списке pgsql-committers по дате отправления:

Предыдущее
От: Andres Freund
Дата:
Сообщение: pgsql: ecpg: use our instead of my in parse.pl to fix perlcritic compla
Следующее
От: Andres Freund
Дата:
Сообщение: Re: pgsql: ecpg: Output dir, source dir, stamp file argument for preproc/*.