Skip to content

Commit 090d756

Browse files
author
Nikita Glukhov
committed
Move checkStringLen() to convertJsonbScalar()
1 parent 5fb585e commit 090d756

File tree

2 files changed

+12
-17
lines changed

2 files changed

+12
-17
lines changed

src/backend/utils/adt/jsonb.c

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ typedef struct JsonbAggState
6969
} JsonbAggState;
7070

7171
static inline Datum jsonb_from_cstring(char *json, int len);
72-
static size_t checkStringLen(size_t len);
7372
static void jsonb_in_object_start(void *pstate);
7473
static void jsonb_in_object_end(void *pstate);
7574
static void jsonb_in_array_start(void *pstate);
@@ -285,18 +284,6 @@ jsonb_from_cstring(char *json, int len)
285284
PG_RETURN_JSONB_P(JsonbValueToJsonb(state.res));
286285
}
287286

288-
static size_t
289-
checkStringLen(size_t len)
290-
{
291-
if (len > JENTRY_OFFLENMASK)
292-
ereport(ERROR,
293-
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
294-
errmsg("string too long to represent as jsonb string"),
295-
errdetail("Due to an implementation restriction, jsonb strings cannot exceed %d bytes.",
296-
JENTRY_OFFLENMASK)));
297-
298-
return len;
299-
}
300287

301288
static void
302289
jsonb_in_object_start(void *pstate)
@@ -338,7 +325,7 @@ jsonb_in_object_field_start(void *pstate, char *fname, bool isnull)
338325

339326
Assert(fname != NULL);
340327
v.type = jbvString;
341-
v.val.string.len = checkStringLen(strlen(fname));
328+
v.val.string.len = strlen(fname);
342329
v.val.string.val = fname;
343330

344331
_state->res = pushJsonbValue(&_state->parseState, WJB_KEY, &v);
@@ -388,7 +375,7 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype)
388375
case JSON_TOKEN_STRING:
389376
Assert(token != NULL);
390377
v.type = jbvString;
391-
v.val.string.len = checkStringLen(strlen(token));
378+
v.val.string.len = strlen(token);
392379
v.val.string.val = token;
393380
break;
394381
case JSON_TOKEN_NUMBER:
@@ -887,7 +874,7 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
887874
default:
888875
outputstr = OidOutputFunctionCall(outfuncoid, val);
889876
jb.type = jbvString;
890-
jb.val.string.len = checkStringLen(strlen(outputstr));
877+
jb.val.string.len = strlen(outputstr);
891878
jb.val.string.val = outputstr;
892879
break;
893880
}

src/backend/utils/adt/jsonb_util.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1864,7 +1864,15 @@ convertJsonbScalar(StringInfo buffer, JEntry *jentry, const JsonbValue *scalarVa
18641864
break;
18651865

18661866
case jbvString:
1867-
appendToBuffer(buffer, scalarVal->val.string.val, scalarVal->val.string.len);
1867+
if (scalarVal->val.string.len > JENTRY_OFFLENMASK)
1868+
ereport(ERROR,
1869+
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1870+
errmsg("string too long to represent as jsonb string"),
1871+
errdetail("Due to an implementation restriction, jsonb strings cannot exceed %d bytes.",
1872+
JENTRY_OFFLENMASK)));
1873+
1874+
appendToBuffer(buffer, scalarVal->val.string.val,
1875+
scalarVal->val.string.len);
18681876

18691877
*jentry = scalarVal->val.string.len;
18701878
break;

0 commit comments

Comments
 (0)