diff options
Diffstat (limited to 'src/backend/utils/adt/jsonpath.c')
-rw-r--r-- | src/backend/utils/adt/jsonpath.c | 250 |
1 files changed, 125 insertions, 125 deletions
diff --git a/src/backend/utils/adt/jsonpath.c b/src/backend/utils/adt/jsonpath.c index c5ba3b7f1d0..0a16f93f39b 100644 --- a/src/backend/utils/adt/jsonpath.c +++ b/src/backend/utils/adt/jsonpath.c @@ -519,18 +519,9 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, case jpiNull: appendStringInfoString(buf, "null"); break; - case jpiKey: - if (inKey) - appendStringInfoChar(buf, '.'); - escape_json(buf, jspGetString(v, NULL)); - break; case jpiString: escape_json(buf, jspGetString(v, NULL)); break; - case jpiVariable: - appendStringInfoChar(buf, '$'); - escape_json(buf, jspGetString(v, NULL)); - break; case jpiNumeric: if (jspHasNext(v)) appendStringInfoChar(buf, '('); @@ -576,58 +567,6 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, if (printBracketes) appendStringInfoChar(buf, ')'); break; - case jpiLikeRegex: - if (printBracketes) - appendStringInfoChar(buf, '('); - - jspInitByBuffer(&elem, v->base, v->content.like_regex.expr); - printJsonPathItem(buf, &elem, false, - operationPriority(elem.type) <= - operationPriority(v->type)); - - appendStringInfoString(buf, " like_regex "); - - escape_json(buf, v->content.like_regex.pattern); - - if (v->content.like_regex.flags) - { - appendStringInfoString(buf, " flag \""); - - if (v->content.like_regex.flags & JSP_REGEX_ICASE) - appendStringInfoChar(buf, 'i'); - if (v->content.like_regex.flags & JSP_REGEX_DOTALL) - appendStringInfoChar(buf, 's'); - if (v->content.like_regex.flags & JSP_REGEX_MLINE) - appendStringInfoChar(buf, 'm'); - if (v->content.like_regex.flags & JSP_REGEX_WSPACE) - appendStringInfoChar(buf, 'x'); - if (v->content.like_regex.flags & JSP_REGEX_QUOTE) - appendStringInfoChar(buf, 'q'); - - appendStringInfoChar(buf, '"'); - } - - if (printBracketes) - appendStringInfoChar(buf, ')'); - break; - case jpiPlus: - case jpiMinus: - if (printBracketes) - appendStringInfoChar(buf, '('); - appendStringInfoChar(buf, v->type == jpiPlus ? '+' : '-'); - jspGetArg(v, &elem); - printJsonPathItem(buf, &elem, false, - operationPriority(elem.type) <= - operationPriority(v->type)); - if (printBracketes) - appendStringInfoChar(buf, ')'); - break; - case jpiFilter: - appendStringInfoString(buf, "?("); - jspGetArg(v, &elem); - printJsonPathItem(buf, &elem, false, false); - appendStringInfoChar(buf, ')'); - break; case jpiNot: appendStringInfoString(buf, "!("); jspGetArg(v, &elem); @@ -640,22 +579,17 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, printJsonPathItem(buf, &elem, false, false); appendStringInfoString(buf, ") is unknown"); break; - case jpiExists: - appendStringInfoString(buf, "exists ("); + case jpiPlus: + case jpiMinus: + if (printBracketes) + appendStringInfoChar(buf, '('); + appendStringInfoChar(buf, v->type == jpiPlus ? '+' : '-'); jspGetArg(v, &elem); - printJsonPathItem(buf, &elem, false, false); - appendStringInfoChar(buf, ')'); - break; - case jpiCurrent: - Assert(!inKey); - appendStringInfoChar(buf, '@'); - break; - case jpiRoot: - Assert(!inKey); - appendStringInfoChar(buf, '$'); - break; - case jpiLast: - appendStringInfoString(buf, "last"); + printJsonPathItem(buf, &elem, false, + operationPriority(elem.type) <= + operationPriority(v->type)); + if (printBracketes) + appendStringInfoChar(buf, ')'); break; case jpiAnyArray: appendStringInfoString(buf, "[*]"); @@ -712,6 +646,35 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, v->content.anybounds.first, v->content.anybounds.last); break; + case jpiKey: + if (inKey) + appendStringInfoChar(buf, '.'); + escape_json(buf, jspGetString(v, NULL)); + break; + case jpiCurrent: + Assert(!inKey); + appendStringInfoChar(buf, '@'); + break; + case jpiRoot: + Assert(!inKey); + appendStringInfoChar(buf, '$'); + break; + case jpiVariable: + appendStringInfoChar(buf, '$'); + escape_json(buf, jspGetString(v, NULL)); + break; + case jpiFilter: + appendStringInfoString(buf, "?("); + jspGetArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + appendStringInfoChar(buf, ')'); + break; + case jpiExists: + appendStringInfoString(buf, "exists ("); + jspGetArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + appendStringInfoChar(buf, ')'); + break; case jpiType: appendStringInfoString(buf, ".type()"); break; @@ -742,6 +705,43 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, case jpiKeyValue: appendStringInfoString(buf, ".keyvalue()"); break; + case jpiLast: + appendStringInfoString(buf, "last"); + break; + case jpiLikeRegex: + if (printBracketes) + appendStringInfoChar(buf, '('); + + jspInitByBuffer(&elem, v->base, v->content.like_regex.expr); + printJsonPathItem(buf, &elem, false, + operationPriority(elem.type) <= + operationPriority(v->type)); + + appendStringInfoString(buf, " like_regex "); + + escape_json(buf, v->content.like_regex.pattern); + + if (v->content.like_regex.flags) + { + appendStringInfoString(buf, " flag \""); + + if (v->content.like_regex.flags & JSP_REGEX_ICASE) + appendStringInfoChar(buf, 'i'); + if (v->content.like_regex.flags & JSP_REGEX_DOTALL) + appendStringInfoChar(buf, 's'); + if (v->content.like_regex.flags & JSP_REGEX_MLINE) + appendStringInfoChar(buf, 'm'); + if (v->content.like_regex.flags & JSP_REGEX_WSPACE) + appendStringInfoChar(buf, 'x'); + if (v->content.like_regex.flags & JSP_REGEX_QUOTE) + appendStringInfoChar(buf, 'q'); + + appendStringInfoChar(buf, '"'); + } + + if (printBracketes) + appendStringInfoChar(buf, ')'); + break; default: elog(ERROR, "unrecognized jsonpath item type: %d", v->type); } @@ -771,11 +771,11 @@ jspOperationName(JsonPathItemType type) return "<="; case jpiGreaterOrEqual: return ">="; - case jpiPlus: case jpiAdd: + case jpiPlus: return "+"; - case jpiMinus: case jpiSub: + case jpiMinus: return "-"; case jpiMul: return "*"; @@ -783,26 +783,26 @@ jspOperationName(JsonPathItemType type) return "/"; case jpiMod: return "%"; - case jpiStartsWith: - return "starts with"; - case jpiLikeRegex: - return "like_regex"; case jpiType: return "type"; case jpiSize: return "size"; - case jpiKeyValue: - return "keyvalue"; - case jpiDouble: - return "double"; case jpiAbs: return "abs"; case jpiFloor: return "floor"; case jpiCeiling: return "ceiling"; + case jpiDouble: + return "double"; case jpiDatetime: return "datetime"; + case jpiKeyValue: + return "keyvalue"; + case jpiStartsWith: + return "starts with"; + case jpiLikeRegex: + return "like_regex"; default: elog(ERROR, "unrecognized jsonpath item type: %d", type); return NULL; @@ -900,8 +900,8 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) case jpiKeyValue: case jpiLast: break; - case jpiKey: case jpiString: + case jpiKey: case jpiVariable: read_int32(v->content.value.datalen, base, pos); /* FALLTHROUGH */ @@ -911,30 +911,24 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) break; case jpiAnd: case jpiOr: - case jpiAdd: - case jpiSub: - case jpiMul: - case jpiDiv: - case jpiMod: case jpiEqual: case jpiNotEqual: case jpiLess: case jpiGreater: case jpiLessOrEqual: case jpiGreaterOrEqual: + case jpiAdd: + case jpiSub: + case jpiMul: + case jpiDiv: + case jpiMod: case jpiStartsWith: read_int32(v->content.args.left, base, pos); read_int32(v->content.args.right, base, pos); break; - case jpiLikeRegex: - read_int32(v->content.like_regex.flags, base, pos); - read_int32(v->content.like_regex.expr, base, pos); - read_int32(v->content.like_regex.patternlen, base, pos); - v->content.like_regex.pattern = base + pos; - break; case jpiNot: - case jpiExists: case jpiIsUnknown: + case jpiExists: case jpiPlus: case jpiMinus: case jpiFilter: @@ -950,6 +944,12 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) read_int32(v->content.anybounds.first, base, pos); read_int32(v->content.anybounds.last, base, pos); break; + case jpiLikeRegex: + read_int32(v->content.like_regex.flags, base, pos); + read_int32(v->content.like_regex.expr, base, pos); + read_int32(v->content.like_regex.patternlen, base, pos); + v->content.like_regex.pattern = base + pos; + break; default: elog(ERROR, "unrecognized jsonpath item type: %d", v->type); } @@ -958,12 +958,12 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) void jspGetArg(JsonPathItem *v, JsonPathItem *a) { - Assert(v->type == jpiFilter || - v->type == jpiNot || + Assert(v->type == jpiNot || v->type == jpiIsUnknown || - v->type == jpiExists || v->type == jpiPlus || v->type == jpiMinus || + v->type == jpiFilter || + v->type == jpiExists || v->type == jpiDatetime); jspInitByBuffer(a, v->base, v->content.arg); @@ -974,21 +974,20 @@ jspGetNext(JsonPathItem *v, JsonPathItem *a) { if (jspHasNext(v)) { - Assert(v->type == jpiString || + Assert(v->type == jpiNull || + v->type == jpiString || v->type == jpiNumeric || v->type == jpiBool || - v->type == jpiNull || - v->type == jpiKey || - v->type == jpiAny || - v->type == jpiAnyArray || - v->type == jpiAnyKey || - v->type == jpiIndexArray || - v->type == jpiFilter || - v->type == jpiCurrent || - v->type == jpiExists || - v->type == jpiRoot || - v->type == jpiVariable || - v->type == jpiLast || + v->type == jpiAnd || + v->type == jpiOr || + v->type == jpiNot || + v->type == jpiIsUnknown || + v->type == jpiEqual || + v->type == jpiNotEqual || + v->type == jpiLess || + v->type == jpiGreater || + v->type == jpiLessOrEqual || + v->type == jpiGreaterOrEqual || v->type == jpiAdd || v->type == jpiSub || v->type == jpiMul || @@ -996,16 +995,16 @@ jspGetNext(JsonPathItem *v, JsonPathItem *a) v->type == jpiMod || v->type == jpiPlus || v->type == jpiMinus || - v->type == jpiEqual || - v->type == jpiNotEqual || - v->type == jpiGreater || - v->type == jpiGreaterOrEqual || - v->type == jpiLess || - v->type == jpiLessOrEqual || - v->type == jpiAnd || - v->type == jpiOr || - v->type == jpiNot || - v->type == jpiIsUnknown || + v->type == jpiAnyArray || + v->type == jpiAnyKey || + v->type == jpiIndexArray || + v->type == jpiAny || + v->type == jpiKey || + v->type == jpiCurrent || + v->type == jpiRoot || + v->type == jpiVariable || + v->type == jpiFilter || + v->type == jpiExists || v->type == jpiType || v->type == jpiSize || v->type == jpiAbs || @@ -1014,6 +1013,7 @@ jspGetNext(JsonPathItem *v, JsonPathItem *a) v->type == jpiDouble || v->type == jpiDatetime || v->type == jpiKeyValue || + v->type == jpiLast || v->type == jpiStartsWith || v->type == jpiLikeRegex); |