On 2024-Sep-09, jian he wrote: > bold idea. print out the constraint name: violates not-null constraint \"%s\" > for the following code: > ereport(ERROR, > (errcode(ERRCODE_NOT_NULL_VIOLATION), > errmsg("null value in column \"%s\" of > relation \"%s\" violates not-null constraint", > NameStr(att->attname), > RelationGetRelationName(orig_rel)), > val_desc ? errdetail("Failing row contains > %s.", val_desc) : 0, > errtablecol(orig_rel, attrChk)));
I gave this a quick run, but I'm not sure it actually improves things much. Here's one change from the regression tests. What do you think? INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL); -ERROR: null value in column "i" of relation "reloptions_test" violates not-null constraint +ERROR: null value in column "i" of relation "reloptions_test" violates not-null constraint "reloptions_test_i_not_null" What do I get from having the constraint name? It's not like I'm going to drop the constraint and retry the insert. Here's the POC-quality patch for this. I changes a lot of regression tests, which I don't patch here. (But that's not the reason for me thinking that this isn't worth it.) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 29e186fa73d..d84137f4f43 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -1907,6 +1907,7 @@ ExecPartitionCheckEmitError(ResultRelInfo *resultRelInfo, * have been converted from the original input tuple after tuple routing. * 'resultRelInfo' is the final result relation, after tuple routing. */ +#include "catalog/pg_constraint.h" void ExecConstraints(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate) @@ -1932,6 +1933,7 @@ ExecConstraints(ResultRelInfo *resultRelInfo, char *val_desc; Relation orig_rel = rel; TupleDesc orig_tupdesc = RelationGetDescr(rel); + char *conname; /* * If the tuple has been routed, it's been converted to the @@ -1970,14 +1972,24 @@ ExecConstraints(ResultRelInfo *resultRelInfo, tupdesc, modifiedCols, 64); + { + HeapTuple tuple; + Form_pg_constraint conForm; + + tuple = findNotNullConstraintAttnum(RelationGetRelid(orig_rel), + att->attnum); + conForm = (Form_pg_constraint) GETSTRUCT(tuple); + conname = pstrdup(NameStr(conForm->conname)); + } ereport(ERROR, - (errcode(ERRCODE_NOT_NULL_VIOLATION), - errmsg("null value in column \"%s\" of relation \"%s\" violates not-null constraint", - NameStr(att->attname), - RelationGetRelationName(orig_rel)), - val_desc ? errdetail("Failing row contains %s.", val_desc) : 0, - errtablecol(orig_rel, attrChk))); + errcode(ERRCODE_NOT_NULL_VIOLATION), + errmsg("null value in column \"%s\" of relation \"%s\" violates not-null constraint \"%s\"", + NameStr(att->attname), + RelationGetRelationName(orig_rel), + conname), + val_desc ? errdetail("Failing row contains %s.", val_desc) : 0, + errtablecol(orig_rel, attrChk)); } } } -- Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/