Commit c076f3d7 authored by Alvaro Herrera's avatar Alvaro Herrera

Remove pg_constraint.conincluding

This column was added in commit 8224de4f ("Indexes with INCLUDE
columns and their support in B-tree") to ease writing the ruleutils.c
supporting code for that feature, but it turns out to be unnecessary --
we can do the same thing with just one more syscache lookup.

Even the documentation for the new column being removed in this commit
is awkward.

Discussion: https://postgr.es/m/20180902165018.33otxftp3olgtu4t@alvherre.pgsql
parent 4ddd8f5f
...@@ -2373,14 +2373,6 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l ...@@ -2373,14 +2373,6 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
triggers), list of the constrained columns</entry> triggers), list of the constrained columns</entry>
</row> </row>
<row>
<entry><structfield>conincluding</structfield></entry>
<entry><type>int2[]</type></entry>
<entry><literal><link linkend="catalog-pg-attribute"><structname>pg_attribute</structname></link>.attnum</literal></entry>
<entry>List of the non-constrained columns which are included into
the same index as the constrained columns</entry>
</row>
<row> <row>
<entry><structfield>confkey</structfield></entry> <entry><structfield>confkey</structfield></entry>
<entry><type>int2[]</type></entry> <entry><type>int2[]</type></entry>
......
...@@ -85,7 +85,6 @@ CreateConstraintEntry(const char *constraintName, ...@@ -85,7 +85,6 @@ CreateConstraintEntry(const char *constraintName,
bool nulls[Natts_pg_constraint]; bool nulls[Natts_pg_constraint];
Datum values[Natts_pg_constraint]; Datum values[Natts_pg_constraint];
ArrayType *conkeyArray; ArrayType *conkeyArray;
ArrayType *conincludingArray;
ArrayType *confkeyArray; ArrayType *confkeyArray;
ArrayType *conpfeqopArray; ArrayType *conpfeqopArray;
ArrayType *conppeqopArray; ArrayType *conppeqopArray;
...@@ -116,21 +115,6 @@ CreateConstraintEntry(const char *constraintName, ...@@ -116,21 +115,6 @@ CreateConstraintEntry(const char *constraintName,
else else
conkeyArray = NULL; conkeyArray = NULL;
if (constraintNTotalKeys > constraintNKeys)
{
Datum *conincluding;
int j = 0;
int constraintNIncludedKeys = constraintNTotalKeys - constraintNKeys;
conincluding = (Datum *) palloc(constraintNIncludedKeys * sizeof(Datum));
for (i = constraintNKeys; i < constraintNTotalKeys; i++)
conincluding[j++] = Int16GetDatum(constraintKey[i]);
conincludingArray = construct_array(conincluding, constraintNIncludedKeys,
INT2OID, 2, true, 's');
}
else
conincludingArray = NULL;
if (foreignNKeys > 0) if (foreignNKeys > 0)
{ {
Datum *fkdatums; Datum *fkdatums;
...@@ -204,11 +188,6 @@ CreateConstraintEntry(const char *constraintName, ...@@ -204,11 +188,6 @@ CreateConstraintEntry(const char *constraintName,
else else
nulls[Anum_pg_constraint_conkey - 1] = true; nulls[Anum_pg_constraint_conkey - 1] = true;
if (conincludingArray)
values[Anum_pg_constraint_conincluding - 1] = PointerGetDatum(conincludingArray);
else
nulls[Anum_pg_constraint_conincluding - 1] = true;
if (confkeyArray) if (confkeyArray)
values[Anum_pg_constraint_confkey - 1] = PointerGetDatum(confkeyArray); values[Anum_pg_constraint_confkey - 1] = PointerGetDatum(confkeyArray);
else else
......
...@@ -315,7 +315,7 @@ static char *deparse_expression_pretty(Node *expr, List *dpcontext, ...@@ -315,7 +315,7 @@ static char *deparse_expression_pretty(Node *expr, List *dpcontext,
static char *pg_get_viewdef_worker(Oid viewoid, static char *pg_get_viewdef_worker(Oid viewoid,
int prettyFlags, int wrapColumn); int prettyFlags, int wrapColumn);
static char *pg_get_triggerdef_worker(Oid trigid, bool pretty); static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);
static void decompile_column_index_array(Datum column_index_array, Oid relId, static int decompile_column_index_array(Datum column_index_array, Oid relId,
StringInfo buf); StringInfo buf);
static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags); static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);
static char *pg_get_indexdef_worker(Oid indexrelid, int colno, static char *pg_get_indexdef_worker(Oid indexrelid, int colno,
...@@ -2055,6 +2055,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, ...@@ -2055,6 +2055,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
Datum val; Datum val;
bool isnull; bool isnull;
Oid indexId; Oid indexId;
int keyatts;
HeapTuple indtup;
/* Start off the constraint definition */ /* Start off the constraint definition */
if (conForm->contype == CONSTRAINT_PRIMARY) if (conForm->contype == CONSTRAINT_PRIMARY)
...@@ -2069,24 +2071,52 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, ...@@ -2069,24 +2071,52 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
elog(ERROR, "null conkey for constraint %u", elog(ERROR, "null conkey for constraint %u",
constraintId); constraintId);
decompile_column_index_array(val, conForm->conrelid, &buf); keyatts = decompile_column_index_array(val, conForm->conrelid, &buf);
appendStringInfoChar(&buf, ')'); appendStringInfoChar(&buf, ')');
/* Fetch and build including column list */ indexId = get_constraint_index(constraintId);
isnull = true;
val = SysCacheGetAttr(CONSTROID, tup, /* Build including column list (from pg_index.indkeys) */
Anum_pg_constraint_conincluding, &isnull); indtup = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexId));
if (!isnull) if (!HeapTupleIsValid(indtup))
elog(ERROR, "cache lookup failed for index %u", indexId);
val = SysCacheGetAttr(INDEXRELID, indtup,
Anum_pg_index_indnatts, &isnull);
if (isnull)
elog(ERROR, "null indnatts for index %u", indexId);
if (DatumGetInt32(val) > keyatts)
{ {
Datum cols;
Datum *keys;
int nKeys;
int j;
appendStringInfoString(&buf, " INCLUDE ("); appendStringInfoString(&buf, " INCLUDE (");
decompile_column_index_array(val, conForm->conrelid, &buf); cols = SysCacheGetAttr(INDEXRELID, indtup,
Anum_pg_index_indkey, &isnull);
if (isnull)
elog(ERROR, "null indkey for index %u", indexId);
deconstruct_array(DatumGetArrayTypeP(cols),
INT2OID, 2, true, 's',
&keys, NULL, &nKeys);
for (j = keyatts; j < nKeys; j++)
{
char *colName;
colName = get_attname(conForm->conrelid,
DatumGetInt16(keys[j]), false);
if (j > keyatts)
appendStringInfoString(&buf, ", ");
appendStringInfoString(&buf, quote_identifier(colName));
}
appendStringInfoChar(&buf, ')'); appendStringInfoChar(&buf, ')');
} }
ReleaseSysCache(indtup);
indexId = get_constraint_index(constraintId);
/* XXX why do we only print these bits if fullCommand? */ /* XXX why do we only print these bits if fullCommand? */
if (fullCommand && OidIsValid(indexId)) if (fullCommand && OidIsValid(indexId))
...@@ -2232,9 +2262,10 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, ...@@ -2232,9 +2262,10 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
/* /*
* Convert an int16[] Datum into a comma-separated list of column names * Convert an int16[] Datum into a comma-separated list of column names
* for the indicated relation; append the list to buf. * for the indicated relation; append the list to buf. Returns the number
* of keys.
*/ */
static void static int
decompile_column_index_array(Datum column_index_array, Oid relId, decompile_column_index_array(Datum column_index_array, Oid relId,
StringInfo buf) StringInfo buf)
{ {
...@@ -2258,6 +2289,8 @@ decompile_column_index_array(Datum column_index_array, Oid relId, ...@@ -2258,6 +2289,8 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
else else
appendStringInfo(buf, ", %s", quote_identifier(colName)); appendStringInfo(buf, ", %s", quote_identifier(colName));
} }
return nKeys;
} }
......
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 201808271 #define CATALOG_VERSION_NO 201809031
#endif #endif
...@@ -105,12 +105,6 @@ CATALOG(pg_constraint,2606,ConstraintRelationId) ...@@ -105,12 +105,6 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
*/ */
int16 conkey[1]; int16 conkey[1];
/*
* Columns of conrelid that the constraint does not apply to, but are
* included into the same index as the key columns
*/
int16 conincluding[1];
/* /*
* If a foreign key, the referenced columns of confrelid * If a foreign key, the referenced columns of confrelid
*/ */
......
...@@ -94,10 +94,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i ...@@ -94,10 +94,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i
covering | 4 | 2 | t | f | 1 2 3 4 | 1978 1978 covering | 4 | 2 | t | f | 1 2 3 4 | 1978 1978
(1 row) (1 row)
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
pg_get_constraintdef | conname | conkey | conincluding pg_get_constraintdef | conname | conkey
----------------------------------+----------+--------+-------------- ----------------------------------+----------+--------
UNIQUE (c1, c2) INCLUDE (c3, c4) | covering | {1,2} | {3,4} UNIQUE (c1, c2) INCLUDE (c3, c4) | covering | {1,2}
(1 row) (1 row)
-- ensure that constraint works -- ensure that constraint works
...@@ -113,10 +113,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i ...@@ -113,10 +113,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i
covering | 4 | 2 | t | t | 1 2 3 4 | 1978 1978 covering | 4 | 2 | t | t | 1 2 3 4 | 1978 1978
(1 row) (1 row)
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
pg_get_constraintdef | conname | conkey | conincluding pg_get_constraintdef | conname | conkey
---------------------------------------+----------+--------+-------------- ---------------------------------------+----------+--------
PRIMARY KEY (c1, c2) INCLUDE (c3, c4) | covering | {1,2} | {3,4} PRIMARY KEY (c1, c2) INCLUDE (c3, c4) | covering | {1,2}
(1 row) (1 row)
-- ensure that constraint works -- ensure that constraint works
...@@ -136,10 +136,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i ...@@ -136,10 +136,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i
tbl_c1_c2_c3_c4_key | 4 | 2 | t | f | 1 2 3 4 | 1978 1978 tbl_c1_c2_c3_c4_key | 4 | 2 | t | f | 1 2 3 4 | 1978 1978
(1 row) (1 row)
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
pg_get_constraintdef | conname | conkey | conincluding pg_get_constraintdef | conname | conkey
----------------------------------+---------------------+--------+-------------- ----------------------------------+---------------------+--------
UNIQUE (c1, c2) INCLUDE (c3, c4) | tbl_c1_c2_c3_c4_key | {1,2} | {3,4} UNIQUE (c1, c2) INCLUDE (c3, c4) | tbl_c1_c2_c3_c4_key | {1,2}
(1 row) (1 row)
-- ensure that constraint works -- ensure that constraint works
...@@ -155,10 +155,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i ...@@ -155,10 +155,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i
tbl_pkey | 4 | 2 | t | t | 1 2 3 4 | 1978 1978 tbl_pkey | 4 | 2 | t | t | 1 2 3 4 | 1978 1978
(1 row) (1 row)
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
pg_get_constraintdef | conname | conkey | conincluding pg_get_constraintdef | conname | conkey
---------------------------------------+----------+--------+-------------- ---------------------------------------+----------+--------
PRIMARY KEY (c1, c2) INCLUDE (c3, c4) | tbl_pkey | {1,2} | {3,4} PRIMARY KEY (c1, c2) INCLUDE (c3, c4) | tbl_pkey | {1,2}
(1 row) (1 row)
-- ensure that constraint works -- ensure that constraint works
...@@ -178,10 +178,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i ...@@ -178,10 +178,10 @@ SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, i
tbl_c1_c3_c4_excl | 3 | 1 | f | f | 1 3 4 | 1978 tbl_c1_c3_c4_excl | 3 | 1 | f | f | 1 3 4 | 1978
(1 row) (1 row)
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
pg_get_constraintdef | conname | conkey | conincluding pg_get_constraintdef | conname | conkey
--------------------------------------------------+-------------------+--------+-------------- --------------------------------------------------+-------------------+--------
EXCLUDE USING btree (c1 WITH =) INCLUDE (c3, c4) | tbl_c1_c3_c4_excl | {1} | {3,4} EXCLUDE USING btree (c1 WITH =) INCLUDE (c3, c4) | tbl_c1_c3_c4_excl | {1}
(1 row) (1 row)
-- ensure that constraint works -- ensure that constraint works
......
...@@ -60,7 +60,7 @@ ALTER TABLE tbl_include_box_pk add PRIMARY KEY (c1, c2) INCLUDE (c3, c4); ...@@ -60,7 +60,7 @@ ALTER TABLE tbl_include_box_pk add PRIMARY KEY (c1, c2) INCLUDE (c3, c4);
CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box,
CONSTRAINT covering UNIQUE(c1,c2) INCLUDE(c3,c4)); CONSTRAINT covering UNIQUE(c1,c2) INCLUDE(c3,c4));
SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid;
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
-- ensure that constraint works -- ensure that constraint works
INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x;
DROP TABLE tbl; DROP TABLE tbl;
...@@ -68,7 +68,7 @@ DROP TABLE tbl; ...@@ -68,7 +68,7 @@ DROP TABLE tbl;
CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box,
CONSTRAINT covering PRIMARY KEY(c1,c2) INCLUDE(c3,c4)); CONSTRAINT covering PRIMARY KEY(c1,c2) INCLUDE(c3,c4));
SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid;
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
-- ensure that constraint works -- ensure that constraint works
INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x;
INSERT INTO tbl SELECT 1, NULL, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; INSERT INTO tbl SELECT 1, NULL, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x;
...@@ -78,7 +78,7 @@ DROP TABLE tbl; ...@@ -78,7 +78,7 @@ DROP TABLE tbl;
CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box,
UNIQUE(c1,c2) INCLUDE(c3,c4)); UNIQUE(c1,c2) INCLUDE(c3,c4));
SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid;
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
-- ensure that constraint works -- ensure that constraint works
INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x;
DROP TABLE tbl; DROP TABLE tbl;
...@@ -86,7 +86,7 @@ DROP TABLE tbl; ...@@ -86,7 +86,7 @@ DROP TABLE tbl;
CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box,
PRIMARY KEY(c1,c2) INCLUDE(c3,c4)); PRIMARY KEY(c1,c2) INCLUDE(c3,c4));
SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid;
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
-- ensure that constraint works -- ensure that constraint works
INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x;
INSERT INTO tbl SELECT 1, NULL, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; INSERT INTO tbl SELECT 1, NULL, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x;
...@@ -96,7 +96,7 @@ DROP TABLE tbl; ...@@ -96,7 +96,7 @@ DROP TABLE tbl;
CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box, CREATE TABLE tbl (c1 int,c2 int, c3 int, c4 box,
EXCLUDE USING btree (c1 WITH =) INCLUDE(c3,c4)); EXCLUDE USING btree (c1 WITH =) INCLUDE(c3,c4));
SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid; SELECT indexrelid::regclass, indnatts, indnkeyatts, indisunique, indisprimary, indkey, indclass FROM pg_index WHERE indrelid = 'tbl'::regclass::oid;
SELECT pg_get_constraintdef(oid), conname, conkey, conincluding FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'tbl'::regclass::oid;
-- ensure that constraint works -- ensure that constraint works
INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x; INSERT INTO tbl SELECT 1, 2, 3*x, box('4,4,4,4') FROM generate_series(1,10) AS x;
INSERT INTO tbl SELECT x, 2*x, NULL, NULL FROM generate_series(1,10) AS x; INSERT INTO tbl SELECT x, 2*x, NULL, NULL FROM generate_series(1,10) AS x;
......
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