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.
This commit is contained in:
Alexander Korotkov 2020-03-30 23:40:22 +03:00
parent 4b42a89938
commit 851b14b0c6
2 changed files with 20 additions and 12 deletions

View File

@ -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;

View File

@ -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 */