From 793beab37e8f7ec6a4ef39395c6c866d7e4c7af5 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Sat, 3 Nov 2018 15:55:23 -0700 Subject: [PATCH] Prevent generating EEOP_AGG_STRICT_INPUT_CHECK operations when nargs == 0. This only became a problem with 4c640f4f38, which didn't synchronize the value agg_strict_input_check.nargs is set to, with the guard condition for emitting the operation. Besides such instructions being unnecessary overhead, currently the LLVM JIT provider doesn't support them. It seems more sensible to avoid generating such instruction than supporting them. Add assertions to make it easier to debug a potential further occurance. Discussion: https://postgr.es/m/2a505161-2727-2473-7c46-591ed108ac52@email.cz Backpatch: 11-, like 4c640f4f38. --- src/backend/executor/execExpr.c | 2 +- src/backend/jit/llvm/llvmjit_expr.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index 5397de4e05..4b44a4a4ea 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -3023,7 +3023,7 @@ ExecBuildAggTrans(AggState *aggstate, AggStatePerPhase phase, * just keep the prior transValue. This is true for both plain and * sorted/distinct aggregates. */ - if (trans_fcinfo->flinfo->fn_strict && numInputs > 0) + if (trans_fcinfo->flinfo->fn_strict && pertrans->numTransInputs > 0) { scratch.opcode = EEOP_AGG_STRICT_INPUT_CHECK; scratch.d.agg_strict_input_check.nulls = strictnulls; diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index e5fe116acb..4225877478 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -2124,6 +2124,8 @@ llvm_compile_expr(ExprState *state) LLVMValueRef v_nullp; LLVMBasicBlockRef *b_checknulls; + Assert(nargs > 0); + jumpnull = op->d.agg_strict_input_check.jumpnull; v_nullp = l_ptr_const(nulls, l_ptr(TypeStorageBool));