From: Jeff Davis Date: Fri, 21 Feb 2025 06:31:22 +0000 (-0800) Subject: Fix for pg_restore_attribute_stats(). X-Git-Tag: REL_18_BETA1~812 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=b50a554cc84066577f0f0a3baafe2f1fac302006;p=postgresql.git Fix for pg_restore_attribute_stats(). Use RelationGetIndexExpressions() rather than rd_indexprs directly. Author: Corey Huinker --- diff --git a/src/backend/statistics/attribute_stats.c b/src/backend/statistics/attribute_stats.c index 94f7dd63a03..c0c398a4bb2 100644 --- a/src/backend/statistics/attribute_stats.c +++ b/src/backend/statistics/attribute_stats.c @@ -480,23 +480,37 @@ attribute_statistics_update(FunctionCallInfo fcinfo, int elevel) static Node * get_attr_expr(Relation rel, int attnum) { - if ((rel->rd_rel->relkind == RELKIND_INDEX - || (rel->rd_rel->relkind == RELKIND_PARTITIONED_INDEX)) - && (rel->rd_indexprs != NIL) - && (rel->rd_index->indkey.values[attnum - 1] == 0)) - { - ListCell *indexpr_item = list_head(rel->rd_indexprs); + List *index_exprs; + ListCell *indexpr_item; - for (int i = 0; i < attnum - 1; i++) - if (rel->rd_index->indkey.values[i] == 0) - indexpr_item = lnext(rel->rd_indexprs, indexpr_item); + /* relation is not an index */ + if (rel->rd_rel->relkind != RELKIND_INDEX && + rel->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) + return NULL; - if (indexpr_item == NULL) /* shouldn't happen */ - elog(ERROR, "too few entries in indexprs list"); + index_exprs = RelationGetIndexExpressions(rel); - return (Node *) lfirst(indexpr_item); - } - return NULL; + /* index has no expressions to give */ + if (index_exprs == NIL) + return NULL; + + /* + * The index attnum points directly to a relation attnum, then it's no an + * expression attribute. + */ + if (rel->rd_index->indkey.values[attnum - 1] != 0) + return NULL; + + indexpr_item = list_head(rel->rd_indexprs); + + for (int i = 0; i < attnum - 1; i++) + if (rel->rd_index->indkey.values[i] == 0) + indexpr_item = lnext(rel->rd_indexprs, indexpr_item); + + if (indexpr_item == NULL) /* shouldn't happen */ + elog(ERROR, "too few entries in indexprs list"); + + return (Node *) lfirst(indexpr_item); } /*