Re: BUG #17997: Assert failed in validatePartitionedIndex() when attaching partition index to child of valid index
Alexander Law <exclusion@gmail.com>
From: Alexander Lakhin <exclusion@gmail.com>
To: Michael Paquier <michael@paquier.xyz>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, pgsql-bugs@lists.postgresql.org
Date: 2023-06-30T04:00:00Z
Lists: pgsql-bugs
29.06.2023 13:39, Michael Paquier wrote: > On Thu, Jun 29, 2023 at 12:00:00PM +0300, Alexander Lakhin wrote: >> That is, the partition tree is containing no invalid indexes now, but the >> upper-level indexes in the tree are still invalid. >> Moreover, I don't know how to make them valid: >> reindex index parted_isvalid_idx; / reindex index parted_isvalid_tab_1_expr_idx; >> doesn't affect their flags indisvalid. >> (Though REINDEX for a top-level index can make leaf indexes valid.) >> Reattaching parted_isvalid_tab_11 after "update parted_isvalid_tab_11 set b=1" >> doesn't help either. > DETACH PARTITION is not possible for indexes, but you should be able > to get back to a cleaner tree by detaching a partition, dropping an > index, and re-attaching back the partitions, so as > validatePartitionedIndex() is able to trigger a refresh of > indisvalid depending on the state of the tree. Yeah, I meant DETACH PARTITION for a table. And when I tried the sequence you have described, I couldn't get a completely valid tree: alter table parted_isvalid_tab_1 detach partition parted_isvalid_tab_11; drop index parted_isvalid_idx_11; update parted_isvalid_tab_11 set b = 1; alter table parted_isvalid_tab_1 attach partition parted_isvalid_tab_11 for values from (1) to (5); indexrelid | indisvalid | indrelid | inhparent --------------------------------+------------+-----------------------+------------------------------- parted_isvalid_idx | f | parted_isvalid_tab | parted_isvalid_tab_11_expr_idx | t | parted_isvalid_tab_11 | parted_isvalid_tab_1_expr_idx parted_isvalid_tab_12_expr_idx | t | parted_isvalid_tab_12 | parted_isvalid_tab_1_expr_idx parted_isvalid_tab_1_expr_idx | f | parted_isvalid_tab_1 | parted_isvalid_idx parted_isvalid_tab_2_expr_idx | t | parted_isvalid_tab_2 | parted_isvalid_idx (5 rows) The index parted_isvalid_tab_11_expr_idx is created anew and it's valid, but the higher-level indexes are still invalid. > Anyway, DefineIndex() and its handling of indisvalid is clearly wrong > when it comes to multiple partition layers as it forgets that we may > have to update the parents recursively or we could once again trigger > the assertion from validatePartitionedIndex(), which would not be a > good idea.. So my previous patch fixes that, at least. Yeah, in regard to that, your patch looks good to me. Thank you! Best regards, Alexander
Commits
-
Fix marking of indisvalid for partitioned indexes at creation
- c75c33de5bab 11.21 landed
- dbe0e5c56f31 12.16 landed
- 537b70b82c2c 13.12 landed
- 663b35f2df62 14.9 landed
- cb4ac3e5685f 15.4 landed
- f4691e2e76a4 16.0 landed
- cfc43aeb3810 17.0 landed