aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-03-14 00:55:17 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-03-14 00:55:17 +0000
commit7931bfa764d114ed64cc24bbeb3876206f2e2ec4 (patch)
tree0c8abc0ae204cdc671a34f132357b628746fc6d0
parent2a1ef30b5779edb9acd1bb69e9d4f4e1c7889f9e (diff)
downloadpostgresql-7931bfa764d114ed64cc24bbeb3876206f2e2ec4.tar.gz
postgresql-7931bfa764d114ed64cc24bbeb3876206f2e2ec4.zip
Make eval_const_expressions simplify FieldSelect from a whole-row Var
into an ordinary one-field Var. Per example from Chris Mungall.
-rw-r--r--src/backend/optimizer/util/clauses.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index fcd58374189..bdad4d9b811 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.131 2003/03/10 03:53:50 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.132 2003/03/14 00:55:17 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -1497,6 +1497,28 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
newcoalesce->args = newargs;
return (Node *) newcoalesce;
}
+ if (IsA(node, FieldSelect))
+ {
+ /*
+ * We can optimize field selection from a whole-row Var into a
+ * simple Var. (This case won't be generated directly by the
+ * parser, because ParseComplexProjection short-circuits it.
+ * But it can arise while simplifying functions.) If the argument
+ * isn't a whole-row Var, just fall through to do generic processing.
+ */
+ FieldSelect *fselect = (FieldSelect *) node;
+ Var *argvar = (Var *) fselect->arg;
+
+ if (argvar && IsA(argvar, Var) &&
+ argvar->varattno == InvalidAttrNumber)
+ {
+ return (Node *) makeVar(argvar->varno,
+ fselect->fieldnum,
+ fselect->resulttype,
+ fselect->resulttypmod,
+ argvar->varlevelsup);
+ }
+ }
/*
* For any node type not handled above, we recurse using