* consistency. We may need additional procs in the future.
     */
    FmgrInfo    extra_procinfos[BLOOM_MAX_PROCNUMS];
-   bool        extra_proc_missing[BLOOM_MAX_PROCNUMS];
 } BloomOpaque;
 
 static FmgrInfo *bloom_get_procinfo(BrinDesc *bdesc, uint16 attno,
     */
    opaque = (BloomOpaque *) bdesc->bd_info[attno - 1]->oi_opaque;
 
-   /*
-    * If we already searched for this proc and didn't find it, don't bother
-    * searching again.
-    */
-   if (opaque->extra_proc_missing[basenum])
-       return NULL;
-
    if (opaque->extra_procinfos[basenum].fn_oid == InvalidOid)
    {
        if (RegProcedureIsValid(index_getprocid(bdesc->bd_index, attno,
                                                procnum)))
-       {
            fmgr_info_copy(&opaque->extra_procinfos[basenum],
                           index_getprocinfo(bdesc->bd_index, attno, procnum),
                           bdesc->bd_context);
-       }
        else
-       {
-           opaque->extra_proc_missing[basenum] = true;
-           return NULL;
-       }
+           ereport(ERROR,
+                   errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+                   errmsg_internal("invalid opclass definition"),
+                   errdetail_internal("The operator class is missing support function %d for column %d.",
+                                      procnum, attno));
    }
 
    return &opaque->extra_procinfos[basenum];
 
 } InclusionOpaque;
 
 static FmgrInfo *inclusion_get_procinfo(BrinDesc *bdesc, uint16 attno,
-                                       uint16 procnum);
+                                       uint16 procnum, bool missing_ok);
 static FmgrInfo *inclusion_get_strategy_procinfo(BrinDesc *bdesc, uint16 attno,
                                                 Oid subtype, uint16 strategynum);
 
     * new value for emptiness; if it returns true, we need to set the
     * "contains empty" flag in the element (unless already set).
     */
-   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_EMPTY);
+   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_EMPTY, true);
    if (finfo != NULL && DatumGetBool(FunctionCall1Coll(finfo, colloid, newval)))
    {
        if (!DatumGetBool(column->bv_values[INCLUSION_CONTAINS_EMPTY]))
        PG_RETURN_BOOL(true);
 
    /* Check if the new value is already contained. */
-   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_CONTAINS);
+   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_CONTAINS, true);
    if (finfo != NULL &&
        DatumGetBool(FunctionCall2Coll(finfo, colloid,
                                       column->bv_values[INCLUSION_UNION],
     * it's not going to be used any longer.  However, the BRIN framework
     * doesn't allow for the value not being present.  Improve someday.
     */
-   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE);
+   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE, true);
    if (finfo != NULL &&
        !DatumGetBool(FunctionCall2Coll(finfo, colloid,
                                        column->bv_values[INCLUSION_UNION],
    }
 
    /* Finally, merge the new value to the existing union. */
-   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE);
-   Assert(finfo != NULL);
+   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE, false);
    result = FunctionCall2Coll(finfo, colloid,
                               column->bv_values[INCLUSION_UNION], newval);
    if (!attr->attbyval &&
    }
 
    /* Check if A and B are mergeable; if not, mark A unmergeable. */
-   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE);
+   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE, true);
    if (finfo != NULL &&
        !DatumGetBool(FunctionCall2Coll(finfo, colloid,
                                        col_a->bv_values[INCLUSION_UNION],
    }
 
    /* Finally, merge B to A. */
-   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE);
-   Assert(finfo != NULL);
+   finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE, false);
    result = FunctionCall2Coll(finfo, colloid,
                               col_a->bv_values[INCLUSION_UNION],
                               col_b->bv_values[INCLUSION_UNION]);
  * Cache and return inclusion opclass support procedure
  *
  * Return the procedure corresponding to the given function support number
- * or null if it is not exists.
+ * or null if it is not exists.  If missing_ok is true and the procedure
+ * isn't set up for this opclass, return NULL instead of raising an error.
  */
 static FmgrInfo *
-inclusion_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum)
+inclusion_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum,
+                      bool missing_ok)
 {
    InclusionOpaque *opaque;
    uint16      basenum = procnum - PROCNUM_BASE;
    {
        if (RegProcedureIsValid(index_getprocid(bdesc->bd_index, attno,
                                                procnum)))
-       {
            fmgr_info_copy(&opaque->extra_procinfos[basenum],
                           index_getprocinfo(bdesc->bd_index, attno, procnum),
                           bdesc->bd_context);
-       }
        else
        {
+           if (!missing_ok)
+               ereport(ERROR,
+                       errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+                       errmsg_internal("invalid opclass definition"),
+                       errdetail_internal("The operator class is missing support function %d for column %d.",
+                                          procnum, attno));
+
            opaque->extra_proc_missing[basenum] = true;
            return NULL;
        }
 
 typedef struct MinmaxMultiOpaque
 {
    FmgrInfo    extra_procinfos[MINMAX_MAX_PROCNUMS];
-   bool        extra_proc_missing[MINMAX_MAX_PROCNUMS];
    Oid         cached_subtype;
    FmgrInfo    strategy_procinfos[BTMaxStrategyNumber];
 } MinmaxMultiOpaque;
     */
    opaque = (MinmaxMultiOpaque *) bdesc->bd_info[attno - 1]->oi_opaque;
 
-   /*
-    * If we already searched for this proc and didn't find it, don't bother
-    * searching again.
-    */
-   if (opaque->extra_proc_missing[basenum])
-       return NULL;
-
    if (opaque->extra_procinfos[basenum].fn_oid == InvalidOid)
    {
        if (RegProcedureIsValid(index_getprocid(bdesc->bd_index, attno,
                                                procnum)))
-       {
            fmgr_info_copy(&opaque->extra_procinfos[basenum],
                           index_getprocinfo(bdesc->bd_index, attno, procnum),
                           bdesc->bd_context);
-       }
        else
-       {
-           opaque->extra_proc_missing[basenum] = true;
-           return NULL;
-       }
+           ereport(ERROR,
+                   errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+                   errmsg_internal("invalid opclass definition"),
+                   errdetail_internal("The operator class is missing support function %d for column %d.",
+                                      procnum, attno));
    }
 
    return &opaque->extra_procinfos[basenum];