Datum
jsonb_contained(PG_FUNCTION_ARGS)
{
- /* Just invert "contains" */
- PG_RETURN_DATUM(DirectFunctionCall2(jsonb_contains,
- PG_GETARG_DATUM(1),
- PG_GETARG_DATUM(0)));
+ /* Commutator of "contains" */
+ Jsonb *tmpl = PG_GETARG_JSONB(0);
+ Jsonb *val = PG_GETARG_JSONB(1);
+
+ JsonbIterator *it1, *it2;
+
+ if (JB_ROOT_COUNT(val) < JB_ROOT_COUNT(tmpl) ||
+ JB_ROOT_IS_OBJECT(val) != JB_ROOT_IS_OBJECT(tmpl))
+ PG_RETURN_BOOL(false);
+
+ it1 = JsonbIteratorInit(VARDATA(val));
+ it2 = JsonbIteratorInit(VARDATA(tmpl));
+
+ PG_RETURN_BOOL(deepContains(&it1, &it2));
}
Datum
jsonb_ne(PG_FUNCTION_ARGS)
{
- int res = DatumGetInt32(DirectFunctionCall2(jsonb_cmp,
- PG_GETARG_DATUM(0),
- PG_GETARG_DATUM(1)));
+ Jsonb *jb1 = PG_GETARG_JSONB(0);
+ Jsonb *jb2 = PG_GETARG_JSONB(1);
+ bool res;
- PG_RETURN_BOOL(res != 0);
+ res = (compareJsonbSuperHeaderValue(VARDATA(jb1), VARDATA(jb2)) != 0);
+
+ PG_FREE_IF_COPY(jb1, 0);
+ PG_FREE_IF_COPY(jb2, 1);
+ PG_RETURN_INT32(res);
}
/*
Datum
jsonb_lt(PG_FUNCTION_ARGS)
{
- int res = DatumGetInt32(DirectFunctionCall2(jsonb_cmp,
- PG_GETARG_DATUM(0),
- PG_GETARG_DATUM(1)));
+ Jsonb *jb1 = PG_GETARG_JSONB(0);
+ Jsonb *jb2 = PG_GETARG_JSONB(1);
+ bool res;
+
+ res = (compareJsonbSuperHeaderValue(VARDATA(jb1), VARDATA(jb2)) < 0);
- PG_RETURN_BOOL(res < 0);
+ PG_FREE_IF_COPY(jb1, 0);
+ PG_FREE_IF_COPY(jb2, 1);
+ PG_RETURN_INT32(res);
}
Datum
jsonb_gt(PG_FUNCTION_ARGS)
{
- int res = DatumGetInt32(DirectFunctionCall2(jsonb_cmp,
- PG_GETARG_DATUM(0),
- PG_GETARG_DATUM(1)));
+ Jsonb *jb1 = PG_GETARG_JSONB(0);
+ Jsonb *jb2 = PG_GETARG_JSONB(1);
+ bool res;
+
+ res = (compareJsonbSuperHeaderValue(VARDATA(jb1), VARDATA(jb2)) > 0);
- PG_RETURN_BOOL(res > 0);
+ PG_FREE_IF_COPY(jb1, 0);
+ PG_FREE_IF_COPY(jb2, 1);
+ PG_RETURN_INT32(res);
}
Datum
jsonb_le(PG_FUNCTION_ARGS)
{
- int res = DatumGetInt32(DirectFunctionCall2(jsonb_cmp,
- PG_GETARG_DATUM(0),
- PG_GETARG_DATUM(1)));
+ Jsonb *jb1 = PG_GETARG_JSONB(0);
+ Jsonb *jb2 = PG_GETARG_JSONB(1);
+ bool res;
+
+ res = (compareJsonbSuperHeaderValue(VARDATA(jb1), VARDATA(jb2)) <= 0);
- PG_RETURN_BOOL(res <= 0);
+ PG_FREE_IF_COPY(jb1, 0);
+ PG_FREE_IF_COPY(jb2, 1);
+ PG_RETURN_INT32(res);
}
Datum
jsonb_ge(PG_FUNCTION_ARGS)
{
- int res = DatumGetInt32(DirectFunctionCall2(jsonb_cmp,
- PG_GETARG_DATUM(0),
- PG_GETARG_DATUM(1)));
- PG_RETURN_BOOL(res >= 0);
+ Jsonb *jb1 = PG_GETARG_JSONB(0);
+ Jsonb *jb2 = PG_GETARG_JSONB(1);
+ bool res;
+
+ res = (compareJsonbSuperHeaderValue(VARDATA(jb1), VARDATA(jb2)) >= 0);
+
+ PG_FREE_IF_COPY(jb1, 0);
+ PG_FREE_IF_COPY(jb2, 1);
+ PG_RETURN_INT32(res);
}
Datum
jsonb_eq(PG_FUNCTION_ARGS)
{
- int res = DatumGetInt32(DirectFunctionCall2(jsonb_cmp,
- PG_GETARG_DATUM(0),
- PG_GETARG_DATUM(1)));
+ Jsonb *jb1 = PG_GETARG_JSONB(0);
+ Jsonb *jb2 = PG_GETARG_JSONB(1);
+ bool res;
+
+ res = (compareJsonbSuperHeaderValue(VARDATA(jb1), VARDATA(jb2)) == 0);
- PG_RETURN_BOOL(res == 0);
+ PG_FREE_IF_COPY(jb1, 0);
+ PG_FREE_IF_COPY(jb2, 1);
+ PG_RETURN_INT32(res);
}
Datum
{
Jsonb *jb1 = PG_GETARG_JSONB(0);
Jsonb *jb2 = PG_GETARG_JSONB(1);
-
int res;
res = compareJsonbSuperHeaderValue(VARDATA(jb1), VARDATA(jb2));
- /*
- * This is a btree support function; this is one of the few places where
- * memory needs to be explicitly freed.
- */
PG_FREE_IF_COPY(jb1, 0);
PG_FREE_IF_COPY(jb2, 1);
PG_RETURN_INT32(res);