*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.17 1997/09/18 20:20:20 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.18 1997/12/22 05:41:49 momjian Exp $
*
*-------------------------------------------------------------------------
*/
CheckPredClause((Expr *) predicate, rangeTable, baseRelOid);
return;
}
- else if (or_clause(predicate))
- clauses = ((Expr *) predicate)->args;
- else if (and_clause(predicate))
+ else if (or_clause(predicate) || and_clause(predicate))
clauses = ((Expr *) predicate)->args;
else
elog(WARN, "Unsupported partial-index predicate expression type");
outerPlan = outerPlan(node);
ExecInitNode(outerPlan, estate, (Plan *) node);
+ /*
+ * Result runs in its own context, but make it use our aggregates
+ * fix for 'select sum(2+2)'
+ */
+ if (nodeTag(outerPlan) == T_Result)
+ {
+ ((Result *)outerPlan)->resstate->cstate.cs_ProjInfo->pi_exprContext->ecxt_values =
+ econtext->ecxt_values;
+ ((Result *)outerPlan)->resstate->cstate.cs_ProjInfo->pi_exprContext->ecxt_nulls =
+ econtext->ecxt_nulls;
+ }
+
+
/* ----------------
* initialize tuple type.
* ----------------
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/xfunc.c,v 1.8 1997/12/11 17:36:29 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/xfunc.c,v 1.9 1997/12/22 05:41:59 momjian Exp $
*
*-------------------------------------------------------------------------
*/
(LispValue) get_funcargs(clause)));
else if (fast_not_clause(clause))
return (xfunc_local_expense(lsecond(clause)));
- else if (fast_or_clause(clause))
+ else if (fast_or_clause(clause) || fast_and_clause(clause))
{
/* find cost of evaluating each disjunct */
for (tmpclause = lnext(clause); tmpclause != LispNil;
}
else if (fast_not_clause(clause))
return (xfunc_find_references(lsecond(clause)));
- else if (fast_or_clause(clause))
+ else if (fast_or_clause(clause) || fast_and_clause(clause))
{
/* string together result of all operands of OR */
for (tmpclause = lnext(clause); tmpclause != LispNil;
xfunc_fixvars(lfirst(tmpclause), rel, varno);
else if (fast_not_clause(clause))
xfunc_fixvars(lsecond(clause), rel, varno);
- else if (fast_or_clause(clause))
+ else if (fast_or_clause(clause) || fast_and_clause(clause))
for (tmpclause = lnext(clause); tmpclause != LispNil;
tmpclause = lnext(tmpclause))
xfunc_fixvars(lfirst(tmpclause), rel, varno);
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.12 1997/12/20 07:59:25 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.13 1997/12/22 05:42:04 momjian Exp $
*
*-------------------------------------------------------------------------
*/
List *qual)
{
List *constant_qual = NIL;
- List *flattened_tlist = NIL;
+ List *var_only_tlist = NIL;
List *level_tlist = NIL;
Plan *subplan = (Plan *) NULL;
* Create a target list that consists solely of (resdom var) target
* list entries, i.e., contains no arbitrary expressions.
*/
- flattened_tlist = flatten_tlist(tlist);
- if (flattened_tlist)
- {
- level_tlist = flattened_tlist;
- }
+ var_only_tlist = flatten_tlist(tlist);
+ if (var_only_tlist)
+ level_tlist = var_only_tlist;
else
- {
/* from old code. the logic is beyond me. - ay 2/95 */
level_tlist = tlist;
- }
/*
* A query may have a non-variable target list and a non-variable
* all-new tuples, or - the query is a replace (a scan must still be
* done in this case).
*/
- if (flattened_tlist == NULL && qual == NULL)
+ if (var_only_tlist == NULL && qual == NULL)
{
switch (command_type)
return (plan);
}
+ /*
+ * fix up the flattened target list of the plan root node so that
+ * expressions are evaluated. this forces expression evaluations that
+ * may involve expensive function calls to be delayed to the very last
+ * stage of query execution. this could be bad. but it is joey's
+ * responsibility to optimally push these expressions down the plan
+ * tree. -- Wei
+ *
+ * But now nothing to do if there are GroupBy and/or Aggregates: 1.
+ * make_groupPlan fixes tlist; 2. flatten_tlist_vars does nothing with
+ * aggregates fixing only other entries (i.e. - GroupBy-ed and so
+ * fixed by make_groupPlan). - vadim 04/05/97
+ */
+ if (root->groupClause == NULL && root->qry_aggs == NULL)
+ {
+ subplan->targetlist = flatten_tlist_vars(tlist,
+ subplan->targetlist);
+ }
+
+#ifdef NOT_USED
/*
* Destructively modify the query plan's targetlist to add fjoin lists
* to flatten functions that return sets of base types
*/
-#ifdef NOT_USED
subplan->targetlist = generate_fjoin(subplan->targetlist);
#endif
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.14 1997/12/20 07:59:27 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.15 1997/12/22 05:42:08 momjian Exp $
*
*-------------------------------------------------------------------------
*/
List *rangetable = parse->rtable;
char *uniqueflag = parse->uniqueFlag;
List *sortclause = parse->sortClause;
- Agg *aggplan = NULL;
Plan *result_plan = (Plan *) NULL;
*/
if (parse->qry_aggs)
{
- aggplan = make_agg(tlist,
+ result_plan = (Plan *)make_agg(tlist,
parse->qry_numAgg,
parse->qry_aggs,
result_plan);
* pointers, after a few dozen's of copying, they're not the same
* as those in the target list.)
*/
- set_agg_tlist_references(aggplan);
- set_agg_agglist_references(aggplan);
-
- result_plan = (Plan *) aggplan;
- }
-
- /*
- * fix up the flattened target list of the plan root node so that
- * expressions are evaluated. this forces expression evaluations that
- * may involve expensive function calls to be delayed to the very last
- * stage of query execution. this could be bad. but it is joey's
- * responsibility to optimally push these expressions down the plan
- * tree. -- Wei
- *
- * But now nothing to do if there are GroupBy and/or Aggregates: 1.
- * make_groupPlan fixes tlist; 2. flatten_tlist_vars does nothing with
- * aggregates fixing only other entries (i.e. - GroupBy-ed and so
- * fixed by make_groupPlan). - vadim 04/05/97
- */
- if (parse->groupClause == NULL && aggplan == NULL)
- {
- result_plan->targetlist = flatten_tlist_vars(tlist,
- result_plan->targetlist);
+ set_agg_tlist_references((Agg *)result_plan);
+ set_agg_agglist_references((Agg *)result_plan);
}
/*
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.9 1997/12/20 07:59:28 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.10 1997/12/22 05:42:10 momjian Exp $
*
*-------------------------------------------------------------------------
*/
{
return ((List *) clause);
}
+ else if (and_clause((Node *) clause))
+ {
+ List *andclause =
+ replace_subclause_joinvar_refs(((Expr *) clause)->args,
+ outer_tlist,
+ inner_tlist);
+
+ return ((List *) make_andclause(andclause));
+ }
else if (or_clause((Node *) clause))
{
List *orclause =
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.12 1997/09/25 12:48:15 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.13 1997/12/22 05:42:14 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
if (not_clause(clause))
return (true);
- if (or_clause(clause))
+ if (or_clause(clause) || and_clause(clause))
{
List *a;
{
;
}
- else if (or_clause(clause))
+ else if (or_clause(clause) || and_clause(clause))
{
fix_opids(((Expr *) clause)->args);
}
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.6 1997/09/08 21:45:56 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.7 1997/12/22 05:42:16 momjian Exp $
*
*-------------------------------------------------------------------------
*/
return contain_var_clause(((Iter *) clause)->iterexpr);
else if (single_node(clause))
return FALSE;
- else if (or_clause(clause))
+ else if (or_clause(clause) || and_clause(clause))
{
List *temp;
retval = pull_var_clause(((Iter *) clause)->iterexpr);
else if (single_node(clause))
retval = NIL;
- else if (or_clause(clause))
+ else if (or_clause(clause) || and_clause(clause))
{
List *temp;
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.3 1997/11/26 03:42:37 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.4 1997/12/22 05:42:19 momjian Exp $
*
*-------------------------------------------------------------------------
*/
return contain_agg_clause(((Iter *) clause)->iterexpr);
else if (single_node(clause))
return FALSE;
- else if (or_clause(clause))
+ else if (or_clause(clause) || and_clause(clause))
{
List *temp;
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.30 1997/11/26 01:11:36 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.31 1997/12/22 05:42:25 momjian Exp $
*
*-------------------------------------------------------------------------
*/
{
return;
}
- else if (or_clause(clause))
+ else if (or_clause(clause) || and_clause(clause))
{
List *temp;