Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Datum
- sequence_contained(PG_FUNCTION_ARGS)
- {
- return DirectFunctionCall2(contains_sequence,
- PG_GETARG_DATUM(1),
- PG_GETARG_DATUM(0));
- }
- Datum
- contains_sequence(PG_FUNCTION_ARGS)
- {
- ArrayType *a = PG_GETARG_ARRAYTYPE_P(0);
- ArrayType *b = PG_GETARG_ARRAYTYPE_P(1);
- Oid element_type = ARR_ELEMTYPE(a);
- int na, nb;
- int i, j;
- char *pa;
- TypeCacheEntry *typentry;
- FunctionCallInfoData locfcinfo;
- Oid collation = PG_GET_COLLATION();
- if (array_contains_nulls(a) || array_contains_nulls(b))
- ereport(ERROR,
- (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
- errmsg("arrays must not contain nulls")));
- na = ArrayGetNItems(ARR_NDIM(a), ARR_DIMS(a));
- nb = ArrayGetNItems(ARR_NDIM(b), ARR_DIMS(b));
- pa = ARR_DATA_PTR(a);
- typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
- if (typentry == NULL ||
- typentry->type_id != element_type)
- {
- typentry = lookup_type_cache(element_type,
- TYPECACHE_EQ_OPR_FINFO);
- if (!OidIsValid(typentry->eq_opr_finfo.fn_oid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_FUNCTION),
- errmsg("could not identify an equality operator for type %s",
- format_type_be(element_type))));
- fcinfo->flinfo->fn_extra = (void *) typentry;
- }
- InitFunctionCallInfoData(locfcinfo, &typentry->eq_opr_finfo, 2,
- collation, NULL, NULL);
- for (i = 0; i <= na - nb; ++i)
- {
- char *ppa = pa;
- char *pb = ARR_DATA_PTR(b);
- for (j = 0; j < nb; ++j)
- {
- locfcinfo.arg[0] = fetch_att(ppa, typentry->typbyval, typentry->typlen);
- locfcinfo.arg[1] = fetch_att(pb, typentry->typbyval, typentry->typlen);
- locfcinfo.argnull[0] = false;
- locfcinfo.argnull[1] = false;
- locfcinfo.isnull = false;
- if (!DatumGetBool(FunctionCallInvoke(&locfcinfo)))
- break;
- pb = att_addlength_pointer(pb, typentry->typlen, pb);
- pb = (char *) att_align_nominal(pb, typentry->typalign);
- ppa = att_addlength_pointer(ppa, typentry->typlen, ppa);
- ppa = (char *) att_align_nominal(ppa, typentry->typalign);
- }
- if (j == nb)
- PG_RETURN_BOOL(true);
- pa = att_addlength_pointer(pa, typentry->typlen, pa);
- pa = (char *) att_align_nominal(pa, typentry->typalign);
- }
- PG_RETURN_BOOL(false);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement