14.06.2024 05:48, Joseph Koshakow wrote:
v4-0001-Remove-dependence-on-integer-wrapping.patch is unchanged, I just incremented the version number. > Also there are several trap-producing cases with date types: > SELECT to_date('100000000', 'CC'); > SELECT to_timestamp('1000000000,999', 'Y,YYY'); > SELECT make_date(-2147483648, 1, 1); > > And one more with array... > CREATE TABLE t (ia int[]); > INSERT INTO t(ia[2147483647:2147483647]) VALUES ('{}'); I'll try and get patches to address these too in the next couple of weeks unless someone beats me to it. > I think it's not the whole iceberg too. +1
After sending my message, I toyed with -ftrapv a little time more and found other cases: SELECT '[]'::jsonb -> -2147483648; #4 0x00007efe232d67f3 in __GI_abort () at ./stdlib/abort.c:79 #5 0x000055e8fde9f211 in __negvsi2 () #6 0x000055e8fdcca62c in jsonb_array_element (fcinfo=0x55e8fec28220) at jsonfuncs.c:948 (gdb) f 6 #6 0x000055e14cb9362c in jsonb_array_element (fcinfo=0x55e14d493220) at jsonfuncs.c:948 948 if (-element > nelements) (gdb) p element $1 = -2147483648 --- SELECT jsonb_delete_path('{"a":[]}', '{"a",-2147483648}'); #4 0x00007f1873bef7f3 in __GI_abort () at ./stdlib/abort.c:79 #5 0x0000564a009d2211 in __negvsi2 () #6 0x0000564a00807c89 in setPathArray (it=0x7fff865c7380, path_elems=0x564a017baf20, path_nulls=0x564a017baf40, path_len=2, st=0x7fff865c7388, level=1, newval=0x0, nelems=2, op_type=2) at jsonfuncs.c:5407 (gdb) f 6 #6 0x000055985e823c89 in setPathArray (it=0x7ffc22258fe0, path_elems=0x559860286f20, path_nulls=0x559860286f40, path_len=2, st=0x7ffc22258fe8, level=1, newval=0x0, nelems=0, op_type=2) at jsonfuncs.c:5407 5407 if (-idx > nelems) (gdb) p idx $1 = -2147483648 --- CREATE FUNCTION check_foreign_key () RETURNS trigger AS .../refint.so' LANGUAGE C; CREATE TABLE t (i int4 NOT NULL); CREATE TRIGGER check_fkey BEFORE DELETE ON t FOR EACH ROW EXECUTE PROCEDURE check_foreign_key (2147483647, 'cascade', 'i', "ft", "i"); INSERT INTO t VALUES (1); DELETE FROM t; #4 0x00007f57f0bef7f3 in __GI_abort () at ./stdlib/abort.c:79 #5 0x00007f57f1671351 in __addvsi3 () from .../src/test/regress/refint.so #6 0x00007f57f1670234 in check_foreign_key (fcinfo=0x7ffebf523650) at refint.c:321 (gdb) f 6 #6 0x00007f3400ef9234 in check_foreign_key (fcinfo=0x7ffd6e16a600) at refint.c:321 321 nkeys = (nargs - nrefs) / (nrefs + 1); (gdb) p nargs $1 = 3 (gdb) p nrefs $2 = 2147483647 --- And the most interesting case to me: SET temp_buffers TO 1000000000; CREATE TEMP TABLE t(i int PRIMARY KEY); INSERT INTO t VALUES(1); #4 0x00007f385cdd37f3 in __GI_abort () at ./stdlib/abort.c:79 #5 0x00005620071c4f51 in __addvsi3 () #6 0x0000562007143f3c in init_htab (hashp=0x562008facb20, nelem=610070812) at dynahash.c:720 (gdb) f 6 #6 0x0000560915207f3c in init_htab (hashp=0x560916039930, nelem=1000000000) at dynahash.c:720 720 hctl->high_mask = (nbuckets << 1) - 1; (gdb) p nbuckets $1 = 1073741824 Best regards, Alexander