mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
tableam: Use in CREATE TABLE AS and CREATE MATERIALIZED VIEW.
Previously those directly performed a heap_insert(). Use table_insert() instead. The input slot of those routines is not of the target relation - we could fix that by copying if necessary, but that'd not be beneficial for performance. As those codepaths don't access any AM specific tuple fields (say xmin/xmax), there's no need to use an AM specific slot. Author: Andres Freund Reviewed-By: Haribabu Kommi Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
This commit is contained in:
@ -27,6 +27,7 @@
|
||||
#include "access/heapam.h"
|
||||
#include "access/reloptions.h"
|
||||
#include "access/htup_details.h"
|
||||
#include "access/tableam.h"
|
||||
#include "access/sysattr.h"
|
||||
#include "access/xact.h"
|
||||
#include "access/xlog.h"
|
||||
@ -572,25 +573,24 @@ static bool
|
||||
intorel_receive(TupleTableSlot *slot, DestReceiver *self)
|
||||
{
|
||||
DR_intorel *myState = (DR_intorel *) self;
|
||||
HeapTuple tuple;
|
||||
|
||||
/*
|
||||
* get the heap tuple out of the tuple table slot, making sure we have a
|
||||
* writable copy
|
||||
* Note that the input slot might not be of the type of the target
|
||||
* relation. That's supported by table_insert(), but slightly less
|
||||
* efficient than inserting with the right slot - but the alternative
|
||||
* would be to copy into a slot of the right type, which would not be
|
||||
* cheap either. This also doesn't allow accessing per-AM data (say a
|
||||
* tuple's xmin), but since we don't do that here...
|
||||
*/
|
||||
tuple = ExecCopySlotHeapTuple(slot);
|
||||
|
||||
heap_insert(myState->rel,
|
||||
tuple,
|
||||
myState->output_cid,
|
||||
myState->hi_options,
|
||||
myState->bistate);
|
||||
table_insert(myState->rel,
|
||||
slot,
|
||||
myState->output_cid,
|
||||
myState->hi_options,
|
||||
myState->bistate);
|
||||
|
||||
/* We know this is a newly created relation, so there are no indexes */
|
||||
|
||||
/* Free the copied tuple. */
|
||||
heap_freetuple(tuple);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user