RE: Parallel INSERT (INTO ... SELECT ...) - Mailing list pgsql-hackers

From Hou, Zhijie
Subject RE: Parallel INSERT (INTO ... SELECT ...)
Date
Msg-id 5276d7272635453eb44900d769994779@G08CNEXMBPEKD05.g08.fujitsu.local
Whole thread Raw
In response to Re: Parallel INSERT (INTO ... SELECT ...)  (Greg Nancarrow <gregn4422@gmail.com>)
Responses Re: Parallel INSERT (INTO ... SELECT ...)  (Greg Nancarrow <gregn4422@gmail.com>)
Re: Parallel INSERT (INTO ... SELECT ...)  (Greg Nancarrow <gregn4422@gmail.com>)
List pgsql-hackers
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



pgsql-hackers by date:

Previous
From: japin
Date:
Subject: Re: row filtering for logical replication
Next
From: Dilip Kumar
Date:
Subject: Re: Printing backtrace of postgres processes