diff options
author | Andres Freund <andres@anarazel.de> | 2018-03-26 12:57:19 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2018-03-26 12:57:19 -0700 |
commit | 32af96b2b118cd204ca809d7c48c7f8ea7f879cf (patch) | |
tree | d9a09cc42afb193293a0b65cfa080d676763d776 /src/backend/executor | |
parent | 64f85894ad2730fb1449a8e81dd8026604e9a546 (diff) | |
download | postgresql-32af96b2b118cd204ca809d7c48c7f8ea7f879cf.tar.gz postgresql-32af96b2b118cd204ca809d7c48c7f8ea7f879cf.zip |
JIT tuple deforming in LLVM JIT provider.
Performing JIT compilation for deforming gains performance benefits
over unJITed deforming from compile-time knowledge of the tuple
descriptor. Fixed column widths, NOT NULLness, etc can be taken
advantage of.
Right now the JITed deforming is only used when deforming tuples as
part of expression evaluation (and obviously only if the descriptor is
known). It's likely to be beneficial in other cases, too.
By default tuple deforming is JITed whenever an expression is JIT
compiled. There's a separate boolean GUC controlling it, but that's
expected to be primarily useful for development and benchmarking.
Docs will follow in a later commit containing docs for the whole JIT
feature.
Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execExpr.c | 5 | ||||
-rw-r--r-- | src/backend/executor/execTuples.c | 1 | ||||
-rw-r--r-- | src/backend/executor/nodeForeignscan.c | 6 |
3 files changed, 11 insertions, 1 deletions
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index 13bf891cea7..e284fd71d75 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -2287,18 +2287,21 @@ ExecPushExprSlots(ExprState *state, LastAttnumInfo *info) { scratch.opcode = EEOP_INNER_FETCHSOME; scratch.d.fetch.last_var = info->last_inner; + scratch.d.fetch.known_desc = NULL; ExprEvalPushStep(state, &scratch); } if (info->last_outer > 0) { scratch.opcode = EEOP_OUTER_FETCHSOME; scratch.d.fetch.last_var = info->last_outer; + scratch.d.fetch.known_desc = NULL; ExprEvalPushStep(state, &scratch); } if (info->last_scan > 0) { scratch.opcode = EEOP_SCAN_FETCHSOME; scratch.d.fetch.last_var = info->last_scan; + scratch.d.fetch.known_desc = NULL; ExprEvalPushStep(state, &scratch); } } @@ -3250,10 +3253,12 @@ ExecBuildGroupingEqual(TupleDesc ldesc, TupleDesc rdesc, /* push deform steps */ scratch.opcode = EEOP_INNER_FETCHSOME; scratch.d.fetch.last_var = maxatt; + scratch.d.fetch.known_desc = ldesc; ExprEvalPushStep(state, &scratch); scratch.opcode = EEOP_OUTER_FETCHSOME; scratch.d.fetch.last_var = maxatt; + scratch.d.fetch.known_desc = rdesc; ExprEvalPushStep(state, &scratch); /* diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index c46d65cf938..acd1b97b0e6 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -896,6 +896,7 @@ ExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupledesc) { scanstate->ss_ScanTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable, tupledesc); + scanstate->ps.scandesc = tupledesc; } /* ---------------- diff --git a/src/backend/executor/nodeForeignscan.c b/src/backend/executor/nodeForeignscan.c index 0084234b350..a2a28b7ec26 100644 --- a/src/backend/executor/nodeForeignscan.c +++ b/src/backend/executor/nodeForeignscan.c @@ -186,7 +186,11 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags) } else { - ExecInitScanTupleSlot(estate, &scanstate->ss, RelationGetDescr(currentRelation)); + TupleDesc scan_tupdesc; + + /* don't trust FDWs to return tuples fulfilling NOT NULL constraints */ + scan_tupdesc = CreateTupleDescCopy(RelationGetDescr(currentRelation)); + ExecInitScanTupleSlot(estate, &scanstate->ss, scan_tupdesc); /* Node's targetlist will contain Vars with varno = scanrelid */ tlistvarno = scanrelid; } |