aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-03-12 19:32:06 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-03-12 19:32:06 +0000
commit1879175b18211962984e6ff0f3cba344c386b11c (patch)
tree9673b9922dc4229839ccf6ab46f127caf535aaad /src
parentef3386affebb641bf84a528fc2b62530577c10e8 (diff)
downloadpostgresql-1879175b18211962984e6ff0f3cba344c386b11c.tar.gz
postgresql-1879175b18211962984e6ff0f3cba344c386b11c.zip
Fix performance bug in constant-expression simplifier. After finding
that the inputs to a given operator can be recursively simplified to constants, it was evaluating the operator using the op's *original* (unsimplified) arg list, so that any subexpressions had to be evaluated again. A constant subexpression at depth N got evaluated N times. Probably not very important in practical situations, but it made us look real slow in MySQL's 'crashme' test...
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/util/clauses.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 4bb84f15214..3ec5118ff77 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.60 2000/02/20 21:32:06 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.61 2000/03/12 19:32:06 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -991,18 +991,26 @@ eval_const_expressions_mutator (Node *node, void *context)
* duplication of code and ensure we get the same result
* as the executor would get.
*
- * The only setup needed here is the replace_opid()
- * that we already did for the OP_EXPR case.
- *
+ * Build a new Expr node containing the already-simplified
+ * arguments. The only other setup needed here is the
+ * replace_opid() that we already did for the OP_EXPR case.
+ */
+ newexpr = makeNode(Expr);
+ newexpr->typeOid = expr->typeOid;
+ newexpr->opType = expr->opType;
+ newexpr->oper = expr->oper;
+ newexpr->args = args;
+ /*
* It is OK to pass econtext = NULL because none of the
* ExecEvalExpr() code used in this situation will use
* econtext. That might seem fortuitous, but it's not
* so unreasonable --- a constant expression does not
* depend on context, by definition, n'est ce pas?
*/
- const_val = ExecEvalExpr((Node *) expr, NULL,
+ const_val = ExecEvalExpr((Node *) newexpr, NULL,
&const_is_null, &isDone);
Assert(isDone); /* if this isn't set, we blew it... */
+ pfree(newexpr);
/*
* Make the constant result node.
*/