current_of_index_only_scan_v2.patch
text/x-diff
Filename: current_of_index_only_scan_v2.patch
Type: text/x-diff
Part: 0
Patch
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| src/backend/executor/execCurrent.c | 30 | 15 |
diff --git a/src/backend/executor/execCurrent.c b/src/backend/executor/execCurrent.c
index ce7d4ac..aa2da16 100644
--- a/src/backend/executor/execCurrent.c
+++ b/src/backend/executor/execCurrent.c
@@ -19,6 +19,7 @@
#include "utils/lsyscache.h"
#include "utils/portal.h"
#include "utils/rel.h"
+#include "access/relscan.h"
static char *fetch_cursor_param_value(ExprContext *econtext, int paramId);
@@ -183,21 +184,35 @@ execCurrentOf(CurrentOfExpr *cexpr,
if (TupIsNull(scanstate->ss_ScanTupleSlot))
return false;
- /* Use slot_getattr to catch any possible mistakes */
- tuple_tableoid =
- DatumGetObjectId(slot_getattr(scanstate->ss_ScanTupleSlot,
- TableOidAttributeNumber,
- &lisnull));
- Assert(!lisnull);
- tuple_tid = (ItemPointer)
- DatumGetPointer(slot_getattr(scanstate->ss_ScanTupleSlot,
- SelfItemPointerAttributeNumber,
- &lisnull));
- Assert(!lisnull);
-
- Assert(tuple_tableoid == table_oid);
-
- *current_tid = *tuple_tid;
+ /* In IndexOnlyScan case, the tuple stored in ss_ScanTupleSlot is a
+ * virtual tuple that does not have ctid column, so we have to get TID
+ * from xs_ctup.t_self. */
+ if (IsA(scanstate, IndexOnlyScanState))
+ {
+ IndexScanDesc scan = ((IndexOnlyScanState *)scanstate)->ioss_ScanDesc;
+
+ Assert(RelationGetRelid(scan.heapRelation) == table_oid);
+
+ *current_tid = scan->xs_ctup.t_self;
+ }
+ else
+ {
+ /* Use slot_getattr to catch any possible mistakes */
+ tuple_tableoid =
+ DatumGetObjectId(slot_getattr(scanstate->ss_ScanTupleSlot,
+ TableOidAttributeNumber,
+ &lisnull));
+ Assert(!lisnull);
+ tuple_tid = (ItemPointer)
+ DatumGetPointer(slot_getattr(scanstate->ss_ScanTupleSlot,
+ SelfItemPointerAttributeNumber,
+ &lisnull));
+ Assert(!lisnull);
+
+ Assert(tuple_tableoid == table_oid);
+
+ *current_tid = *tuple_tid;
+ }
return true;
}