Finish reverting "recheck_on_update" patch.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Jan 2019 17:07:10 +0000 (12:07 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Jan 2019 17:07:10 +0000 (12:07 -0500)
This reverts commit c203d6cf8 and some follow-on fixes, completing the
task begun in commit 5d28c9bd7.  If that feature is ever resurrected,
the code will look quite a bit different from this, so it seems best
to start from a clean slate.

The v11 branch is not touched; in that branch, the recheck_on_update
storage option remains present, but nonfunctional and undocumented.

Discussion: https://postgr.es/m/20190114223409.3tcvejfhlvbucrv5@alap3.anarazel.de

src/backend/access/common/reloptions.c
src/backend/access/heap/heapam.c
src/backend/catalog/index.c
src/backend/utils/cache/relcache.c
src/bin/psql/tab-complete.c
src/include/access/reloptions.h
src/include/utils/rel.h
src/include/utils/relcache.h

index f5efe94b7b983b548f9fd79c9f7ba164306ac325..cdf1f4af62dfdcac24ba663ced1d6a5a8e574ad2 100644 (file)
@@ -129,15 +129,6 @@ static relopt_bool boolRelOpts[] =
        },
        true
    },
-   {
-       {
-           "recheck_on_update",
-           "Recheck functional index expression for changed value after update",
-           RELOPT_KIND_INDEX,
-           ShareUpdateExclusiveLock    /* since only applies to later UPDATEs */
-       },
-       true
-   },
    {
        {
            "security_barrier",
@@ -1343,7 +1334,7 @@ fillRelOptions(void *rdopts, Size basesize,
                break;
            }
        }
-       if (validate && !found && options[i].gen->kinds != RELOPT_KIND_INDEX)
+       if (validate && !found)
            elog(ERROR, "reloption \"%s\" not found in parse table",
                 options[i].gen->name);
    }
@@ -1501,40 +1492,6 @@ index_reloptions(amoptions_function amoptions, Datum reloptions, bool validate)
    return amoptions(reloptions, validate);
 }
 
-/*
- * Parse generic options for all indexes.
- *
- * reloptions  options as text[] datum
- * validate    error flag
- */
-bytea *
-index_generic_reloptions(Datum reloptions, bool validate)
-{
-   int         numoptions;
-   GenericIndexOpts *idxopts;
-   relopt_value *options;
-   static const relopt_parse_elt tab[] = {
-       {"recheck_on_update", RELOPT_TYPE_BOOL, offsetof(GenericIndexOpts, recheck_on_update)}
-   };
-
-   options = parseRelOptions(reloptions, validate,
-                             RELOPT_KIND_INDEX,
-                             &numoptions);
-
-   /* if none set, we're done */
-   if (numoptions == 0)
-       return NULL;
-
-   idxopts = allocateReloptStruct(sizeof(GenericIndexOpts), options, numoptions);
-
-   fillRelOptions((void *) idxopts, sizeof(GenericIndexOpts), options, numoptions,
-                  validate, tab, lengthof(tab));
-
-   pfree(options);
-
-   return (bytea *) idxopts;
-}
-
 /*
  * Option parser for attribute reloptions
  */
index 3a184f2eccbe7b0dd73eb84106dd91efc3e0dc5e..f7b08ffdd13c82d62fd4247632e69920ffe61266 100644 (file)
@@ -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);
@@ -4450,87 +4436,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.
  *
index 761218f0574b8c56135b75b6160075ed1774b626..8701e3a791cf50d6d68f515b66356ab07c73c0f2 100644 (file)
@@ -27,7 +27,6 @@
 #include "access/heapam.h"
 #include "access/multixact.h"
 #include "access/relscan.h"
-#include "access/reloptions.h"
 #include "access/sysattr.h"
 #include "access/transam.h"
 #include "access/visibilitymap.h"
