Re: Re: BUG #11411: ALTER DOMAIN VALIDATE CONSTRAINT fails if the domain is used in a composite type - Mailing list pgsql-bugs

From Bruce Momjian
Subject Re: Re: BUG #11411: ALTER DOMAIN VALIDATE CONSTRAINT fails if the domain is used in a composite type
Date
Msg-id 20141013204501.GL21267@momjian.us
Whole thread Raw
In response to Re: BUG #11411: ALTER DOMAIN VALIDATE CONSTRAINT fails if the domain is used in a composite type  (David G Johnston <david.g.johnston@gmail.com>)
List pgsql-bugs
I have applied the doc patch that hopefully makes things a little clearer.

---------------------------------------------------------------------------

On Fri, Sep 12, 2014 at 06:06:21PM -0700, David G Johnston wrote:
> Ondřej Bouda wrote
> > The following bug has been logged on the website:
> >
> > Bug reference:      11411
> > Logged by:          Ondřej Bouda
> > Email address:
>
> > obouda@
>
> > PostgreSQL version: 9.3.5
> > Operating system:   Windows 7 64bit
> > Description:
> >
> > The documentation for ALTER DOMAIN notes that "ALTER DOMAIN ADD CONSTRAINT
> > and ALTER DOMAIN SET NOT NULL will fail if the named domain or any derived
> > domain is used within a composite-type column of any table in the
> > database."
> >
> > It appears current Postgres also fails on ALTER DOMAIN VALIDATE CONSTRAINT
> > in such a case, as demonstrated by the following script:
> >
> > CREATE DOMAIN test_domain AS TEXT CONSTRAINT some_check CHECK (TRUE);
> > CREATE TYPE test_composite AS (num INT, word test_domain);
> > CREATE TABLE test_table (val test_composite);
> > ALTER DOMAIN test_domain VALIDATE CONSTRAINT some_check;
> >
> > Since the documentation says nothing special regarding ALTER DOMAIN
> > VALIDATE
> > CONSTRAINT on a domain used by composite-type columns, the query is
> > expected
> > to run without errors.
> >
> > Instead, the following error is reported:
> > [0A000] ERROR: cannot alter type "test_domain" because column
> > "test_table.val" uses it
> >
> > It is questionable whether this is an implementation or documentation bug,
> > but it certainly is a bug.
>
> TL/DR; The documentation needs some work here; and the code could be more
> helpful - even without overcoming the limitation - though it likely isn't
> worth the effort.
>
> Fix) Document that validating a table-embedded-composite domain check
> constraint is not currently implemented.  Furthermore, clarify that it is
> specifically the "VALID" version of ALTER DOMAIN ADD that fails - you can
> add a NOT VALID constraint and it will not fail until validation.
>
> 1) VALIDATE CONSTRAINT could early-exit if the named constraint is already
> valid (probably worth the effort)
>
> 2) Error upon ALTER ADD NOT VALID if the domain is already part of a
> table-embedded-composite (probably not...)
>
> 3) Error when adding a domain-embedded-composite, having one or more NOT
> VALID constraints, to a table (probably not ...)
>
>
> version
> PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro
> 4.6.3-1ubuntu5) 4.6.3, 64-bit
>
> No failures:
>
> BEGIN;
> CREATE DOMAIN testdom AS varchar;
> CREATE TYPE testdomtype AS (
>   col1 testdom
> , col2 testdom
> );
> CREATE TABLE testtbl ( tblcol1 testdomtype );
> ALTER DOMAIN testdom ADD CONSTRAINT testcon CHECK (length(VALUE) = 5) NOT
> VALID;
>
> Since "NOT VALID" is simply a modifier to ALTER DOMAIN ADD CONSTRAINT the
> sentence:
>
> "Currently, ALTER DOMAIN ADD CONSTRAINT and ALTER DOMAIN SET NOT NULL will
> fail if the named domain or any derived domain is used within a
> composite-type column of any table in the database."
>
> is incomplete since it is not immediately obvious that the NOT VALID variant
> should be a special case.
>
> The act of making the constraint valid, which is what the OP is doing in
> theory (there is no NOT VALID constraint to validate), is what ends up
> causing the failure.
>
> Note that it would seem reasonable for the VALIDATE CONSTRAINT action to
> short-circuit - possibly with a NOTICE emitted - in the situation where
> there are no NOT VALID constraints to validate.  At least in the specific
> scenario posited by the OP the error would be avoided.
>
> I was thinking about the following scenario:
> CREATE DOMAIN
> CREATE TYPE
> ALTER DOMAIN NOT VALID
> CREATE TABLE
> ALTER DOMAIN VALIDATE
>
> Since NOT VALID does not error this is currently functionally equivalent to
> the test I posted above - where the ALTER ADD follows the CREATE TABLE.
>
> One question is whether we can prevent an embedded domain with an
> outstanding NOT VALID constraint from being added to a table in the first
> place.
>
> The other question is whether the error on validation can be moved up so
> that an attempt to ADD a NOT VALID constraint that is guaranteed to fail
> when validated (reasonably assumes dropping the column from the table is not
> a valid workaround) can be caught during the ADD instead.
>
> The documentation fix should be simple but the question is whether anyone
> wants to do more, with or without back-patching, to have the SQL interface
> being more helpful.
>
> Fixing the limitation would be best.  At this point being a little more
> helpful is probably of little benefit since an altered domain should be
> reasonably quickly validated and so funneling the error to that point
> doesn't seem to impose any meaningful risk or usage hazard on the user.
> Actual experiences to the contrary would help. This report is too limited to
> qualify for that.
>
> David J.
>
>
>
>
> --
> View this message in context:
http://postgresql.1045698.n5.nabble.com/BUG-11411-ALTER-DOMAIN-VALIDATE-CONSTRAINT-fails-if-the-domain-is-used-in-a-composite-type-tp5818899p5818911.html
> Sent from the PostgreSQL - bugs mailing list archive at Nabble.com.
>
>
> --
> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-bugs

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + Everyone has their own god. +

Attachment

pgsql-bugs by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: BUG #11335: an invalid prepare statement causes crash at log_statement = 'mod' or 'ddl'.
Next
From: Bruce Momjian
Date:
Subject: Re: BUG #11474: [Documentation] Add a note about to_date() not accepting TM modifier