From a2095f7fb5a57ea1794f25d029756d9a140fd429 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 16 Feb 2011 19:24:45 -0500 Subject: [PATCH] Fix bogus test for hypothetical indexes in get_actual_variable_range(). That function was supposing that indexoid == 0 for a hypothetical index, but that is not likely to be true in any non-toy implementation of an index adviser, since assigning a fake OID is the only way to know at EXPLAIN time which hypothetical index got selected. Fix by adding a flag to IndexOptInfo to mark hypothetical indexes. Back-patch to 9.0 where get_actual_variable_range() was added. Gurjeet Singh --- src/backend/nodes/outfuncs.c | 2 ++ src/backend/optimizer/util/plancat.c | 1 + src/backend/utils/adt/selfuncs.c | 4 ++-- src/include/nodes/relation.h | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 5c943bc254..192c042291 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -1700,10 +1700,12 @@ _outIndexOptInfo(StringInfo str, IndexOptInfo *node) WRITE_UINT_FIELD(pages); WRITE_FLOAT_FIELD(tuples, "%.0f"); WRITE_INT_FIELD(ncolumns); + WRITE_OID_FIELD(relam); WRITE_NODE_FIELD(indexprs); WRITE_NODE_FIELD(indpred); WRITE_BOOL_FIELD(predOK); WRITE_BOOL_FIELD(unique); + WRITE_BOOL_FIELD(hypothetical); } static void diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 1f79ba24fb..40df626b62 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -316,6 +316,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, ChangeVarNodes((Node *) info->indpred, 1, varno, 0); info->predOK = false; /* set later in indxpath.c */ info->unique = index->indisunique; + info->hypothetical = false; /* * Estimate the index size. If it's not a partial index, we lock diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index b3299b56d8..f10110b1b7 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -4562,10 +4562,10 @@ get_actual_variable_range(PlannerInfo *root, VariableStatData *vardata, continue; /* - * The index list might include fictitious indexes inserted by a + * The index list might include hypothetical indexes inserted by a * get_relation_info hook --- don't try to access them. */ - if (!OidIsValid(index->indexoid)) + if (index->hypothetical) continue; /* diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h index 49ce441e62..6f51b6c5fe 100644 --- a/src/include/nodes/relation.h +++ b/src/include/nodes/relation.h @@ -455,7 +455,7 @@ typedef struct IndexOptInfo int ncolumns; /* number of columns in index */ Oid *opfamily; /* OIDs of operator families for columns */ int *indexkeys; /* column numbers of index's keys, or 0 */ - Oid *indexcollations;/* OIDs of the collations of the index columns */ + Oid *indexcollations; /* OIDs of collations of index columns */ Oid *opcintype; /* OIDs of opclass declared input data types */ Oid *sortopfamily; /* OIDs of btree opfamilies, if orderable */ bool *reverse_sort; /* is sort order descending? */ @@ -469,6 +469,7 @@ typedef struct IndexOptInfo bool predOK; /* true if predicate matches query */ bool unique; /* true if a unique index */ + bool hypothetical; /* true if index doesn't really exist */ bool amcanorderbyop; /* does AM support order by operator result? */ bool amoptionalkey; /* can query omit key for the first column? */ bool amsearchnulls; /* can AM search for NULL/NOT NULL entries? */ -- 2.11.0