A row in an index rowset consists of at least two entries: one or more columns that form a key value used to search in the index rowset, and a column containing a bookmark (primary key or row identifier). The bookmark points to the row in the corresponding base table rowset that contains the key value. The provider must guarantee that these bookmarks consistently identify a row in the base table rowset.
The key columns must occur in the order of most significant key column to least significant key column. The consumer can determine this order from the order in which column metadata is returned by IColumnsInfo::GetColumnInfo. The consumer can determine which columns are key columns from the DBINDEXCOLUMNDESC structure returned by IRowsetIndex::GetIndexInfo.
The bookmark that points to the base table rowset is not the self bookmark. That is, it is not the bookmark in column 0 that points to the row in the index rowset. Instead, it is a column with an ordinal greater than zero for which the DBCOLUMNFLAGS_ISBOOKMARK flag returned by GetColumnInfo is set.
The index rowset can contain other columns in addition to the key value columns and bookmark column. For example, it might contain a timestamp column. Such columns should be discussed in the documentation that describes the index provider. Although such columns are not barred from containing bookmarks, additional bookmark columns preclude the ability of generic query processors to use the index rowset. That is, such query processors are unable to determine which column contains the bookmark pointing to the base table rowset and which column contains a bookmark pointing elsewhere.