On Thu, 6 Sep 2012 14:50:05 -0400 Robert Hass wrote:
On Tue, Aug 28, 2012 at 6:40 AM, Amit Kapila
<amit(dot)kapila(at)huawei(dot)com> wrote:
>> AFAICT during Update also, it doesn't contain useful. The only chance it
>> would have contain something useful is when it goes for EvalPlanQual and
>> then again comes to check for constraints. However these attributes get
>> filled in heap_update much later.
>
>> So now should the fix be that it returns an error for system column
>> reference except for OID case?
> +1.
1. I think in this scenario the error for system column except for tableOID
should be thrown at Create/Alter time.
2. After setting OID in ExecInsert/ExecUpdate may be setting of same inside
heap functions can be removed.
But for now I have kept them as it is.
Please find the Patch for bug-fix.
If this is okay, I shall send you the test cases for same.
With Regards,
Amit Kapila.
*** a/src/backend/executor/nodeModifyTable.c
--- b/src/backend/executor/nodeModifyTable.c
***************
*** 226,231 **** ExecInsert(TupleTableSlot *slot,
--- 226,235 ----
}
else
{
+ /* Set the relation OID in tuple here only so that if OID is
used as part of constraint check then
+ * it will be able to evaluate result of constraint correctly.*/
+ tuple->t_tableOid = RelationGetRelid(resultRelationDesc);
+
/*
* Check the constraints of the tuple
*/
***************
*** 540,545 **** ExecUpdate(ItemPointer tupleid,
--- 544,553 ----
}
else
{
+ /* Set the relation OID in tuple here only so that if OID is
used as part of constraint check then
+ * it will be able to evaluate result of constraint
correctly.*/
+ tuple->t_tableOid = RelationGetRelid(resultRelationDesc);
+
/*
* Check the constraints of the tuple
*
*** a/src/backend/parser/parse_relation.c
--- b/src/backend/parser/parse_relation.c
***************
*** 549,554 **** scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte, char
*colname,
--- 549,566 ----
{
/* quick check to see if name could be a system column */
attnum = specialAttNum(colname);
+
+ /* In constraint check, no system column are allowed except
tableoid*/
+ if ((pstate->p_expr_kind == EXPR_KIND_CHECK_CONSTRAINT)
+ &&(attnum < InvalidAttrNumber)
+ && (attnum != TableOidAttributeNumber))
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
+ errmsg("system column \"%s\" reference in check
constraint is invalid", colname),
+ parser_errposition(pstate, location)));
+ }
+
if (attnum != InvalidAttrNumber)
{
/* now check to see if column actually is defined */
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers