Re: Re: [patch] Include detailed information about a row failing a CHECK constraint into the error message - Mailing list pgsql-hackers
From | Jan Kundrát |
---|---|
Subject | Re: Re: [patch] Include detailed information about a row failing a CHECK constraint into the error message |
Date | |
Msg-id | 4EBBD43E.1070907@flaska.net Whole thread Raw |
In response to | Re: Re: [patch] Include detailed information about a row failing a CHECK constraint into the error message (Robert Haas <robertmhaas@gmail.com>) |
Responses |
Re: Re: [patch] Include detailed information about a row
failing a CHECK constraint into the error message
|
List | pgsql-hackers |
On 11/10/11 13:04, Robert Haas wrote: > Well, if we're going to try to emit some context here, I'd suggest > that we try to output only the columns implicated in the CHECK > constraint, rather than the whole tuple. I'm not sure whether > emitting only a certain amount of output (either total, or for each > column) can be made to work nicely, or whether the feature overall is > something we want. It seems like a trade-off between possibly useful > context and possibly annoying log clutter, and I guess I don't have a > strong opinion on which way to go with it. OK, let me start with some background on why I actually want to have such a feature. The project which we're working on [1] (and [2] for some context about why the hell we bother) allows users to define layout of their DB tables using standard CREATE TABLE ... stanzas, including various triggers, check constraints etc etc. What our project does is generating plenty of stored procedures which essentially built a version-control infrastructure around the user-specified table layout. Our workflow utilizes something similar to the concept of a working copy in Subversion. It means that any modifications that users perform are executed on an extra table (the history one) which does not enforce any user-specified constraints. It's only at the time of a commit, where data is moved by `UPDATE tabl SELECT ... FROM tbl_history where revision = $pending_changeset` to its final destination and all the checks, triggers and constraints are enforced. The issue which we've hit is that when the user has specified a CHECK constraint and tries to save many rows at once, we don't have any information about what went wrong besides the name of the check which failed. It's better than nothing, but given that Pg provides very similar information for UNIQUE columns, it looked like a good feature to implement. What I want to find in the end is something which tells me "this row causes the error". Unfortunately, as the new row of the table with the constraint is not yet on disk, it doesn't really have its own ctid, and therefore I cannot report that. (Which makes sense, obviously.) I also realize that our use case is a bit esoteric and very far from the mainstream Postgres applications, but I believe that simply having detailed error messages is a good thing overall. Of course it's clearly possible that we're doing it completely wrong, so if someone has a suggestion or would like to chat about that, I'm all ears (feel free to go off-list here). Now I realize that there might be some concerns about error log cluttering etc. On the other hand, I'd take it for granted that it's a good idea to include at least *some* context in the error messages (and I assume that's what the detail field is for). If it's acceptable for UNIQUE constraints to show the index values (which are enough to identify the troublesome row), it seems to me that extending this to CHECKs is a natural further development and leads to better consistency. As I've said earlier, I'm not at all familiar with Postgres' internals, so before I go ahead and spend another night finding out how to look at the table/check metadata and print just the columns which are referenced by a CHECK, if that's even possible, I'd like to know whether such a patch would be welcome and accepted or not :). Again, a big thank you for your review -- it's much appreciated. Cheers, Jan [1] https://projects.flaska.net/projects/deska [2] https://projects.flaska.net/attachments/download/74/2011-11-10-deska-18e4c5b.pdf -- Trojita, a fast e-mail client -- http://trojita.flaska.net/
pgsql-hackers by date: