1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-02 04:21:28 +03:00

Revert "Fix parallel-safety check of expressions and predicate for index builds"

This reverts commit eae7be600b, 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
This commit is contained in:
Michael Paquier
2024-03-07 08:31:00 +09:00
parent 1b3029be5d
commit c46817ee51
5 changed files with 2 additions and 121 deletions

View File

@@ -6695,18 +6695,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;

View File

@@ -3504,74 +3504,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
*