Repair find_inheritance_children with no active snapshot
authorAlvaro Herrera
Thu, 8 Apr 2021 04:46:14 +0000 (00:46 -0400)
committerAlvaro Herrera
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;