aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/heap/heapam.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/heap/heapam.c')
-rw-r--r--src/backend/access/heap/heapam.c109
1 files changed, 7 insertions, 102 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 3a184f2eccb..f7b08ffdd13 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -57,7 +57,6 @@
#include "access/xlogutils.h"
#include "catalog/catalog.h"
#include "catalog/namespace.h"
-#include "catalog/index.h"
#include "miscadmin.h"
#include "pgstat.h"
#include "port/atomics.h"
@@ -76,9 +75,7 @@
#include "utils/snapmgr.h"
#include "utils/syscache.h"
#include "utils/tqual.h"
-#include "utils/memutils.h"
-#include "nodes/execnodes.h"
-#include "executor/executor.h"
+
/* GUC variable */
bool synchronize_seqscans = true;
@@ -130,7 +127,6 @@ static bool ConditionalMultiXactIdWait(MultiXactId multi, MultiXactStatus status
static XLogRecPtr log_heap_new_cid(Relation relation, HeapTuple tup);
static HeapTuple ExtractReplicaIdentity(Relation rel, HeapTuple tup, bool key_modified,
bool *copy);
-static bool ProjIndexIsUnchanged(Relation relation, HeapTuple oldtup, HeapTuple newtup);
/*
@@ -3511,7 +3507,6 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
HTSU_Result result;
TransactionId xid = GetCurrentTransactionId();
Bitmapset *hot_attrs;
- Bitmapset *proj_idx_attrs;
Bitmapset *key_attrs;
Bitmapset *id_attrs;
Bitmapset *interesting_attrs;
@@ -3575,11 +3570,12 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
* Note that we get copies of each bitmap, so we need not worry about
* relcache flush happening midway through.
*/
- hot_attrs = RelationGetIndexAttrBitmap(relation, INDEX_ATTR_BITMAP_HOT);
- proj_idx_attrs = RelationGetIndexAttrBitmap(relation, INDEX_ATTR_BITMAP_PROJ);
+ hot_attrs = RelationGetIndexAttrBitmap(relation, INDEX_ATTR_BITMAP_ALL);
key_attrs = RelationGetIndexAttrBitmap(relation, INDEX_ATTR_BITMAP_KEY);
id_attrs = RelationGetIndexAttrBitmap(relation,
INDEX_ATTR_BITMAP_IDENTITY_KEY);
+
+
block = ItemPointerGetBlockNumber(otid);
buffer = ReadBuffer(relation, block);
page = BufferGetPage(buffer);
@@ -3599,7 +3595,6 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
if (!PageIsFull(page))
{
interesting_attrs = bms_add_members(interesting_attrs, hot_attrs);
- interesting_attrs = bms_add_members(interesting_attrs, proj_idx_attrs);
hot_attrs_checked = true;
}
interesting_attrs = bms_add_members(interesting_attrs, key_attrs);
@@ -3883,7 +3878,6 @@ l2:
if (vmbuffer != InvalidBuffer)
ReleaseBuffer(vmbuffer);
bms_free(hot_attrs);
- bms_free(proj_idx_attrs);
bms_free(key_attrs);
bms_free(id_attrs);
bms_free(modified_attrs);
@@ -4191,18 +4185,11 @@ l2:
/*
* Since the new tuple is going into the same page, we might be able
* to do a HOT update. Check if any of the index columns have been
- * changed, or if we have projection functional indexes, check whether
- * the old and the new values are the same. If the page was already
- * full, we may have skipped checking for index columns. If so, HOT
- * update is possible.
+ * changed. If the page was already full, we may have skipped checking
+ * for index columns. If so, HOT update is possible.
*/
- if (hot_attrs_checked
- && !bms_overlap(modified_attrs, hot_attrs)
- && (!bms_overlap(modified_attrs, proj_idx_attrs)
- || ProjIndexIsUnchanged(relation, &oldtup, newtup)))
- {
+ if (hot_attrs_checked && !bms_overlap(modified_attrs, hot_attrs))
use_hot_update = true;
- }
}
else
{
@@ -4364,7 +4351,6 @@ l2:
heap_freetuple(old_key_tuple);
bms_free(hot_attrs);
- bms_free(proj_idx_attrs);
bms_free(key_attrs);
bms_free(id_attrs);
bms_free(modified_attrs);
@@ -4451,87 +4437,6 @@ heap_tuple_attr_equals(TupleDesc tupdesc, int attrnum,
}
/*
- * Check whether the value is unchanged after update of a projection
- * functional index. Compare the new and old values of the indexed
- * expression to see if we are able to use a HOT update or not.
- */
-static bool
-ProjIndexIsUnchanged(Relation relation, HeapTuple oldtup, HeapTuple newtup)
-{
- ListCell *l;
- List *indexoidlist = RelationGetIndexList(relation);
- EState *estate = CreateExecutorState();
- ExprContext *econtext = GetPerTupleExprContext(estate);
- TupleTableSlot *slot = MakeSingleTupleTableSlot(RelationGetDescr(relation),
- &TTSOpsHeapTuple);
- bool equals = true;
- Datum old_values[INDEX_MAX_KEYS];
- bool old_isnull[INDEX_MAX_KEYS];
- Datum new_values[INDEX_MAX_KEYS];
- bool new_isnull[INDEX_MAX_KEYS];
- int indexno = 0;
-
- econtext->ecxt_scantuple = slot;
-
- foreach(l, indexoidlist)
- {
- if (bms_is_member(indexno, relation->rd_projidx))
- {
- Oid indexOid = lfirst_oid(l);
- Relation indexDesc = index_open(indexOid, AccessShareLock);
- IndexInfo *indexInfo = BuildIndexInfo(indexDesc);
- int i;
-
- ResetExprContext(econtext);
- ExecStoreHeapTuple(oldtup, slot, false);
- FormIndexDatum(indexInfo,
- slot,
- estate,
- old_values,
- old_isnull);
-
- ExecStoreHeapTuple(newtup, slot, false);
- FormIndexDatum(indexInfo,
- slot,
- estate,
- new_values,
- new_isnull);
-
- for (i = 0; i < indexInfo->ii_NumIndexAttrs; i++)
- {
- if (old_isnull[i] != new_isnull[i])
- {
- equals = false;
- break;
- }
- else if (!old_isnull[i])
- {
- Form_pg_attribute att = TupleDescAttr(RelationGetDescr(indexDesc), i);
-
- if (!datumIsEqual(old_values[i], new_values[i], att->attbyval, att->attlen))
- {
- equals = false;
- break;
- }
- }
- }
- index_close(indexDesc, AccessShareLock);
-
- if (!equals)
- {
- break;
- }
- }
- indexno += 1;
- }
- ExecDropSingleTupleTableSlot(slot);
- FreeExecutorState(estate);
-
- return equals;
-}
-
-
-/*
* Check which columns are being updated.
*
* Given an updated tuple, determine (and return into the output bitmapset),