mirror of
https://github.com/postgres/postgres.git
synced 2025-06-25 01:02:05 +03:00
Fix jit compilation bug on wide tables.
The function generated to perform JIT compiled tuple deforming failed when HeapTupleHeader's t_hoff was bigger than a signed int8. I'd failed to realize that LLVM's getelementptr would treat an int8 index argument as signed, rather than unsigned. That means that a hoff larger than 127 would result in a negative offset being applied. Fix that by widening the index to 32bit. Add a testcase with a wide table. Don't drop it, as it seems useful to verify other tools deal properly with wide tables. Thanks to Justin Pryzby for both reporting a bug and then reducing it to a reproducible testcase! Reported-By: Justin Pryzby Author: Andres Freund Discussion: https://postgr.es/m/20181115223959.GB10913@telsasoft.com Backpatch: 11, just as jit compilation was
This commit is contained in:
@ -248,10 +248,16 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
|
||||
v_infomask2,
|
||||
"maxatt");
|
||||
|
||||
/*
|
||||
* Need to zext, as getelementptr otherwise treats hoff as a signed 8bit
|
||||
* integer, which'd yield a negative offset for t_hoff > 127.
|
||||
*/
|
||||
v_hoff =
|
||||
l_load_struct_gep(b, v_tuplep,
|
||||
FIELDNO_HEAPTUPLEHEADERDATA_HOFF,
|
||||
"t_hoff");
|
||||
LLVMBuildZExt(b,
|
||||
l_load_struct_gep(b, v_tuplep,
|
||||
FIELDNO_HEAPTUPLEHEADERDATA_HOFF,
|
||||
""),
|
||||
LLVMInt32Type(), "t_hoff");
|
||||
|
||||
v_tupdata_base =
|
||||
LLVMBuildGEP(b,
|
||||
|
Reference in New Issue
Block a user