@@ -355,7 +354,7 @@ ConstructTupleDescriptor(Relation heapRelation,
            /* Simple index column */
            const FormData_pg_attribute *from;
 
-           Assert(atnum > 0); /* should've been caught above */
+           Assert(atnum > 0);  /* should've been caught above */
 
            if (atnum > natts)  /* safety check */
                elog(ERROR, "invalid column number %d", atnum);
@@ -3903,7 +3902,7 @@ reindex_relation(Oid relid, int flags, int options)
 
    /* Ensure rd_indexattr is valid; see comments for RelationSetIndexList */
    if (is_pg_class)
-       (void) RelationGetIndexAttrBitmap(rel, INDEX_ATTR_BITMAP_HOT);
+       (void) RelationGetIndexAttrBitmap(rel, INDEX_ATTR_BITMAP_ALL);
 
    PG_TRY();
    {
index df30bff6c999f350dabce48a1a25e0b1b19296e9..e3b1473e6c9905cc2170b93cde7bacd53b14e00a 100644 (file)
 #include "miscadmin.h"
 #include "nodes/nodeFuncs.h"
 #include "optimizer/clauses.h"
-#include "optimizer/cost.h"
 #include "optimizer/prep.h"
 #include "optimizer/var.h"
 #include "partitioning/partbounds.h"
-#include "pgstat.h"
 #include "rewrite/rewriteDefine.h"
 #include "rewrite/rowsecurity.h"
 #include "storage/lmgr.h"
@@ -2266,11 +2264,9 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc)
    list_free_deep(relation->rd_fkeylist);
    list_free(relation->rd_indexlist);
    bms_free(relation->rd_indexattr);
-   bms_free(relation->rd_projindexattr);
    bms_free(relation->rd_keyattr);
    bms_free(relation->rd_pkattr);
    bms_free(relation->rd_idattr);
-   bms_free(relation->rd_projidx);
    if (relation->rd_pubactions)
        pfree(relation->rd_pubactions);
    if (relation->rd_options)
@@ -4401,7 +4397,7 @@ RelationGetStatExtList(Relation relation)
 
    while (HeapTupleIsValid(htup = systable_getnext(indscan)))
    {
-       Oid oid = ((Form_pg_statistic_ext) GETSTRUCT(htup))->oid;
+       Oid         oid = ((Form_pg_statistic_ext) GETSTRUCT(htup))->oid;
 
        result = insert_ordered_oid(result, oid);
    }
@@ -4675,77 +4671,6 @@ RelationGetIndexPredicate(Relation relation)
    return result;
 }
 
-#define HEURISTIC_MAX_HOT_RECHECK_EXPR_COST 1000
-
-/*
- * Check if functional index is projection: index expression returns some subset
- * of its argument values. During HOT update check we handle projection indexes
- * differently: instead of checking if any of attributes used in indexed
- * expression were updated, we calculate and compare values of index expression
- * for old and new tuple values.
- *
- * Decision made by this function is based on two sources:
- * 1. Calculated cost of index expression: if greater than some heuristic limit
-     then extra comparison of index expression values is expected to be too
-     expensive, so we don't attempt it by default.
- * 2. "recheck_on_update" index option explicitly set by user, which overrides 1)
- */
-static bool
-IsProjectionFunctionalIndex(Relation index, IndexInfo *ii)
-{
-   bool        is_projection = false;
-
-#ifdef NOT_USED
-   if (ii->ii_Expressions)
-   {
-       HeapTuple   tuple;
-       Datum       reloptions;
-       bool        isnull;
-       QualCost    index_expr_cost;
-
-       /* by default functional index is considered as non-injective */
-       is_projection = true;
-
-       cost_qual_eval(&index_expr_cost, ii->ii_Expressions, NULL);
-
-       /*
-        * If index expression is too expensive, then disable projection
-        * optimization, because extra evaluation of index expression is
-        * expected to be more expensive than index update.  Currently the
-        * projection optimization has to calculate index expression twice
-        * when the value of index expression has not changed and three times
-        * when values differ because the expression is recalculated when
-        * inserting a new index entry for the changed value.
-        */
-       if ((index_expr_cost.startup + index_expr_cost.per_tuple) >
-           HEURISTIC_MAX_HOT_RECHECK_EXPR_COST)
-           is_projection = false;
-
-       tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(RelationGetRelid(index)));
-       if (!HeapTupleIsValid(tuple))
-           elog(ERROR, "cache lookup failed for relation %u", RelationGetRelid(index));
-
-       reloptions = SysCacheGetAttr(RELOID, tuple,
-                                    Anum_pg_class_reloptions, &isnull);
-       if (!isnull)
-       {
-           GenericIndexOpts *idxopts;
-
-           idxopts = (GenericIndexOpts *) index_generic_reloptions(reloptions, false);
-
-           if (idxopts != NULL)
-           {
-               is_projection = idxopts->recheck_on_update;
-               pfree(idxopts);
-           }
-       }
-       ReleaseSysCache(tuple);
-   }
-#endif
-
-   return is_projection;
-}
-
 /*
  * RelationGetIndexAttrBitmap -- get a bitmap of index attribute numbers
  *
@@ -4773,29 +4698,24 @@ IsProjectionFunctionalIndex(Relation index, IndexInfo *ii)
 Bitmapset *
 RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind)
 {
-   Bitmapset  *indexattrs;     /* columns used in non-projection indexes */
-   Bitmapset  *projindexattrs; /* columns used in projection indexes */
+   Bitmapset  *indexattrs;     /* indexed columns */
    Bitmapset  *uindexattrs;    /* columns in unique indexes */
    Bitmapset  *pkindexattrs;   /* columns in the primary index */
    Bitmapset  *idindexattrs;   /* columns in the replica identity */
