diff options
author | Robert Haas <rhaas@postgresql.org> | 2017-03-03 09:07:41 +0530 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2017-03-03 09:09:52 +0530 |
commit | 5a73e17317e91912b2755f7960d5bf31d374cf31 (patch) | |
tree | 9df368817ebdf24e6eca7a2a47dbccdbc67808b0 /src/backend/utils/adt/ruleutils.c | |
parent | be6ed6451c693d9121d357996cbc21b06058b9c1 (diff) | |
download | postgresql-5a73e17317e91912b2755f7960d5bf31d374cf31.tar.gz postgresql-5a73e17317e91912b2755f7960d5bf31d374cf31.zip |
Improve error reporting for tuple-routing failures.
Currently, the whole row is shown without column names. Instead,
adopt a style similar to _bt_check_unique() in ExecFindPartition()
and show the failing key: (key1, ...) = (val1, ...).
Amit Langote, per a complaint from Simon Riggs. Reviewed by me;
I also adjusted the grammar in one of the comments.
Discussion: http://postgr.es/m/9f9dc7ae-14f0-4a25-5485-964d9bfc19bd@lab.ntt.co.jp
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r-- | src/backend/utils/adt/ruleutils.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index b27b77de216..cf79f4126e4 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -317,7 +317,8 @@ static char *pg_get_indexdef_worker(Oid indexrelid, int colno, const Oid *excludeOps, bool attrsOnly, bool showTblSpc, int prettyFlags, bool missing_ok); -static char *pg_get_partkeydef_worker(Oid relid, int prettyFlags); +static char *pg_get_partkeydef_worker(Oid relid, int prettyFlags, + bool attrsOnly); static char *pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, int prettyFlags, bool missing_ok); static text *pg_get_expr_worker(text *expr, Oid relid, const char *relname, @@ -1431,14 +1432,26 @@ pg_get_partkeydef(PG_FUNCTION_ARGS) Oid relid = PG_GETARG_OID(0); PG_RETURN_TEXT_P(string_to_text(pg_get_partkeydef_worker(relid, - PRETTYFLAG_INDENT))); + PRETTYFLAG_INDENT, + false))); +} + +/* Internal version that just reports the column definitions */ +char * +pg_get_partkeydef_columns(Oid relid, bool pretty) +{ + int prettyFlags; + + prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT; + return pg_get_partkeydef_worker(relid, prettyFlags, true); } /* * Internal workhorse to decompile a partition key definition. */ static char * -pg_get_partkeydef_worker(Oid relid, int prettyFlags) +pg_get_partkeydef_worker(Oid relid, int prettyFlags, + bool attrsOnly) { Form_pg_partitioned_table form; HeapTuple tuple; @@ -1508,17 +1521,20 @@ pg_get_partkeydef_worker(Oid relid, int prettyFlags) switch (form->partstrat) { case PARTITION_STRATEGY_LIST: - appendStringInfo(&buf, "LIST"); + if (!attrsOnly) + appendStringInfo(&buf, "LIST"); break; case PARTITION_STRATEGY_RANGE: - appendStringInfo(&buf, "RANGE"); + if (!attrsOnly) + appendStringInfo(&buf, "RANGE"); break; default: elog(ERROR, "unexpected partition strategy: %d", (int) form->partstrat); } - appendStringInfo(&buf, " ("); + if (!attrsOnly) + appendStringInfo(&buf, " ("); sep = ""; for (keyno = 0; keyno < form->partnatts; keyno++) { @@ -1561,14 +1577,17 @@ pg_get_partkeydef_worker(Oid relid, int prettyFlags) /* Add collation, if not default for column */ partcoll = partcollation->values[keyno]; - if (OidIsValid(partcoll) && partcoll != keycolcollation) + if (!attrsOnly && OidIsValid(partcoll) && partcoll != keycolcollation) appendStringInfo(&buf, " COLLATE %s", generate_collation_name((partcoll))); /* Add the operator class name, if not default */ - get_opclass_name(partclass->values[keyno], keycoltype, &buf); + if (!attrsOnly) + get_opclass_name(partclass->values[keyno], keycoltype, &buf); } - appendStringInfoChar(&buf, ')'); + + if (!attrsOnly) + appendStringInfoChar(&buf, ')'); /* Clean up */ ReleaseSysCache(tuple); |