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

From Hou, Zhijie
Subject RE: Parallel INSERT (INTO ... SELECT ...)
Date
Msg-id c9f909674d994d8599e957333df86764@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>)
List pgsql-hackers
Hi,

After doing some test to cover the code path in the PATCH 0001.
I have some suggestions for the 0002 testcase.


(1)
+            /* Check parallel-safety of any expressions in the partition key */
+            if (get_partition_col_attnum(pkey, i) == 0)
+            {
+                Node       *check_expr = (Node *) lfirst(partexprs_item);
+
+                if (max_parallel_hazard_walker(check_expr, context))
+                {
+                    table_close(rel, lockmode);
+                    return true;
+                }

The testcase seems does not cover the above code(test when the table have parallel unsafe expression in the partition
key).

Personally, I use the following sql to cover this:
-----
create table partkey_unsafe_key_expr_t (a int4, b name) partition by range
((fullname_parallel_unsafe('',a::varchar)));
explain (costs off) insert into partkey_unsafe_key_expr_t select unique1, stringu1 from tenk1;
-----


(2)
I noticed that most of testcase test both (parallel safe/unsafe/restricted).
But the index expression seems does not test the parallel restricted.
How about add a testcase like:
-----
create or replace function fullname_parallel_restricted(f text, l text) returns text as $$
    begin
        return f || l;
    end;
$$ language plpgsql immutable parallel restricted;

create table names4(index int, first_name text, last_name text);
create index names4_fullname_idx on names4 (fullname_parallel_restricted(first_name, last_name));

--
-- Test INSERT with parallel-restricted index expression
-- (should create a parallel plan)
--
explain (costs off) insert into names4 select * from names;
-----

(3)
+        /* Recursively check each partition ... */
+        pdesc = RelationGetPartitionDesc(rel);
+        for (i = 0; i < pdesc->nparts; i++)
+        {
+            if (rel_max_parallel_hazard_for_modify(pdesc->oids[i],
+                                                        command_type,
+                                                        context,
+                                                        AccessShareLock))
+            {
+                table_close(rel, lockmode);
+                return true;
+            }
+        }

It seems we do not have a testcase to test (some parallel unsafe expression or.. in partition)
Hoe about add one testcase to test parallel unsafe partition ?

Best regards,
houzj




pgsql-hackers by date:

Previous
From: Amit Kapila
Date:
Subject: Re: Logical Replication - behavior of ALTER PUBLICATION .. DROP TABLE and ALTER SUBSCRIPTION .. REFRESH PUBLICATION
Next
From: Noah Misch
Date:
Subject: Re: PG vs LLVM 12 on seawasp, next round