Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit c46817e

Browse files
committed
Revert "Fix parallel-safety check of expressions and predicate for index builds"
This reverts commit eae7be6, following a discussion with Tom Lane, due to concerns that this impacts the decisions made by the planner for the number of workers spawned based on the inlining and const-folding of index expressions and predicate for cases that would have worked until this commit. Discussion: https://postgr.es/m/162802.1709746091@sss.pgh.pa.us Backpatch-through: 12
1 parent 1b3029b commit c46817e

File tree

5 files changed

+2
-121
lines changed

5 files changed

+2
-121
lines changed

src/backend/optimizer/plan/planner.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6695,18 +6695,10 @@ plan_create_index_workers(Oid tableOid, Oid indexOid)
66956695
* Currently, parallel workers can't access the leader's temporary tables.
66966696
* Furthermore, any index predicate or index expressions must be parallel
66976697
* safe.
6698-
*
6699-
* Fetch the list of expressions and predicates directly from the
6700-
* catalogs. Retrieving this information from the relcache would cause
6701-
* the expressions and predicates to be flattened, losing properties that
6702-
* can be important to check if parallel workers can be used. For
6703-
* example, immutable parallel-unsafe functions, that cannot be used in
6704-
* parallel workers, would be changed to Const nodes, that are safe in
6705-
* parallel workers.
67066698
*/
67076699
if (heap->rd_rel->relpersistence == RELPERSISTENCE_TEMP ||
6708-
!is_parallel_safe(root, (Node *) get_index_expressions(indexOid)) ||
6709-
!is_parallel_safe(root, (Node *) get_index_predicate(indexOid)))
6700+
!is_parallel_safe(root, (Node *) RelationGetIndexExpressions(index)) ||
6701+
!is_parallel_safe(root, (Node *) RelationGetIndexPredicate(index)))
67106702
{
67116703
parallel_workers = 0;
67126704
goto done;

src/backend/utils/cache/lsyscache.c

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -3504,74 +3504,6 @@ get_index_column_opclass(Oid index_oid, int attno)
35043504
return opclass;
35053505
}
35063506

