mirror of
https://github.com/postgres/postgres.git
synced 2025-06-26 12:21:12 +03:00
Extend ExecBuildAggTrans() to support a NULL pointer check.
Optionally push a step to check for a NULL pointer to the pergroup state. This will be important for disk-based hash aggregation in combination with grouping sets. When memory limits are reached, a given tuple may find its per-group state for some grouping sets but not others. For the former, it advances the per-group state as normal; for the latter, it skips evaluation and the calling code will have to spill the tuple and reprocess it in a later batch. Add the NULL check as a separate expression step because in some common cases it's not needed. Discussion: https://postgr.es/m/20200221202212.ssb2qpmdgrnx52sj%40alap3.anarazel.de
This commit is contained in:
@ -2046,6 +2046,45 @@ llvm_compile_expr(ExprState *state)
|
||||
break;
|
||||
}
|
||||
|
||||
case EEOP_AGG_PLAIN_PERGROUP_NULLCHECK:
|
||||
{
|
||||
int jumpnull;
|
||||
LLVMValueRef v_aggstatep;
|
||||
LLVMValueRef v_allpergroupsp;
|
||||
LLVMValueRef v_pergroup_allaggs;
|
||||
LLVMValueRef v_setoff;
|
||||
|
||||
jumpnull = op->d.agg_plain_pergroup_nullcheck.jumpnull;
|
||||
|
||||
/*
|
||||
* pergroup_allaggs = aggstate->all_pergroups
|
||||
* [op->d.agg_plain_pergroup_nullcheck.setoff];
|
||||
*/
|
||||
v_aggstatep = LLVMBuildBitCast(
|
||||
b, v_parent, l_ptr(StructAggState), "");
|
||||
|
||||
v_allpergroupsp = l_load_struct_gep(
|
||||
b, v_aggstatep,
|
||||
FIELDNO_AGGSTATE_ALL_PERGROUPS,
|
||||
"aggstate.all_pergroups");
|
||||
|
||||
v_setoff = l_int32_const(
|
||||
op->d.agg_plain_pergroup_nullcheck.setoff);
|
||||
|
||||
v_pergroup_allaggs = l_load_gep1(
|
||||
b, v_allpergroupsp, v_setoff, "");
|
||||
|
||||
LLVMBuildCondBr(
|
||||
b,
|
||||
LLVMBuildICmp(b, LLVMIntEQ,
|
||||
LLVMBuildPtrToInt(
|
||||
b, v_pergroup_allaggs, TypeSizeT, ""),
|
||||
l_sizet_const(0), ""),
|
||||
opblocks[jumpnull],
|
||||
opblocks[opno + 1]);
|
||||
break;
|
||||
}
|
||||
|
||||
case EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYVAL:
|
||||
case EEOP_AGG_PLAIN_TRANS_STRICT_BYVAL:
|
||||
case EEOP_AGG_PLAIN_TRANS_BYVAL:
|
||||
|
Reference in New Issue
Block a user