From e2dc3f57726199408902ba87eaaf7b95d1223744 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 23 Nov 2014 15:31:32 -0500
Subject: [PATCH] Get rid of redundant production in plpgsql grammar.

There may once have been a reason for the intermediate proc_stmts
production in the plpgsql grammar, but it isn't doing anything useful
anymore, so let's collapse it into proc_sect.  Saves some code and
probably a small number of nanoseconds per statement list.

In passing, correctly alphabetize keyword lists to match pl_scanner.c;
note that for "rowtype" vs "row_count", pl_scanner.c must sort on the
basis of the lower-case spelling.

Noted while fooling with a patch to de-reserve more plpgsql keywords.
---
 src/pl/plpgsql/src/pl_gram.y | 32 +++++++++++---------------------
 1 file changed, 11 insertions(+), 21 deletions(-)

diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y
index 893f3a486f5..82378c7d5fa 100644
--- a/src/pl/plpgsql/src/pl_gram.y
+++ b/src/pl/plpgsql/src/pl_gram.y
@@ -188,7 +188,7 @@ static	void			check_raise_parameters(PLpgSQL_stmt_raise *stmt);
 
 %type <str>		any_identifier opt_block_label opt_label option_value
 
-%type <list>	proc_sect proc_stmts stmt_elsifs stmt_else
+%type <list>	proc_sect stmt_elsifs stmt_else
 %type <loop_body>	loop_body
 %type <stmt>	proc_stmt pl_block
 %type <stmt>	stmt_assign stmt_if stmt_loop stmt_while stmt_exit
@@ -318,8 +318,8 @@ static	void			check_raise_parameters(PLpgSQL_stmt_raise *stmt);
 %token <keyword>	K_RETURN
 %token <keyword>	K_RETURNED_SQLSTATE
 %token <keyword>	K_REVERSE
-%token <keyword>	K_ROWTYPE
 %token <keyword>	K_ROW_COUNT
+%token <keyword>	K_ROWTYPE
 %token <keyword>	K_SCHEMA
 %token <keyword>	K_SCHEMA_NAME
 %token <keyword>	K_SCROLL
@@ -838,24 +838,14 @@ assign_operator	: '='
 
 proc_sect		:
 					{ $$ = NIL; }
-				| proc_stmts
-					{ $$ = $1; }
-				;
-
-proc_stmts		: proc_stmts proc_stmt
-						{
-							if ($2 == NULL)
-								$$ = $1;
-							else
-								$$ = lappend($1, $2);
-						}
-				| proc_stmt
-						{
-							if ($1 == NULL)
-								$$ = NIL;
-							else
-								$$ = list_make1($1);
-						}
+				| proc_sect proc_stmt
+					{
+						/* don't bother linking null statements into list */
+						if ($2 == NULL)
+							$$ = $1;
+						else
+							$$ = lappend($1, $2);
+					}
 				;
 
 proc_stmt		: pl_block ';'
@@ -2356,8 +2346,8 @@ unreserved_keyword	:
 				| K_PG_EXCEPTION_CONTEXT
 				| K_PG_EXCEPTION_DETAIL
 				| K_PG_EXCEPTION_HINT
-				| K_PRIOR
 				| K_PRINT_STRICT_PARAMS
+				| K_PRIOR
 				| K_QUERY
 				| K_RELATIVE
 				| K_RESULT_OID
-- 
GitLab