Fix for pg_restore_attribute_stats().
authorJeff Davis <[email protected]>
Fri, 21 Feb 2025 06:31:22 +0000 (22:31 -0800)
committerJeff Davis <[email protected]>
Fri, 21 Feb 2025 06:31:22 +0000 (22:31 -0800)
Use RelationGetIndexExpressions() rather than rd_indexprs directly.

Author: Corey Huinker <[email protected]>

src/backend/statistics/attribute_stats.c

index 94f7dd63a03ab4f2fc4c9f50e09b3a855b7eaa11..c0c398a4bb268870904038b2f68dec21e494c5f7 100644 (file)
@@ -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);
 }
 
 /*