/* Check if the new value is already contained. */
finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_CONTAINS, true); if (finfo != NULL &&
DatumGetBool(FunctionCall2Coll(finfo, colloid,
column->bv_values[INCLUSION_UNION],
newval)))
PG_RETURN_BOOL(false);
/* Finally, merge the new value to the existing union. */
finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE, false);
result = FunctionCall2Coll(finfo, colloid,
column->bv_values[INCLUSION_UNION], newval); if (!attr->attbyval &&
DatumGetPointer(result) != DatumGetPointer(column->bv_values[INCLUSION_UNION]))
{
pfree(DatumGetPointer(column->bv_values[INCLUSION_UNION]));
if (result == newval)
result = datumCopy(result, attr->attbyval, attr->attlen);
}
column->bv_values[INCLUSION_UNION] = result;
PG_RETURN_BOOL(true);
}
/* *BRINinclusionconsistentfunction * *We'renolongerdealingwithNULLkeysintheconsistentfunction,thatis *nowhandledbytheAMcode.Thatmeansweshouldnotgetanyall-NULLranges *either,becausethosecan'tbeconsistentwithregular(not[IS]NULL)keys. * *Allofthestrategiesareoptional.
*/
Datum
brin_inclusion_consistent(PG_FUNCTION_ARGS)
{
BrinDesc *bdesc = (BrinDesc *) PG_GETARG_POINTER(0);
BrinValues *column = (BrinValues *) PG_GETARG_POINTER(1);
ScanKey key = (ScanKey) PG_GETARG_POINTER(2);
Oid colloid = PG_GET_COLLATION(),
subtype;
Datum unionval;
AttrNumber attno;
Datum query;
FmgrInfo *finfo;
Datum result;
/* This opclass uses the old signature with only three arguments. */
Assert(PG_NARGS() == 3);
/* Should not be dealing with all-NULL ranges. */
Assert(!column->bv_allnulls);
/* It has to be checked, if it contains elements that are not mergeable. */ if (DatumGetBool(column->bv_values[INCLUSION_UNMERGEABLE]))
PG_RETURN_BOOL(true);
case RTOverlapStrategyNumber: case RTContainsStrategyNumber: case RTContainsElemStrategyNumber: case RTSubStrategyNumber: case RTSubEqualStrategyNumber:
finfo = inclusion_get_strategy_procinfo(bdesc, attno, subtype,
key->sk_strategy);
result = FunctionCall2Coll(finfo, colloid, unionval, query);
PG_RETURN_DATUM(result);
case RTContainedByStrategyNumber: case RTSuperStrategyNumber: case RTSuperEqualStrategyNumber:
finfo = inclusion_get_strategy_procinfo(bdesc, attno, subtype,
RTOverlapStrategyNumber);
result = FunctionCall2Coll(finfo, colloid, unionval, query); if (DatumGetBool(result))
PG_RETURN_BOOL(true);
case RTLessStrategyNumber: case RTLessEqualStrategyNumber:
finfo = inclusion_get_strategy_procinfo(bdesc, attno, subtype,
RTRightStrategyNumber);
result = FunctionCall2Coll(finfo, colloid, unionval, query); if (!DatumGetBool(result))
PG_RETURN_BOOL(true);
case RTSameStrategyNumber: case RTEqualStrategyNumber:
finfo = inclusion_get_strategy_procinfo(bdesc, attno, subtype,
RTContainsStrategyNumber);
result = FunctionCall2Coll(finfo, colloid, unionval, query); if (DatumGetBool(result))
PG_RETURN_BOOL(true);
case RTGreaterStrategyNumber: /* no need to check for empty elements */
finfo = inclusion_get_strategy_procinfo(bdesc, attno, subtype,
RTLeftStrategyNumber);
result = FunctionCall2Coll(finfo, colloid, unionval, query);
PG_RETURN_BOOL(!DatumGetBool(result));
/* If B includes empty elements, mark A similarly, if needed. */ if (!DatumGetBool(col_a->bv_values[INCLUSION_CONTAINS_EMPTY]) &&
DatumGetBool(col_b->bv_values[INCLUSION_CONTAINS_EMPTY]))
col_a->bv_values[INCLUSION_CONTAINS_EMPTY] = BoolGetDatum(true);
/* Check if A includes elements that are not mergeable. */ if (DatumGetBool(col_a->bv_values[INCLUSION_UNMERGEABLE]))
PG_RETURN_VOID();
/* If B includes elements that are not mergeable, mark A similarly. */ if (DatumGetBool(col_b->bv_values[INCLUSION_UNMERGEABLE]))
{
col_a->bv_values[INCLUSION_UNMERGEABLE] = BoolGetDatum(true);
PG_RETURN_VOID();
}
/* Check if A and B are mergeable; if not, mark A unmergeable. */
finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE, true); if (finfo != NULL &&
!DatumGetBool(FunctionCall2Coll(finfo, colloid,
col_a->bv_values[INCLUSION_UNION],
col_b->bv_values[INCLUSION_UNION])))
{
col_a->bv_values[INCLUSION_UNMERGEABLE] = BoolGetDatum(true);
PG_RETURN_VOID();
}
/* Finally, merge B to A. */
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]); if (!attr->attbyval &&
DatumGetPointer(result) != DatumGetPointer(col_a->bv_values[INCLUSION_UNION]))
{
pfree(DatumGetPointer(col_a->bv_values[INCLUSION_UNION]));
if (result == col_b->bv_values[INCLUSION_UNION])
result = datumCopy(result, attr->attbyval, attr->attlen);
}
col_a->bv_values[INCLUSION_UNION] = result;
/* *Ifwealreadysearchedforthisprocanddidn'tfindit,don'tbother *searchingagain.
*/ 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
{ 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));
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.