1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-13 07:41:39 +03:00

Improve unique-constraint-violation error messages to include the exact

values being complained of.

In passing, also remove the arbitrary length limitation in the similar
error detail message for foreign key violations.

Itagaki Takahiro
This commit is contained in:
Tom Lane
2009-08-01 19:59:41 +00:00
parent 2487d872e0
commit b680ae4bdb
20 changed files with 173 additions and 41 deletions

View File

@ -15,7 +15,7 @@
*
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/backend/utils/adt/ri_triggers.c,v 1.113 2009/06/11 14:49:04 momjian Exp $
* $PostgreSQL: pgsql/src/backend/utils/adt/ri_triggers.c,v 1.114 2009/08/01 19:59:41 tgl Exp $
*
* ----------
*/
@ -3413,11 +3413,8 @@ ri_ReportViolation(RI_QueryKey *qkey, const char *constrname,
HeapTuple violator, TupleDesc tupdesc,
bool spi_err)
{
#define BUFLENGTH 512
char key_names[BUFLENGTH];
char key_values[BUFLENGTH];
char *name_ptr = key_names;
char *val_ptr = key_values;
StringInfoData key_names;
StringInfoData key_values;
bool onfk;
int idx,
key_idx;
@ -3465,6 +3462,8 @@ ri_ReportViolation(RI_QueryKey *qkey, const char *constrname,
}
/* Get printable versions of the keys involved */
initStringInfo(&key_names);
initStringInfo(&key_values);
for (idx = 0; idx < qkey->nkeypairs; idx++)
{
int fnum = qkey->keypair[idx][key_idx];
@ -3476,20 +3475,13 @@ ri_ReportViolation(RI_QueryKey *qkey, const char *constrname,
if (!val)
val = "null";
/*
* Go to "..." if name or value doesn't fit in buffer. We reserve 5
* bytes to ensure we can add comma, "...", null.
*/
if (strlen(name) >= (key_names + BUFLENGTH - 5) - name_ptr ||
strlen(val) >= (key_values + BUFLENGTH - 5) - val_ptr)
if (idx > 0)
{
sprintf(name_ptr, "...");
sprintf(val_ptr, "...");
break;
appendStringInfoString(&key_names, ", ");
appendStringInfoString(&key_values, ", ");
}
name_ptr += sprintf(name_ptr, "%s%s", idx > 0 ? "," : "", name);
val_ptr += sprintf(val_ptr, "%s%s", idx > 0 ? "," : "", val);
appendStringInfoString(&key_names, name);
appendStringInfoString(&key_values, val);
}
if (onfk)
@ -3498,7 +3490,7 @@ ri_ReportViolation(RI_QueryKey *qkey, const char *constrname,
errmsg("insert or update on table \"%s\" violates foreign key constraint \"%s\"",
RelationGetRelationName(fk_rel), constrname),
errdetail("Key (%s)=(%s) is not present in table \"%s\".",
key_names, key_values,
key_names.data, key_values.data,
RelationGetRelationName(pk_rel))));
else
ereport(ERROR,
@ -3507,7 +3499,7 @@ ri_ReportViolation(RI_QueryKey *qkey, const char *constrname,
RelationGetRelationName(pk_rel),
constrname, RelationGetRelationName(fk_rel)),
errdetail("Key (%s)=(%s) is still referenced from table \"%s\".",
key_names, key_values,
key_names.data, key_values.data,
RelationGetRelationName(fk_rel))));
}