aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execMain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r--src/backend/executor/execMain.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index d511e5f6e56..5ce90902b4c 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -26,7 +26,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.74 1999/02/07 14:20:11 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.75 1999/02/07 16:17:11 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1124,7 +1124,7 @@ ExecAppend(TupleTableSlot *slot,
if (resultRelationDesc->rd_att->constr)
{
- ExecConstraints("ExecAppend", resultRelationDesc, tuple);
+ ExecConstraints("ExecAppend", resultRelationDesc, tuple, estate);
}
/******************
@@ -1327,7 +1327,7 @@ ExecReplace(TupleTableSlot *slot,
if (resultRelationDesc->rd_att->constr)
{
- ExecConstraints("ExecReplace", resultRelationDesc, tuple);
+ ExecConstraints("ExecReplace", resultRelationDesc, tuple, estate);
}
/*
@@ -1472,7 +1472,7 @@ ExecAttrDefault(Relation rel, HeapTuple tuple)
#endif
static char *
-ExecRelCheck(Relation rel, HeapTuple tuple)
+ExecRelCheck(Relation rel, HeapTuple tuple, EState *estate)
{
int ncheck = rel->rd_att->constr->num_check;
ConstrCheck *check = rel->rd_att->constr->check;
@@ -1505,14 +1505,24 @@ ExecRelCheck(Relation rel, HeapTuple tuple)
econtext->ecxt_param_exec_vals = NULL; /* exec param values */
econtext->ecxt_range_table = rtlist; /* range table */
+ if (estate->es_result_relation_constraints == NULL)
+ {
+ estate->es_result_relation_constraints =
+ (List **)palloc(ncheck * sizeof(List *));
+
+ for (i = 0; i < ncheck; i++)
+ {
+ qual = (List *) stringToNode(check[i].ccbin);
+ estate->es_result_relation_constraints[i] = qual;
+ }
+ }
+
for (i = 0; i < ncheck; i++)
{
- qual = (List *) stringToNode(check[i].ccbin);
+ qual = estate->es_result_relation_constraints[i];
res = ExecQual(qual, econtext);
- freeObject(qual);
-
if (!res)
return check[i].ccname;
}
@@ -1528,7 +1538,7 @@ ExecRelCheck(Relation rel, HeapTuple tuple)
}
void
-ExecConstraints(char *caller, Relation rel, HeapTuple tuple)
+ExecConstraints(char *caller, Relation rel, HeapTuple tuple, EState *estate)
{
Assert(rel->rd_att->constr);
@@ -1549,7 +1559,7 @@ ExecConstraints(char *caller, Relation rel, HeapTuple tuple)
{
char *failed;
- if ((failed = ExecRelCheck(rel, tuple)) != NULL)
+ if ((failed = ExecRelCheck(rel, tuple, estate)) != NULL)
elog(ERROR, "%s: rejected due to CHECK constraint %s", caller, failed);
}