Repair find_inheritance_children with no active snapshot
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 8 Apr 2021 04:46:14 +0000 (00:46 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 8 Apr 2021 04:46:14 +0000 (00:46 -0400)
When working on a scan with only a catalog snapshot, we may not have an
ActiveSnapshot set.  If we were to come across a detached partition,
that would cause a crash.  Fix by only ignoring detached partitions when
there's an active snapshot.

src/backend/catalog/pg_inherits.c

index bedee069be22493a0ba6b04b80a68f5e8ec284bb..bb8b2249b10773e55382d805b8e89073c06fe893 100644 (file)
@@ -106,10 +106,13 @@ find_inheritance_children(Oid parentrelId, bool include_detached,
                 *
                 * The reason for this check is that we want to avoid seeing the
                 * partition as alive in RI queries during REPEATABLE READ or
-                * SERIALIZABLE transactions.
+                * SERIALIZABLE transactions.  (If there's no active snapshot set,
+                * that means we're not running a user query, so it's OK to always
+                * include detached partitions in that case.)
                 */
                if (((Form_pg_inherits) GETSTRUCT(inheritsTuple))->inhdetachpending &&
-                       !include_detached)
+                       !include_detached &&
+                       ActiveSnapshotSet())
                {
                        TransactionId xmin;
                        Snapshot snap;