Re: BUG #18314: PARALLEL UNSAFE function does not prevent parallel index build
От | jian he |
---|---|
Тема | Re: BUG #18314: PARALLEL UNSAFE function does not prevent parallel index build |
Дата | |
Msg-id | CACJufxFFmFKeLBgQfwyGCEoTyEoksXgbJ0uWc=whPu5fk=LXwA@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: BUG #18314: PARALLEL UNSAFE function does not prevent parallel index build (Tender Wang <tndrwang@gmail.com>) |
Ответы |
Re: BUG #18314: PARALLEL UNSAFE function does not prevent parallel index build
|
Список | pgsql-bugs |
On Wed, Feb 7, 2024 at 7:54 PM Tender Wang <tndrwang@gmail.com> wrote: > > In pg document, I found this: > > Also, a block containing an EXCEPTION clause effectively forms a subtransaction that can be rolled back without affectingthe outer transaction. > > So it will report error for this case even though we replace PARALLEL UNSAFE with PARALLEL SAFE. > > I think if PARALLEL UNSAFE is specified by users, PG internal should not choose to build index parallel, even if the functionis > too simply that can be transform to Const node. > > Attached patch will fix Alexander reported issue. I choose pass the raw index expression to is_parallel_safe(). > The comments of RelationGetIndexExpressions() doesn't say it will return optimized expression. So I add a bool argumentto RelationGetIndexExpressions(). > I don't decide to write a new function like RelationGetIndexRawExpression. I think the RelationGetIndexExpressions() isenough after adding a bool argument to indicate > whether caller needing a raw index expression. > > But if users specify PARALLEL SAFE, like I said before, it also reports error. But I think it is another thing. Maybe itis reasonable? > /home/jian/Downloads/patches/0001-Fix-parallel-index-build-failed.patch:273: trailing whitespace. BEGIN warning: 1 line adds whitespace errors. +CREATE TABLE btree_para_bld(i int); +INSERT INTO btree_para_bld SELECT g FROM generate_series(1, 300000) g; +CREATE INDEX ON btree_para_bld((i + para_unsafe_f())); you don't need an insert of 300000 rows to test it. you can just CREATE TABLE btree_para_bld(i int); ALTER TABLE btree_para_bld SET (parallel_workers = 4); SET max_parallel_maintenance_workers TO 4; CREATE INDEX ON btree_para_bld(i) WHERE i > para_unsafe_f(); reset max_parallel_maintenance_workers; demo: https://dbfiddle.uk/HpLKN6zj
В списке pgsql-bugs по дате отправления: