aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2018-01-23 23:20:02 -0800
committerAndres Freund <andres@anarazel.de>2018-01-29 12:01:07 -0800
commitfc96c6942551dafa6cb2a6000cbc9b20643e5db3 (patch)
treea6612a76bf06b9faed77e2c53682db85333bc92e /src
parent1e1e599d6663c4a65388b40f84b2ea6b7c6e381b (diff)
downloadpostgresql-fc96c6942551dafa6cb2a6000cbc9b20643e5db3.tar.gz
postgresql-fc96c6942551dafa6cb2a6000cbc9b20643e5db3.zip
Initialize unused ExprEvalStep fields.
ExecPushExprSlots didn't initialize ExprEvalStep's resvalue/resnull steps as it didn't use them. That caused wrong valgrind warnings for an upcoming patch, so zero-intialize. Also zero-initialize all scratch ExprEvalStep's allocated on the stack, to avoid issues with similar future omissions of non-critial data.
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/execExpr.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index 883a29f0a7b..c6eb3ebacf8 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -118,7 +118,7 @@ ExprState *
ExecInitExpr(Expr *node, PlanState *parent)
{
ExprState *state;
- ExprEvalStep scratch;
+ ExprEvalStep scratch = {0};
/* Special case: NULL expression produces a NULL ExprState pointer */
if (node == NULL)
@@ -155,7 +155,7 @@ ExprState *
ExecInitExprWithParams(Expr *node, ParamListInfo ext_params)
{
ExprState *state;
- ExprEvalStep scratch;
+ ExprEvalStep scratch = {0};
/* Special case: NULL expression produces a NULL ExprState pointer */
if (node == NULL)
@@ -204,7 +204,7 @@ ExprState *
ExecInitQual(List *qual, PlanState *parent)
{
ExprState *state;
- ExprEvalStep scratch;
+ ExprEvalStep scratch = {0};
List *adjust_jumps = NIL;
ListCell *lc;
@@ -353,7 +353,7 @@ ExecBuildProjectionInfo(List *targetList,
{
ProjectionInfo *projInfo = makeNode(ProjectionInfo);
ExprState *state;
- ExprEvalStep scratch;
+ ExprEvalStep scratch = {0};
ListCell *lc;
projInfo->pi_exprContext = econtext;
@@ -638,7 +638,7 @@ static void
ExecInitExprRec(Expr *node, ExprState *state,
Datum *resv, bool *resnull)
{
- ExprEvalStep scratch;
+ ExprEvalStep scratch = {0};
/* Guard against stack overflow due to overly complex expressions */
check_stack_depth();
@@ -2273,7 +2273,10 @@ ExecInitExprSlots(ExprState *state, Node *node)
static void
ExecPushExprSlots(ExprState *state, LastAttnumInfo *info)
{
- ExprEvalStep scratch;
+ ExprEvalStep scratch = {0};
+
+ scratch.resvalue = NULL;
+ scratch.resnull = NULL;
/* Emit steps as needed */
if (info->last_inner > 0)
@@ -2659,7 +2662,7 @@ static void
ExecInitCoerceToDomain(ExprEvalStep *scratch, CoerceToDomain *ctest,
ExprState *state, Datum *resv, bool *resnull)
{
- ExprEvalStep scratch2;
+ ExprEvalStep scratch2 = {0};
DomainConstraintRef *constraint_ref;
Datum *domainval = NULL;
bool *domainnull = NULL;
@@ -2811,7 +2814,7 @@ ExecBuildAggTrans(AggState *aggstate, AggStatePerPhase phase,
{
ExprState *state = makeNode(ExprState);
PlanState *parent = &aggstate->ss.ps;
- ExprEvalStep scratch;
+ ExprEvalStep scratch = {0};
int transno = 0;
int setoff = 0;
bool isCombine = DO_AGGSPLIT_COMBINE(aggstate->aggsplit);