@ -2842,6 +2842,7 @@ typedef struct
{
{
DestReceiver pub ; /* publicly-known function pointers */
DestReceiver pub ; /* publicly-known function pointers */
EState * estate ; /* EState we are working with */
EState * estate ; /* EState we are working with */
DestReceiver * origdest ; /* QueryDesc's original receiver */
Relation rel ; /* Relation to write to */
Relation rel ; /* Relation to write to */
int hi_options ; /* heap_insert performance options */
int hi_options ; /* heap_insert performance options */
BulkInsertState bistate ; /* bulk insert state */
BulkInsertState bistate ; /* bulk insert state */
@ -2999,12 +3000,14 @@ OpenIntoRel(QueryDesc *queryDesc)
/*
/*
* Now replace the query ' s DestReceiver with one for SELECT INTO
* Now replace the query ' s DestReceiver with one for SELECT INTO
*/
*/
queryDesc - > dest = CreateDestReceiver ( DestIntoRel ) ;
myState = ( DR_intorel * ) CreateDestReceiver ( DestIntoRel ) ;
myState = ( DR_intorel * ) queryDesc - > dest ;
Assert ( myState - > pub . mydest = = DestIntoRel ) ;
Assert ( myState - > pub . mydest = = DestIntoRel ) ;
myState - > estate = estate ;
myState - > estate = estate ;
myState - > origdest = queryDesc - > dest ;
myState - > rel = intoRelationDesc ;
myState - > rel = intoRelationDesc ;
queryDesc - > dest = ( DestReceiver * ) myState ;
/*
/*
* We can skip WAL - logging the insertions , unless PITR is in use . We can
* We can skip WAL - logging the insertions , unless PITR is in use . We can
* skip the FSM in any case .
* skip the FSM in any case .
@ -3025,8 +3028,11 @@ CloseIntoRel(QueryDesc *queryDesc)
{
{
DR_intorel * myState = ( DR_intorel * ) queryDesc - > dest ;
DR_intorel * myState = ( DR_intorel * ) queryDesc - > dest ;
/* OpenIntoRel might never have gotten called */
/*
if ( myState & & myState - > pub . mydest = = DestIntoRel & & myState - > rel )
* OpenIntoRel might never have gotten called , and we also want to guard
* against double destruction .
*/
if ( myState & & myState - > pub . mydest = = DestIntoRel )
{
{
FreeBulkInsertState ( myState - > bistate ) ;
FreeBulkInsertState ( myState - > bistate ) ;
@ -3037,7 +3043,11 @@ CloseIntoRel(QueryDesc *queryDesc)
/* close rel, but keep lock until commit */
/* close rel, but keep lock until commit */
heap_close ( myState - > rel , NoLock ) ;
heap_close ( myState - > rel , NoLock ) ;
myState - > rel = NULL ;
/* restore the receiver belonging to executor's caller */
queryDesc - > dest = myState - > origdest ;
/* might as well invoke my destructor */
intorel_destroy ( ( DestReceiver * ) myState ) ;
}
}
}
}