|
|
|
|
@ -8,7 +8,7 @@ |
|
|
|
|
* |
|
|
|
|
* |
|
|
|
|
* IDENTIFICATION |
|
|
|
|
* $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.103 2002/08/30 23:59:46 tgl Exp $ |
|
|
|
|
* $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.104 2002/08/31 19:09:27 tgl Exp $ |
|
|
|
|
* |
|
|
|
|
*------------------------------------------------------------------------- |
|
|
|
|
*/ |
|
|
|
|
@ -69,8 +69,9 @@ static Datum ExecEvalNullTest(NullTest *ntest, ExprContext *econtext, |
|
|
|
|
bool *isNull, ExprDoneCond *isDone); |
|
|
|
|
static Datum ExecEvalBooleanTest(BooleanTest *btest, ExprContext *econtext, |
|
|
|
|
bool *isNull, ExprDoneCond *isDone); |
|
|
|
|
static Datum ExecEvalConstraint(Constraint *constraint, ExprContext *econtext, |
|
|
|
|
bool *isNull, ExprDoneCond *isDone); |
|
|
|
|
static Datum ExecEvalConstraintTest(ConstraintTest *constraint, |
|
|
|
|
ExprContext *econtext, |
|
|
|
|
bool *isNull, ExprDoneCond *isDone); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*----------
|
|
|
|
|
@ -1465,43 +1466,6 @@ ExecEvalNullTest(NullTest *ntest, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* ExecEvalConstraint |
|
|
|
|
* |
|
|
|
|
* Test the constraint against the data provided. If the data fits |
|
|
|
|
* within the constraint specifications, pass it through (return the |
|
|
|
|
* datum) otherwise throw an error. |
|
|
|
|
*/ |
|
|
|
|
static Datum |
|
|
|
|
ExecEvalConstraint(Constraint *constraint, ExprContext *econtext, |
|
|
|
|
bool *isNull, ExprDoneCond *isDone) |
|
|
|
|
{ |
|
|
|
|
Datum result; |
|
|
|
|
|
|
|
|
|
result = ExecEvalExpr(constraint->raw_expr, econtext, isNull, isDone); |
|
|
|
|
|
|
|
|
|
/* Test for the constraint type */ |
|
|
|
|
switch(constraint->contype) |
|
|
|
|
{ |
|
|
|
|
case CONSTR_NOTNULL: |
|
|
|
|
if (*isNull) |
|
|
|
|
{ |
|
|
|
|
elog(ERROR, "Domain %s does not allow NULL values", constraint->name); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case CONSTR_CHECK: |
|
|
|
|
|
|
|
|
|
elog(ERROR, "ExecEvalConstraint: Domain CHECK Constraints not yet implemented"); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
elog(ERROR, "ExecEvalConstraint: Constraint type unknown"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* If all has gone well (constraint did not fail) return the datum */ |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------------
|
|
|
|
|
* ExecEvalBooleanTest |
|
|
|
|
* |
|
|
|
|
@ -1582,6 +1546,41 @@ ExecEvalBooleanTest(BooleanTest *btest, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* ExecEvalConstraintTest |
|
|
|
|
* |
|
|
|
|
* Test the constraint against the data provided. If the data fits |
|
|
|
|
* within the constraint specifications, pass it through (return the |
|
|
|
|
* datum) otherwise throw an error. |
|
|
|
|
*/ |
|
|
|
|
static Datum |
|
|
|
|
ExecEvalConstraintTest(ConstraintTest *constraint, ExprContext *econtext, |
|
|
|
|
bool *isNull, ExprDoneCond *isDone) |
|
|
|
|
{ |
|
|
|
|
Datum result; |
|
|
|
|
|
|
|
|
|
result = ExecEvalExpr(constraint->arg, econtext, isNull, isDone); |
|
|
|
|
|
|
|
|
|
switch (constraint->testtype) |
|
|
|
|
{ |
|
|
|
|
case CONSTR_TEST_NOTNULL: |
|
|
|
|
if (*isNull) |
|
|
|
|
elog(ERROR, "Domain %s does not allow NULL values", |
|
|
|
|
constraint->name); |
|
|
|
|
break; |
|
|
|
|
case CONSTR_TEST_CHECK: |
|
|
|
|
/* TODO: Add CHECK Constraints to domains */ |
|
|
|
|
elog(ERROR, "Domain CHECK Constraints not yet implemented"); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
elog(ERROR, "ExecEvalConstraintTest: Constraint type unknown"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* If all has gone well (constraint did not fail) return the datum */ |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------------
|
|
|
|
|
* ExecEvalFieldSelect |
|
|
|
|
* |
|
|
|
|
@ -1749,12 +1748,6 @@ ExecEvalExpr(Node *expression, |
|
|
|
|
isNull, |
|
|
|
|
isDone); |
|
|
|
|
break; |
|
|
|
|
case T_Constraint: |
|
|
|
|
retDatum = ExecEvalConstraint((Constraint *) expression, |
|
|
|
|
econtext, |
|
|
|
|
isNull, |
|
|
|
|
isDone); |
|
|
|
|
break; |
|
|
|
|
case T_CaseExpr: |
|
|
|
|
retDatum = ExecEvalCase((CaseExpr *) expression, |
|
|
|
|
econtext, |
|
|
|
|
@ -1773,6 +1766,12 @@ ExecEvalExpr(Node *expression, |
|
|
|
|
isNull, |
|
|
|
|
isDone); |
|
|
|
|
break; |
|
|
|
|
case T_ConstraintTest: |
|
|
|
|
retDatum = ExecEvalConstraintTest((ConstraintTest *) expression, |
|
|
|
|
econtext, |
|
|
|
|
isNull, |
|
|
|
|
isDone); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
elog(ERROR, "ExecEvalExpr: unknown expression type %d", |
|
|
|
|
|