-   Bitmapset  *projindexes;    /* projection indexes */
    List       *indexoidlist;
    List       *newindexoidlist;
    Oid         relpkindex;
    Oid         relreplindex;
    ListCell   *l;
    MemoryContext oldcxt;
-   int         indexno;
 
    /* Quick exit if we already computed the result. */
    if (relation->rd_indexattr != NULL)
    {
        switch (attrKind)
        {
-           case INDEX_ATTR_BITMAP_HOT:
+           case INDEX_ATTR_BITMAP_ALL:
                return bms_copy(relation->rd_indexattr);
-           case INDEX_ATTR_BITMAP_PROJ:
-               return bms_copy(relation->rd_projindexattr);
            case INDEX_ATTR_BITMAP_KEY:
                return bms_copy(relation->rd_keyattr);
            case INDEX_ATTR_BITMAP_PRIMARY_KEY:
@@ -4842,12 +4762,9 @@ restart:
     * won't be returned at all by RelationGetIndexList.
     */
    indexattrs = NULL;
-   projindexattrs = NULL;
    uindexattrs = NULL;
    pkindexattrs = NULL;
    idindexattrs = NULL;
-   projindexes = NULL;
-   indexno = 0;
    foreach(l, indexoidlist)
    {
        Oid         indexOid = lfirst_oid(l);
@@ -4906,22 +4823,13 @@ restart:
            }
        }
 
-       /* Collect attributes used in expressions, too */
-       if (IsProjectionFunctionalIndex(indexDesc, indexInfo))
-       {
-           projindexes = bms_add_member(projindexes, indexno);
-           pull_varattnos((Node *) indexInfo->ii_Expressions, 1, &projindexattrs);
-       }
-       else
-       {
-           /* Collect all attributes used in expressions, too */
-           pull_varattnos((Node *) indexInfo->ii_Expressions, 1, &indexattrs);
-       }
+       /* Collect all attributes used in expressions, too */
+       pull_varattnos((Node *) indexInfo->ii_Expressions, 1, &indexattrs);
+
        /* Collect all attributes in the index predicate, too */
        pull_varattnos((Node *) indexInfo->ii_Predicate, 1, &indexattrs);
 
        index_close(indexDesc, AccessShareLock);
-       indexno += 1;
    }
 
    /*
@@ -4948,8 +4856,6 @@ restart:
        bms_free(pkindexattrs);
        bms_free(idindexattrs);
        bms_free(indexattrs);
-       bms_free(projindexattrs);
-       bms_free(projindexes);
 
        goto restart;
    }
@@ -4957,16 +4863,12 @@ restart:
    /* Don't leak the old values of these bitmaps, if any */
    bms_free(relation->rd_indexattr);
    relation->rd_indexattr = NULL;
-   bms_free(relation->rd_projindexattr);
-   relation->rd_projindexattr = NULL;
    bms_free(relation->rd_keyattr);
    relation->rd_keyattr = NULL;
    bms_free(relation->rd_pkattr);
    relation->rd_pkattr = NULL;
    bms_free(relation->rd_idattr);
    relation->rd_idattr = NULL;
