|From:||Yura Sokolov <y(dot)sokolov(at)postgrespro(dot)ru>|
|Cc:||David Rowley <dgrowleyml(at)gmail(dot)com>|
|Subject:||Fix BUG #17335: Duplicate result rows in Gather node|
|Views:||Raw Message | Whole Thread | Download mbox | Resend email|
Good day, hackers.
- Append path is created with explicitely parallel_aware = true
- It has two child, one is trivial, other is parallel_aware = false .
Trivial child is dropped.
- Gather/GatherMerge path takes Append path as a child and thinks
its child is parallel_aware = true.
- But Append path is removed at the last since it has only one child.
- Now Gather/GatherMerge thinks its child is parallel_aware, but it
Gather/GatherMerge runs its child twice: in a worker and in a leader,
and gathers same rows twice.
Reproduction code attached (repro.sql. Included as a test as well).
Suggested quick (and valid) fix in the patch attached:
- If Append has single child, then copy its parallel awareness.
Bug were introduced with commit 8edd0e79460b414b1d971895312e549e95e12e4f
"Suppress Append and MergeAppend plan nodes that have a single child."
During discussion, it were supposed  those fields should be copied:
> I haven't looked into whether this does the right things for parallel
> planning --- possibly create_[merge]append_path need to propagate up
> parallel-related path fields from the single child?
But it were not so obvious .
Better fix could contain removing Gather/GatherMerge node as well if
its child is not parallel aware.
Bug is reported in https://postgr.es/m/flat/17335-4dc92e1aea3a78af%40postgresql.org
Since no way to add thread from pgsql-bugs to commitfest, I write here.
|Next Message||Pavel Borisov||2021-12-30 11:45:42||Re: Pre-allocating WAL files|
|Previous Message||Japin Li||2021-12-30 11:01:22||Re: Autovacuum and idle_session_timeout|