Use appendStringInfoString instead of appendBinaryStringInfo where possible
authorPeter Eisentraut <peter@eisentraut.org>
Fri, 30 Dec 2022 09:59:25 +0000 (10:59 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Fri, 30 Dec 2022 10:05:09 +0000 (11:05 +0100)
For the jsonpath output, we don't need to squeeze out every bit of
performance, so instead use a more robust coding style.  There are
similar calls in jsonb.c, which we leave alone here since there is
indeed a performance impact for bulk exports.

Discussion: https://www.postgresql.org/message-id/flat/a0086cfc-ff0f-2827-20fe-52b591d2666c%40enterprisedb.com

src/backend/utils/adt/jsonpath.c

index bb9364843e6b506d08a34262266b2a1d99234bc5..f37d60f6935b3194b60d930c80a64b2aaaf6dcb8 100644 (file)
@@ -221,7 +221,7 @@ jsonPathToCstring(StringInfo out, JsonPath *in, int estimated_len)
        enlargeStringInfo(out, estimated_len);
 
        if (!(in->header & JSONPATH_LAX))
-               appendBinaryStringInfo(out, "strict ", 7);
+               appendStringInfoString(out, "strict ");
 
        jspInit(&v, in);
        printJsonPathItem(out, &v, false, true);
@@ -542,9 +542,9 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
                        break;
                case jpiBool:
                        if (jspGetBool(v))
-                               appendBinaryStringInfo(buf, "true", 4);
+                               appendStringInfoString(buf, "true");
                        else
-                               appendBinaryStringInfo(buf, "false", 5);
+                               appendStringInfoString(buf, "false");
                        break;
                case jpiAnd:
                case jpiOr:
@@ -585,13 +585,13 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
                                                          operationPriority(elem.type) <=
                                                          operationPriority(v->type));
 
-                       appendBinaryStringInfo(buf, " like_regex ", 12);
+                       appendStringInfoString(buf, " like_regex ");
 
                        escape_json(buf, v->content.like_regex.pattern);
 
                        if (v->content.like_regex.flags)
                        {
-                               appendBinaryStringInfo(buf, " flag \"", 7);
+                               appendStringInfoString(buf, " flag \"");
 
                                if (v->content.like_regex.flags & JSP_REGEX_ICASE)
                                        appendStringInfoChar(buf, 'i');
@@ -623,13 +623,13 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
                                appendStringInfoChar(buf, ')');
                        break;
                case jpiFilter:
-                       appendBinaryStringInfo(buf, "?(", 2);
+                       appendStringInfoString(buf, "?(");
                        jspGetArg(v, &elem);
                        printJsonPathItem(buf, &elem, false, false);
                        appendStringInfoChar(buf, ')');
                        break;
                case jpiNot:
-                       appendBinaryStringInfo(buf, "!(", 2);
+                       appendStringInfoString(buf, "!(");
                        jspGetArg(v, &elem);
                        printJsonPathItem(buf, &elem, false, false);
                        appendStringInfoChar(buf, ')');
@@ -638,10 +638,10 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
                        appendStringInfoChar(buf, '(');
                        jspGetArg(v, &elem);
                        printJsonPathItem(buf, &elem, false, false);
-                       appendBinaryStringInfo(buf, ") is unknown", 12);
+                       appendStringInfoString(buf, ") is unknown");
                        break;
                case jpiExists:
-                       appendBinaryStringInfo(buf, "exists (", 8);
+                       appendStringInfoString(buf, "exists (");
                        jspGetArg(v, &elem);
                        printJsonPathItem(buf, &elem, false, false);
                        appendStringInfoChar(buf, ')');
@@ -655,10 +655,10 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
                        appendStringInfoChar(buf, '$');
                        break;
                case jpiLast:
-                       appendBinaryStringInfo(buf, "last", 4);
+                       appendStringInfoString(buf, "last");
                        break;
                case jpiAnyArray:
-                       appendBinaryStringInfo(buf, "[*]", 3);
+                       appendStringInfoString(buf, "[*]");
                        break;
                case jpiAnyKey:
                        if (inKey)
@@ -680,7 +680,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
 
                                if (range)
                                {
-                                       appendBinaryStringInfo(buf, " to ", 4);
+                                       appendStringInfoString(buf, " to ");
                                        printJsonPathItem(buf, &to, false, false);
                                }
                        }
@@ -692,7 +692,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
 
                        if (v->content.anybounds.first == 0 &&
                                v->content.anybounds.last == PG_UINT32_MAX)
-                               appendBinaryStringInfo(buf, "**", 2);
+                               appendStringInfoString(buf, "**");
                        else if (v->content.anybounds.first == v->content.anybounds.last)
                        {
                                if (v->content.anybounds.first == PG_UINT32_MAX)
@@ -713,25 +713,25 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
                                                                 v->content.anybounds.last);
                        break;
                case jpiType:
-                       appendBinaryStringInfo(buf, ".type()", 7);
+                       appendStringInfoString(buf, ".type()");
                        break;
                case jpiSize:
-                       appendBinaryStringInfo(buf, ".size()", 7);
+                       appendStringInfoString(buf, ".size()");
                        break;
                case jpiAbs:
-                       appendBinaryStringInfo(buf, ".abs()", 6);
+                       appendStringInfoString(buf, ".abs()");
                        break;
                case jpiFloor:
-                       appendBinaryStringInfo(buf, ".floor()", 8);
+                       appendStringInfoString(buf, ".floor()");
                        break;
                case jpiCeiling:
-                       appendBinaryStringInfo(buf, ".ceiling()", 10);
+                       appendStringInfoString(buf, ".ceiling()");
                        break;
                case jpiDouble:
-                       appendBinaryStringInfo(buf, ".double()", 9);
+                       appendStringInfoString(buf, ".double()");
                        break;
                case jpiDatetime:
-                       appendBinaryStringInfo(buf, ".datetime(", 10);
+                       appendStringInfoString(buf, ".datetime(");
                        if (v->content.arg)
                        {
                                jspGetArg(v, &elem);
@@ -740,7 +740,7 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
                        appendStringInfoChar(buf, ')');
                        break;
                case jpiKeyValue:
-                       appendBinaryStringInfo(buf, ".keyvalue()", 11);
+                       appendStringInfoString(buf, ".keyvalue()");
                        break;
                default:
                        elog(ERROR, "unrecognized jsonpath item type: %d", v->type);