From 41b810fe325663d84188220f5af911972d4e4c6e Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 14 Aug 2010 14:20:35 +0000
Subject: [PATCH] Fix \ef and \sf to not fail on functions with nonnull probin.
 Update comment about them in pg_get_functiondef.

---
 src/backend/utils/adt/ruleutils.c |  7 ++++---
 src/bin/psql/command.c            | 22 +++++++++++-----------
 2 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 655d3f890c6..df5b08480a7 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.331 2010/08/12 00:40:59 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.332 2010/08/14 14:20:35 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1622,8 +1622,9 @@ pg_get_serial_sequence(PG_FUNCTION_ARGS)
  *		the specified function.
  *
  * Note: if you change the output format of this function, be careful not
- * to break psql's rules (in \ef) for identifying the start of the function
- * body.
+ * to break psql's rules (in \ef and \sf) for identifying the start of the
+ * function body.  To wit: the function body starts on a line that begins
+ * with "AS ", and no preceding line will look like that.
  */
 Datum
 pg_get_functiondef(PG_FUNCTION_ARGS)
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index e902f5e95c0..a482010157b 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2010, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.227 2010/08/14 13:59:49 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.228 2010/08/14 14:20:35 tgl Exp $
  */
 #include "postgres_fe.h"
 #include "command.h"
@@ -611,17 +611,17 @@ exec_command(const char *cmd,
 				/*
 				 * lineno "1" should correspond to the first line of the
 				 * function body.  We expect that pg_get_functiondef() will
-				 * emit that on a line beginning with "AS $function", and that
-				 * there can be no such line before the real start of the
-				 * function body.  Increment lineno by the number of lines
-				 * before that line, so that it becomes relative to the first
-				 * line of the function definition.
+				 * emit that on a line beginning with "AS ", and that there
+				 * can be no such line before the real start of the function
+				 * body.  Increment lineno by the number of lines before that
+				 * line, so that it becomes relative to the first line of the
+				 * function definition.
 				 */
 				const char *lines = query_buf->data;
 
 				while (*lines != '\0')
 				{
-					if (strncmp(lines, "AS $function", 12) == 0)
+					if (strncmp(lines, "AS ", 3) == 0)
 						break;
 					lineno++;
 					/* find start of next line */
@@ -1150,9 +1150,9 @@ exec_command(const char *cmd,
 				/*
 				 * lineno "1" should correspond to the first line of the
 				 * function body.  We expect that pg_get_functiondef() will
-				 * emit that on a line beginning with "AS $function", and that
-				 * there can be no such line before the real start of the
-				 * function body.
+				 * emit that on a line beginning with "AS ", and that there
+				 * can be no such line before the real start of the function
+				 * body.
 				 *
 				 * Note that this loop scribbles on func_buf.
 				 */
@@ -1160,7 +1160,7 @@ exec_command(const char *cmd,
 				{
 					char   *eol;
 
-					if (in_header && strncmp(lines, "AS $function", 12) == 0)
+					if (in_header && strncmp(lines, "AS ", 3) == 0)
 						in_header = false;
 					/* increment lineno only for body's lines */
 					if (!in_header)
-- 
GitLab