mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Don't needlessly check the partition contraint twice
Starting with commitf0e44751d7
, ExecConstraints was in charge of running the partition constraint; commit19c47e7c82
modified that so that caller could request to skip that checking depending on some conditions, but that commit and15ce775faa
together introduced a small bug there which caused ExecInsert to request skipping the constraint check but have this not be honored -- in effect doing the check twice. This could have been fixed in a very small patch, but on further analysis of the involved function and its callsites, it turns out to be simpler to give the responsibility of checking the partition constraint fully to the caller, and return ExecConstraints to its original (pre-partitioning) shape where it only checked tuple descriptor-related constraints. Each caller must do partition constraint checking on its own schedule, which is more convenient after commit2f17844104
anyway. Reported-by: David Rowley Author: David Rowley, Álvaro Herrera Reviewed-by: Amit Langote, Amit Khandekar, Simon Riggs Discussion: https://postgr.es/m/CAKJS1f8w8+awsxgea8wt7_UX8qzOQ=Tm1LD+U1fHqBAkXxkW2w@mail.gmail.com
This commit is contained in:
@ -1856,14 +1856,16 @@ ExecRelCheck(ResultRelInfo *resultRelInfo,
|
||||
/*
|
||||
* ExecPartitionCheck --- check that tuple meets the partition constraint.
|
||||
*
|
||||
* Exported in executor.h for outside use.
|
||||
* Returns true if it meets the partition constraint, else returns false.
|
||||
* Returns true if it meets the partition constraint. If the constraint
|
||||
* fails and we're asked to emit to error, do so and don't return; otherwise
|
||||
* return false.
|
||||
*/
|
||||
bool
|
||||
ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot,
|
||||
EState *estate)
|
||||
EState *estate, bool emitError)
|
||||
{
|
||||
ExprContext *econtext;
|
||||
bool success;
|
||||
|
||||
/*
|
||||
* If first time through, build expression state tree for the partition
|
||||
@ -1890,7 +1892,13 @@ ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot,
|
||||
* As in case of the catalogued constraints, we treat a NULL result as
|
||||
* success here, not a failure.
|
||||
*/
|
||||
return ExecCheck(resultRelInfo->ri_PartitionCheckExpr, econtext);
|
||||
success = ExecCheck(resultRelInfo->ri_PartitionCheckExpr, econtext);
|
||||
|
||||
/* if asked to emit error, don't actually return on failure */
|
||||
if (!success && emitError)
|
||||
ExecPartitionCheckEmitError(resultRelInfo, slot, estate);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1951,17 +1959,17 @@ ExecPartitionCheckEmitError(ResultRelInfo *resultRelInfo,
|
||||
/*
|
||||
* ExecConstraints - check constraints of the tuple in 'slot'
|
||||
*
|
||||
* This checks the traditional NOT NULL and check constraints, and if
|
||||
* requested, checks the partition constraint.
|
||||
* This checks the traditional NOT NULL and check constraints.
|
||||
*
|
||||
* The partition constraint is *NOT* checked.
|
||||
*
|
||||
* Note: 'slot' contains the tuple to check the constraints of, which may
|
||||
* have been converted from the original input tuple after tuple routing.
|
||||
* 'resultRelInfo' is the original result relation, before tuple routing.
|
||||
* 'resultRelInfo' is the final result relation, after tuple routing.
|
||||
*/
|
||||
void
|
||||
ExecConstraints(ResultRelInfo *resultRelInfo,
|
||||
TupleTableSlot *slot, EState *estate,
|
||||
bool check_partition_constraint)
|
||||
TupleTableSlot *slot, EState *estate)
|
||||
{
|
||||
Relation rel = resultRelInfo->ri_RelationDesc;
|
||||
TupleDesc tupdesc = RelationGetDescr(rel);
|
||||
@ -2076,13 +2084,8 @@ ExecConstraints(ResultRelInfo *resultRelInfo,
|
||||
errtableconstraint(orig_rel, failed)));
|
||||
}
|
||||
}
|
||||
|
||||
if (check_partition_constraint && resultRelInfo->ri_PartitionCheck &&
|
||||
!ExecPartitionCheck(resultRelInfo, slot, estate))
|
||||
ExecPartitionCheckEmitError(resultRelInfo, slot, estate);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ExecWithCheckOptions -- check that tuple satisfies any WITH CHECK OPTIONs
|
||||
* of the specified kind.
|
||||
|
Reference in New Issue
Block a user