static bool executeExpr(char *jqBase, int32 jqPos, int32 op, JsonbValue *jb) { int32 type; int32 nextPos; check_stack_depth(); /* * read arg type */ jqPos = readJsQueryHeader(jqBase, jqPos, &type, &nextPos); Assert(nextPos == 0); Assert(type == jqiAny || type == jqiString || type == jqiNumeric || type == jqiNull || type == jqiBool || type == jqiArray); switch(op) { case jqiEqual: if (jb->type == jbvBinary && type == jqiArray) return checkArrayEquality(jqBase, jqPos, type, jb); return checkEquality(jqBase, jqPos, type, jb); case jqiIn: return checkIn(jqBase, jqPos, type, jb); case jqiOverlap: case jqiContains: case jqiContained: return executeArrayOp(jqBase, jqPos, type, op, jb); case jqiLess: case jqiGreater: case jqiLessOrEqual: case jqiGreaterOrEqual: return makeCompare(jqBase, jqPos, type, op, jb); default: elog(ERROR, "Unknown operation"); } return false; }
static bool executeExpr(JsQueryItem *jsq, int32 op, JsonbValue *jb, JsQueryItem *jsqLeftArg) { bool res = false; /* * read arg type */ Assert(jsqGetNext(jsq, NULL) == false); Assert(jsq->type == jqiAny || jsq->type == jqiString || jsq->type == jqiNumeric || jsq->type == jqiNull || jsq->type == jqiBool || jsq->type == jqiArray); if (jsqLeftArg && jsqLeftArg->type == jqiLength) { if (JsonbType(jb) == jbvArray || JsonbType(jb) == jbvObject) { int32 length; JsonbIterator *it; JsonbValue v; int r; it = JsonbIteratorInit(jb->val.binary.data); r = JsonbIteratorNext(&it, &v, true); Assert(r == WJB_BEGIN_ARRAY || r == WJB_BEGIN_OBJECT); length = (r == WJB_BEGIN_ARRAY) ? v.val.array.nElems : v.val.object.nPairs; v.type = jbvNumeric; v.val.numeric = DatumGetNumeric(DirectFunctionCall1(int4_numeric, Int32GetDatum(length))); switch(op) { case jqiEqual: case jqiLess: case jqiGreater: case jqiLessOrEqual: case jqiGreaterOrEqual: res = makeCompare(jsq, op, &v); break; case jqiIn: res = checkScalarIn(jsq, &v); break; case jqiOverlap: case jqiContains: case jqiContained: break; default: elog(ERROR, "Unknown operation"); } } } else { switch(op) { case jqiEqual: if (JsonbType(jb) == jbvArray && jsq->type == jqiArray) res = checkArrayEquality(jsq, jb); else res = checkScalarEquality(jsq, jb); break; case jqiIn: res = checkScalarIn(jsq, jb); break; case jqiOverlap: case jqiContains: case jqiContained: res = executeArrayOp(jsq, op, jb); break; case jqiLess: case jqiGreater: case jqiLessOrEqual: case jqiGreaterOrEqual: res = makeCompare(jsq, op, jb); break; default: elog(ERROR, "Unknown operation"); } } return res; }