From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Matthew Gabeler-Lee <mgabelerlee(at)zycos(dot)com> |
Cc: | pgsql-general(at)postgresql(dot)org, Bart Teeuwisse <bart(dot)teeuwisse(at)thecodemill(dot)biz> |
Subject: | Re: Query breaking with unknown expression type (lost s |
Date: | 2002-12-05 21:51:06 |
Message-ID: | 2630.1039125066@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Matthew Gabeler-Lee <mgabelerlee(at)zycos(dot)com> writes:
> -- triggers bug
> select * from (select t1.*, (select t2.c from t2 limit 1) as v from t1) t1v
> natural left join t3;
Excellent, thank you for the test case.
I've applied the attached patch to prevent this problem.
regards, tom lane
*** src/backend/optimizer/plan/planner.c.orig Tue Sep 24 14:38:23 2002
--- src/backend/optimizer/plan/planner.c Thu Dec 5 16:32:21 2002
***************
*** 330,339 ****
* nothing will happen after the first time. We do have to be
* careful to copy everything we pull up, however, or risk
* having chunks of structure multiply linked.
*/
subquery->jointree = (FromExpr *)
pull_up_subqueries(subquery, (Node *) subquery->jointree,
! below_outer_join);
/*
* Now make a modifiable copy of the subquery that we can run
--- 330,343 ----
* nothing will happen after the first time. We do have to be
* careful to copy everything we pull up, however, or risk
* having chunks of structure multiply linked.
+ *
+ * Note: 'false' is correct here even if we are within an outer
+ * join in the upper query; the lower query starts with a clean
+ * slate for outer-join semantics.
*/
subquery->jointree = (FromExpr *)
pull_up_subqueries(subquery, (Node *) subquery->jointree,
! false);
/*
* Now make a modifiable copy of the subquery that we can run
***************
*** 513,518 ****
--- 517,536 ----
* quals of higher queries.
*/
if (expression_returns_set((Node *) subquery->targetList))
+ return false;
+
+ /*
+ * Don't pull up a subquery that has any sublinks in its targetlist,
+ * either. As of PG 7.3 this creates problems because the pulled-up
+ * expressions may go into join alias lists, and the sublinks would
+ * not get fixed because we do flatten_join_alias_vars() too late.
+ * Eventually we should do a complete flatten_join_alias_vars as the
+ * first step of preprocess_expression, and then we could probably
+ * support this. (BUT: it might be a bad idea anyway, due to possibly
+ * causing multiple evaluations of an expensive sublink.)
+ */
+ if (subquery->hasSubLinks &&
+ contain_subplans((Node *) subquery->targetList))
return false;
/*
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Treat | 2002-12-05 21:57:56 | Re: Size for vacuum_mem |
Previous Message | Bruce Momjian | 2002-12-05 20:18:36 | Re: passwords in pg_shadow (duplicate). |