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:
parent
4b42a89938
commit
851b14b0c6
|
@ -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;
|
||||
|
|
18
src/backend/utils/cache/relcache.c
vendored
18
src/backend/utils/cache/relcache.c
vendored
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue