Re: Partitioned index can be not dumped - Mailing list pgsql-hackers

From Alexander Pyhalov
Subject Re: Partitioned index can be not dumped
Date
Msg-id b62ec70dab88a1f441c18e69f1c4f696@postgrespro.ru
Whole thread Raw
In response to Re: Partitioned index can be not dumped  (Álvaro Herrera <alvherre@alvh.no-ip.org>)
Responses Re: Partitioned index can be not dumped
List pgsql-hackers
Álvaro Herrera писал 2021-06-30 21:54:
> On 2021-Jun-30, Alexander Pyhalov wrote:
> 
>> I've seen the following effect on PostgreSQL 14 stable branch.
>> Index, created on partitioned table, disappears from pg_dump or psql 
>> \d
>> output.
>> This seems to begin after analyze. Partitoned relation relhasindex 
>> pg_class
>> field suddenly becomes false.
> 
> Yeah, that seems correct.
> 
> I didn't verify your test case, but after looking at the code I thought
> there was a bit too much churn and the new conditions looked quite 
> messy
> and unexplained.  It seems simpler to be explicit at the start about
> what we're doing, and keep nindexes=0 for partitioned tables; with 
> that,
> the code works unchanged because the "for" loops do nothing without
> having to check for anything.  My proposal is attached.
> 
> I did run the tests and they do pass, but I didn't look very closely at
> what the tests are actually doing.
> 
> I noticed that part of that comment seems to be a leftover from ... I
> don't know when: "We do not analyze index columns if there was an
> explicit column list in the ANALYZE command, however."  I suppose this
> is about some code that was removed, but I didn't dig into it.

Looks good. It seems this comment refers to line 455.

  445     if (nindexes > 0)
  446     {
  447         indexdata = (AnlIndexData *) palloc0(nindexes * 
sizeof(AnlIndexData));
  448         for (ind = 0; ind < nindexes; ind++)
  449         {
  450             AnlIndexData *thisdata = &indexdata[ind];
  451             IndexInfo  *indexInfo;
  452
  453             thisdata->indexInfo = indexInfo = 
BuildIndexInfo(Irel[ind]);
  454             thisdata->tupleFract = 1.0; /* fix later if partial */
  455             if (indexInfo->ii_Expressions != NIL && va_cols == NIL)
  456             {
  457                 ListCell   *indexpr_item = 
list_head(indexInfo->ii_Expressions);
  458
  459                 thisdata->vacattrstats = (VacAttrStats **)
  460                     palloc(indexInfo->ii_NumIndexAttrs * 
sizeof(VacAttrStats *));

Also I've added non-necessary new line in test.
Restored comment and removed new line.
-- 
Best regards,
Alexander Pyhalov,
Postgres Professional
Attachment

pgsql-hackers by date:

Previous
From: Ibrar Ahmed
Date:
Subject: Re: Commit fest manager
Next
From: Rahila Syed
Date:
Subject: Column Filtering in Logical Replication