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
Re: timeline signedness |
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: