1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-02 09:02:37 +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:
Teodor Sigaev
2016-04-08 19:31:49 +03:00
parent 339025c68f
commit 386e3d7609
68 changed files with 1321 additions and 256 deletions

View File

@ -1140,6 +1140,21 @@ pg_get_indexdef_worker(Oid indexrelid, int colno,
Oid keycoltype;
Oid keycolcollation;
/*
* attrsOnly flag is used for building unique-constraint and
* exclusion-constraint error messages. Included attrs are
* meaningless there, so do not include them into the message.
*/
if (attrsOnly && keyno >= idxrec->indnkeyatts)
break;
/* Report the INCLUDED attributes, if any. */
if ((!attrsOnly) && keyno == idxrec->indnkeyatts)
{
appendStringInfoString(&buf, ") INCLUDING (");
sep = "";
}
if (!colno)
appendStringInfoString(&buf, sep);
sep = ", ";
@ -1153,6 +1168,7 @@ pg_get_indexdef_worker(Oid indexrelid, int colno,
attname = get_relid_attribute_name(indrelid, attnum);
if (!colno || colno == keyno + 1)
appendStringInfoString(&buf, quote_identifier(attname));
get_atttypetypmodcoll(indrelid, attnum,
&keycoltype, &keycoltypmod,
&keycolcollation);
@ -1192,6 +1208,9 @@ pg_get_indexdef_worker(Oid indexrelid, int colno,
appendStringInfo(&buf, " COLLATE %s",
generate_collation_name((indcoll)));
if(keyno >= idxrec->indnkeyatts)
continue;
/* Add the operator class name, if not default */
get_opclass_name(indclass->values[keyno], keycoltype, &buf);
@ -1520,6 +1539,19 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
appendStringInfoChar(&buf, ')');
/* Fetch and build including column list */
isnull = true;
val = SysCacheGetAttr(CONSTROID, tup,
Anum_pg_constraint_conincluding, &isnull);
if (!isnull)
{
appendStringInfoString(&buf, " INCLUDING (");
decompile_column_index_array(val, conForm->conrelid, &buf);
appendStringInfoChar(&buf, ')');
}
indexId = get_constraint_index(constraintId);
/* XXX why do we only print these bits if fullCommand? */