Hello, Hackers! While I was reviewed a patch with "json_insert" function I found a bug which wasn't connected with the patch and reproduced at master.
It claims about non-integer whereas input values are obvious integers and in an allowed range. More testing lead to understanding it appears when numbers length are multiplier of 4: postgres=# select jsonb_set('{"a":[[],1,2,3],"b":[]}', '{"a", 9999}', '"4"'); ERROR: path element at the position 2 is not an integer postgres=# select jsonb_set('{"a":[[],1,2,3],"b":[]}', '{"b", 1000}', '"4"'); ERROR: path element at the position 2 is not an integer postgres=# select jsonb_set('{"a":[[],1,2,3],"b":[]}', '{"a", -999}', '"4"'); ERROR: path element at the position 2 is not an integer postgres=# select jsonb_set('{"a":[[],1,2,3],"b":[]}', '{"a", 10009999}', '"4"'); ERROR: path element at the position 2 is not an integer Close values are ok: postgres=# select jsonb_set('{"a":[[],1,2,3]}', '{"a", 0, 999}', '"4"'); jsonb_set ------------------------- {"a": [["4"], 1, 2, 3]} (1 row) postgres=# select jsonb_set('{"a":[[],1,2,3]}', '{"a", 0, 10000}', '"4"'); jsonb_set ------------------------- {"a": [["4"], 1, 2, 3]} (1 row) Research lead to setPathArray where a string which is got via VARDATA_ANY but is passed to strtol which expects cstring. In case of string number length is not a multiplier of 4 rest bytes are padding by '\0', when length is a multiplier of 4 there is no padding, just garbage after the last digit of the value. Proposed patch in an attachment fixes it. There is a magic number "20" as a length of an array for copying key from a path before passing it to strtol. It is a maximal length of a value which can be parsed by the function. I could not find a proper constant for it. Also I found similar direct value in the code (e.g. in numeric.c). I've added a comment, I hope it is enough for it. -- Best regards, Vitaly Burovoy
fix_jsonb_set_path.0001.patch
Description: Binary data
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers