@ -26,7 +26,7 @@
*
*
* IDENTIFICATION
* $ PostgreSQL : pgsql / src / backend / executor / execMain . c , v 1.322 2009 / 02 / 02 19 : 31 : 39 alvherre Exp $
* $ PostgreSQL : pgsql / src / backend / executor / execMain . c , v 1.323 2009 / 02 / 08 18 : 02 : 27 tgl Exp $
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
@ -1766,6 +1766,21 @@ ExecInsert(TupleTableSlot *slot,
resultRelInfo = estate - > es_result_relation_info ;
resultRelationDesc = resultRelInfo - > ri_RelationDesc ;
/*
* If the result relation has OIDs , force the tuple ' s OID to zero so that
* heap_insert will assign a fresh OID . Usually the OID already will be
* zero at this point , but there are corner cases where the plan tree can
* return a tuple extracted literally from some table with the same
* rowtype .
*
* XXX if we ever wanted to allow users to assign their own OIDs to new
* rows , this ' d be the place to do it . For the moment , we make a point
* of doing this before calling triggers , so that a user - supplied trigger
* could hack the OID if desired .
*/
if ( resultRelationDesc - > rd_rel - > relhasoids )
HeapTupleSetOid ( tuple , InvalidOid ) ;
/* BEFORE ROW INSERT Triggers */
if ( resultRelInfo - > ri_TrigDesc & &
resultRelInfo - > ri_TrigDesc - > n_before_row [ TRIGGER_EVENT_INSERT ] > 0 )
@ -3033,6 +3048,12 @@ intorel_receive(TupleTableSlot *slot, DestReceiver *self)
*/
tuple = ExecMaterializeSlot ( slot ) ;
/*
* force assignment of new OID ( see comments in ExecInsert )
*/
if ( myState - > rel - > rd_rel - > relhasoids )
HeapTupleSetOid ( tuple , InvalidOid ) ;
heap_insert ( myState - > rel ,
tuple ,
myState - > estate - > es_output_cid ,