Re: BUG #18314: PARALLEL UNSAFE function does not prevent parallel index build
jian he <jian.universality@gmail.com>
From: jian he <jian.universality@gmail.com>
To: Tender Wang <tndrwang@gmail.com>
Cc: Alexander Lakhin <exclusion@gmail.com>, pgsql-bugs@lists.postgresql.org
Date: 2024-02-08T06:17:53Z
Lists: pgsql-bugs
On Wed, Feb 7, 2024 at 11:43 PM jian he <jian.universality@gmail.com> wrote: > > 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 affecting the 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 function is > > 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 argument to RelationGetIndexExpressions(). > > I don't decide to write a new function like RelationGetIndexRawExpression. I think the RelationGetIndexExpressions() is enough 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 it is reasonable? > > based on index_build's ereport(DEBUG1...) output information you patch disabled parallel index build for parallel safe function. after apply your patch: set log_min_messages to debug1; begin; drop table if exists btree_para_bld; CREATE TABLE btree_para_bld(i int); ALTER TABLE btree_para_bld SET (parallel_workers = 4); SET local max_parallel_maintenance_workers TO 4; CREATE or replace FUNCTION para_unsafe_f1() RETURNS int IMMUTABLE PARALLEL UNSAFE AS $$ BEGIN RETURN 0; END$$ LANGUAGE plpgsql; CREATE or replace FUNCTION para_safe() RETURNS int IMMUTABLE PARALLEL UNSAFE AS $$ BEGIN RETURN 0; END$$ LANGUAGE plpgsql; CREATE INDEX ON btree_para_bld((para_unsafe_f1())); CREATE INDEX ON btree_para_bld((para_safe())); commit; debug information: 2024-02-08 14:11:26.664 CST [33245] DEBUG: building index "btree_para_bld_para_unsafe_f1_idx" on table "btree_para_bld" serially 2024-02-08 14:11:26.664 CST [33245] DEBUG: index "btree_para_bld_para_unsafe_f1_idx" can safely use deduplication CREATE INDEX 2024-02-08 14:11:26.666 CST [33245] DEBUG: building index "btree_para_bld_para_safe_idx" on table "btree_para_bld" serially 2024-02-08 14:11:26.666 CST [33245] DEBUG: index "btree_para_bld_para_safe_idx" can safely use deduplication CREATE INDEX the problem entry point is_parallel_safe, i think.
Commits
-
Revert "Fix parallel-safety check of expressions and predicate for index builds"
- 69e8f9dadb01 12.19 landed
- 70a31629aede 13.15 landed
- 49b971298a9b 14.12 landed
- e82b64a92cf5 15.7 landed
- c46817ee512a 16.3 landed
- 099ca50bd41c 17.0 landed
-
Fix parallel-safety check of expressions and predicate for index builds
- c0e0174c216b 12.19 landed
- b60d71c202cd 13.15 landed
- 56a8ab2fc6f7 14.12 landed
- 50b5913a87c9 15.7 landed
- 4ec8f7708b6b 16.3 landed
- eae7be600be7 17.0 landed
-
Ensure we preprocess expressions before checking their volatility.
- 743ddafc7124 17.0 cited