Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Use elog, not Assert, to report failure to provide an outer snapshot.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 31 Jul 2021 15:50:14 +0000 (11:50 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 31 Jul 2021 15:50:14 +0000 (11:50 -0400)
As of commit 84f5c2908, executing SQL commands (via SPI or otherwise)
requires having either an active Portal, or a caller-established
active snapshot.  We were simply Assert'ing that that's the case.
But we've now had a couple different reports of people testing
extensions that didn't meet this requirement, and were confused by
the resulting crash.  Let's convert the Assert to a test-and-elog,
in hopes of making the issue clearer for extension authors.

Per gripes from Liu Huailing and RekGRpth.  Back-patch to v11,
like the prior commit.

Discussion: https://postgr.es/m/OSZPR01MB6215671E3C5956A034A080DFBEEC9@OSZPR01MB6215.jpnprd01.prod.outlook.com
Discussion: https://postgr.es/m/17035-14607d308ac8643c@postgresql.org

src/backend/tcop/pquery.c

index 3a03dcbc4eeb32fd37abbab14b4c5224d4072f7c..b1d07079a8f7d91c5b9d6198b2c6a1e044d5f663 100644 (file)
@@ -1782,7 +1782,8 @@ EnsurePortalSnapshotExists(void)
 
    /* Otherwise, we'd better have an active Portal */
    portal = ActivePortal;
-   Assert(portal != NULL);
+   if (unlikely(portal == NULL))
+       elog(ERROR, "cannot execute SQL without an outer snapshot or portal");
    Assert(portal->portalSnapshot == NULL);
 
    /* Create a new snapshot and make it active */