Sorry, earlier sent below mail on hackers instead of bugs list. Just forwarding the same here.
________________________________________ From: pgsql-hackers-ow...@postgresql.org [pgsql-hackers-ow...@postgresql.org] on behalf of Amit kapila [amit.kap...@huawei.com] Sent: Friday, September 14, 2012 7:34 PM To: robertmh...@gmail.com Cc: t...@sss.pgh.pa.us; pgsql-hackers@postgresql.org Subject: Re: [HACKERS] Minor inheritance/check bug: Inconsistent behavior 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
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers