Treat timeline IDs as unsigned in replication parser
authorPeter Eisentraut <peter_e@gmx.net>
Thu, 15 Aug 2013 03:18:49 +0000 (23:18 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 15 Aug 2013 03:18:49 +0000 (23:18 -0400)
Timeline IDs are unsigned ints everywhere, except the replication parser
treated them as signed ints.

src/backend/replication/repl_gram.y
src/backend/replication/repl_scanner.l

index bce18b84767b08deebf6f161249f9d0d29d71f6e..8c8378045e6ff2eb23af3e3f770186c184270a07 100644 (file)
@@ -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,12 +175,12 @@ start_replication:
            ;
 
 opt_timeline:
-           K_TIMELINE ICONST
+           K_TIMELINE UCONST
                {
                    if ($2 <= 0)
                        ereport(ERROR,
                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                (errmsg("invalid timeline %d", $2))));
+                                (errmsg("invalid timeline %u", $2))));
                    $$ = $2;
                }
                | /* nothing */         { $$ = 0; }
@@ -190,14 +190,14 @@ 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))));
+                                (errmsg("invalid timeline %u", $2))));
 
                    cmd = makeNode(TimeLineHistoryCmd);
                    cmd->timeline = $2;
index b4743e6357d0ed044eac28ebd12f9742fb80ca22..3d930f1301216d4150da89eddb01eb55781e1799 100644 (file)
@@ -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}+       {