From b4bedfa956a32bd4fcb56822d3c09f72762cccce Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 2 Apr 2002 06:30:34 +0000
Subject: [PATCH] Tweak SERIAL column creation to emit a fully qualified
 sequence name as argument for nextval().

---
 src/backend/parser/analyze.c | 50 +++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 42e18d8ac1e..080392b97f5 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *	$Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.225 2002/03/31 06:26:31 tgl Exp $
+ *	$Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.226 2002/04/02 06:30:34 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -35,6 +35,7 @@
 #include "rewrite/rewriteManip.h"
 #include "utils/builtins.h"
 #include "utils/fmgroids.h"
+#include "utils/lsyscache.h"
 #include "utils/relcache.h"
 #include "utils/syscache.h"
 #ifdef MULTIBYTE
@@ -801,25 +802,43 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
 	if (is_serial)
 	{
 		char	   *sname;
+		char	   *snamespace;
 		char	   *qstring;
 		A_Const    *snamenode;
 		FuncCall   *funccallnode;
-		CreateSeqStmt *sequence;
+		CreateSeqStmt *seqstmt;
+
+		/*
+		 * Determine name and namespace to use for the sequence.
+		 */
+		sname = makeObjectName(cxt->relation->relname, column->colname, "seq");
+		snamespace = get_namespace_name(RangeVarGetCreationNamespace(cxt->relation));
+
+		elog(NOTICE, "%s will create implicit sequence '%s' for SERIAL column '%s.%s'",
+			 cxt->stmtType, sname, cxt->relation->relname, column->colname);
+
+		/*
+		 * Build a CREATE SEQUENCE command to create the sequence object,
+		 * and add it to the list of things to be done before this
+		 * CREATE/ALTER TABLE.
+		 */
+		seqstmt = makeNode(CreateSeqStmt);
+		seqstmt->sequence = makeRangeVar(snamespace, sname);
+		seqstmt->options = NIL;
+
+		cxt->blist = lappend(cxt->blist, seqstmt);
 
 		/*
 		 * Create appropriate constraints for SERIAL.  We do this in full,
 		 * rather than shortcutting, so that we will detect any
 		 * conflicting constraints the user wrote (like a different
 		 * DEFAULT).
-		 */
-		sname = makeObjectName((cxt->relation)->relname, column->colname, "seq");
-
-		/*
+		 *
 		 * Create an expression tree representing the function call
 		 * nextval('"sequencename"')
 		 */
-		qstring = palloc(strlen(sname) + 2 + 1);
-		sprintf(qstring, "\"%s\"", sname);
+		qstring = palloc(strlen(snamespace) + strlen(sname) + 5 + 1);
+		sprintf(qstring, "\"%s\".\"%s\"", snamespace, sname);
 		snamenode = makeNode(A_Const);
 		snamenode->val.type = T_String;
 		snamenode->val.val.str = qstring;
@@ -845,21 +864,6 @@ transformColumnDefinition(ParseState *pstate, CreateStmtContext *cxt,
 		constraint = makeNode(Constraint);
 		constraint->contype = CONSTR_NOTNULL;
 		column->constraints = lappend(column->constraints, constraint);
-
-		/*
-		 * Build a CREATE SEQUENCE command to create the sequence object,
-		 * and add it to the list of things to be done before this
-		 * CREATE/ALTER TABLE.
-		 */
-		sequence = makeNode(CreateSeqStmt);
-		sequence->sequence = copyObject(cxt->relation);
-		sequence->sequence->relname = pstrdup(sname);
-		sequence->options = NIL;
-
-		elog(NOTICE, "%s will create implicit sequence '%s' for SERIAL column '%s.%s'",
-		cxt->stmtType, sequence->sequence->relname, (cxt->relation)->relname, column->colname);
-
-		cxt->blist = lappend(cxt->blist, sequence);
 	}
 
 	/* Process column constraints, if any... */
-- 
GitLab