Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9f71e10

Browse files
committed
Fix checking of index expressions in CompareIndexInfo().
This code was sloppy about comparison of index columns thatare expressions. It didn't reliably reject cases where oneindex has an expression where the other has a plain column,and it could index off the start of the attmap array, leadingto a Valgrind complaint (though an actual crash seems unlikely).I'm not sure that the expression-vs-column sloppiness leadsto any visible problem in practice, because the subsequentcomparison of the two expression lists would reject caseswhere the indexes have different numbers of expressionsoverall. Maybe we could falsely match indexes having thesame expressions in different column positions, but it'drequire unlucky contents of the word before the attmap array.It's not too surprising that no problem has been reportedfrom the field. Nonetheless, this code is clearly wrong.Per bug #18135 from Alexander Lakhin. Back-patch to allsupported branches.Discussion:https://postgr.es/m/18135-532f4a755e71e4d2@postgresql.org
1 parent4e9fc3a commit9f71e10

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

‎src/backend/catalog/index.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2559,7 +2559,7 @@ CompareIndexInfo(const IndexInfo *info1, const IndexInfo *info2,
25592559

25602560
/*
25612561
* and columns match through the attribute map (actual attribute numbers
2562-
* might differ!) Note that thisimplies that index columns that are
2562+
* might differ!) Note that thischecks that index columns that are
25632563
* expressions appear in the same positions. We will next compare the
25642564
* expressions themselves.
25652565
*/
@@ -2568,13 +2568,22 @@ CompareIndexInfo(const IndexInfo *info1, const IndexInfo *info2,
25682568
if (attmap->maplen<info2->ii_IndexAttrNumbers[i])
25692569
elog(ERROR,"incorrect attribute map");
25702570

2571-
/* ignore expressions at this stage */
2572-
if ((info1->ii_IndexAttrNumbers[i]!=InvalidAttrNumber)&&
2573-
(attmap->attnums[info2->ii_IndexAttrNumbers[i]-1]!=
2574-
info1->ii_IndexAttrNumbers[i]))
2575-
return false;
2571+
/* ignore expressions for now (but check their collation/opfamily) */
2572+
if (!(info1->ii_IndexAttrNumbers[i]==InvalidAttrNumber&&
2573+
info2->ii_IndexAttrNumbers[i]==InvalidAttrNumber))
2574+
{
2575+
/* fail if just one index has an expression in this column */
2576+
if (info1->ii_IndexAttrNumbers[i]==InvalidAttrNumber||
2577+
info2->ii_IndexAttrNumbers[i]==InvalidAttrNumber)
2578+
return false;
2579+
2580+
/* both are columns, so check for match after mapping */
2581+
if (attmap->attnums[info2->ii_IndexAttrNumbers[i]-1]!=
2582+
info1->ii_IndexAttrNumbers[i])
2583+
return false;
2584+
}
25762585

2577-
/* collation and opfamilyis not valid forincluding columns */
2586+
/* collation and opfamilyare not valid forincluded columns */
25782587
if (i >=info1->ii_NumIndexKeyAttrs)
25792588
continue;
25802589

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp