diff options
author | Andres Freund <andres@anarazel.de> | 2017-12-29 12:38:15 -0800 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2017-12-29 12:45:25 -0800 |
commit | b40933101ca622aa8a35b6fe07ace36effadf1c7 (patch) | |
tree | 386c6c5114eacc544ad6b96e6f860c92272d1740 /src/backend/executor/execExpr.c | |
parent | 4717fdb14cf0a62ffe1b1023e1c5ea8866e34fa0 (diff) | |
download | postgresql-b40933101ca622aa8a35b6fe07ace36effadf1c7.tar.gz postgresql-b40933101ca622aa8a35b6fe07ace36effadf1c7.zip |
Perform slot validity checks in a separate pass over expression.
This reduces code duplication a bit, but the primary benefit that it
makes JITing expression evaluation easier. When doing so we can't, as
previously done in the interpreted case, really change opcode without
recompiling. Nor dow we just carry around unnecessary branches to
avoid re-checking over and over.
As a minor side-effect this makes ExecEvalStepOp() O(log(N)) rather
than O(N).
Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de
Diffstat (limited to 'src/backend/executor/execExpr.c')
-rw-r--r-- | src/backend/executor/execExpr.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index 55bb9251917..2642b404ff6 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -680,20 +680,19 @@ ExecInitExprRec(Expr *node, ExprState *state, /* regular user column */ scratch.d.var.attnum = variable->varattno - 1; scratch.d.var.vartype = variable->vartype; - /* select EEOP_*_FIRST opcode to force one-time checks */ switch (variable->varno) { case INNER_VAR: - scratch.opcode = EEOP_INNER_VAR_FIRST; + scratch.opcode = EEOP_INNER_VAR; break; case OUTER_VAR: - scratch.opcode = EEOP_OUTER_VAR_FIRST; + scratch.opcode = EEOP_OUTER_VAR; break; /* INDEX_VAR is handled by default case */ default: - scratch.opcode = EEOP_SCAN_VAR_FIRST; + scratch.opcode = EEOP_SCAN_VAR; break; } } |