aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/util/clauses.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/util/clauses.c')
-rw-r--r--src/backend/optimizer/util/clauses.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 5df7e1c3cb3..6060f462e8f 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.147 2003/07/25 00:01:08 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.148 2003/07/28 18:33:18 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -70,6 +70,7 @@ static Node *substitute_actual_parameters(Node *expr, int nargs, List *args,
int *usecounts);
static Node *substitute_actual_parameters_mutator(Node *node,
substitute_actual_parameters_context *context);
+static void sql_inline_error_callback(void *arg);
static Expr *evaluate_expr(Expr *expr, Oid result_type);
@@ -1730,6 +1731,7 @@ inline_function(Oid funcid, Oid result_type, List *args,
bool isNull;
MemoryContext oldcxt;
MemoryContext mycxt;
+ ErrorContextCallback sqlerrcontext;
List *raw_parsetree_list;
List *querytree_list;
Query *querytree;
@@ -1781,6 +1783,15 @@ inline_function(Oid funcid, Oid result_type, List *args,
}
/*
+ * Setup error traceback support for ereport(). This is so that we can
+ * finger the function that bad information came from.
+ */
+ sqlerrcontext.callback = sql_inline_error_callback;
+ sqlerrcontext.arg = funcform;
+ sqlerrcontext.previous = error_context_stack;
+ error_context_stack = &sqlerrcontext;
+
+ /*
* Make a temporary memory context, so that we don't leak all the
* stuff that parsing might create.
*/
@@ -1926,12 +1937,15 @@ inline_function(Oid funcid, Oid result_type, List *args,
newexpr = eval_const_expressions_mutator(newexpr,
lconso(funcid, active_fns));
+ error_context_stack = sqlerrcontext.previous;
+
return (Expr *) newexpr;
/* Here if func is not inlinable: release temp memory and return NULL */
fail:
MemoryContextSwitchTo(oldcxt);
MemoryContextDelete(mycxt);
+ error_context_stack = sqlerrcontext.previous;
return NULL;
}
@@ -1979,6 +1993,18 @@ substitute_actual_parameters_mutator(Node *node,
}
/*
+ * error context callback to let us supply a call-stack traceback
+ */
+static void
+sql_inline_error_callback(void *arg)
+{
+ Form_pg_proc funcform = (Form_pg_proc) arg;
+
+ errcontext("SQL function \"%s\" during inlining",
+ NameStr(funcform->proname));
+}
+
+/*
* evaluate_expr: pre-evaluate a constant expression
*
* We use the executor's routine ExecEvalExpr() to avoid duplication of