-   bms_free(relation->rd_projidx);
-   relation->rd_projidx = NULL;
 
    /*
     * Now save copies of the bitmaps in the relcache entry.  We intentionally
@@ -4980,17 +4882,13 @@ restart:
    relation->rd_pkattr = bms_copy(pkindexattrs);
    relation->rd_idattr = bms_copy(idindexattrs);
    relation->rd_indexattr = bms_copy(indexattrs);
-   relation->rd_projindexattr = bms_copy(projindexattrs);
-   relation->rd_projidx = bms_copy(projindexes);
    MemoryContextSwitchTo(oldcxt);
 
    /* We return our original working copy for caller to play with */
    switch (attrKind)
    {
-       case INDEX_ATTR_BITMAP_HOT:
+       case INDEX_ATTR_BITMAP_ALL:
            return indexattrs;
-       case INDEX_ATTR_BITMAP_PROJ:
-           return projindexattrs;
        case INDEX_ATTR_BITMAP_KEY:
            return uindexattrs;
        case INDEX_ATTR_BITMAP_PRIMARY_KEY:
@@ -5619,11 +5517,9 @@ load_relcache_init_file(bool shared)
        rel->rd_pkindex = InvalidOid;
        rel->rd_replidindex = InvalidOid;
        rel->rd_indexattr = NULL;
-       rel->rd_projindexattr = NULL;
        rel->rd_keyattr = NULL;
        rel->rd_pkattr = NULL;
        rel->rd_idattr = NULL;
-       rel->rd_projidx = NULL;
        rel->rd_pubactions = NULL;
        rel->rd_statvalid = false;
        rel->rd_statlist = NIL;
index bca788c7a3310470c125c02cffb5e514b368a6f4..292b1f483a9689fff75c0bb1996e3fa120aa03da 100644 (file)
@@ -1623,14 +1623,14 @@ psql_completion(const char *text, int start, int end)
        COMPLETE_WITH("(");
    /* ALTER INDEX <foo> SET|RESET ( */
    else if (Matches("ALTER", "INDEX", MatchAny, "RESET", "("))
-       COMPLETE_WITH("fillfactor", "recheck_on_update",
+       COMPLETE_WITH("fillfactor",
                      "vacuum_cleanup_index_scale_factor",  /* BTREE */
                      "fastupdate", "gin_pending_list_limit",   /* GIN */
                      "buffering",  /* GiST */
                      "pages_per_range", "autosummarize"    /* BRIN */
            );
    else if (Matches("ALTER", "INDEX", MatchAny, "SET", "("))
-       COMPLETE_WITH("fillfactor =", "recheck_on_update =",
+       COMPLETE_WITH("fillfactor =",
                      "vacuum_cleanup_index_scale_factor =",    /* BTREE */
                      "fastupdate =", "gin_pending_list_limit =",   /* GIN */
                      "buffering =",    /* GiST */
index 96b457fbe489544cd6497eda01168a0a21a75aa5..7ade18ea46b453cdcd883bf4efa4c8f0d962cc4c 100644 (file)
@@ -51,7 +51,6 @@ typedef enum relopt_kind
    RELOPT_KIND_PARTITIONED = (1 << 11),
    /* if you add a new kind, make sure you update "last_default" too */
    RELOPT_KIND_LAST_DEFAULT = RELOPT_KIND_PARTITIONED,
-   RELOPT_KIND_INDEX = RELOPT_KIND_BTREE | RELOPT_KIND_HASH | RELOPT_KIND_GIN | RELOPT_KIND_SPGIST,
    /* some compilers treat enums as signed ints, so we can't use 1 << 31 */
    RELOPT_KIND_MAX = (1 << 30)
 } relopt_kind;
@@ -277,7 +276,6 @@ extern bytea *heap_reloptions(char relkind, Datum reloptions, bool validate);
 extern bytea *view_reloptions(Datum reloptions, bool validate);
 extern bytea *index_reloptions(amoptions_function amoptions, Datum reloptions,
                 bool validate);
-extern bytea *index_generic_reloptions(Datum reloptions, bool validate);
 extern bytea *attribute_reloptions(Datum reloptions, bool validate);
 extern bytea *tablespace_reloptions(Datum reloptions, bool validate);
 extern LOCKMODE AlterTableGetRelOptionsLockLevel(List *defList);
index bc20950cc8ac52fa7843637c48a8c78a8a3301f6..ff0a3ea45cde42db7bf8156daeee2b9bca99d953 100644 (file)
@@ -110,12 +110,10 @@ typedef struct RelationData
    List       *rd_statlist;    /* list of OIDs of extended stats */
 
    /* data managed by RelationGetIndexAttrBitmap: */
-   Bitmapset  *rd_indexattr;   /* columns used in non-projection indexes */
-   Bitmapset  *rd_projindexattr;   /* columns used in projection indexes */
+   Bitmapset  *rd_indexattr;   /* identifies columns used in indexes */
    Bitmapset  *rd_keyattr;     /* cols that can be ref'd by foreign keys */
    Bitmapset  *rd_pkattr;      /* cols included in primary key */
    Bitmapset  *rd_idattr;      /* included in replica identity index */
-   Bitmapset  *rd_projidx;     /* Oids of projection indexes */
 
    PublicationActions *rd_pubactions;  /* publication actions */
 
@@ -217,14 +215,6 @@ typedef struct ForeignKeyCacheInfo
    Oid         conpfeqop[INDEX_MAX_KEYS];  /* PK = FK operator OIDs */
 } ForeignKeyCacheInfo;
 
-/*
- * Options common for all indexes
- */
-typedef struct GenericIndexOpts
-{
-   int32       vl_len_;
-   bool        recheck_on_update;
-} GenericIndexOpts;
 
 /*
  * StdRdOptions
index 3135d06c18f684217f1d86670c9526f44b41676f..a80e335374db5f1ddfe4e51ac2a02724fa95681d 100644 (file)
@@ -52,8 +52,7 @@ extern List *RelationGetIndexPredicate(Relation relation);
 
 typedef enum IndexAttrBitmapKind
 {
-   INDEX_ATTR_BITMAP_HOT,
-   INDEX_ATTR_BITMAP_PROJ,
+   INDEX_ATTR_BITMAP_ALL,
    INDEX_ATTR_BITMAP_KEY,
    INDEX_ATTR_BITMAP_PRIMARY_KEY,
    INDEX_ATTR_BITMAP_IDENTITY_KEY