Hi Hackers, I found a bug in the query rewriter. If a query that has a modifying CTE is re-written, the hasModifyingCTE flag is not getting set in the re-written query. This bug can result in the query being allowed to execute in parallel-mode, which results in an error.
I originally found the problem using INSERT (which doesn't actually affect the current Postgres code, as it doesn't support INSERT in parallel mode) but a colleague of mine (Hou, Zhijie) managed to reproduce it using SELECT as well (see example below), and helped to minimize the patch size. I've attached the patch with the suggested fix (reviewed by Amit Langote). The following reproduces the issue (adapted from a test case in the "with" regression tests): drop table if exists test_data1; create table test_data1(a int, b int) ; insert into test_data1 select generate_series(1,1000), generate_series(1,1000); set force_parallel_mode=on; CREATE TEMP TABLE bug6051 AS select i from generate_series(1,3) as i; SELECT * FROM bug6051; CREATE RULE bug6051_ins AS ON INSERT TO bug6051 DO INSTEAD select a as i from test_data1; WITH t1 AS ( DELETE FROM bug6051 RETURNING * ) INSERT INTO bug6051 SELECT * FROM t1; produces the error: ERROR: cannot assign XIDs during a parallel operation Regards, Greg Nancarrow Fujitsu Australia
v1-0001-Fix-bug-in-the-query-rewriter-hasModifyingCTE-not-set.patch
Description: Binary data