3507-
/*
3508-
* get_index_expressions
3509-
*
3510-
* Given the index OID, its a List of its expressions or NIL if none.
3511-
*/
3512-
List *
3513-
get_index_expressions(Oid index_oid)
3514-
{
3515-
List *result;
3516-
HeapTuple tuple;
3517-
Datum exprDatum;
3518-
bool isnull;
3519-
char *exprString;
3520-
3521-
tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
3522-
if (!HeapTupleIsValid(tuple))
3523-
elog(ERROR, "cache lookup failed for index %u", index_oid);
3524-
3525-
exprDatum = SysCacheGetAttr(INDEXRELID, tuple,
3526-
Anum_pg_index_indexprs, &isnull);
3527-
if (isnull)
3528-
{
3529-
ReleaseSysCache(tuple);
3530-
return NIL;
3531-
}
3532-
3533-
exprString = TextDatumGetCString(exprDatum);
3534-
result = (List *) stringToNode(exprString);
3535-
pfree(exprString);
3536-
ReleaseSysCache(tuple);
3537-
3538-
return result;
3539-
}
3540-
3541-
/*
3542-
* get_index_predicate
3543-
*
3544-
* Given the index OID, return a List of its predicate or NIL if none.
3545-
*/
3546-
List *
3547-
get_index_predicate(Oid index_oid)
3548-
{
3549-
List *result;
3550-
HeapTuple tuple;
3551-
Datum predDatum;
3552-
bool isnull;
3553-
char *predString;
3554-
3555-
tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
3556-
if (!HeapTupleIsValid(tuple))
3557-
elog(ERROR, "cache lookup failed for index %u", index_oid);
3558-
3559-
predDatum = SysCacheGetAttr(INDEXRELID, tuple,
3560-
Anum_pg_index_indpred, &isnull);
3561-
if (isnull)
3562-
{
3563-
ReleaseSysCache(tuple);
3564-
return NIL;
3565-
}
3566-
3567-
predString = TextDatumGetCString(predDatum);
3568-
result = (List *) stringToNode(predString);
3569-
pfree(predString);
3570-
ReleaseSysCache(tuple);
3571-
3572-
return result;
3573-
}
3574-
35753507
/*
35763508
* get_index_isreplident
35773509
*

src/include/utils/lsyscache.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,6 @@ extern Oid get_range_collation(Oid rangeOid);
195195
extern Oid get_range_multirange(Oid rangeOid);
196196
extern Oid get_multirange_range(Oid multirangeOid);
197197
extern Oid get_index_column_opclass(Oid index_oid, int attno);
198-
extern List *get_index_expressions(Oid index_oid);
199-
extern List *get_index_predicate(Oid index_oid);
200198
extern bool get_index_isreplident(Oid index_oid);
201199
extern bool get_index_isvalid(Oid index_oid);
202200
extern bool get_index_isclustered(Oid index_oid);

src/test/regress/expected/btree_index.out

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -387,22 +387,3 @@ ALTER INDEX btree_part_idx ALTER COLUMN id SET (n_distinct=100);
387387
ERROR: ALTER action ALTER COLUMN ... SET cannot be performed on relation "btree_part_idx"
388388
DETAIL: This operation is not supported for partitioned indexes.
389389
DROP TABLE btree_part;
390-
-- Test with index expression and predicate that include a parallel unsafe
391-
-- function.
392-
CREATE FUNCTION para_unsafe_f() RETURNS int IMMUTABLE PARALLEL UNSAFE
393-
AS $$
394-
BEGIN
395-
RETURN 0;
396-
EXCEPTION WHEN OTHERS THEN
397-
RETURN 1;
398-
END$$ LANGUAGE plpgsql;
399-
CREATE TABLE btree_para_bld(i int);
400-
ALTER TABLE btree_para_bld SET (parallel_workers = 4);
401-
SET max_parallel_maintenance_workers TO 4;
402-
-- With parallel-unsafe expression
403-
CREATE INDEX ON btree_para_bld((i + para_unsafe_f()));
404-
-- With parallel-unsafe predicate
405-
CREATE INDEX ON btree_para_bld(i) WHERE i > para_unsafe_f();
406-
RESET max_parallel_maintenance_workers;
407-
DROP TABLE btree_para_bld;
408-
DROP FUNCTION para_unsafe_f;

src/test/regress/sql/btree_index.sql

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -242,25 +242,3 @@ CREATE TABLE btree_part (id int4) PARTITION BY RANGE (id);
242242
CREATE INDEX btree_part_idx ON btree_part(id);
243243
ALTER INDEX btree_part_idx ALTER COLUMN id SET (n_distinct=100);
244244
DROP TABLE btree_part;
245-
246-
-- Test with index expression and predicate that include a parallel unsafe
247-
-- function.
248-
CREATE FUNCTION para_unsafe_f() RETURNS int IMMUTABLE PARALLEL UNSAFE
249-
AS $$
250-
BEGIN
251-
RETURN 0;
252-
EXCEPTION WHEN OTHERS THEN
253-
RETURN 1;
254-
END$$ LANGUAGE plpgsql;
255-
256-
CREATE TABLE btree_para_bld(i int);
257-
ALTER TABLE btree_para_bld SET (parallel_workers = 4);
258-
SET max_parallel_maintenance_workers TO 4;
259-
-- With parallel-unsafe expression
260-
CREATE INDEX ON btree_para_bld((i + para_unsafe_f()));
261-
-- With parallel-unsafe predicate
262-
CREATE INDEX ON btree_para_bld(i) WHERE i > para_unsafe_f();
263-
264-
RESET max_parallel_maintenance_workers;
265-
DROP TABLE btree_para_bld;
266-
DROP FUNCTION para_unsafe_f;

0 commit comments

Comments
 (0)