Revert "Fix parallel-safety check of expressions and predicate for index builds"
authorMichael Paquier <[email protected]>
Wed, 6 Mar 2024 23:31:09 +0000 (08:31 +0900)
committerMichael Paquier <[email protected]>
Wed, 6 Mar 2024 23:31:09 +0000 (08:31 +0900)
This reverts commit eae7be600be7, 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

src/backend/optimizer/plan/planner.c
src/backend/utils/cache/lsyscache.c
src/include/utils/lsyscache.h
src/test/regress/expected/btree_index.out
src/test/regress/sql/btree_index.sql

index 6af14113c85a899fa99a3ffa68411fcb893d79a6..821693c60ee27f3c1300d91ae3bbdcbaf0ebbe56 100644 (file)
@@ -6415,18 +6415,10 @@ plan_create_index_workers(Oid tableOid, Oid indexOid)
     * Currently, parallel workers can't access the leader's temporary tables.
     * Furthermore, any index predicate or index expressions must be parallel
     * safe.
-    *
-    * Fetch the list of expressions and predicates directly from the
-    * catalogs.  Retrieving this information from the relcache would cause
-    * the expressions and predicates to be flattened, losing properties that
-    * can be important to check if parallel workers can be used.  For
-    * example, immutable parallel-unsafe functions, that cannot be used in
-    * parallel workers, would be changed to Const nodes, that are safe in
-    * parallel workers.
     */
    if (heap->rd_rel->relpersistence == RELPERSISTENCE_TEMP ||
-       !is_parallel_safe(root, (Node *) get_index_expressions(indexOid)) ||
-       !is_parallel_safe(root, (Node *) get_index_predicate(indexOid)))
+       !is_parallel_safe(root, (Node *) RelationGetIndexExpressions(index)) ||
+       !is_parallel_safe(root, (Node *) RelationGetIndexPredicate(index)))
    {
        parallel_workers = 0;
        goto done;
index fad425c5f1a5021d53fffd96d94f85ce79808010..3303c31e5757a39a208e02bc821d2f77e1afa694 100644 (file)
@@ -3352,74 +3352,6 @@ get_index_column_opclass(Oid index_oid, int attno)
    return opclass;
 }
 
-/*
- * get_index_expressions
- *
- *     Given the index OID, its a List of its expressions or NIL if none.
- */
-List *
-get_index_expressions(Oid index_oid)
-{
-   List       *result;
-   HeapTuple   tuple;
-   Datum       exprDatum;
-   bool        isnull;
-   char       *exprString;
-
-   tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
-   if (!HeapTupleIsValid(tuple))
-       elog(ERROR, "cache lookup failed for index %u", index_oid);
-
-   exprDatum = SysCacheGetAttr(INDEXRELID, tuple,
-                               Anum_pg_index_indexprs, &isnull);
-   if (isnull)
-   {
-       ReleaseSysCache(tuple);
-       return NIL;
-   }
-
-   exprString = TextDatumGetCString(exprDatum);
-   result = (List *) stringToNode(exprString);
-   pfree(exprString);
-   ReleaseSysCache(tuple);
-
-   return result;
-}
-
-/*
- * get_index_predicate
- *
- *     Given the index OID, return a List of its predicate or NIL if none.
- */
-List *
-get_index_predicate(Oid index_oid)
-{
-   List       *result;
-   HeapTuple   tuple;
-   Datum       predDatum;
-   bool        isnull;
-   char       *predString;
-
-   tuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(index_oid));
-   if (!HeapTupleIsValid(tuple))
-       elog(ERROR, "cache lookup failed for index %u", index_oid);
-
-   predDatum = SysCacheGetAttr(INDEXRELID, tuple,
-                               Anum_pg_index_indpred, &isnull);
-   if (isnull)
-   {
-       ReleaseSysCache(tuple);
-       return NIL;
-   }
-
-   predString = TextDatumGetCString(predDatum);
-   result = (List *) stringToNode(predString);
-   pfree(predString);
-   ReleaseSysCache(tuple);
-
-   return result;
-}
-
 /*
  * get_index_isreplident
  *
index cc1696195ecbaa081cf6e63f73dd67e05e17bce6..ee35686a660cbe550b8b84ade4490b403992d2f4 100644 (file)
@@ -185,8 +185,6 @@ extern char *get_namespace_name_or_temp(Oid nspid);
 extern Oid get_range_subtype(Oid rangeOid);
 extern Oid get_range_collation(Oid rangeOid);
 extern Oid get_index_column_opclass(Oid index_oid, int attno);
-extern List *get_index_expressions(Oid index_oid);
-extern List *get_index_predicate(Oid index_oid);
 extern bool get_index_isreplident(Oid index_oid);
 extern bool get_index_isvalid(Oid index_oid);
 extern bool get_index_isclustered(Oid index_oid);
index 0463d72faa7ccd61a278a033f7a21ae2ea03c9e0..c7328b1dc4f9974a90facae470663f0bb25c4066 100644 (file)
@@ -341,22 +341,3 @@ CREATE INDEX btree_part_idx ON btree_part(id);
 ALTER INDEX btree_part_idx ALTER COLUMN id SET (n_distinct=100);
 ERROR:  "btree_part_idx" is not a table, materialized view, or foreign table
 DROP TABLE btree_part;
--- Test with index expression and predicate that include a parallel unsafe
--- function.
-CREATE FUNCTION para_unsafe_f() RETURNS int IMMUTABLE PARALLEL UNSAFE
-AS $$
-BEGIN
-    RETURN 0;
-EXCEPTION WHEN OTHERS THEN
-    RETURN 1;
-END$$ LANGUAGE plpgsql;
-CREATE TABLE btree_para_bld(i int);
-ALTER TABLE btree_para_bld SET (parallel_workers = 4);
-SET max_parallel_maintenance_workers TO 4;
--- With parallel-unsafe expression
-CREATE INDEX ON btree_para_bld((i + para_unsafe_f()));
--- With parallel-unsafe predicate
-CREATE INDEX ON btree_para_bld(i) WHERE i > para_unsafe_f();
-RESET max_parallel_maintenance_workers;
-DROP TABLE btree_para_bld;
-DROP FUNCTION para_unsafe_f;
index 71d816223da8e1dc1594ce8f8ebf83ad4428b484..c34502249f3ed043b2621736310e7be2fa56681c 100644 (file)
@@ -183,25 +183,3 @@ CREATE TABLE btree_part (id int4) PARTITION BY RANGE (id);
 CREATE INDEX btree_part_idx ON btree_part(id);
 ALTER INDEX btree_part_idx ALTER COLUMN id SET (n_distinct=100);
 DROP TABLE btree_part;
-
--- Test with index expression and predicate that include a parallel unsafe
--- function.
-CREATE FUNCTION para_unsafe_f() RETURNS int IMMUTABLE PARALLEL UNSAFE
-AS $$
-BEGIN
-    RETURN 0;
-EXCEPTION WHEN OTHERS THEN
-    RETURN 1;
-END$$ LANGUAGE plpgsql;
-
-CREATE TABLE btree_para_bld(i int);
-ALTER TABLE btree_para_bld SET (parallel_workers = 4);
-SET max_parallel_maintenance_workers TO 4;
--- With parallel-unsafe expression
-CREATE INDEX ON btree_para_bld((i + para_unsafe_f()));
--- With parallel-unsafe predicate
-CREATE INDEX ON btree_para_bld(i) WHERE i > para_unsafe_f();
-
-RESET max_parallel_maintenance_workers;
-DROP TABLE btree_para_bld;
-DROP FUNCTION para_unsafe_f;