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 (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to