mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Compute information about EEOP_*_FETCHSOME at expression init time.
Previously this information was computed when JIT compiling an expression. But the information is useful for assertions in the non-JIT case too (for assertions), therefore it makes sense to move it. This will, in a followup commit, allow to treat different slot types differently. E.g. for virtual slots there's no need to generate a JIT function to deform the slot. Author: Andres Freund Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
This commit is contained in:
@ -276,6 +276,8 @@ llvm_compile_expr(ExprState *state)
|
||||
LLVMValueRef v_slot;
|
||||
LLVMBasicBlockRef b_fetch;
|
||||
LLVMValueRef v_nvalid;
|
||||
LLVMValueRef l_jit_deform = NULL;
|
||||
const TupleTableSlotOps *tts_ops = NULL;
|
||||
|
||||
b_fetch = l_bb_before_v(opblocks[i + 1],
|
||||
"op.%d.fetch", i);
|
||||
@ -283,40 +285,22 @@ llvm_compile_expr(ExprState *state)
|
||||
if (op->d.fetch.known_desc)
|
||||
desc = op->d.fetch.known_desc;
|
||||
|
||||
if (op->d.fetch.fixed)
|
||||
tts_ops = op->d.fetch.kind;
|
||||
|
||||
if (opcode == EEOP_INNER_FETCHSOME)
|
||||
{
|
||||
PlanState *is = innerPlanState(parent);
|
||||
|
||||
v_slot = v_innerslot;
|
||||
|
||||
if (!desc &&
|
||||
is &&
|
||||
is->ps_ResultTupleSlot &&
|
||||
TTS_FIXED(is->ps_ResultTupleSlot))
|
||||
desc = is->ps_ResultTupleSlot->tts_tupleDescriptor;
|
||||
}
|
||||
else if (opcode == EEOP_OUTER_FETCHSOME)
|
||||
{
|
||||
PlanState *os = outerPlanState(parent);
|
||||
|
||||
v_slot = v_outerslot;
|
||||
|
||||
if (!desc &&
|
||||
os &&
|
||||
os->ps_ResultTupleSlot &&
|
||||
TTS_FIXED(os->ps_ResultTupleSlot))
|
||||
desc = os->ps_ResultTupleSlot->tts_tupleDescriptor;
|
||||
}
|
||||
else
|
||||
{
|
||||
v_slot = v_scanslot;
|
||||
if (!desc && parent)
|
||||
desc = parent->scandesc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if all required attributes are available, or
|
||||
* whether deforming is required.
|
||||
*
|
||||
* TODO: skip nvalid check if slot is fixed and known to
|
||||
* be a virtual slot.
|
||||
*/
|
||||
v_nvalid =
|
||||
l_load_struct_gep(b, v_slot,
|
||||
@ -336,19 +320,21 @@ llvm_compile_expr(ExprState *state)
|
||||
* function specific to tupledesc and the exact number of
|
||||
* to-be-extracted attributes.
|
||||
*/
|
||||
if (desc && (context->base.flags & PGJIT_DEFORM))
|
||||
if (tts_ops && desc && (context->base.flags & PGJIT_DEFORM))
|
||||
{
|
||||
LLVMValueRef params[1];
|
||||
LLVMValueRef l_jit_deform;
|
||||
|
||||
l_jit_deform =
|
||||
slot_compile_deform(context, desc,
|
||||
op->d.fetch.last_var);
|
||||
}
|
||||
|
||||
if (l_jit_deform)
|
||||
{
|
||||
LLVMValueRef params[1];
|
||||
|
||||
params[0] = v_slot;
|
||||
|
||||
LLVMBuildCall(b, l_jit_deform,
|
||||
params, lengthof(params), "");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Reference in New Issue
Block a user