aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/brin/brin_bloom.c19
-rw-r--r--src/backend/access/brin/brin_inclusion.c31
-rw-r--r--src/backend/access/brin/brin_minmax_multi.c19
3 files changed, 28 insertions, 41 deletions
diff --git a/src/backend/access/brin/brin_bloom.c b/src/backend/access/brin/brin_bloom.c
index 40e1f303a0a..d160fa7f08f 100644
--- a/src/backend/access/brin/brin_bloom.c
+++ b/src/backend/access/brin/brin_bloom.c
@@ -438,7 +438,6 @@ typedef struct BloomOpaque
* 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,
@@ -714,27 +713,19 @@ bloom_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum)
*/
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];
diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c
index ef2247347f9..b86ca5744a3 100644
--- a/src/backend/access/brin/brin_inclusion.c
+++ b/src/backend/access/brin/brin_inclusion.c
@@ -82,7 +82,7 @@ typedef struct InclusionOpaque
} 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);
@@ -179,7 +179,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
* 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]))
@@ -195,7 +195,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
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],
@@ -210,7 +210,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
* 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],
@@ -221,8 +221,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS)
}
/* 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 &&
@@ -506,7 +505,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
}
/* 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],
@@ -517,8 +516,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
}
/* 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]);
@@ -539,10 +537,12 @@ brin_inclusion_union(PG_FUNCTION_ARGS)
* 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;
@@ -564,13 +564,18 @@ inclusion_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum)
{
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;
}
diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c
index 88214720bff..0d1507a2a36 100644
--- a/src/backend/access/brin/brin_minmax_multi.c
+++ b/src/backend/access/brin/brin_minmax_multi.c
@@ -111,7 +111,6 @@
typedef struct MinmaxMultiOpaque
{
FmgrInfo extra_procinfos[MINMAX_MAX_PROCNUMS];
- bool extra_proc_missing[MINMAX_MAX_PROCNUMS];
Oid cached_subtype;
FmgrInfo strategy_procinfos[BTMaxStrategyNumber];
} MinmaxMultiOpaque;
@@ -2872,27 +2871,19 @@ minmax_multi_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum)
*/
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];