]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix for pg_restore_attribute_stats().
authorJeff Davis <jdavis@postgresql.org>
Fri, 21 Feb 2025 06:31:22 +0000 (22:31 -0800)
committerJeff Davis <jdavis@postgresql.org>
Fri, 21 Feb 2025 06:31:22 +0000 (22:31 -0800)
Use RelationGetIndexExpressions() rather than rd_indexprs directly.

Author: Corey Huinker <corey.huinker@gmail.com>

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);
 }
 
 /*