From 851b14b0c69b3773753a3c202bff42c3e4425d8d Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Mon, 30 Mar 2020 23:40:22 +0300 Subject: [PATCH] Remove rudiments of supporting procnum == 0 from 911e702077 Early versions of opclass options patch uses zero support procedure as opclass options procedure. This commit removes rudiments of it, which were committed in 911e702077. Also, it implements correct handling of amoptsprocnum == 0. --- src/backend/access/index/indexam.c | 14 +++++++++----- src/backend/utils/cache/relcache.c | 18 +++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) 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 */