@ -1849,16 +1849,12 @@ 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 .
*/
void
bool
ExecPartitionCheck ( ResultRelInfo * resultRelInfo , TupleTableSlot * slot ,
EState * estate )
{
Relation rel = resultRelInfo - > ri_RelationDesc ;
TupleDesc tupdesc = RelationGetDescr ( rel ) ;
Bitmapset * modifiedCols ;
Bitmapset * insertedCols ;
Bitmapset * updatedCols ;
ExprContext * econtext ;
/*
@ -1886,12 +1882,30 @@ ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot,
* As in case of the catalogued constraints , we treat a NULL result as
* success here , not a failure .
*/
if ( ! ExecCheck ( resultRelInfo - > ri_PartitionCheckExpr , econtext ) )
return ExecCheck ( resultRelInfo - > ri_PartitionCheckExpr , econtext ) ;
}
/*
* ExecPartitionCheckEmitError - Form and emit an error message after a failed
* partition constraint check .
*/
void
ExecPartitionCheckEmitError ( ResultRelInfo * resultRelInfo ,
TupleTableSlot * slot ,
EState * estate )
{
char * val_desc ;
Relation rel = resultRelInfo - > ri_RelationD esc;
Relation orig_rel = rel ;
TupleDesc tupdesc = RelationGetDescr ( rel ) ;
char * val_desc ;
Bitmapset * modifiedCols ;
Bitmapset * insertedCols ;
Bitmapset * updatedCols ;
/* See the comment above. */
/*
* Need to first convert the tuple to the root partitioned table ' s row
* type . For details , check similar comments in ExecConstraints ( ) .
*/
if ( resultRelInfo - > ri_PartitionRoot )
{
HeapTuple tuple = ExecFetchSlotTuple ( slot ) ;
@ -1925,13 +1939,12 @@ ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot,
RelationGetRelationName ( orig_rel ) ) ,
val_desc ? errdetail ( " Failing row contains %s. " , val_desc ) : 0 ) ) ;
}
}
/*
* ExecConstraints - check constraints of the tuple in ' slot '
*
* This checks the traditional NOT NULL and check constraints , as well as
* the partition constraint , if any .
* This checks the traditional NOT NULL and check constraints , and if
* requested , checks the partition constraint .
*
* Note : ' slot ' contains the tuple to check the constraints of , which may
* have been converted from the original input tuple after tuple routing .
@ -1939,7 +1952,8 @@ ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot,
*/
void
ExecConstraints ( ResultRelInfo * resultRelInfo ,
TupleTableSlot * slot , EState * estate )
TupleTableSlot * slot , EState * estate ,
bool check_partition_constraint )
{
Relation rel = resultRelInfo - > ri_RelationDesc ;
TupleDesc tupdesc = RelationGetDescr ( rel ) ;
@ -2055,8 +2069,9 @@ ExecConstraints(ResultRelInfo *resultRelInfo,
}
}
if ( resultRelInfo - > ri_PartitionCheck )
ExecPartitionCheck ( resultRelInfo , slot , estate ) ;
if ( check_partition_constraint & & resultRelInfo - > ri_PartitionCheck & &
! ExecPartitionCheck ( resultRelInfo , slot , estate ) )
ExecPartitionCheckEmitError ( resultRelInfo , slot , estate ) ;
}