Re: timeline signedness - Mailing list pgsql-hackers

From Peter Eisentraut
Subject Re: timeline signedness
Date
Msg-id 1376393513.23146.2.camel@vanquo.pezone.net
Whole thread Raw
In response to timeline signedness  (Peter Eisentraut <peter_e@gmx.net>)
Responses Re: timeline signedness  (Magnus Hagander <magnus@hagander.net>)
Re: timeline signedness  (Heikki Linnakangas <hlinnakangas@vmware.com>)
List pgsql-hackers
On Wed, 2013-08-07 at 21:55 -0400, Peter Eisentraut wrote:
> WAL timelines are unsigned 32-bit integers everywhere, except the
> replication parser (replication/repl_gram.y and
> replication/repl_scanner.l) treats them as signed 32-bit integers.  It's
> obviously a corner case, but it would be prudent to be correct about
> this.  It should be easy to fix in those grammar files.

Here is a patch to fix this.
diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y
index bce18b8..f465530 100644
--- a/src/backend/replication/repl_gram.y
+++ b/src/backend/replication/repl_gram.y
@@ -56,7 +56,7 @@ Node *replication_parse_result;
 %union {
         char                    *str;
         bool                    boolval;
-        int32                    intval;
+        uint32                    uintval;

         XLogRecPtr                recptr;
         Node                    *node;
@@ -66,7 +66,7 @@ Node *replication_parse_result;

 /* Non-keyword tokens */
 %token <str> SCONST
-%token <intval> ICONST
+%token <uintval> UCONST
 %token <recptr> RECPTR

 /* Keyword tokens. */
@@ -85,7 +85,7 @@ Node *replication_parse_result;
 %type <node>    base_backup start_replication identify_system timeline_history
 %type <list>    base_backup_opt_list
 %type <defelt>    base_backup_opt
-%type <intval>    opt_timeline
+%type <uintval>    opt_timeline
 %%

 firstcmd: command opt_semicolon
@@ -175,14 +175,7 @@ start_replication:
             ;

 opt_timeline:
-            K_TIMELINE ICONST
-                {
-                    if ($2 <= 0)
-                        ereport(ERROR,
-                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                 (errmsg("invalid timeline %d", $2))));
-                    $$ = $2;
-                }
+            K_TIMELINE UCONST            { $$ = $2; }
                 | /* nothing */            { $$ = 0; }
             ;

@@ -190,15 +183,10 @@ opt_timeline:
  * TIMELINE_HISTORY %d
  */
 timeline_history:
-            K_TIMELINE_HISTORY ICONST
+            K_TIMELINE_HISTORY UCONST
                 {
                     TimeLineHistoryCmd *cmd;

-                    if ($2 <= 0)
-                        ereport(ERROR,
-                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                 (errmsg("invalid timeline %d", $2))));
-
                     cmd = makeNode(TimeLineHistoryCmd);
                     cmd->timeline = $2;

diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l
index b4743e6..3d930f1 100644
--- a/src/backend/replication/repl_scanner.l
+++ b/src/backend/replication/repl_scanner.l
@@ -83,8 +83,8 @@ TIMELINE_HISTORY    { return K_TIMELINE_HISTORY; }
 " "                ;

 {digit}+        {
-                    yylval.intval = pg_atoi(yytext, sizeof(int32), 0);
-                    return ICONST;
+                    yylval.uintval = strtoul(yytext, NULL, 10);
+                    return UCONST;
                 }

 {hexdigit}+\/{hexdigit}+        {

pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: Regarding BGworkers
Next
From: Merlin Moncure
Date:
Subject: Re: How to create read-only view on 9.3