mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Code review for domain-constraints patch. Use a new ConstraintTest node
type for runtime constraint checks, instead of misusing the parse-time Constraint node for the purpose. Fix some damage introduced into type coercion logic; in particular ensure that a coerced expression tree will read out the correct result type when inspected (patch had broken some RelabelType cases). Enforce domain NOT NULL constraints against columns that are omitted from an INSERT.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.105 2002/08/31 19:10:08 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.106 2002/08/31 22:10:43 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",
|
||||
|
Reference in New Issue
Block a user