*** 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 */