diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c index f7e4c65d99..a3f77169a7 100644 --- a/src/backend/access/index/indexam.c +++ b/src/backend/access/index/indexam.c @@ -773,9 +773,9 @@ index_getprocid(Relation irel, nproc = irel->rd_indam->amsupport; - Assert(procnum >= 0 && procnum <= (uint16) nproc); + Assert(procnum > 0 && procnum <= (uint16) nproc); - procindex = ((nproc + 1) * (attnum - 1)) + procnum; + procindex = (nproc * (attnum - 1)) + (procnum - 1); loc = irel->rd_support; @@ -809,9 +809,9 @@ index_getprocinfo(Relation irel, nproc = irel->rd_indam->amsupport; optsproc = irel->rd_indam->amoptsprocnum; - Assert(procnum >= 0 && procnum <= (uint16) nproc); + Assert(procnum > 0 && procnum <= (uint16) nproc); - procindex = ((nproc + 1) * (attnum - 1)) + procnum; + procindex = (nproc * (attnum - 1)) + (procnum - 1); locinfo = irel->rd_supportinfo; @@ -937,10 +937,14 @@ index_opclass_options(Relation indrel, AttrNumber attnum, Datum attoptions, bool validate) { int amoptsprocnum = indrel->rd_indam->amoptsprocnum; - Oid procid = index_getprocid(indrel, attnum, amoptsprocnum); + Oid procid = InvalidOid; FmgrInfo *procinfo; local_relopts relopts; + /* fetch options support procedure if specified */ + if (amoptsprocnum != 0) + procid =index_getprocid(indrel, attnum, amoptsprocnum); + if (!OidIsValid(procid)) { Oid opclass; diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index fa82ab9c5c..f8e2c6e88e 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -1426,7 +1426,7 @@ RelationInitIndexAccessInfo(Relation relation) amsupport = relation->rd_indam->amsupport; if (amsupport > 0) { - int nsupport = indnatts * (amsupport + 1); + int nsupport = indnatts * amsupport; relation->rd_support = (RegProcedure *) MemoryContextAllocZero(indexcxt, nsupport * sizeof(RegProcedure)); @@ -1541,9 +1541,9 @@ IndexSupportInitialize(oidvector *indclass, opFamily[attIndex] = opcentry->opcfamily; opcInType[attIndex] = opcentry->opcintype; if (maxSupportNumber > 0) - memcpy(&indexSupport[attIndex * (maxSupportNumber + 1)], + memcpy(&indexSupport[attIndex * maxSupportNumber], opcentry->supportProcs, - (maxSupportNumber + 1) * sizeof(RegProcedure)); + maxSupportNumber * sizeof(RegProcedure)); } } @@ -1695,12 +1695,13 @@ LookupOpclassInfo(Oid operatorClassOid, { Form_pg_amproc amprocform = (Form_pg_amproc) GETSTRUCT(htup); - if (amprocform->amprocnum < 0 || + if (amprocform->amprocnum <= 0 || (StrategyNumber) amprocform->amprocnum > numSupport) elog(ERROR, "invalid amproc number %d for opclass %u", amprocform->amprocnum, operatorClassOid); - opcentry->supportProcs[amprocform->amprocnum] = amprocform->amproc; + opcentry->supportProcs[amprocform->amprocnum - 1] = + amprocform->amproc; } systable_endscan(scan); @@ -5201,6 +5202,9 @@ RelationGetIndexRawAttOptions(Relation indexrel) for (attnum = 1; attnum <= natts; attnum++) { + if (indexrel->rd_indam->amoptsprocnum == 0) + continue; + if (!OidIsValid(index_getprocid(indexrel, attnum, indexrel->rd_indam->amoptsprocnum))) continue; @@ -5661,7 +5665,7 @@ load_relcache_init_file(bool shared) } /* set up zeroed fmgr-info vector */ - nsupport = relform->relnatts * (rel->rd_indam->amsupport + 1); + nsupport = relform->relnatts * rel->rd_indam->amsupport; rel->rd_supportinfo = (FmgrInfo *) MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo)); } @@ -5962,7 +5966,7 @@ write_relcache_init_file(bool shared) /* next, write the vector of support procedure OIDs */ write_item(rel->rd_support, - relform->relnatts * ((rel->rd_indam->amsupport + 1) * sizeof(RegProcedure)), + relform->relnatts * (rel->rd_indam->amsupport * sizeof(RegProcedure)), fp); /* next, write the vector of collation OIDs */