On Sun, 2019-04-14 at 20:15 +0200, I wrote: > I wrote: > > Identity columns don't work if they own more than one sequence. > > Alternatively, maybe getOwnedSequence should only consider sequences > with an "internal" dependency on the column. That would avoid the problem > without forbidding anything, since normal OWNED BY dependencies are "auto". > > What do you think?
Here is a patch that illustrates the second approach. I'll add this thread to the next commitfest. Yours, Laurenz Albe
From 7f7bae5315b7770f1327a80eb192bb098ee9df89 Mon Sep 17 00:00:00 2001 From: Laurenz Albe <laurenz.a...@cybertec.at> Date: Wed, 24 Apr 2019 16:46:39 +0200 Subject: [PATCH] Change getOwnedSequence to only find sequences for identity columns This makes identity columns work even if there is another sequence owned by the column (with an auto dependency). --- src/backend/catalog/pg_depend.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c index d63bf5e56d..4d8c333243 100644 --- a/src/backend/catalog/pg_depend.c +++ b/src/backend/catalog/pg_depend.c @@ -684,14 +684,18 @@ getOwnedSequences(Oid relid, AttrNumber attnum) Form_pg_depend deprec = (Form_pg_depend) GETSTRUCT(tup); /* - * We assume any auto or internal dependency of a sequence on a column - * must be what we are looking for. (We need the relkind test because - * indexes can also have auto dependencies on columns.) + * If no "attnum" was given, we are looking for sequences with an + * auto or internal dependency. + * If "attnum" was given, only look for sequences with an internal + * dependency, because that is what we need for identity columns. + * (We need the relkind test because indexes can also have auto + * dependencies on columns.) */ if (deprec->classid == RelationRelationId && deprec->objsubid == 0 && deprec->refobjsubid != 0 && - (deprec->deptype == DEPENDENCY_AUTO || deprec->deptype == DEPENDENCY_INTERNAL) && + ((!attnum && deprec->deptype == DEPENDENCY_AUTO) || + deprec->deptype == DEPENDENCY_INTERNAL) && get_rel_relkind(deprec->objid) == RELKIND_SEQUENCE) { result = lappend_oid(result, deprec->objid); -- 2.20.1