Re: Problem with dblink - Mailing list pgsql-patches

From Joe Conway
Subject Re: Problem with dblink
Date
Msg-id 3FCABDBC.7000203@joeconway.com
Whole thread Raw
In response to Re: Problem with dblink  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-patches
Tom Lane wrote:
> 1. AFAIR, all the other at-end-of-xact routines that take a flag telling
> them if it's commit or abort define the flag as isCommit.  Having the
> reverse convention for this one routine is confusing and a recipe for
> errors, so please make it be isCommit too.

Done.

> 2. The initial comment for AtEOXact_SPI:
>
>>   * Clean up SPI state at transaction commit or abort (we don't care which).
>
> is now incorrect and needs to be updated (at least get rid of the
> parenthetical note).

Done.

>>!     if (_SPI_stack != NULL)
>>!     {
>>          free(_SPI_stack);
>>+         if (!isAbort)
>>+             ereport(WARNING,
>>+                     (errcode(ERRCODE_WARNING),
>>+                      errmsg("freeing non-empty SPI stack"),
>>+                      errhint("Check for missing \"SPI_finish\" calls")));
>>+     }
>>+
>
> While this isn't necessarily wrong, what would probably be a stronger
> test is to complain if either _SPI_connected or _SPI_curid is not -1.
> For one thing that would catch missing SPI_pop().  (Jan, any comment
> about that?)
>

Based on some simple testing, a warning for (_SPI_connected != -1) seems
redundant with (_SPI_stack != NULL) -- i.e. I just get both warnings
when SPI_finish() isn't called. And commenting out SPI_pop() causes a
"SPI_finish failed" error, at least in the one place it's used
(pl_exec.c), so we never get to AtEOXact_SPI(). So for the moment at
least I left that last section the same.

OK to commit?

Joe

Index: src/backend/access/transam/xact.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/access/transam/xact.c,v
retrieving revision 1.157
diff -c -r1.157 xact.c
*** src/backend/access/transam/xact.c    29 Nov 2003 19:51:40 -0000    1.157
--- src/backend/access/transam/xact.c    1 Dec 2003 03:50:40 -0000
***************
*** 977,983 ****

      CallEOXactCallbacks(true);
      AtEOXact_GUC(true);
!     AtEOXact_SPI();
      AtEOXact_gist();
      AtEOXact_hash();
      AtEOXact_nbtree();
--- 977,983 ----

      CallEOXactCallbacks(true);
      AtEOXact_GUC(true);
!     AtEOXact_SPI(true);
      AtEOXact_gist();
      AtEOXact_hash();
      AtEOXact_nbtree();
***************
*** 1087,1093 ****

      CallEOXactCallbacks(false);
      AtEOXact_GUC(false);
!     AtEOXact_SPI();
      AtEOXact_gist();
      AtEOXact_hash();
      AtEOXact_nbtree();
--- 1087,1093 ----

      CallEOXactCallbacks(false);
      AtEOXact_GUC(false);
!     AtEOXact_SPI(false);
      AtEOXact_gist();
      AtEOXact_hash();
      AtEOXact_nbtree();
Index: src/backend/executor/spi.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/executor/spi.c,v
retrieving revision 1.108
diff -c -r1.108 spi.c
*** src/backend/executor/spi.c    29 Nov 2003 19:51:48 -0000    1.108
--- src/backend/executor/spi.c    1 Dec 2003 03:50:40 -0000
***************
*** 174,191 ****
  }

  /*
!  * Clean up SPI state at transaction commit or abort (we don't care which).
   */
  void
! AtEOXact_SPI(void)
  {
      /*
       * Note that memory contexts belonging to SPI stack entries will be
       * freed automatically, so we can ignore them here.  We just need to
       * restore our static variables to initial state.
       */
!     if (_SPI_stack != NULL)        /* there was abort */
          free(_SPI_stack);
      _SPI_current = _SPI_stack = NULL;
      _SPI_connected = _SPI_curid = -1;
      SPI_processed = 0;
--- 174,199 ----
  }

  /*
!  * Clean up SPI state at transaction commit or abort.
   */
  void
! AtEOXact_SPI(bool isCommit)
  {
      /*
       * Note that memory contexts belonging to SPI stack entries will be
       * freed automatically, so we can ignore them here.  We just need to
       * restore our static variables to initial state.
       */
!     if (_SPI_stack != NULL)
!     {
          free(_SPI_stack);
+         if (isCommit)
+             ereport(WARNING,
+                     (errcode(ERRCODE_WARNING),
+                      errmsg("freeing non-empty SPI stack"),
+                      errhint("Check for missing \"SPI_finish\" calls")));
+     }
+
      _SPI_current = _SPI_stack = NULL;
      _SPI_connected = _SPI_curid = -1;
      SPI_processed = 0;
Index: src/include/executor/spi.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/executor/spi.h,v
retrieving revision 1.40
diff -c -r1.40 spi.h
*** src/include/executor/spi.h    29 Nov 2003 22:41:01 -0000    1.40
--- src/include/executor/spi.h    1 Dec 2003 03:50:43 -0000
***************
*** 116,121 ****
  extern void SPI_cursor_move(Portal portal, bool forward, int count);
  extern void SPI_cursor_close(Portal portal);

! extern void AtEOXact_SPI(void);

  #endif   /* SPI_H */
--- 116,121 ----
  extern void SPI_cursor_move(Portal portal, bool forward, int count);
  extern void SPI_cursor_close(Portal portal);

! extern void AtEOXact_SPI(bool isCommit);

  #endif   /* SPI_H */

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: GUC descriptions of SHOW
Next
From: Bruce Momjian
Date:
Subject: Re: [PATCH] Re: [pgsql-advocacy] Why READ ONLY transactions?