]> granicus.if.org Git - postgresql/commitdiff
tableam: Add table_get_latest_tid, to wrap heap_get_latest_tid.
authorAndres Freund <andres@anarazel.de>
Tue, 26 Mar 2019 00:14:48 +0000 (17:14 -0700)
committerAndres Freund <andres@anarazel.de>
Tue, 26 Mar 2019 00:14:48 +0000 (17:14 -0700)
This primarily is to allow WHERE CURRENT OF to continue to work as it
currently does. It's not clear to me that these semantics make sense
for every AM, but it works for the in-core heap, and the out of core
zheap. We can refine it further at a later point if necessary.

Author: Andres Freund
Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de

src/backend/access/heap/heapam_handler.c
src/backend/executor/nodeTidscan.c
src/backend/utils/adt/tid.c
src/include/access/tableam.h

index 00ca71a3d2a27aeba2c206fdacd787beee41297c..56223921e72ca66777217cd8bdfc0d3af3d74d85 100644 (file)
@@ -542,6 +542,7 @@ static const TableAmRoutine heapam_methods = {
        .tuple_lock = heapam_tuple_lock,
 
        .tuple_fetch_row_version = heapam_fetch_row_version,
+       .tuple_get_latest_tid = heap_get_latest_tid,
        .tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,
 };
 
index d8f9eb355703e2401bcab5ba9ed945d07b03e92c..156be56a57d3637a3f3ef79a386a7a4d6ea27975 100644 (file)
@@ -22,7 +22,6 @@
  */
 #include "postgres.h"
 
-#include "access/heapam.h"
 #include "access/sysattr.h"
 #include "access/tableam.h"
 #include "catalog/pg_type.h"
@@ -308,7 +307,6 @@ TidNext(TidScanState *node)
        ScanDirection direction;
        Snapshot        snapshot;
        Relation        heapRelation;
-       HeapTuple       tuple;
        TupleTableSlot *slot;
        ItemPointerData *tidList;
        int                     numTids;
@@ -332,12 +330,6 @@ TidNext(TidScanState *node)
        tidList = node->tss_TidList;
        numTids = node->tss_NumTids;
 
-       /*
-        * We use node->tss_htup as the tuple pointer; note this can't just be a
-        * local variable here, as the scan tuple slot will keep a pointer to it.
-        */
-       tuple = &(node->tss_htup);
-
        /*
         * Initialize or advance scan position, depending on direction.
         */
@@ -365,7 +357,7 @@ TidNext(TidScanState *node)
 
        while (node->tss_TidPtr >= 0 && node->tss_TidPtr < numTids)
        {
-               tuple->t_self = tidList[node->tss_TidPtr];
+               ItemPointerData tid = tidList[node->tss_TidPtr];
 
                /*
                 * For WHERE CURRENT OF, the tuple retrieved from the cursor might
@@ -373,10 +365,9 @@ TidNext(TidScanState *node)
                 * current according to our snapshot.
                 */
                if (node->tss_isCurrentOf)
-                       heap_get_latest_tid(heapRelation, snapshot, &tuple->t_self);
+                       table_get_latest_tid(heapRelation, snapshot, &tid);
 
-               if (table_fetch_row_version(heapRelation, &tuple->t_self, snapshot,
-                                                                       slot))
+               if (table_fetch_row_version(heapRelation, &tid, snapshot, slot))
                        return slot;
 
                /* Bad TID or failed snapshot qual; try next */
index 8c62771261d716e53bf3f6f12e306e8d13b6b614..6ab26d8ea8b4c4b0a570b11a59e924a45e949659 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "access/heapam.h"
 #include "access/sysattr.h"
+#include "access/tableam.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_type.h"
 #include "libpq/pqformat.h"
@@ -379,7 +380,7 @@ currtid_byreloid(PG_FUNCTION_ARGS)
        ItemPointerCopy(tid, result);
 
        snapshot = RegisterSnapshot(GetLatestSnapshot());
-       heap_get_latest_tid(rel, snapshot, result);
+       table_get_latest_tid(rel, snapshot, result);
        UnregisterSnapshot(snapshot);
 
        table_close(rel, AccessShareLock);
@@ -414,7 +415,7 @@ currtid_byrelname(PG_FUNCTION_ARGS)
        ItemPointerCopy(tid, result);
 
        snapshot = RegisterSnapshot(GetLatestSnapshot());
-       heap_get_latest_tid(rel, snapshot, result);
+       table_get_latest_tid(rel, snapshot, result);
        UnregisterSnapshot(snapshot);
 
        table_close(rel, AccessShareLock);
index 29371f4c479bd9a7117968ec0c98bb3f66a9b3cc..4699335cdfd63b61cce898b40296fc6234b7ffb0 100644 (file)
@@ -283,6 +283,14 @@ typedef struct TableAmRoutine
                                                                                        Snapshot snapshot,
                                                                                        TupleTableSlot *slot);
 
+       /*
+        * Return the latest version of the tuple at `tid`, by updating `tid` to
+        * point at the newest version.
+        */
+       void            (*tuple_get_latest_tid) (Relation rel,
+                                                                                Snapshot snapshot,
+                                                                                ItemPointer tid);
+
        /*
         * Does the tuple in `slot` satisfy `snapshot`?  The slot needs to be of
         * the appropriate type for the AM.
@@ -656,6 +664,16 @@ table_fetch_row_version(Relation rel,
        return rel->rd_tableam->tuple_fetch_row_version(rel, tid, snapshot, slot);
 }
 
+/*
+ * Return the latest version of the tuple at `tid`, by updating `tid` to
+ * point at the newest version.
+ */
+static inline void
+table_get_latest_tid(Relation rel, Snapshot snapshot, ItemPointer tid)
+{
+       rel->rd_tableam->tuple_get_latest_tid(rel, snapshot, tid);
+}
+
 /*
  * Return true iff tuple in slot satisfies the snapshot.
  *