Re: BUG #14629: ALTER TABLE VALIDATE CONSTRAINTS does not obey NO INHERIT clause

Amit Langote <langote_amit_f8@lab.ntt.co.jp>

From: Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>
To: buschmann@nidsa.net, pgsql-bugs@postgresql.org
Date: 2017-04-24T04:16:51Z
Lists: pgsql-bugs, pgsql-hackers

Attachments

On 2017/04/22 3:40, buschmann@nidsa.net wrote:
> The following bug has been logged on the website:
> 
> Bug reference:      14629
> Logged by:          Hans Buschmann
> Email address:      buschmann@nidsa.net
> PostgreSQL version: 9.6.2
> Operating system:   Windows x64
> Description:        
> 
> 
> Given these both tables (orders_archiv inherits orders) on 9.6.2 Windows
> x64
> (cut/paste from psql)
> 
> xxxdb=# \d orders_archiv;
> ...
> Check constraints:
>     "ck_or_old" CHECK (or_season < 24) NO INHERIT
> Inherits: orders
> 
> 
> xxxdb=# \d orders
> ...
> Check constraints:
>     "ck_or_new" CHECK (or_season >= 24) NO INHERIT NOT VALID
> Triggers:
>     tr_orders_insert BEFORE INSERT ON orders FOR EACH ROW WHEN
> (new.or_season < 24) EXECUTE PROCEDURE fn_orders_insert()
> Number of child tables: 1 (Use \d+ to list them.)
> 
> 
> When applying these commands to the parent table, the following errors are
> returned:
> 
> xxxdb=# alter table orders validate constraint ck_or_new;
> ERROR:  constraint "ck_or_new" of relation "orders_archiv" does not exist
> 
> 
> xxxdb=# alter table only orders validate constraint ck_or_new;
> ERROR:  constraint must be validated on child tables too
> 
> Background:
> From our original partitioning of quite a lot of tables according to
> xx_season columns (a season is a half year period) I dropped and recreated
> the check constraintsin a not valid state.
> 
> At the end of the script to move the data from 2 seasons into the archiv
> tables I tried to reenable the check constraints and encountered those two
> errors.
> 
> It seems that I can circumvent these errors by recreating the constraints
> without the not valid clause.
> 
> Do I miss something here ?

Looks indeed like a bug to me.  Performing VALIDATE CONSTRAINT on what is
a non-inheritable constraint shouldn't look for that constraint in the
child tables.  Attached patch fixes that.  Should be applied in all of the
supported branches.

Thanks,
Amit

Commits

  1. Fix VALIDATE CONSTRAINT to consider NO INHERIT attribute.