mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Fix inadequate tree-walking code in exec_eval_clear_fcache.
This commit is contained in:
@ -3,7 +3,7 @@
|
|||||||
* procedural language
|
* procedural language
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.32 2000/11/16 22:30:50 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.33 2000/12/01 20:43:59 tgl Exp $
|
||||||
*
|
*
|
||||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||||
*
|
*
|
||||||
@ -54,6 +54,7 @@
|
|||||||
#include "executor/spi.h"
|
#include "executor/spi.h"
|
||||||
#include "executor/spi_priv.h"
|
#include "executor/spi_priv.h"
|
||||||
#include "fmgr.h"
|
#include "fmgr.h"
|
||||||
|
#include "optimizer/clauses.h"
|
||||||
#include "parser/parse_expr.h"
|
#include "parser/parse_expr.h"
|
||||||
#include "tcop/tcopprot.h"
|
#include "tcop/tcopprot.h"
|
||||||
#include "utils/builtins.h"
|
#include "utils/builtins.h"
|
||||||
@ -112,6 +113,7 @@ static void exec_prepare_plan(PLpgSQL_execstate * estate,
|
|||||||
static bool exec_simple_check_node(Node *node);
|
static bool exec_simple_check_node(Node *node);
|
||||||
static void exec_simple_check_plan(PLpgSQL_expr * expr);
|
static void exec_simple_check_plan(PLpgSQL_expr * expr);
|
||||||
static void exec_eval_clear_fcache(Node *node);
|
static void exec_eval_clear_fcache(Node *node);
|
||||||
|
static bool exec_eval_clear_fcache_walker(Node *node, void *context);
|
||||||
static Datum exec_eval_simple_expr(PLpgSQL_execstate * estate,
|
static Datum exec_eval_simple_expr(PLpgSQL_execstate * estate,
|
||||||
PLpgSQL_expr * expr,
|
PLpgSQL_expr * expr,
|
||||||
bool *isNull,
|
bool *isNull,
|
||||||
@ -2593,7 +2595,7 @@ exec_eval_simple_expr(PLpgSQL_execstate * estate,
|
|||||||
*rettype = expr->plan_simple_type;
|
*rettype = expr->plan_simple_type;
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
* Clear the function cache
|
* Clear any function cache entries in the expression tree
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
exec_eval_clear_fcache(expr->plan_simple_expr);
|
exec_eval_clear_fcache(expr->plan_simple_expr);
|
||||||
@ -2904,32 +2906,34 @@ exec_simple_check_plan(PLpgSQL_expr * expr)
|
|||||||
static void
|
static void
|
||||||
exec_eval_clear_fcache(Node *node)
|
exec_eval_clear_fcache(Node *node)
|
||||||
{
|
{
|
||||||
Expr *expr;
|
/* This tree walk requires no special setup, so away we go... */
|
||||||
List *l;
|
exec_eval_clear_fcache_walker(node, NULL);
|
||||||
|
|
||||||
if (nodeTag(node) != T_Expr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
expr = (Expr *) node;
|
|
||||||
|
|
||||||
switch (expr->opType)
|
|
||||||
{
|
|
||||||
case OP_EXPR:
|
|
||||||
((Oper *) (expr->oper))->op_fcache = NULL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FUNC_EXPR:
|
|
||||||
((Func *) (expr->oper))->func_fcache = NULL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach(l, expr->args)
|
|
||||||
exec_eval_clear_fcache(lfirst(l));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
exec_eval_clear_fcache_walker(Node *node, void *context)
|
||||||
|
{
|
||||||
|
if (node == NULL)
|
||||||
|
return false;
|
||||||
|
if (IsA(node, Expr))
|
||||||
|
{
|
||||||
|
Expr *expr = (Expr *) node;
|
||||||
|
|
||||||
|
switch (expr->opType)
|
||||||
|
{
|
||||||
|
case OP_EXPR:
|
||||||
|
((Oper *) (expr->oper))->op_fcache = NULL;
|
||||||
|
break;
|
||||||
|
case FUNC_EXPR:
|
||||||
|
((Func *) (expr->oper))->func_fcache = NULL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return expression_tree_walker(node, exec_eval_clear_fcache_walker,
|
||||||
|
context);
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
* exec_set_found Set the global found variable
|
* exec_set_found Set the global found variable
|
||||||
|
Reference in New Issue
Block a user