On 05-01-2021 04:59, Bharath Rupireddy wrote:
On Mon, Jan 4, 2021 at 7:02 PM Bharath Rupireddy
<bharath.rupireddyforpostg...@gmail.com> wrote:

+                                       if (IS_PARALLEL_CTAS_DEST(gstate->dest) 
&&
+                                               ((DR_intorel *) 
gstate->dest)->into->rel &&
+                                               ((DR_intorel *) 
gstate->dest)->into->rel->relname)
why would rel and relname not be there? if no rows have been inserted?
because it seems from the intorel_startup function that that would be
set as soon as startup was done, which i assume (wrongly?) is always done?

Actually, that into clause rel variable is always being set in the gram.y for 
CTAS, Create Materialized View and SELECT INTO (because qualified_name 
non-terminal is not optional). My bad. I just added it as a sanity check. 
Actually, it's not required.

create_as_target:
             qualified_name opt_column_list table_access_method_clause
             OptWith OnCommitOption OptTableSpace
                 {
                     $$ = makeNode(IntoClause);
                     $$->rel = $1;
create_mv_target:
             qualified_name opt_column_list table_access_method_clause 
opt_reloptions OptTableSpace
             {
                 $$ = makeNode(IntoClause);
                 $$->rel = $1;
into_clause:
             INTO OptTempTableName
             {
                 $$ = makeNode(IntoClause);
                $$->rel = $2;

I will change the below code:
+                    if (GetParallelInsertCmdType(gstate->dest) ==
+                        PARALLEL_INSERT_CMD_CREATE_TABLE_AS &&
+                        ((DR_intorel *) gstate->dest)->into &&
+                        ((DR_intorel *) gstate->dest)->into->rel &&
+                        ((DR_intorel *) gstate->dest)->into->rel->relname)
+                    {

to:
+                    if (GetParallelInsertCmdType(gstate->dest) ==
+                        PARALLEL_INSERT_CMD_CREATE_TABLE_AS)
+                    {

I will update this in the next version of the patch set.

Attaching v20 patch set that has above change in 0001 patch, note that
0002 to 0004 patches have no changes from v19. Please consider the v20
patch set for further review.


With Regards,
Bharath Rupireddy.
EnterpriseDB: http://www.enterprisedb.com


Hi,

Reviewing further v20-0001:

I would still opt for moving the code for the parallel worker into a separate function, and then setting rStartup of the dest receiver to that function in ExecParallelGetInsReceiver, as its completely independent code. Just a matter of style I guess.

Maybe I'm not completely following why but afaics we want parallel inserts in various scenarios, not just CTAS? I'm asking because code like
+       if (fpes->ins_cmd_type == PARALLEL_INSERT_CMD_CREATE_TABLE_AS)
+ pg_atomic_add_fetch_u64(&fpes->processed, queryDesc->estate->es_processed); seems very specific to CTAS. For now that seems fine but I suppose that would be generalized soon after? Basically I would have expected the if to compare against PARALLEL_INSERT_CMD_UNDEF.

Apart from these small things v20-0001 looks (very) good to me.

v20-0002:
will reply on the specific mail-thread about the state machine

v20-0003 and v20-0004:
looks good to me.

Kind regards,
Luc


Reply via email to