Commit 7e041603 authored by Alexander Korotkov's avatar Alexander Korotkov

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
parent 89b160c3
...@@ -3157,7 +3157,8 @@ get_range_subtype(Oid rangeOid) ...@@ -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) ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment