Skip to content

Commit 34c9c53

Browse files
committed
Reduce code duplication for ExecJust*Var operations.
This is mainly in preparation for adding further fastpath evaluation routines. Also reorder ExecJust*Var functions to be consistent with the order in which they're used. Author: Andres Freund Discussion: https://postgr.es/m/CAE-ML+9OKSN71+mHtfMD-L24oDp8dGTfaVjDU6U+j+FNAW5kRQ@mail.gmail.com
1 parent d52eaa0 commit 34c9c53

File tree

1 file changed

+35
-59
lines changed

1 file changed

+35
-59
lines changed

src/backend/executor/execExprInterp.c

Lines changed: 35 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,11 @@ static void ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
155155
static Datum ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull);
156156
static Datum ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull);
157157
static Datum ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull);
158-
static Datum ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull);
159158
static Datum ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull);
160159
static Datum ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, bool *isnull);
161160
static Datum ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool *isnull);
162161
static Datum ExecJustApplyFuncToCase(ExprState *state, ExprContext *econtext, bool *isnull);
162+
static Datum ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull);
163163

164164

165165
/*
@@ -1966,13 +1966,12 @@ ShutdownTupleDescRef(Datum arg)
19661966
* Fast-path functions, for very simple expressions
19671967
*/
19681968

1969-
/* Simple reference to inner Var */
1970-
static Datum
1971-
ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
1969+
/* implementation of ExecJust(Inner|Outer|Scan)Var */
1970+
static pg_attribute_always_inline Datum
1971+
ExecJustVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
19721972
{
19731973
ExprEvalStep *op = &state->steps[1];
19741974
int attnum = op->d.var.attnum + 1;
1975-
TupleTableSlot *slot = econtext->ecxt_innertuple;
19761975

19771976
CheckOpSlotCompatibility(&state->steps[0], slot);
19781977

@@ -1984,52 +1983,34 @@ ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
19841983
return slot_getattr(slot, attnum, isnull);
19851984
}
19861985

1987-
/* Simple reference to outer Var */
1986+
/* Simple reference to inner Var */
19881987
static Datum
1989-
ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
1988+
ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
19901989
{
1991-
ExprEvalStep *op = &state->steps[1];
1992-
int attnum = op->d.var.attnum + 1;
1993-
TupleTableSlot *slot = econtext->ecxt_outertuple;
1994-
1995-
CheckOpSlotCompatibility(&state->steps[0], slot);
1996-
1997-
/* See comments in ExecJustInnerVar */
1998-
return slot_getattr(slot, attnum, isnull);
1990+
return ExecJustVarImpl(state, econtext->ecxt_innertuple, isnull);
19991991
}
20001992

2001-
/* Simple reference to scan Var */
1993+
/* Simple reference to outer Var */
20021994
static Datum
2003-
ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
1995+
ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
20041996
{
2005-
ExprEvalStep *op = &state->steps[1];
2006-
int attnum = op->d.var.attnum + 1;
2007-
TupleTableSlot *slot = econtext->ecxt_scantuple;
2008-
2009-
CheckOpSlotCompatibility(&state->steps[0], slot);
2010-
2011-
/* See comments in ExecJustInnerVar */
2012-
return slot_getattr(slot, attnum, isnull);
1997+
return ExecJustVarImpl(state, econtext->ecxt_outertuple, isnull);
20131998
}
20141999

2015-
/* Simple Const expression */
2000+
/* Simple reference to scan Var */
20162001
static Datum
2017-
ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
2002+
ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
20182003
{
2019-
ExprEvalStep *op = &state->steps[0];
2020-
2021-
*isnull = op->d.constval.isnull;
2022-
return op->d.constval.value;
2004+
return ExecJustVarImpl(state, econtext->ecxt_scantuple, isnull);
20232005
}
20242006

2025-
/* Evaluate inner Var and assign to appropriate column of result tuple */
2026-
static Datum
2027-
ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
2007+
/* implementation of ExecJustAssign(Inner|Outer|Scan)Var */
2008+
static pg_attribute_always_inline Datum
2009+
ExecJustAssignVarImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
20282010
{
20292011
ExprEvalStep *op = &state->steps[1];
20302012
int attnum = op->d.assign_var.attnum + 1;
20312013
int resultnum = op->d.assign_var.resultnum;
2032-
TupleTableSlot *inslot = econtext->ecxt_innertuple;
20332014
TupleTableSlot *outslot = state->resultslot;
20342015

20352016
CheckOpSlotCompatibility(&state->steps[0], inslot);
@@ -2047,40 +2028,25 @@ ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
20472028
return 0;
20482029
}
20492030

2031+
/* Evaluate inner Var and assign to appropriate column of result tuple */
2032+
static Datum
2033+
ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
2034+
{
2035+
return ExecJustAssignVarImpl(state, econtext->ecxt_innertuple, isnull);
2036+
}
2037+
20502038
/* Evaluate outer Var and assign to appropriate column of result tuple */
20512039
static Datum
20522040
ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
20532041
{
2054-
ExprEvalStep *op = &state->steps[1];
2055-
int attnum = op->d.assign_var.attnum + 1;
2056-
int resultnum = op->d.assign_var.resultnum;
2057-
TupleTableSlot *inslot = econtext->ecxt_outertuple;
2058-
TupleTableSlot *outslot = state->resultslot;
2059-
2060-
CheckOpSlotCompatibility(&state->steps[0], inslot);
2061-
2062-
/* See comments in ExecJustAssignInnerVar */
2063-
outslot->tts_values[resultnum] =
2064-
slot_getattr(inslot, attnum, &outslot->tts_isnull[resultnum]);
2065-
return 0;
2042+
return ExecJustAssignVarImpl(state, econtext->ecxt_outertuple, isnull);
20662043
}
20672044

20682045
/* Evaluate scan Var and assign to appropriate column of result tuple */
20692046
static Datum
20702047
ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
20712048
{
2072-
ExprEvalStep *op = &state->steps[1];
2073-
int attnum = op->d.assign_var.attnum + 1;
2074-
int resultnum = op->d.assign_var.resultnum;
2075-
TupleTableSlot *inslot = econtext->ecxt_scantuple;
2076-
TupleTableSlot *outslot = state->resultslot;
2077-
2078-
CheckOpSlotCompatibility(&state->steps[0], inslot);
2079-
2080-
/* See comments in ExecJustAssignInnerVar */
2081-
outslot->tts_values[resultnum] =
2082-
slot_getattr(inslot, attnum, &outslot->tts_isnull[resultnum]);
2083-
return 0;
2049+
return ExecJustAssignVarImpl(state, econtext->ecxt_scantuple, isnull);
20842050
}
20852051

20862052
/* Evaluate CASE_TESTVAL and apply a strict function to it */
@@ -2120,6 +2086,16 @@ ExecJustApplyFuncToCase(ExprState *state, ExprContext *econtext, bool *isnull)
21202086
return d;
21212087
}
21222088

2089+
/* Simple Const expression */
2090+
static Datum
2091+
ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
2092+
{
2093+
ExprEvalStep *op = &state->steps[0];
2094+
2095+
*isnull = op->d.constval.isnull;
2096+
return op->d.constval.value;
2097+
}
2098+
21232099
#if defined(EEO_USE_COMPUTED_GOTO)
21242100
/*
21252101
* Comparator used when building address->opcode lookup table for

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy