mirror of
https://github.com/postgres/postgres.git
synced 2025-07-17 06:41:09 +03:00
Enable CHECK constraints to be declared NOT VALID
This means that they can initially be added to a large existing table without checking its initial contents, but new tuples must comply to them; a separate pass invoked by ALTER TABLE / VALIDATE can verify existing data and ensure it complies with the constraint, at which point it is marked validated and becomes a normal part of the table ecosystem. An non-validated CHECK constraint is ignored in the planner for constraint_exclusion purposes; when validated, cached plans are recomputed so that partitioning starts working right away. This patch also enables domains to have unvalidated CHECK constraints attached to them as well by way of ALTER DOMAIN / ADD CONSTRAINT / NOT VALID, which can later be validated with ALTER DOMAIN / VALIDATE CONSTRAINT. Thanks to Thom Brown, Dean Rasheed and Jaime Casanova for the various reviews, and Robert Hass for documentation wording improvement suggestions. This patch was sponsored by Enova Financial.
This commit is contained in:
@ -552,7 +552,7 @@ get_relation_data_width(Oid relid, int32 *attr_widths)
|
||||
/*
|
||||
* get_relation_constraints
|
||||
*
|
||||
* Retrieve the CHECK constraint expressions of the given relation.
|
||||
* Retrieve the validated CHECK constraint expressions of the given relation.
|
||||
*
|
||||
* Returns a List (possibly empty) of constraint expressions. Each one
|
||||
* has been canonicalized, and its Vars are changed to have the varno
|
||||
@ -591,6 +591,13 @@ get_relation_constraints(PlannerInfo *root,
|
||||
{
|
||||
Node *cexpr;
|
||||
|
||||
/*
|
||||
* If this constraint hasn't been fully validated yet, we must
|
||||
* ignore it here.
|
||||
*/
|
||||
if (!constr->check[i].ccvalid)
|
||||
continue;
|
||||
|
||||
cexpr = stringToNode(constr->check[i].ccbin);
|
||||
|
||||
/*
|
||||
@ -663,7 +670,7 @@ get_relation_constraints(PlannerInfo *root,
|
||||
*
|
||||
* Detect whether the relation need not be scanned because it has either
|
||||
* self-inconsistent restrictions, or restrictions inconsistent with the
|
||||
* relation's CHECK constraints.
|
||||
* relation's validated CHECK constraints.
|
||||
*
|
||||
* Note: this examines only rel->relid, rel->reloptkind, and
|
||||
* rel->baserestrictinfo; therefore it can be called before filling in
|
||||
|
Reference in New Issue
Block a user