mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-19 20:00:51 +08:00
Fix for pg_restore_attribute_stats().
Use RelationGetIndexExpressions() rather than rd_indexprs directly. Author: Corey Huinker <corey.huinker@gmail.com>
This commit is contained in:
parent
41625ab8ea
commit
b50a554cc8
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user