*** a/doc/src/sgml/ref/alter_table.sgml --- b/doc/src/sgml/ref/alter_table.sgml *************** *** 1013,1019 **** ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5); To add a check constraint only to a table and not to its children: ! ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK NO INHERIT (char_length(zipcode) = 5); (The check constraint will not be inherited by future children, either.) --- 1013,1019 ---- To add a check constraint only to a table and not to its children: ! ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT; (The check constraint will not be inherited by future children, either.) *** a/doc/src/sgml/ref/create_table.sgml --- b/doc/src/sgml/ref/create_table.sgml *************** *** 47,53 **** CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI [ CONSTRAINT constraint_name ] { NOT NULL | NULL | ! CHECK [ NO INHERIT ] ( expression ) | DEFAULT default_expr | UNIQUE index_parameters | PRIMARY KEY index_parameters | --- 47,53 ---- [ CONSTRAINT constraint_name ] { NOT NULL | NULL | ! CHECK ( expression ) [ NO INHERIT ] | DEFAULT default_expr | UNIQUE index_parameters | PRIMARY KEY index_parameters | *************** *** 58,64 **** CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI and table_constraint is: [ CONSTRAINT constraint_name ] ! { CHECK [ NO INHERIT ] ( expression ) | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] | --- 58,64 ---- and table_constraint is: [ CONSTRAINT constraint_name ] ! { CHECK ( expression ) [ NO INHERIT ] | UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] | *************** *** 417,423 **** CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI ! CHECK [ NO INHERIT ] ( expression ) The CHECK clause specifies an expression producing a --- 417,423 ---- ! CHECK ( expression ) [ NO INHERIT ] The CHECK clause specifies an expression producing a *** a/src/backend/commands/typecmds.c --- b/src/backend/commands/typecmds.c *************** *** 921,928 **** DefineDomain(CreateDomainStmt *stmt) /* * Check constraints are handled after domain creation, as ! * they require the Oid of the domain */ break; /* --- 921,934 ---- /* * Check constraints are handled after domain creation, as ! * they require the Oid of the domain; at this point we can ! * only check that they're not marked NO INHERIT, because ! * that would be bogus. */ + if (constr->is_no_inherit) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("CHECK constraints for domains cannot be marked NO INHERIT"))); break; /* *** a/src/backend/parser/gram.y --- b/src/backend/parser/gram.y *************** *** 101,106 **** typedef struct PrivTarget --- 101,107 ---- #define CAS_INITIALLY_IMMEDIATE 0x04 #define CAS_INITIALLY_DEFERRED 0x08 #define CAS_NOT_VALID 0x10 + #define CAS_NO_INHERIT 0x20 #define parser_yyerror(msg) scanner_yyerror(msg, yyscanner) *************** *** 144,150 **** static void SplitColQualList(List *qualList, core_yyscan_t yyscanner); static void processCASbits(int cas_bits, int location, const char *constrType, bool *deferrable, bool *initdeferred, bool *not_valid, ! core_yyscan_t yyscanner); %} --- 145,151 ---- core_yyscan_t yyscanner); static void processCASbits(int cas_bits, int location, const char *constrType, bool *deferrable, bool *initdeferred, bool *not_valid, ! bool *no_inherit, core_yyscan_t yyscanner); %} *************** *** 2709,2721 **** ColConstraintElem: n->indexspace = $4; $$ = (Node *)n; } ! | CHECK opt_no_inherit '(' a_expr ')' { Constraint *n = makeNode(Constraint); n->contype = CONSTR_CHECK; n->location = @1; ! n->is_no_inherit = $2; ! n->raw_expr = $4; n->cooked_expr = NULL; $$ = (Node *)n; } --- 2710,2722 ---- n->indexspace = $4; $$ = (Node *)n; } ! | CHECK '(' a_expr ')' opt_no_inherit { Constraint *n = makeNode(Constraint); n->contype = CONSTR_CHECK; n->location = @1; ! n->is_no_inherit = $5; ! n->raw_expr = $3; n->cooked_expr = NULL; $$ = (Node *)n; } *************** *** 2755,2764 **** ColConstraintElem: * combinations. * * See also ConstraintAttributeSpec, which can be used in places where ! * there is no parsing conflict. (Note: currently, NOT VALID is an allowed ! * clause in ConstraintAttributeSpec, but not here. Someday we might need ! * to allow it here too, but for the moment it doesn't seem useful in the ! * statements that use ConstraintAttr.) */ ConstraintAttr: DEFERRABLE --- 2756,2765 ---- * combinations. * * See also ConstraintAttributeSpec, which can be used in places where ! * there is no parsing conflict. (Note: currently, NOT VALID and NO INHERIT ! * are allowed clauses in ConstraintAttributeSpec, but not here. Someday we ! * might need to allow them here too, but for the moment it doesn't seem ! * useful in the statements that use ConstraintAttr.) */ ConstraintAttr: DEFERRABLE *************** *** 2835,2851 **** TableConstraint: ; ConstraintElem: ! CHECK opt_no_inherit '(' a_expr ')' ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); n->contype = CONSTR_CHECK; n->location = @1; ! n->is_no_inherit = $2; ! n->raw_expr = $4; n->cooked_expr = NULL; ! processCASbits($6, @6, "CHECK", NULL, NULL, &n->skip_validation, ! yyscanner); n->initially_valid = !n->skip_validation; $$ = (Node *)n; } --- 2836,2851 ---- ; ConstraintElem: ! CHECK '(' a_expr ')' ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); n->contype = CONSTR_CHECK; n->location = @1; ! n->raw_expr = $3; n->cooked_expr = NULL; ! processCASbits($5, @5, "CHECK", NULL, NULL, &n->skip_validation, ! &n->is_no_inherit, yyscanner); n->initially_valid = !n->skip_validation; $$ = (Node *)n; } *************** *** 2861,2867 **** ConstraintElem: n->indexspace = $6; processCASbits($7, @7, "UNIQUE", &n->deferrable, &n->initdeferred, NULL, ! yyscanner); $$ = (Node *)n; } | UNIQUE ExistingIndex ConstraintAttributeSpec --- 2861,2867 ---- n->indexspace = $6; processCASbits($7, @7, "UNIQUE", &n->deferrable, &n->initdeferred, NULL, ! NULL, yyscanner); $$ = (Node *)n; } | UNIQUE ExistingIndex ConstraintAttributeSpec *************** *** 2875,2881 **** ConstraintElem: n->indexspace = NULL; processCASbits($3, @3, "UNIQUE", &n->deferrable, &n->initdeferred, NULL, ! yyscanner); $$ = (Node *)n; } | PRIMARY KEY '(' columnList ')' opt_definition OptConsTableSpace --- 2875,2881 ---- n->indexspace = NULL; processCASbits($3, @3, "UNIQUE", &n->deferrable, &n->initdeferred, NULL, ! NULL, yyscanner); $$ = (Node *)n; } | PRIMARY KEY '(' columnList ')' opt_definition OptConsTableSpace *************** *** 2890,2896 **** ConstraintElem: n->indexspace = $7; processCASbits($8, @8, "PRIMARY KEY", &n->deferrable, &n->initdeferred, NULL, ! yyscanner); $$ = (Node *)n; } | PRIMARY KEY ExistingIndex ConstraintAttributeSpec --- 2890,2896 ---- n->indexspace = $7; processCASbits($8, @8, "PRIMARY KEY", &n->deferrable, &n->initdeferred, NULL, ! NULL, yyscanner); $$ = (Node *)n; } | PRIMARY KEY ExistingIndex ConstraintAttributeSpec *************** *** 2904,2910 **** ConstraintElem: n->indexspace = NULL; processCASbits($4, @4, "PRIMARY KEY", &n->deferrable, &n->initdeferred, NULL, ! yyscanner); $$ = (Node *)n; } | EXCLUDE access_method_clause '(' ExclusionConstraintList ')' --- 2904,2910 ---- n->indexspace = NULL; processCASbits($4, @4, "PRIMARY KEY", &n->deferrable, &n->initdeferred, NULL, ! NULL, yyscanner); $$ = (Node *)n; } | EXCLUDE access_method_clause '(' ExclusionConstraintList ')' *************** *** 2922,2928 **** ConstraintElem: n->where_clause = $8; processCASbits($9, @9, "EXCLUDE", &n->deferrable, &n->initdeferred, NULL, ! yyscanner); $$ = (Node *)n; } | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name --- 2922,2928 ---- n->where_clause = $8; processCASbits($9, @9, "EXCLUDE", &n->deferrable, &n->initdeferred, NULL, ! NULL, yyscanner); $$ = (Node *)n; } | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name *************** *** 2939,2945 **** ConstraintElem: n->fk_del_action = (char) ($10 & 0xFF); processCASbits($11, @11, "FOREIGN KEY", &n->deferrable, &n->initdeferred, ! &n->skip_validation, yyscanner); n->initially_valid = !n->skip_validation; $$ = (Node *)n; --- 2939,2945 ---- n->fk_del_action = (char) ($10 & 0xFF); processCASbits($11, @11, "FOREIGN KEY", &n->deferrable, &n->initdeferred, ! &n->skip_validation, NULL, yyscanner); n->initially_valid = !n->skip_validation; $$ = (Node *)n; *************** *** 4133,4139 **** CreateTrigStmt: n->isconstraint = TRUE; processCASbits($10, @10, "TRIGGER", &n->deferrable, &n->initdeferred, NULL, ! yyscanner); n->constrrel = $9; $$ = (Node *)n; } --- 4133,4139 ---- n->isconstraint = TRUE; processCASbits($10, @10, "TRIGGER", &n->deferrable, &n->initdeferred, NULL, ! NULL, yyscanner); n->constrrel = $9; $$ = (Node *)n; } *************** *** 4270,4275 **** ConstraintAttributeElem: --- 4270,4276 ---- | INITIALLY IMMEDIATE { $$ = CAS_INITIALLY_IMMEDIATE; } | INITIALLY DEFERRED { $$ = CAS_INITIALLY_DEFERRED; } | NOT VALID { $$ = CAS_NOT_VALID; } + | NO INHERIT { $$ = CAS_NO_INHERIT; } ; *************** *** 4386,4392 **** CreateAssertStmt: n->isconstraint = TRUE; processCASbits($8, @8, "ASSERTION", &n->deferrable, &n->initdeferred, NULL, ! yyscanner); ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), --- 4387,4393 ---- n->isconstraint = TRUE; processCASbits($8, @8, "ASSERTION", &n->deferrable, &n->initdeferred, NULL, ! NULL, yyscanner); ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), *************** *** 13380,13386 **** SplitColQualList(List *qualList, static void processCASbits(int cas_bits, int location, const char *constrType, bool *deferrable, bool *initdeferred, bool *not_valid, ! core_yyscan_t yyscanner) { /* defaults */ if (deferrable) --- 13381,13387 ---- static void processCASbits(int cas_bits, int location, const char *constrType, bool *deferrable, bool *initdeferred, bool *not_valid, ! bool *no_inherit, core_yyscan_t yyscanner) { /* defaults */ if (deferrable) *************** *** 13428,13433 **** processCASbits(int cas_bits, int location, const char *constrType, --- 13429,13447 ---- constrType), parser_errposition(location))); } + + if (cas_bits & CAS_NO_INHERIT) + { + if (no_inherit) + *no_inherit = true; + else + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + /* translator: %s is CHECK, UNIQUE, or similar */ + errmsg("%s constraints cannot be marked NO INHERIT", + constrType), + parser_errposition(location))); + } } /* parser_init() *** a/src/backend/utils/adt/ruleutils.c --- b/src/backend/utils/adt/ruleutils.c *************** *** 1343,1352 **** pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, * Note that simply checking for leading '(' and trailing ')' * would NOT be good enough, consider "(x > 0) AND (y > 0)". */ ! appendStringInfo(&buf, "CHECK %s(%s)", ! conForm->connoinherit ? "NO INHERIT " : "", ! consrc); ! break; } case CONSTRAINT_TRIGGER: --- 1343,1351 ---- * Note that simply checking for leading '(' and trailing ')' * would NOT be good enough, consider "(x > 0) AND (y > 0)". */ ! appendStringInfo(&buf, "CHECK (%s)%s", ! consrc, ! conForm->connoinherit ? " NO INHERIT" : ""); break; } case CONSTRAINT_TRIGGER: *** a/src/test/regress/expected/alter_table.out --- b/src/test/regress/expected/alter_table.out *************** *** 233,239 **** Check constraints: "con1foo" CHECK (a > 0) Inherits: constraint_rename_test ! ALTER TABLE constraint_rename_test ADD CONSTRAINT con2 CHECK NO INHERIT (b > 0); ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con2 TO con2foo; -- ok ALTER TABLE constraint_rename_test RENAME CONSTRAINT con2foo TO con2bar; -- ok \d constraint_rename_test --- 233,239 ---- "con1foo" CHECK (a > 0) Inherits: constraint_rename_test ! ALTER TABLE constraint_rename_test ADD CONSTRAINT con2 CHECK (b > 0) NO INHERIT; ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con2 TO con2foo; -- ok ALTER TABLE constraint_rename_test RENAME CONSTRAINT con2foo TO con2bar; -- ok \d constraint_rename_test *************** *** 245,251 **** Table "public.constraint_rename_test" c | integer | Check constraints: "con1foo" CHECK (a > 0) ! "con2bar" CHECK NO INHERIT (b > 0) Number of child tables: 1 (Use \d+ to list them.) \d constraint_rename_test2 --- 245,251 ---- c | integer | Check constraints: "con1foo" CHECK (a > 0) ! "con2bar" CHECK (b > 0) NO INHERIT Number of child tables: 1 (Use \d+ to list them.) \d constraint_rename_test2 *************** *** 273,279 **** Indexes: "con3foo" PRIMARY KEY, btree (a) Check constraints: "con1foo" CHECK (a > 0) ! "con2bar" CHECK NO INHERIT (b > 0) Number of child tables: 1 (Use \d+ to list them.) \d constraint_rename_test2 --- 273,279 ---- "con3foo" PRIMARY KEY, btree (a) Check constraints: "con1foo" CHECK (a > 0) ! "con2bar" CHECK (b > 0) NO INHERIT Number of child tables: 1 (Use \d+ to list them.) \d constraint_rename_test2 *************** *** 635,641 **** drop table atacc1; create table atacc1 (test int); create table atacc2 (test2 int) inherits (atacc1); -- ok: ! alter table atacc1 add constraint foo check no inherit (test>0); -- check constraint is not there on child insert into atacc2 (test) values (-3); -- check constraint is there on parent --- 635,641 ---- create table atacc1 (test int); create table atacc2 (test2 int) inherits (atacc1); -- ok: ! alter table atacc1 add constraint foo check (test>0) no inherit; -- check constraint is not there on child insert into atacc2 (test) values (-3); -- check constraint is there on parent *************** *** 644,650 **** ERROR: new row for relation "atacc1" violates check constraint "foo" DETAIL: Failing row contains (-3). insert into atacc1 (test) values (3); -- fail, violating row: ! alter table atacc2 add constraint foo check no inherit (test>0); ERROR: check constraint "foo" is violated by some row drop table atacc2; drop table atacc1; --- 644,650 ---- DETAIL: Failing row contains (-3). insert into atacc1 (test) values (3); -- fail, violating row: ! alter table atacc2 add constraint foo check (test>0) no inherit; ERROR: check constraint "foo" is violated by some row drop table atacc2; drop table atacc1; *** a/src/test/regress/expected/inherit.out --- b/src/test/regress/expected/inherit.out *************** *** 597,603 **** select * from d; -- Test non-inheritable parent constraints create table p1(ff1 int); ! alter table p1 add constraint p1chk check no inherit (ff1 > 0); alter table p1 add constraint p2chk check (ff1 > 10); -- connoinherit should be true for NO INHERIT constraint select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pgc.connoinherit from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname = 'p1' order by 1,2; --- 597,603 ---- -- Test non-inheritable parent constraints create table p1(ff1 int); ! alter table p1 add constraint p1chk check (ff1 > 0) no inherit; alter table p1 add constraint p2chk check (ff1 > 10); -- connoinherit should be true for NO INHERIT constraint select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pgc.connoinherit from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname = 'p1' order by 1,2; *************** *** 615,621 **** create table c1 () inherits (p1); --------+---------+----------- ff1 | integer | Check constraints: ! "p1chk" CHECK NO INHERIT (ff1 > 0) "p2chk" CHECK (ff1 > 10) Number of child tables: 1 (Use \d+ to list them.) --- 615,621 ---- --------+---------+----------- ff1 | integer | Check constraints: ! "p1chk" CHECK (ff1 > 0) NO INHERIT "p2chk" CHECK (ff1 > 10) Number of child tables: 1 (Use \d+ to list them.) *** a/src/test/regress/input/constraints.source --- b/src/test/regress/input/constraints.source *************** *** 148,154 **** DROP TABLE INSERT_CHILD; -- CREATE TABLE ATACC1 (TEST INT ! CHECK NO INHERIT (TEST > 0)); CREATE TABLE ATACC2 (TEST2 INT) INHERITS (ATACC1); -- check constraint is not there on child --- 148,154 ---- -- CREATE TABLE ATACC1 (TEST INT ! CHECK (TEST > 0) NO INHERIT); CREATE TABLE ATACC2 (TEST2 INT) INHERITS (ATACC1); -- check constraint is not there on child *************** *** 158,164 **** INSERT INTO ATACC1 (TEST) VALUES (-3); DROP TABLE ATACC1 CASCADE; CREATE TABLE ATACC1 (TEST INT, TEST2 INT ! CHECK (TEST > 0), CHECK NO INHERIT (TEST2 > 10)); CREATE TABLE ATACC2 () INHERITS (ATACC1); -- check constraint is there on child --- 158,164 ---- DROP TABLE ATACC1 CASCADE; CREATE TABLE ATACC1 (TEST INT, TEST2 INT ! CHECK (TEST > 0), CHECK (TEST2 > 10) NO INHERIT); CREATE TABLE ATACC2 () INHERITS (ATACC1); -- check constraint is there on child *** a/src/test/regress/output/constraints.source --- b/src/test/regress/output/constraints.source *************** *** 231,237 **** DROP TABLE INSERT_CHILD; -- Check NO INHERIT type of constraints and inheritance -- CREATE TABLE ATACC1 (TEST INT ! CHECK NO INHERIT (TEST > 0)); CREATE TABLE ATACC2 (TEST2 INT) INHERITS (ATACC1); -- check constraint is not there on child INSERT INTO ATACC2 (TEST) VALUES (-3); --- 231,237 ---- -- Check NO INHERIT type of constraints and inheritance -- CREATE TABLE ATACC1 (TEST INT ! CHECK (TEST > 0) NO INHERIT); CREATE TABLE ATACC2 (TEST2 INT) INHERITS (ATACC1); -- check constraint is not there on child INSERT INTO ATACC2 (TEST) VALUES (-3); *************** *** 242,248 **** DETAIL: Failing row contains (-3). DROP TABLE ATACC1 CASCADE; NOTICE: drop cascades to table atacc2 CREATE TABLE ATACC1 (TEST INT, TEST2 INT ! CHECK (TEST > 0), CHECK NO INHERIT (TEST2 > 10)); CREATE TABLE ATACC2 () INHERITS (ATACC1); -- check constraint is there on child INSERT INTO ATACC2 (TEST) VALUES (-3); --- 242,248 ---- DROP TABLE ATACC1 CASCADE; NOTICE: drop cascades to table atacc2 CREATE TABLE ATACC1 (TEST INT, TEST2 INT ! CHECK (TEST > 0), CHECK (TEST2 > 10) NO INHERIT); CREATE TABLE ATACC2 () INHERITS (ATACC1); -- check constraint is there on child INSERT INTO ATACC2 (TEST) VALUES (-3); *** a/src/test/regress/sql/alter_table.sql --- b/src/test/regress/sql/alter_table.sql *************** *** 218,224 **** ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con1 TO con1foo; -- fa ALTER TABLE constraint_rename_test RENAME CONSTRAINT con1 TO con1foo; -- ok \d constraint_rename_test \d constraint_rename_test2 ! ALTER TABLE constraint_rename_test ADD CONSTRAINT con2 CHECK NO INHERIT (b > 0); ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con2 TO con2foo; -- ok ALTER TABLE constraint_rename_test RENAME CONSTRAINT con2foo TO con2bar; -- ok \d constraint_rename_test --- 218,224 ---- ALTER TABLE constraint_rename_test RENAME CONSTRAINT con1 TO con1foo; -- ok \d constraint_rename_test \d constraint_rename_test2 ! ALTER TABLE constraint_rename_test ADD CONSTRAINT con2 CHECK (b > 0) NO INHERIT; ALTER TABLE ONLY constraint_rename_test RENAME CONSTRAINT con2 TO con2foo; -- ok ALTER TABLE constraint_rename_test RENAME CONSTRAINT con2foo TO con2bar; -- ok \d constraint_rename_test *************** *** 500,513 **** drop table atacc1; create table atacc1 (test int); create table atacc2 (test2 int) inherits (atacc1); -- ok: ! alter table atacc1 add constraint foo check no inherit (test>0); -- check constraint is not there on child insert into atacc2 (test) values (-3); -- check constraint is there on parent insert into atacc1 (test) values (-3); insert into atacc1 (test) values (3); -- fail, violating row: ! alter table atacc2 add constraint foo check no inherit (test>0); drop table atacc2; drop table atacc1; --- 500,513 ---- create table atacc1 (test int); create table atacc2 (test2 int) inherits (atacc1); -- ok: ! alter table atacc1 add constraint foo check (test>0) no inherit; -- check constraint is not there on child insert into atacc2 (test) values (-3); -- check constraint is there on parent insert into atacc1 (test) values (-3); insert into atacc1 (test) values (3); -- fail, violating row: ! alter table atacc2 add constraint foo check (test>0) no inherit; drop table atacc2; drop table atacc1; *** a/src/test/regress/sql/inherit.sql --- b/src/test/regress/sql/inherit.sql *************** *** 140,146 **** select * from d; -- Test non-inheritable parent constraints create table p1(ff1 int); ! alter table p1 add constraint p1chk check no inherit (ff1 > 0); alter table p1 add constraint p2chk check (ff1 > 10); -- connoinherit should be true for NO INHERIT constraint select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pgc.connoinherit from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname = 'p1' order by 1,2; --- 140,146 ---- -- Test non-inheritable parent constraints create table p1(ff1 int); ! alter table p1 add constraint p1chk check (ff1 > 0) no inherit; alter table p1 add constraint p2chk check (ff1 > 10); -- connoinherit should be true for NO INHERIT constraint select pc.relname, pgc.conname, pgc.contype, pgc.conislocal, pgc.coninhcount, pgc.connoinherit from pg_class as pc inner join pg_constraint as pgc on (pgc.conrelid = pc.oid) where pc.relname = 'p1' order by 1,2;