mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-23 19:39:53 +08:00
Fix handling of non-key columns get_index_column_opclass()
f2e40380
introduces support of non-key attributes in GiST indexes. Then if
get_index_column_opclass() is asked by gistproperty() to get an opclass of
non-key column, it returns garbage past oidvector value. This commit fixes
that by making get_index_column_opclass() return InvalidOid in this case.
Discussion: https://postgr.es/m/20190902231948.GA5343%40alvherre.pgsql
Author: Nikita Glukhov, Alexander Korotkov
Backpatch-through: 12
This commit is contained in:
parent
89b160c320
commit
7e04160390
12
src/backend/utils/cache/lsyscache.c
vendored
12
src/backend/utils/cache/lsyscache.c
vendored
@ -3157,7 +3157,8 @@ get_range_subtype(Oid rangeOid)
|
|||||||
*
|
*
|
||||||
* Given the index OID and column number,
|
* Given the index OID and column number,
|
||||||
* return opclass of the index column
|
* return opclass of the index column
|
||||||
* or InvalidOid if the index was not found.
|
* or InvalidOid if the index was not found
|
||||||
|
* or column is non-key one.
|
||||||
*/
|
*/
|
||||||
Oid
|
Oid
|
||||||
get_index_column_opclass(Oid index_oid, int attno)
|
get_index_column_opclass(Oid index_oid, int attno)
|
||||||
@ -3180,11 +3181,20 @@ get_index_column_opclass(Oid index_oid, int attno)
|
|||||||
/* caller is supposed to guarantee this */
|
/* caller is supposed to guarantee this */
|
||||||
Assert(attno > 0 && attno <= rd_index->indnatts);
|
Assert(attno > 0 && attno <= rd_index->indnatts);
|
||||||
|
|
||||||
|
/* Non-key attributes don't have an opclass */
|
||||||
|
if (attno > rd_index->indnkeyatts)
|
||||||
|
{
|
||||||
|
ReleaseSysCache(tuple);
|
||||||
|
return InvalidOid;
|
||||||
|
}
|
||||||
|
|
||||||
datum = SysCacheGetAttr(INDEXRELID, tuple,
|
datum = SysCacheGetAttr(INDEXRELID, tuple,
|
||||||
Anum_pg_index_indclass, &isnull);
|
Anum_pg_index_indclass, &isnull);
|
||||||
Assert(!isnull);
|
Assert(!isnull);
|
||||||
|
|
||||||
indclass = ((oidvector *) DatumGetPointer(datum));
|
indclass = ((oidvector *) DatumGetPointer(datum));
|
||||||
|
|
||||||
|
Assert(attno <= indclass->dim1);
|
||||||
opclass = indclass->values[attno - 1];
|
opclass = indclass->values[attno - 1];
|
||||||
|
|
||||||
ReleaseSysCache(tuple);
|
ReleaseSysCache(tuple);
|
||||||
|
Loading…
Reference in New Issue
Block a user