Skip to content

Commit 7ad2220

Browse files
author
Nikita Glukhov
committed
Move checkStringLen() to convertJsonbScalar()
1 parent 2bcf6bf commit 7ad2220

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
@@ -68,7 +68,6 @@ typedef struct JsonbAggState
6868
} JsonbAggState;
6969

7070
static inline Datum jsonb_from_cstring(char *json, int len);
71-
static size_t checkStringLen(size_t len);
7271
static void jsonb_in_object_start(void *pstate);
7372
static void jsonb_in_object_end(void *pstate);
7473
static void jsonb_in_array_start(void *pstate);
@@ -255,18 +254,6 @@ jsonb_from_cstring(char *json, int len)
255254
PG_RETURN_JSONB(JsonbValueToJsonb(state.res));
256255
}
257256

258-
static size_t
259-
checkStringLen(size_t len)
260-
{
261-
if (len > JENTRY_OFFLENMASK)
262-
ereport(ERROR,
263-
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
264-
errmsg("string too long to represent as jsonb string"),
265-
errdetail("Due to an implementation restriction, jsonb strings cannot exceed %d bytes.",
266-
JENTRY_OFFLENMASK)));
267-
268-
return len;
269-
}
270257

271258
static void
272259
jsonb_in_object_start(void *pstate)
@@ -308,7 +295,7 @@ jsonb_in_object_field_start(void *pstate, char *fname, bool isnull)
308295

309296
Assert(fname != NULL);
310297
v.type = jbvString;
311-
v.val.string.len = checkStringLen(strlen(fname));
298+
v.val.string.len = strlen(fname);
312299
v.val.string.val = fname;
313300

314301
_state->res = pushJsonbValue(&_state->parseState, WJB_KEY, &v);
@@ -357,7 +344,7 @@ jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype)
357344
case JSON_TOKEN_STRING:
358345
Assert(token != NULL);
359346
v.type = jbvString;
360-
v.val.string.len = checkStringLen(strlen(token));
347+
v.val.string.len = strlen(token);
361348
v.val.string.val = token;
362349
break;
363350
case JSON_TOKEN_NUMBER:
@@ -899,7 +886,7 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result,
899886
default:
900887
outputstr = OidOutputFunctionCall(outfuncoid, val);
901888
jb.type = jbvString;
902-
jb.val.string.len = checkStringLen(strlen(outputstr));
889+
jb.val.string.len = strlen(outputstr);
903890
jb.val.string.val = outputstr;
904891
break;
905892
}

src/backend/utils/adt/jsonb_util.c

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

17781778
case jbvString:
1779-
appendToBuffer(buffer, scalarVal->val.string.val, scalarVal->val.string.len);
1779+
if (scalarVal->val.string.len > JENTRY_OFFLENMASK)
1780+
ereport(ERROR,
1781+
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1782+
errmsg("string too long to represent as jsonb string"),
1783+
errdetail("Due to an implementation restriction, jsonb strings cannot exceed %d bytes.",
1784+
JENTRY_OFFLENMASK)));
1785+
1786+
appendToBuffer(buffer, scalarVal->val.string.val,
1787+
scalarVal->val.string.len);
17801788

17811789
*jentry = scalarVal->val.string.len;
17821790
break;

0 commit comments

Comments
 (0)