aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/index/indexam.c14
-rw-r--r--src/backend/utils/cache/relcache.c18
2 files changed, 20 insertions, 12 deletions
diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c
index f7e4c65d99f..a3f77169a79 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 fa82ab9c5c9..f8e2c6e88e9 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 */