Re: Error on failed COMMIT - Mailing list pgsql-hackers

From Dave Cramer
Subject Re: Error on failed COMMIT
Date
Msg-id CADK3HHKqvSYDSUfvKbBq16Fh1HRtEaoBpd=8hF7sJuir6oxZsg@mail.gmail.com
Whole thread Raw
In response to Re: Error on failed COMMIT  (Laurenz Albe <laurenz.albe@cybertec.at>)
Responses Re: Error on failed COMMIT  (Laurenz Albe <laurenz.albe@cybertec.at>)
List pgsql-hackers
On Tue, 26 Jan 2021 at 05:05, Laurenz Albe <laurenz.albe@cybertec.at> wrote:
On Mon, 2021-01-25 at 11:29 -0500, Dave Cramer wrote:
> Rebased against head
>
> Here's my summary of the long thread above.
>
> This change is in keeping with the SQL spec.
>
> There is an argument (Tom) that says that this will annoy more people than it will please.
>  I presume this is due to the fact that libpq behaviour will change.
>
> As the author of the JDBC driver, and I believe I speak for other driver (NPGSQL for one)
>  authors as well that have implemented the protocol I would argue that the current behaviour
>  is more annoying.
>
> We currently have to keep state and determine if COMMIT actually failed or it ROLLED BACK.
>  There are a number of async drivers that would also benefit from not having to keep state
>  in the session.

I think this change makes sense, but I think everybody agrees that it does as it
makes PostgreSQL more standard compliant.

About the fear that it will break user's applications:

I think that the breakage will be minimal.  All that will change is that COMMIT of
an aborted transaction raises an error.

Applications that catch an error in a transaction and roll back will not
be affected.  What will be affected are applications that do *not* check for
errors in statements in a transaction, but check for errors in the COMMIT.
I think that doesn't happen often.

I agree that some people will be hurt, but I don't think it will be a major problem.

The patch applies and passes regression tests.

I wonder about the introduction of the new USER_ERROR level:

 #define WARNING_CLIENT_ONLY    20  /* Warnings to be sent to client as usual, but
                                 * never to the server log. */
-#define ERROR      21          /* user error - abort transaction; return to
+#define USER_ERROR 21
+#define ERROR      22          /* user error - abort transaction; return to
                                 * known state */
 /* Save ERROR value in PGERROR so it can be restored when Win32 includes
  * modify it.  We have to use a constant rather than ERROR because macros
  * are expanded only when referenced outside macros.
  */
 #ifdef WIN32
-#define PGERROR        21
+#define PGERROR        22
 #endif
-#define FATAL      22          /* fatal error - abort process */
-#define PANIC      23          /* take down the other backends with me */
+#define FATAL      23          /* fatal error - abort process */
+#define PANIC      24          /* take down the other backends with me */

I see that without that, COMMIT AND CHAIN does not behave correctly,
since the respective regression tests fail.

But I don't understand why.  I think that this needs some more comments to
make this clear.

First off thanks for reviewing.

The problem is that ereport does not return for any level equal to or above ERROR. This code required it to return so that it could continue processing
So after re-acquainting myself with the code I propose: Now we could use "TRANSACTION_ERROR" instead of "USER_ERROR" 
I'd like to comment more but I do not believe that elog.h is the place. Suggestions ?


index 3c0e57621f..df79a2d6db 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -42,17 +42,19 @@
                                                                 * WARNING is for unexpected messages. */
 #define WARNING_CLIENT_ONLY    20      /* Warnings to be sent to client as usual, but
                                                                 * never to the server log. */
-#define ERROR          21                      /* user error - abort transaction; return to
+#define USER_ERROR     21                      /* similar to ERROR, except we don't want to
+                                                               * exit the current context. */
+#define ERROR          22                      /* user error - abort transaction; return to
                                                                 * known state */
 /* Save ERROR value in PGERROR so it can be restored when Win32 includes
  * modify it.  We have to use a constant rather than ERROR because macros
  * are expanded only when referenced outside macros.
  */
 #ifdef WIN32
-#define PGERROR                21
+#define PGERROR                22
 #endif
-#define FATAL          22                      /* fatal error - abort process */
-#define PANIC          23                      /* take down the other backends with me */
+#define FATAL          23                      /* fatal error - abort process */
+#define PANIC          24                      /* take down the other backends with me */



 
Is this new message level something we need to allow setting for
"client_min_messages" and "log_min_messages"?

Good question. I had not given that any thought.


Dave Cramer
www.postgres.rocks

pgsql-hackers by date:

Previous
From: Magnus Hagander
Date:
Subject: Re: mkid reference
Next
From: Bruce Momjian
Date:
Subject: Re: Key management with tests