Remove rudiments of supporting procnum == 0 from 911e702077
authorAlexander Korotkov <akorotkov@postgresql.org>
Mon, 30 Mar 2020 20:40:22 +0000 (23:40 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Mon, 30 Mar 2020 20:43:25 +0000 (23:43 +0300)
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
src/backend/utils/cache/relcache.c

index f7e4c65d99f9193dacecb9e49f8204d48705a560..a3f77169a79d6300fc37a2facbacb6fb491e3c11 100644 (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;
index fa82ab9c5c990002334ea1316a9d79723c0503ef..f8e2c6e88e9d76c2ce07991eb3f4559f0ec290c0 100644 (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 */