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}+		{
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to