On 2015/12/09 11:19, Amit Langote wrote:
> On 2015/12/09 5:50, Robert Haas wrote:
>> I suspect this is an oversight. We allowed FOREIGN KEY constraints to
>> be not valid in 722bf7017bbe796decc79c1fde03e7a83dae9ada by Simon
>> Riggs, but didn't add allow it for CHECK constraints until Alvaro's
>> commit of 897795240cfaaed724af2f53ed2c50c9862f951f a few months later.
>> My guess is that there's no reason for these not to behave in the same
>> way, but they don't. Amul's proposed one-liner might be one part of
>> actually fixing that, but it wouldn't be enough by itself: you'd also
>> need to teach transformCreateStmt to set the initially_valid flag to
>> true, maybe by adding a new function transformCheckConstraints or so.
>
> So, any NOT VALID specification for a FK constraint is effectively
> overridden in transformFKConstraints() at table creation time but the same
> doesn't happen for CHECK constraints. I agree that that could be fixed,
> then as you say, Amul's one-liner would make sense.
So, how about attached?
I think it may be enough to flip initially_valid to true in
transformTableConstraint() when in a CREATE TABLE context.
Regarding Amul's proposed change, there arises one minor inconsistency.
StoreRelCheck() is called in two places - AddRelationNewConstraints(),
where we can safely change from passing the value of !skip_validation to
that of initially_valid and StoreConstraints(), where we cannot because
CookedConstraint is used which doesn't have the initially_valid field.
Nevertheless, attached patch includes the former.
Thoughts?
Thanks,
Amit
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 7d7d062..04c4f8f 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -2349,7 +2349,7 @@ AddRelationNewConstraints(Relation rel,
* OK, store it.
*/
constrOid =
- StoreRelCheck(rel, ccname, expr, !cdef->skip_validation, is_local,
+ StoreRelCheck(rel, ccname, expr, cdef->initially_valid, is_local,
is_local ? 0 : 1, cdef->is_no_inherit, is_internal);
numchecks++;
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 344a40c..ce45804 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -687,6 +687,10 @@ transformTableConstraint(CreateStmtContext *cxt, Constraint *constraint)
break;
case CONSTR_CHECK:
+ /* Is this better done in a transformCheckConstraint? */
+ if (!cxt->isalter)
+ constraint->initially_valid = true;
+
cxt->ckconstraints = lappend(cxt->ckconstraints, constraint);
break;
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index 61669b6..c91342f 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -187,7 +187,7 @@ Table "public.constraint_rename_test"
b | integer |
c | integer |
Check constraints:
- "con1" CHECK (a > 0)
+ "con1" CHECK (a > 0) NOT VALID
CREATE TABLE constraint_rename_test2 (a int CONSTRAINT con1 CHECK (a > 0), d int) INHERITS (constraint_rename_test);
NOTICE: merging column "a" with inherited definition
@@ -217,7 +217,7 @@ Table "public.constraint_rename_test"
b | integer |
c | integer |
Check constraints:
- "con1foo" CHECK (a > 0)
+ "con1foo" CHECK (a > 0) NOT VALID
Number of child tables: 1 (Use \d+ to list them.)
\d constraint_rename_test2
@@ -243,7 +243,7 @@ Table "public.constraint_rename_test"
b | integer |
c | integer |
Check constraints:
- "con1foo" CHECK (a > 0)
+ "con1foo" CHECK (a > 0) NOT VALID
"con2bar" CHECK (b > 0) NO INHERIT
Number of child tables: 1 (Use \d+ to list them.)
@@ -271,7 +271,7 @@ Table "public.constraint_rename_test"
Indexes:
"con3foo" PRIMARY KEY, btree (a)
Check constraints:
- "con1foo" CHECK (a > 0)
+ "con1foo" CHECK (a > 0) NOT VALID
"con2bar" CHECK (b > 0) NO INHERIT
Number of child tables: 1 (Use \d+ to list them.)
@@ -1820,7 +1820,7 @@ CREATE TABLE test_inh_check_child() INHERITS(test_inh_check);
a | double precision |
b | double precision |
Check constraints:
- "test_inh_check_a_check" CHECK (a > 10.2::double precision)
+ "test_inh_check_a_check" CHECK (a > 10.2::double precision) NOT VALID
Number of child tables: 1 (Use \d+ to list them.)
\d test_inh_check_child
@@ -1851,7 +1851,7 @@ ALTER TABLE test_inh_check ALTER COLUMN a TYPE numeric;
a | numeric |
b | double precision |
Check constraints:
- "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision)
+ "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) NOT VALID
Number of child tables: 1 (Use \d+ to list them.)
\d test_inh_check_child
@@ -1861,7 +1861,7 @@ Number of child tables: 1 (Use \d+ to list them.)
a | numeric |
b | double precision |
Check constraints:
- "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision)
+ "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) NOT VALID
Inherits: test_inh_check
select relname, conname, coninhcount, conislocal, connoinherit
@@ -1889,7 +1889,7 @@ NOTICE: merging constraint "bmerged" with inherited definition
Check constraints:
"bmerged" CHECK (b > 1::double precision)
"bnoinherit" CHECK (b > 100::double precision) NO INHERIT
- "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision)
+ "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) NOT VALID
Number of child tables: 1 (Use \d+ to list them.)
\d test_inh_check_child
@@ -1901,7 +1901,7 @@ Number of child tables: 1 (Use \d+ to list them.)
Check constraints:
"blocal" CHECK (b < 1000::double precision)
"bmerged" CHECK (b > 1::double precision)
- "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision)
+ "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) NOT VALID
Inherits: test_inh_check
select relname, conname, coninhcount, conislocal, connoinherit
@@ -1929,7 +1929,7 @@ Table "public.test_inh_check"
Check constraints:
"bmerged" CHECK (b::double precision > 1::double precision)
"bnoinherit" CHECK (b::double precision > 100::double precision) NO INHERIT
- "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision)
+ "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) NOT VALID
Number of child tables: 1 (Use \d+ to list them.)
\d test_inh_check_child
@@ -1941,7 +1941,7 @@ Table "public.test_inh_check_child"
Check constraints:
"blocal" CHECK (b::double precision < 1000::double precision)
"bmerged" CHECK (b::double precision > 1::double precision)
- "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision)
+ "test_inh_check_a_check" CHECK (a::double precision > 10.2::double precision) NOT VALID
Inherits: test_inh_check
select relname, conname, coninhcount, conislocal, connoinherit
diff --git a/src/test/regress/expected/create_table_like.out b/src/test/regress/expected/create_table_like.out
index 97edde1..55b3706 100644
--- a/src/test/regress/expected/create_table_like.out
+++ b/src/test/regress/expected/create_table_like.out
@@ -171,7 +171,7 @@ NOTICE: merging column "a" with inherited definition
c | text | | external | | C
Check constraints:
"ctlt1_a_check" CHECK (length(a) > 2)
- "ctlt3_a_check" CHECK (length(a) < 5)
+ "ctlt3_a_check" CHECK (length(a) < 5) NOT VALID
Inherits: ctlt1
SELECT description FROM pg_description, pg_constraint c WHERE classoid = 'pg_constraint'::regclass AND objoid = c.oid AND c.conrelid = 'ctlt13_like'::regclass;
@@ -192,7 +192,7 @@ Indexes:
"ctlt_all_b_idx" btree (b)
"ctlt_all_expr_idx" btree ((a || b))
Check constraints:
- "ctlt1_a_check" CHECK (length(a) > 2)
+ "ctlt1_a_check" CHECK (length(a) > 2) NOT VALID
SELECT c.relname, objsubid, description FROM pg_description, pg_index i, pg_class c WHERE classoid = 'pg_class'::regclass AND objoid = i.indexrelid AND c.oid = i.indexrelid AND i.indrelid = 'ctlt_all'::regclass ORDER BY c.relname, objsubid;
relname | objsubid | description
diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out
index 73c02bb..4596dbc 100644
--- a/src/test/regress/expected/foreign_data.out
+++ b/src/test/regress/expected/foreign_data.out
@@ -709,7 +709,7 @@ COMMENT ON COLUMN ft1.c1 IS 'ft1.c1';
c2 | text | | (param2 'val2', param3 'val3') | extended | |
c3 | date | | | plain | |
Check constraints:
- "ft1_c2_check" CHECK (c2 <> ''::text)
+ "ft1_c2_check" CHECK (c2 <> ''::text) NOT VALID
"ft1_c3_check" CHECK (c3 >= '01-01-1994'::date AND c3 <= '01-31-1994'::date)
Server: s0
FDW Options: (delimiter ',', quote '"', "be quoted" 'value')
@@ -771,7 +771,7 @@ ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 SET STORAGE PLAIN;
c9 | integer | | | plain | |
c10 | integer | | (p1 'v1') | plain | |
Check constraints:
- "ft1_c2_check" CHECK (c2 <> ''::text)
+ "ft1_c2_check" CHECK (c2 <> ''::text) NOT VALID
"ft1_c3_check" CHECK (c3 >= '01-01-1994'::date AND c3 <= '01-31-1994'::date)
Server: s0
FDW Options: (delimiter ',', quote '"', "be quoted" 'value')
@@ -820,7 +820,7 @@ ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1;
c8 | text | | (p2 'V2')
c10 | integer | | (p1 'v1')
Check constraints:
- "ft1_c2_check" CHECK (c2 <> ''::text)
+ "ft1_c2_check" CHECK (c2 <> ''::text) NOT VALID
"ft1_c3_check" CHECK (c3 >= '01-01-1994'::date AND c3 <= '01-31-1994'::date)
Server: s0
FDW Options: (quote '~', "be quoted" 'value', escape '@')
diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out
index 89b6c1c..7853e41 100644
--- a/src/test/regress/expected/inherit.out
+++ b/src/test/regress/expected/inherit.out
@@ -849,7 +849,7 @@ alter table pp1 add column a1 int check (a1 > 0);
f3 | integer |
a1 | integer |
Check constraints:
- "pp1_a1_check" CHECK (a1 > 0)
+ "pp1_a1_check" CHECK (a1 > 0) NOT VALID
Inherits: pp1
create table cc2(f4 float) inherits(pp1,cc1);
@@ -884,7 +884,7 @@ NOTICE: merging constraint "pp1_a2_check" with inherited definition
a2 | integer |
Check constraints:
"pp1_a1_check" CHECK (a1 > 0)
- "pp1_a2_check" CHECK (a2 > 0)
+ "pp1_a2_check" CHECK (a2 > 0) NOT VALID
Inherits: pp1,
cc1
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers