diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index 363afa7..7d986f5 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -3873,9 +3873,18 @@ setPathArray(JsonbIterator **it, Datum *path_elems, bool *path_nulls,
 	/* pick correct index */
 	if (level < path_len && !path_nulls[level])
 	{
-		char	   *c = VARDATA_ANY(path_elems[level]);
+		char	   *keyptr = VARDATA_ANY(path_elems[level]);
+		int			keylen = VARSIZE_ANY_EXHDR(path_elems[level]);
+		char		c[20 + 1];   /* int64 = 18446744073709551615 (20 symbols) */
 		long		lindex;
 
+		if (keylen > 20)
+			elog(ERROR, "path element at the position %d is not an integer", level + 1);
+
+		/* fast copy to a stack (get cstring without bothering palloc) */
+		memcpy(c, keyptr, keylen);
+		c[keylen] = '\0';
+
 		errno = 0;
 		lindex = strtol(c, &badp, 10);
 		if (errno != 0 || badp == c || *badp != '\0' || lindex > INT_MAX ||
