tableam: Use in CREATE TABLE AS and CREATE MATERIALIZED VIEW.
authorAndres Freund <[email protected]>
Mon, 25 Mar 2019 01:55:34 +0000 (18:55 -0700)
committerAndres Freund <[email protected]>
Mon, 25 Mar 2019 01:58:37 +0000 (18:58 -0700)
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[email protected]

src/backend/commands/createas.c
src/backend/commands/matview.c

index 36e3d44aad6b758a5d1afc4cb0924b85193bfd26..3bdb67c697cb368c5b05a3df33d41a0b25f5a4b6 100644 (file)
@@ -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;
 }
 
index 5a47be4b33c51f49193d6842af207cb94c44d3a4..5b2cbc7c89cde05bbd3a8c729d545010bedce939 100644 (file)
@@ -477,25 +477,24 @@ static bool
 transientrel_receive(TupleTableSlot *slot, DestReceiver *self)
 {
        DR_transientrel *myState = (DR_transientrel *) 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->transientrel,
-                               tuple,
-                               myState->output_cid,
-                               myState->hi_options,
-                               myState->bistate);
+       table_insert(myState->transientrel,
+                                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;
 }