mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
The UNDEFOID later causes an assertion failure in heap_formtuple when
you try to use the tupdesc to build a tuple. Joe Conway
This commit is contained in:
parent
1bab464eb4
commit
0da6cf54ec
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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);
|
bool *isNull, ExprDoneCond *isDone);
|
||||||
static Datum ExecEvalBooleanTest(BooleanTest *btest, ExprContext *econtext,
|
static Datum ExecEvalBooleanTest(BooleanTest *btest, ExprContext *econtext,
|
||||||
bool *isNull, ExprDoneCond *isDone);
|
bool *isNull, ExprDoneCond *isDone);
|
||||||
static Datum ExecEvalConstraint(Constraint *constraint, ExprContext *econtext,
|
static Datum ExecEvalConstraintTest(ConstraintTest *constraint,
|
||||||
bool *isNull, ExprDoneCond *isDone);
|
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
|
* 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
|
* ExecEvalFieldSelect
|
||||||
*
|
*
|
||||||
@ -1749,12 +1748,6 @@ ExecEvalExpr(Node *expression,
|
|||||||
isNull,
|
isNull,
|
||||||
isDone);
|
isDone);
|
||||||
break;
|
break;
|
||||||
case T_Constraint:
|
|
||||||
retDatum = ExecEvalConstraint((Constraint *) expression,
|
|
||||||
econtext,
|
|
||||||
isNull,
|
|
||||||
isDone);
|
|
||||||
break;
|
|
||||||
case T_CaseExpr:
|
case T_CaseExpr:
|
||||||
retDatum = ExecEvalCase((CaseExpr *) expression,
|
retDatum = ExecEvalCase((CaseExpr *) expression,
|
||||||
econtext,
|
econtext,
|
||||||
@ -1773,6 +1766,12 @@ ExecEvalExpr(Node *expression,
|
|||||||
isNull,
|
isNull,
|
||||||
isDone);
|
isDone);
|
||||||
break;
|
break;
|
||||||
|
case T_ConstraintTest:
|
||||||
|
retDatum = ExecEvalConstraintTest((ConstraintTest *) expression,
|
||||||
|
econtext,
|
||||||
|
isNull,
|
||||||
|
isDone);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
elog(ERROR, "ExecEvalExpr: unknown expression type %d",
|
elog(ERROR, "ExecEvalExpr: unknown expression type %d",
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeFunctionscan.c,v 1.9 2002/08/30 23:59:46 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/nodeFunctionscan.c,v 1.10 2002/08/31 19:09:27 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -226,6 +226,7 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, Plan *parent)
|
|||||||
List *coldeflist = rte->coldeflist;
|
List *coldeflist = rte->coldeflist;
|
||||||
|
|
||||||
tupdesc = BuildDescForRelation(coldeflist);
|
tupdesc = BuildDescForRelation(coldeflist);
|
||||||
|
tupdesc->tdhasoid = WITHOUTOID;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
elog(ERROR, "Unknown kind of return type specified for function");
|
elog(ERROR, "Unknown kind of return type specified for function");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user