Looks like the function get_actual_variable_range() was written with the knowledge that virtual/hypothetical indexes may exist, but the assumption seems wrong.
One one hand get_actual_variable_range() expects that virtual indexes do not have an OID assigned, on the other hand explain_get_index_name_hook() is handed just an index's OID to get its name back; IMHO these are based on two conflicting assumptions about whether a virtual index will have an OID assigned. Attached patch fix_get_actual_variable_range.patch tries to fix this by introducing a new hook that can help Postgres decide if an index is fictitious or not. Also attached is the patch expose_IndexSupportInitialize.patch, that makes the static function IndexSupportInitialize() global so that the Index Advisor doesn't have to reinvent the wheel to prepare an index structure with opfamilies and opclasses. Regards, -- gurjeet.singh @ EnterpriseDB - The Enterprise Postgres Company http://www.EnterpriseDB.com singh.gurjeet@{ gmail | yahoo }.com Twitter/Skype: singh_gurjeet Mail sent from my BlackLaptop device
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index e24e718..609182e 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -45,6 +45,7 @@ int constraint_exclusion = CONSTRAINT_EXCLUSION_PARTITION; /* Hook for plugins to get control in get_relation_info() */ get_relation_info_hook_type get_relation_info_hook = NULL; +is_fictitious_index_hook_type is_fictitious_index_hook = NULL; static List *get_relation_constraints(PlannerInfo *root, Oid relationObjectId, RelOptInfo *rel, diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index c837fb6..57ee37c 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -4561,7 +4561,7 @@ get_actual_variable_range(PlannerInfo *root, VariableStatData *vardata, * The index list might include fictitious indexes inserted by a * get_relation_info hook --- don't try to access them. */ - if (!OidIsValid(index->indexoid)) + if (is_fictitious_index_hook && (*is_fictitious_index_hook) (index->indexoid)) continue; /* diff --git a/src/include/optimizer/plancat.h b/src/include/optimizer/plancat.h index 9316c9e..050cce0 100644 --- a/src/include/optimizer/plancat.h +++ b/src/include/optimizer/plancat.h @@ -24,6 +24,9 @@ typedef void (*get_relation_info_hook_type) (PlannerInfo *root, RelOptInfo *rel); extern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook; +typedef bool (*is_fictitious_index_hook_type) (Oid index_oid); + +extern PGDLLIMPORT is_fictitious_index_hook_type is_fictitious_index_hook; extern void get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 43549c2..f78503f 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -233,14 +233,6 @@ static TupleDesc GetPgIndexDescriptor(void); static void AttrDefaultFetch(Relation relation); static void CheckConstraintFetch(Relation relation); static List *insert_ordered_oid(List *list, Oid datum); -static void IndexSupportInitialize(oidvector *indclass, - Oid *indexOperator, - RegProcedure *indexSupport, - Oid *opFamily, - Oid *opcInType, - StrategyNumber maxStrategyNumber, - StrategyNumber maxSupportNumber, - AttrNumber maxAttributeNumber); static OpClassCacheEnt *LookupOpclassInfo(Oid operatorClassOid, StrategyNumber numStrats, StrategyNumber numSupport); @@ -1140,7 +1132,7 @@ RelationInitIndexAccessInfo(Relation relation) * those obtainable from the system catalog entries for the index and * access method. */ -static void +void IndexSupportInitialize(oidvector *indclass, Oid *indexOperator, RegProcedure *indexSupport, diff --git a/src/include/utils/relcache.h b/src/include/utils/relcache.h index 5314fc2..3984296 100644 --- a/src/include/utils/relcache.h +++ b/src/include/utils/relcache.h @@ -14,6 +14,7 @@ #ifndef RELCACHE_H #define RELCACHE_H +#include "access/skey.h" /* for StrategyNumber */ #include "access/tupdesc.h" #include "nodes/bitmapset.h" #include "nodes/pg_list.h" @@ -109,4 +110,14 @@ extern bool criticalRelcachesBuilt; /* should be used only by relcache.c and postinit.c */ extern bool criticalSharedRelcachesBuilt; +/* Exposed as a global for the benefit of Index Advisor. */ +extern void IndexSupportInitialize(oidvector *indclass, + Oid *indexOperator, + RegProcedure *indexSupport, + Oid *opFamily, + Oid *opcInType, + StrategyNumber maxStrategyNumber, + StrategyNumber maxSupportNumber, + AttrNumber maxAttributeNumber); + #endif /* RELCACHE_H */
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers