On 2019-04-26 15:37, Laurenz Albe wrote:
> What do you think of the patch I just posted on this thread to
> remove ownership automatically when the default is dropped, as Michael
> suggested?  I think that would make things much more intuitive from
> the user's perspective.

I think that adds more nonstandard behavior on top of an already
confusing and obsolescent feature, so I can't get too excited about it.

A more forward-looking fix would be your other idea of having
getOwnedSequence() only deal with identity sequences (not serial
sequences).  See attached patch for a draft.

-- 
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From b0a9c3402847f846d6d133cb9eced56ea9634a30 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Sat, 27 Apr 2019 14:12:03 +0200
Subject: [PATCH] Untangle some stuff about identity sequences

XXX draft XXX
---
 src/backend/catalog/pg_depend.c      | 26 +++++++++++++++++++-------
 src/backend/commands/tablecmds.c     |  2 +-
 src/backend/parser/parse_utilcmd.c   | 12 +++++-------
 src/backend/rewrite/rewriteHandler.c |  2 +-
 src/include/catalog/dependency.h     |  2 +-
 5 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index f7caedcc02..63c94cfbe6 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -707,8 +707,8 @@ sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, 
int32 *colId)
  * Collect a list of OIDs of all sequences owned by the specified relation,
  * and column if specified.
  */
-List *
-getOwnedSequences(Oid relid, AttrNumber attnum)
+static List *
+getOwnedSequences_internal(Oid relid, AttrNumber attnum, char deptype)
 {
        List       *result = NIL;
        Relation        depRel;
@@ -750,7 +750,8 @@ getOwnedSequences(Oid relid, AttrNumber attnum)
                        (deprec->deptype == DEPENDENCY_AUTO || deprec->deptype 
== DEPENDENCY_INTERNAL) &&
                        get_rel_relkind(deprec->objid) == RELKIND_SEQUENCE)
                {
-                       result = lappend_oid(result, deprec->objid);
+                       if (!deptype || deprec->deptype == deptype)
+                               result = lappend_oid(result, deprec->objid);
                }
        }
 
@@ -761,18 +762,29 @@ getOwnedSequences(Oid relid, AttrNumber attnum)
        return result;
 }
 
+List *
+getOwnedSequences(Oid relid, AttrNumber attnum)
+{
+       return getOwnedSequences_internal(relid, attnum, 0);
+}
+
 /*
- * Get owned sequence, error if not exactly one.
+ * Get owned identity sequence, error if not exactly one.
  */
 Oid
-getOwnedSequence(Oid relid, AttrNumber attnum)
+getIdentitySequence(Oid relid, AttrNumber attnum, bool missing_ok)
 {
-       List       *seqlist = getOwnedSequences(relid, attnum);
+       List       *seqlist = getOwnedSequences_internal(relid, attnum, 
DEPENDENCY_INTERNAL);
 
        if (list_length(seqlist) > 1)
                elog(ERROR, "more than one owned sequence found");
        else if (list_length(seqlist) < 1)
-               elog(ERROR, "no owned sequence found");
+       {
+               if (missing_ok)
+                       return InvalidOid;
+               else
+                       elog(ERROR, "no owned sequence found");
+       }
 
        return linitial_oid(seqlist);
 }
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 14fcad9034..53dc72f7d6 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6607,7 +6607,7 @@ ATExecDropIdentity(Relation rel, const char *colName, 
bool missing_ok, LOCKMODE
        table_close(attrelation, RowExclusiveLock);
 
        /* drop the internal sequence */
-       seqid = getOwnedSequence(RelationGetRelid(rel), attnum);
+       seqid = getIdentitySequence(RelationGetRelid(rel), attnum, false);
        deleteDependencyRecordsForClass(RelationRelationId, seqid,
                                                                        
RelationRelationId, DEPENDENCY_INTERNAL);
        CommandCounterIncrement();
diff --git a/src/backend/parser/parse_utilcmd.c 
b/src/backend/parser/parse_utilcmd.c
index 4564c0ae81..a3c5b005d5 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -1083,7 +1083,7 @@ transformTableLikeClause(CreateStmtContext *cxt, 
TableLikeClause *table_like_cla
                         * find sequence owned by old column; extract sequence 
parameters;
                         * build new create sequence command
                         */
-                       seq_relid = 
getOwnedSequence(RelationGetRelid(relation), attribute->attnum);
+                       seq_relid = 
getIdentitySequence(RelationGetRelid(relation), attribute->attnum, false);
                        seq_options = sequence_options(seq_relid);
                        generateSerialExtraStmts(cxt, def,
                                                                         
InvalidOid, seq_options, true,
@@ -3165,7 +3165,7 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt,
                                        if (attnum != InvalidAttrNumber &&
                                                TupleDescAttr(tupdesc, attnum - 
1)->attidentity)
                                        {
-                                               Oid                     
seq_relid = getOwnedSequence(relid, attnum);
+                                               Oid                     
seq_relid = getIdentitySequence(relid, attnum, false);
                                                Oid                     typeOid 
= typenameTypeId(pstate, def->typeName);
                                                AlterSeqStmt *altseqstmt = 
makeNode(AlterSeqStmt);
 
@@ -3216,7 +3216,6 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt,
                                        ListCell   *lc;
                                        List       *newseqopts = NIL;
                                        List       *newdef = NIL;
-                                       List       *seqlist;
                                        AttrNumber      attnum;
 
                                        /*
@@ -3237,14 +3236,13 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt,
 
                                        if (attnum)
                                        {
-                                               seqlist = 
getOwnedSequences(relid, attnum);
-                                               if (seqlist)
+                                               Oid                     
seq_relid = getIdentitySequence(relid, attnum, true);
+
+                                               if (seq_relid)
                                                {
                                                        AlterSeqStmt *seqstmt;
-                                                       Oid                     
seq_relid;
 
                                                        seqstmt = 
makeNode(AlterSeqStmt);
-                                                       seq_relid = 
linitial_oid(seqlist);
                                                        seqstmt->sequence = 
makeRangeVar(get_namespace_name(get_rel_namespace(seq_relid)),
                                                                                
                                         get_rel_name(seq_relid), -1);
                                                        seqstmt->options = 
newseqopts;
diff --git a/src/backend/rewrite/rewriteHandler.c 
b/src/backend/rewrite/rewriteHandler.c
index 39080776b0..fce361fc6a 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -1130,7 +1130,7 @@ build_column_default(Relation rel, int attrno)
        {
                NextValueExpr *nve = makeNode(NextValueExpr);
 
-               nve->seqid = getOwnedSequence(RelationGetRelid(rel), attrno);
+               nve->seqid = getIdentitySequence(RelationGetRelid(rel), attrno, 
false);
                nve->typeId = att_tup->atttypid;
 
                return (Node *) nve;
diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h
index 57545b70d8..495a591934 100644
--- a/src/include/catalog/dependency.h
+++ b/src/include/catalog/dependency.h
@@ -209,7 +209,7 @@ extern Oid  getExtensionOfObject(Oid classId, Oid objectId);
 
 extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 
*colId);
 extern List *getOwnedSequences(Oid relid, AttrNumber attnum);
-extern Oid     getOwnedSequence(Oid relid, AttrNumber attnum);
+extern Oid     getIdentitySequence(Oid relid, AttrNumber attnum, bool 
missing_ok);
 
 extern Oid     get_constraint_index(Oid constraintId);
 
-- 
2.21.0

Reply via email to