diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2018-09-03 12:58:42 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2018-09-03 12:59:26 -0300 |
commit | c076f3d74af6e4836206142446bdcc2f93e149d6 (patch) | |
tree | f6f9155408b19d64d94f2cde7a236dd36c65ee87 /src/backend | |
parent | 4ddd8f5f55a0a1967fc787e42182745ca1e3a995 (diff) | |
download | postgresql-c076f3d74af6e4836206142446bdcc2f93e149d6.tar.gz postgresql-c076f3d74af6e4836206142446bdcc2f93e149d6.zip |
Remove pg_constraint.conincluding
This column was added in commit 8224de4f42cc ("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
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/catalog/pg_constraint.c | 21 | ||||
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 57 |
2 files changed, 45 insertions, 33 deletions
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c index 7a6d158f898..ea844413608 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -85,7 +85,6 @@ CreateConstraintEntry(const char *constraintName, bool nulls[Natts_pg_constraint]; Datum values[Natts_pg_constraint]; ArrayType *conkeyArray; - ArrayType *conincludingArray; ArrayType *confkeyArray; ArrayType *conpfeqopArray; ArrayType *conppeqopArray; @@ -116,21 +115,6 @@ CreateConstraintEntry(const char *constraintName, else 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) { Datum *fkdatums; @@ -204,11 +188,6 @@ CreateConstraintEntry(const char *constraintName, else 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) values[Anum_pg_constraint_confkey - 1] = PointerGetDatum(confkeyArray); else diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 03e9a28a63b..5cce3f12420 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -315,7 +315,7 @@ static char *deparse_expression_pretty(Node *expr, List *dpcontext, static char *pg_get_viewdef_worker(Oid viewoid, int prettyFlags, int wrapColumn); 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); static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags); static char *pg_get_indexdef_worker(Oid indexrelid, int colno, @@ -2055,6 +2055,8 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, Datum val; bool isnull; Oid indexId; + int keyatts; + HeapTuple indtup; /* Start off the constraint definition */ if (conForm->contype == CONSTRAINT_PRIMARY) @@ -2069,24 +2071,52 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, elog(ERROR, "null conkey for constraint %u", constraintId); - decompile_column_index_array(val, conForm->conrelid, &buf); + keyatts = decompile_column_index_array(val, conForm->conrelid, &buf); appendStringInfoChar(&buf, ')'); - /* Fetch and build including column list */ - isnull = true; - val = SysCacheGetAttr(CONSTROID, tup, - Anum_pg_constraint_conincluding, &isnull); - if (!isnull) + indexId = get_constraint_index(constraintId); + + /* Build including column list (from pg_index.indkeys) */ + indtup = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexId)); + 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 ("); - 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, ')'); } - - indexId = get_constraint_index(constraintId); + ReleaseSysCache(indtup); /* XXX why do we only print these bits if fullCommand? */ if (fullCommand && OidIsValid(indexId)) @@ -2232,9 +2262,10 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, /* * 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, StringInfo buf) { @@ -2258,6 +2289,8 @@ decompile_column_index_array(Datum column_index_array, Oid relId, else appendStringInfo(buf, ", %s", quote_identifier(colName)); } + + return nKeys; } |