mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
CREATE INDEX ... INCLUDING (column[, ...])
Now indexes (but only B-tree for now) can contain "extra" column(s) which doesn't participate in index structure, they are just stored in leaf tuples. It allows to use index only scan by using single index instead of two or more indexes. Author: Anastasia Lubennikova with minor editorializing by me Reviewers: David Rowley, Peter Geoghegan, Jeff Janes
This commit is contained in:
@ -646,7 +646,7 @@ check_exclusion_or_unique_constraint(Relation heap, Relation index,
|
||||
Oid *constr_procs;
|
||||
uint16 *constr_strats;
|
||||
Oid *index_collations = index->rd_indcollation;
|
||||
int index_natts = index->rd_index->indnatts;
|
||||
int indnkeyatts = IndexRelationGetNumberOfKeyAttributes(index);
|
||||
IndexScanDesc index_scan;
|
||||
HeapTuple tup;
|
||||
ScanKeyData scankeys[INDEX_MAX_KEYS];
|
||||
@ -673,7 +673,7 @@ check_exclusion_or_unique_constraint(Relation heap, Relation index,
|
||||
* If any of the input values are NULL, the constraint check is assumed to
|
||||
* pass (i.e., we assume the operators are strict).
|
||||
*/
|
||||
for (i = 0; i < index_natts; i++)
|
||||
for (i = 0; i < indnkeyatts; i++)
|
||||
{
|
||||
if (isnull[i])
|
||||
return true;
|
||||
@ -685,7 +685,7 @@ check_exclusion_or_unique_constraint(Relation heap, Relation index,
|
||||
*/
|
||||
InitDirtySnapshot(DirtySnapshot);
|
||||
|
||||
for (i = 0; i < index_natts; i++)
|
||||
for (i = 0; i < indnkeyatts; i++)
|
||||
{
|
||||
ScanKeyEntryInitialize(&scankeys[i],
|
||||
0,
|
||||
@ -717,8 +717,8 @@ check_exclusion_or_unique_constraint(Relation heap, Relation index,
|
||||
retry:
|
||||
conflict = false;
|
||||
found_self = false;
|
||||
index_scan = index_beginscan(heap, index, &DirtySnapshot, index_natts, 0);
|
||||
index_rescan(index_scan, scankeys, index_natts, NULL, 0);
|
||||
index_scan = index_beginscan(heap, index, &DirtySnapshot, indnkeyatts, 0);
|
||||
index_rescan(index_scan, scankeys, indnkeyatts, NULL, 0);
|
||||
|
||||
while ((tup = index_getnext(index_scan,
|
||||
ForwardScanDirection)) != NULL)
|
||||
@ -879,10 +879,10 @@ index_recheck_constraint(Relation index, Oid *constr_procs,
|
||||
Datum *existing_values, bool *existing_isnull,
|
||||
Datum *new_values)
|
||||
{
|
||||
int index_natts = index->rd_index->indnatts;
|
||||
int indnkeyatts = IndexRelationGetNumberOfKeyAttributes(index);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < index_natts; i++)
|
||||
for (i = 0; i < indnkeyatts; i++)
|
||||
{
|
||||
/* Assume the exclusion operators are strict */
|
||||
if (existing_isnull[i])
|
||||
|
Reference in New Issue
Block a user