Hi,

When developing the reloption patch, I noticed some issues in the patch.

1).
> - Reduce Insert parallel-safety checks required for some SQL, by noting
> that the subquery must operate on a relation (check for RTE_RELATION in
> subquery range-table)

+                       foreach(lcSub, rte->subquery->rtable)
+                       {
+                               rteSub = lfirst_node(RangeTblEntry, lcSub);
+                               if (rteSub->rtekind == RTE_RELATION)
+                               {
+                                       hasSubQueryOnRelation = true;
+                                       break;
+                               }
+                       }
It seems we can not only search RTE_RELATION in rtable,
because RTE_RELATION may exist in other place like:

---
--** explain insert into target select (select * from test);
        Subplan's subplan

--** with cte as (select * from test) insert into target select * from cte;
        In query's ctelist.
---

May be we should use a walker function [1] to
search the subquery and ctelist.

2).

+--
+-- Test INSERT into temporary table with underlying query.
+-- (should not use a parallel plan)
+--

May be the comment here need some change since
we currently support parallel plan for temp table.

3)
Do you think we can add a testcase for foreign-table ?
To test parallel query with serial insert on foreign table.


[1]
static bool
relation_walker(Node *node)
{
        if (node == NULL)
                return false;

        else if (IsA(node, RangeTblEntry))
        {
                RangeTblEntry *rte = (RangeTblEntry *) node;
                if (rte->rtekind == RTE_RELATION)
                        return true;
                
                return false;
        }

        else if (IsA(node, Query))
        {
                Query      *query = (Query *) node;

                /* Recurse into subselects */
                return query_tree_walker(query, relation_walker,
                                                                 NULL, 
QTW_EXAMINE_RTES_BEFORE);
        }

        /* Recurse to check arguments */
        return expression_tree_walker(node,
                                                                  
relation_walker,
                                                                  NULL);
}


Best regards,
houzj


Reply via email to