From: Andres Freund Date: Sun, 22 Jul 2018 23:47:00 +0000 (-0700) Subject: Fix JITed EEOP_AGG_INIT_TRANS, which missed some state. X-Git-Tag: REL_12_BETA1~1836 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6b4d860311e99621681f25db5db82f88348d8ea6;p=postgresql Fix JITed EEOP_AGG_INIT_TRANS, which missed some state. The JIT compiled implementation missed maintaining AggState->{current_set,curaggcontext}. That could lead to trouble because the transition value could be allocated in the wrong context. Reported-By: Rushabh Lathia Diagnosed-By: Dmitry Dolgov Author: Dmitry Dolgov, with minor changes by me Discussion: https://postgr.es/m/CAGPqQf165-=+Drw3Voim7M5EjHT1zwPF9BQRjLFQzCzYnNZEiQ@mail.gmail.com Backpatch: 11-, where JIT compilation support was added --- diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index 36c5f7d500..31b0321275 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -2228,6 +2228,28 @@ llvm_compile_expr(ExprState *state) { LLVMValueRef params[3]; + LLVMValueRef v_curaggcontext; + LLVMValueRef v_current_set; + LLVMValueRef v_aggcontext; + + v_aggcontext = l_ptr_const(op->d.agg_init_trans.aggcontext, + l_ptr(StructExprContext)); + + v_current_set = + LLVMBuildStructGEP(b, + v_aggstatep, + FIELDNO_AGGSTATE_CURRENT_SET, + "aggstate.current_set"); + v_curaggcontext = + LLVMBuildStructGEP(b, + v_aggstatep, + FIELDNO_AGGSTATE_CURAGGCONTEXT, + "aggstate.curaggcontext"); + + LLVMBuildStore(b, l_int32_const(op->d.agg_init_trans.setno), + v_current_set); + LLVMBuildStore(b, v_aggcontext, + v_curaggcontext); params[0] = v_aggstatep; params[1] = v_pertransp;