|
16 | 16 | * |
17 | 17 | * |
18 | 18 | * IDENTIFICATION |
19 | | - * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.57 2008/10/21 20:42:53 tgl Exp $ |
| 19 | + * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.58 2008/10/22 20:17:52 tgl Exp $ |
20 | 20 | * |
21 | 21 | *------------------------------------------------------------------------- |
22 | 22 | */ |
@@ -565,7 +565,6 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, |
565 | 565 | subroot->cte_plan_ids = NIL; |
566 | 566 | subroot->eq_classes = NIL; |
567 | 567 | subroot->append_rel_list = NIL; |
568 | | - subroot->placeholder_list = NIL; |
569 | 568 | subroot->hasRecursion = false; |
570 | 569 | subroot->wt_param_id = -1; |
571 | 570 | subroot->non_recursive_plan = NULL; |
@@ -627,20 +626,18 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, |
627 | 626 | /* |
628 | 627 | * Adjust level-0 varnos in subquery so that we can append its rangetable |
629 | 628 | * to upper query's. We have to fix the subquery's append_rel_list |
630 | | - * and placeholder_list as well. |
| 629 | + * as well. |
631 | 630 | */ |
632 | 631 | rtoffset = list_length(parse->rtable); |
633 | 632 | OffsetVarNodes((Node *) subquery, rtoffset, 0); |
634 | 633 | OffsetVarNodes((Node *) subroot->append_rel_list, rtoffset, 0); |
635 | | - OffsetVarNodes((Node *) subroot->placeholder_list, rtoffset, 0); |
636 | 634 |
|
637 | 635 | /* |
638 | 636 | * Upper-level vars in subquery are now one level closer to their parent |
639 | 637 | * than before. |
640 | 638 | */ |
641 | 639 | IncrementVarSublevelsUp((Node *) subquery, -1, 1); |
642 | 640 | IncrementVarSublevelsUp((Node *) subroot->append_rel_list, -1, 1); |
643 | | - IncrementVarSublevelsUp((Node *) subroot->placeholder_list, -1, 1); |
644 | 641 |
|
645 | 642 | /* |
646 | 643 | * The subquery's targetlist items are now in the appropriate form to |
@@ -706,48 +703,42 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, |
706 | 703 | parse->rowMarks = list_concat(parse->rowMarks, subquery->rowMarks); |
707 | 704 |
|
708 | 705 | /* |
709 | | - * We also have to fix the relid sets of any FlattenedSubLink, |
710 | | - * PlaceHolderVar, and PlaceHolderInfo nodes in the parent query. |
711 | | - * (This could perhaps be done by ResolveNew, but it would clutter that |
712 | | - * routine's API unreasonably.) Note in particular that any placeholder |
713 | | - * nodes just created by insert_targetlist_placeholders() wiil be adjusted. |
| 706 | + * We also have to fix the relid sets of any FlattenedSubLink and |
| 707 | + * PlaceHolderVar nodes in the parent query. (This could perhaps be done |
| 708 | + * by ResolveNew, but it would clutter that routine's API unreasonably.) |
| 709 | + * Note in particular that any PlaceHolderVar nodes just created by |
| 710 | + * insert_targetlist_placeholders() will be adjusted, so having created |
| 711 | + * them with the subquery's varno is correct. |
714 | 712 | * |
715 | 713 | * Likewise, relids appearing in AppendRelInfo nodes have to be fixed (but |
716 | 714 | * we took care of their translated_vars lists above). We already checked |
717 | 715 | * that this won't require introducing multiple subrelids into the |
718 | 716 | * single-slot AppendRelInfo structs. |
719 | 717 | */ |
720 | | - if (parse->hasSubLinks || root->placeholder_list || root->append_rel_list) |
| 718 | + if (parse->hasSubLinks || root->glob->lastPHId != 0 || |
| 719 | + root->append_rel_list) |
721 | 720 | { |
722 | 721 | Relids subrelids; |
723 | 722 |
|
724 | 723 | subrelids = get_relids_in_jointree((Node *) subquery->jointree, false); |
725 | | - substitute_multiple_relids((Node *) parse, |
726 | | - varno, subrelids); |
727 | | - substitute_multiple_relids((Node *) root->placeholder_list, |
728 | | - varno, subrelids); |
729 | | - fix_append_rel_relids(root->append_rel_list, |
730 | | - varno, subrelids); |
| 724 | + substitute_multiple_relids((Node *) parse, varno, subrelids); |
| 725 | + fix_append_rel_relids(root->append_rel_list, varno, subrelids); |
731 | 726 | } |
732 | 727 |
|
733 | 728 | /* |
734 | | - * And now add subquery's AppendRelInfos and PlaceHolderInfos to our lists. |
735 | | - * Note that any placeholders pulled up from the subquery will appear |
736 | | - * after any we just created; this preserves the property that placeholders |
737 | | - * can only refer to other placeholders that appear later in the list |
738 | | - * (needed by fix_placeholder_eval_levels). |
| 729 | + * And now add subquery's AppendRelInfos to our list. |
739 | 730 | */ |
740 | 731 | root->append_rel_list = list_concat(root->append_rel_list, |
741 | 732 | subroot->append_rel_list); |
742 | | - root->placeholder_list = list_concat(root->placeholder_list, |
743 | | - subroot->placeholder_list); |
744 | 733 |
|
745 | 734 | /* |
746 | 735 | * We don't have to do the equivalent bookkeeping for outer-join info, |
747 | | - * because that hasn't been set up yet. |
| 736 | + * because that hasn't been set up yet. placeholder_list likewise. |
748 | 737 | */ |
749 | 738 | Assert(root->join_info_list == NIL); |
750 | 739 | Assert(subroot->join_info_list == NIL); |
| 740 | + Assert(root->placeholder_list == NIL); |
| 741 | + Assert(subroot->placeholder_list == NIL); |
751 | 742 |
|
752 | 743 | /* |
753 | 744 | * Miscellaneous housekeeping. |
@@ -1606,10 +1597,10 @@ reduce_outer_joins_pass2(Node *jtnode, |
1606 | 1597 | * substitute_multiple_relids - adjust node relid sets after pulling up |
1607 | 1598 | * a subquery |
1608 | 1599 | * |
1609 | | - * Find any FlattenedSubLink, PlaceHolderVar, or PlaceHolderInfo nodes in the |
1610 | | - * given tree that reference the pulled-up relid, and change them to reference |
1611 | | - * the replacement relid(s). We do not need to recurse into subqueries, since |
1612 | | - * no subquery of the current top query could (yet) contain such a reference. |
| 1600 | + * Find any FlattenedSubLink or PlaceHolderVar nodes in the given tree that |
| 1601 | + * reference the pulled-up relid, and change them to reference the replacement |
| 1602 | + * relid(s). We do not need to recurse into subqueries, since no subquery of |
| 1603 | + * the current top query could (yet) contain such a reference. |
1613 | 1604 | * |
1614 | 1605 | * NOTE: although this has the form of a walker, we cheat and modify the |
1615 | 1606 | * nodes in-place. This should be OK since the tree was copied by ResolveNew |
@@ -1662,26 +1653,11 @@ substitute_multiple_relids_walker(Node *node, |
1662 | 1653 | } |
1663 | 1654 | /* fall through to examine children */ |
1664 | 1655 | } |
1665 | | - if (IsA(node, PlaceHolderInfo)) |
1666 | | - { |
1667 | | - PlaceHolderInfo *phinfo = (PlaceHolderInfo *) node; |
| 1656 | + /* Shouldn't need to handle planner auxiliary nodes here */ |
| 1657 | + Assert(!IsA(node, SpecialJoinInfo)); |
| 1658 | + Assert(!IsA(node, AppendRelInfo)); |
| 1659 | + Assert(!IsA(node, PlaceHolderInfo)); |
1668 | 1660 |
|
1669 | | - if (bms_is_member(context->varno, phinfo->ph_eval_at)) |
1670 | | - { |
1671 | | - phinfo->ph_eval_at = bms_union(phinfo->ph_eval_at, |
1672 | | - context->subrelids); |
1673 | | - phinfo->ph_eval_at = bms_del_member(phinfo->ph_eval_at, |
1674 | | - context->varno); |
1675 | | - } |
1676 | | - if (bms_is_member(context->varno, phinfo->ph_needed)) |
1677 | | - { |
1678 | | - phinfo->ph_needed = bms_union(phinfo->ph_needed, |
1679 | | - context->subrelids); |
1680 | | - phinfo->ph_needed = bms_del_member(phinfo->ph_needed, |
1681 | | - context->varno); |
1682 | | - } |
1683 | | - /* fall through to examine children */ |
1684 | | - } |
1685 | 1661 | return expression_tree_walker(node, substitute_multiple_relids_walker, |
1686 | 1662 | (void *) context); |
1687 | 1663 | } |
|
0 commit comments