Thread
Commits
-
Fix ALTER TABLE code to update domain constraints when needed.
- af20e2d728eb 11.0 landed
-
Rethink the dependencies recorded for FieldSelect/FieldStore nodes.
- 6784d7a1dc69 11.0 cited
-
ALTER COLUMN TYPE vs. domain constraints
Tom Lane <tgl@sss.pgh.pa.us> — 2017-10-27T18:15:30Z
I found out that altering a column's type does not play nicely with domain constraints: tablecmds.c expects that only table constraints could depend on a column. Now, it's easy to hit that with domains over composite, so I propose to fix it in HEAD with the attached patch. However, if you really work at it, you can make it fail in the back branches too: regression=# create type comptype as (r float8, i float8); CREATE TYPE regression=# create domain silly as float8 check ((row(value,0)::comptype).r > 0); CREATE DOMAIN regression=# alter type comptype alter attribute r type varchar; ERROR: cache lookup failed for relation 0 Before commit 6784d7a1d, the ALTER actually went through, leaving a mess. Fortunately it doesn't actually crash afterwards, but you get things like regression=# select 0::silly; ERROR: ROW() column has type double precision instead of type character varying We could consider back-patching the attached to cover this, but I'm not entirely sure it's worth the trouble, because I haven't thought of any non-silly use-cases in the absence of domains over composite. Comments? regards, tom lane
-
Re: ALTER COLUMN TYPE vs. domain constraints
Michael Paquier <michael.paquier@gmail.com> — 2017-10-28T21:07:59Z
On Fri, Oct 27, 2017 at 11:15 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > We could consider back-patching the attached to cover this, but > I'm not entirely sure it's worth the trouble, because I haven't > thought of any non-silly use-cases in the absence of domains > over composite. Comments? There are no real complaints about the current behavior, aren't there? So only patching HEAD seems enough to me. +comment on constraint c1 on domain dcomptype is 'random commentary'; [...] +alter type comptype alter attribute r type bigint; You have added a comment on the constraint to make sure that it remains up on basically this ALTER TYPE. Querying pg_obj_description would make sure that the comment on the constraint is still here. +static void +RebuildDomainConstraintComment(AlteredTableInfo *tab, int pass, Oid objid, + List *domname, char *conname) There is much duplication with RebuildConstraintComment. Why not grouping both under say RebuildObjectComment()? I would think about having cmd->objtype and cmd->object passed as arguments, and then remove rel and domname from the existing arguments. [nit] foreach(lcmd, subcmds) - ATExecCmd(wqueue, tab, rel, (AlterTableCmd *) lfirst(lcmd), lockmode); + ATExecCmd(wqueue, tab, rel, + castNode(AlterTableCmd, lfirst(lcmd)), + lockmode); This does not really belong to this patch.. No objections to group things. [/nit] -- Michael -
Re: ALTER COLUMN TYPE vs. domain constraints
Tom Lane <tgl@sss.pgh.pa.us> — 2017-11-01T17:36:46Z
Michael Paquier <michael.paquier@gmail.com> writes: > On Fri, Oct 27, 2017 at 11:15 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote: >> We could consider back-patching the attached to cover this, but >> I'm not entirely sure it's worth the trouble, because I haven't >> thought of any non-silly use-cases in the absence of domains >> over composite. Comments? > There are no real complaints about the current behavior, aren't there? > So only patching HEAD seems enough to me. Yeah, we can leave it till someone does complain. > You have added a comment on the constraint to make sure that it > remains up on basically this ALTER TYPE. Querying pg_obj_description > would make sure that the comment on the constraint is still here. Done. > +RebuildDomainConstraintComment(AlteredTableInfo *tab, int pass, Oid objid, > + List *domname, char *conname) > There is much duplication with RebuildConstraintComment. Why not > grouping both under say RebuildObjectComment()? True. I'd originally expected the code to differ more, but we can merge these easily enough. > I would think about > having cmd->objtype and cmd->object passed as arguments, and then > remove rel and domname from the existing arguments. Doing it like that requires the callers to do work (to prepare the object ID data structure) that's wasted if there's no comment, which most often there wouldn't be, I suspect. Seems better to just pass the info the caller does have and let this function do the rest. Pushed, thanks for reviewing! regards, tom lane