Add object names to partition integrity violations.
authorAmit Kapila <[email protected]>
Mon, 23 Mar 2020 02:39:15 +0000 (08:09 +0530)
committerAmit Kapila <[email protected]>
Mon, 23 Mar 2020 02:39:15 +0000 (08:09 +0530)
All errors of SQLSTATE class 23 should include the name of an object
associated with the error in separate fields of the error report message.
We do this so that applications need not try to extract them from the
possibly-localized human-readable text of the message.

Reported-by: Chris Bandy
Author: Chris Bandy
Reviewed-by: Amit Kapila and Amit Langote
Discussion: https://postgr.es/m/0aa113a3-3c7f-db48-bcd8-f9290b2269ae@gmail.com

src/backend/commands/tablecmds.c
src/backend/executor/execMain.c
src/backend/executor/execPartition.c
src/backend/partitioning/partbounds.c
src/backend/utils/adt/ri_triggers.c

index 729025470dc1160a3cf4a6ab9468fb6fdcabe8a7..8e35c5bd1a27a22b43b8fd290a7bb25b5af1b966 100644 (file)
@@ -5343,12 +5343,14 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode)
                    ereport(ERROR,
                            (errcode(ERRCODE_CHECK_VIOLATION),
                             errmsg("updated partition constraint for default partition \"%s\" would be violated by some row",
-                                   RelationGetRelationName(oldrel))));
+                                   RelationGetRelationName(oldrel)),
+                            errtable(oldrel)));
                else
                    ereport(ERROR,
                            (errcode(ERRCODE_CHECK_VIOLATION),
                             errmsg("partition constraint of relation \"%s\" is violated by some row",
-                                   RelationGetRelationName(oldrel))));
+                                   RelationGetRelationName(oldrel)),
+                            errtable(oldrel)));
            }
 
            /* Write the tuple out to the new relation */
index 28130fbc2b19d60d9664beabb0f9c8f69a15610b..4fdffad6f35dfaefe1eb503b244f73ee5cc1a570 100644 (file)
@@ -1878,7 +1878,8 @@ ExecPartitionCheckEmitError(ResultRelInfo *resultRelInfo,
            (errcode(ERRCODE_CHECK_VIOLATION),
             errmsg("new row for relation \"%s\" violates partition constraint",
                    RelationGetRelationName(resultRelInfo->ri_RelationDesc)),
-            val_desc ? errdetail("Failing row contains %s.", val_desc) : 0));
+            val_desc ? errdetail("Failing row contains %s.", val_desc) : 0,
+            errtable(resultRelInfo->ri_RelationDesc)));
 }
 
 /*
index ef74ad85ff9a04b990257c798953e345fd4f09f4..fb6ce49056814c3f8d7db49090261ff2c6c889d6 100644 (file)
@@ -346,7 +346,8 @@ ExecFindPartition(ModifyTableState *mtstate,
                            RelationGetRelationName(rel)),
                     val_desc ?
                     errdetail("Partition key of the failing row contains %s.",
-                              val_desc) : 0));
+                              val_desc) : 0,
+                    errtable(rel)));
        }
 
        if (partdesc->is_leaf[partidx])
index 35953f23facafb82a276e166c92d44907f8fcf53..4c47f54a57c195c2f8dc89be3f1e9be8dec5a561 100644 (file)
@@ -1366,7 +1366,8 @@ check_default_partition_contents(Relation parent, Relation default_rel,
                ereport(ERROR,
                        (errcode(ERRCODE_CHECK_VIOLATION),
                         errmsg("updated partition constraint for default partition \"%s\" would be violated by some row",
-                               RelationGetRelationName(default_rel))));
+                               RelationGetRelationName(default_rel)),
+                        errtable(default_rel)));
 
            ResetExprContext(econtext);
            CHECK_FOR_INTERRUPTS();
index 4ab7cda1105aba9122935601c1a364b2f0bcd6d2..bb49e80d1665b46c234cb3dbe7babbf6fbde41c8 100644 (file)
@@ -2452,7 +2452,8 @@ ri_ReportViolation(const RI_ConstraintInfo *riinfo,
                        NameStr(riinfo->conname)),
                 errdetail("Key (%s)=(%s) is still referenced from table \"%s\".",
                           key_names.data, key_values.data,
-                          RelationGetRelationName(fk_rel))));
+                          RelationGetRelationName(fk_rel)),
+                errtableconstraint(fk_rel, NameStr(riinfo->conname))));
    else if (onfk)
        ereport(ERROR,
                (errcode(ERRCODE_FOREIGN_KEY_VIOLATION),