]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
pg_plan_advice: Avoid assertion failure with partitionwise aggregate.
authorRobert Haas <rhaas@postgresql.org>
Mon, 30 Mar 2026 13:58:25 +0000 (09:58 -0400)
committerRobert Haas <rhaas@postgresql.org>
Mon, 30 Mar 2026 13:58:25 +0000 (09:58 -0400)
An Append node that is part of a partitionwise aggregate has no
apprelids. If such a node was elided, the previous coding would
attempt to call unique_nonjoin_rtekind() on a NULL pointer, which
leads to an assertion failure. Insert a NULL check to prevent that.

Reported-by: Alexander Lakhin <exclusion@gmail.com>
Discussion: http://postgr.es/m/0afba1ce-c946-4131-972d-191d9a1c097c@gmail.com

contrib/pg_plan_advice/pgpa_scan.c

index 5f210f2b725ce1dc95c03e6626f5dbd4f8ccf146..0467f9b12ba87b38ca4e4ce2541423521bf640a7 100644 (file)
@@ -68,8 +68,15 @@ pgpa_build_scan(pgpa_plan_walker_context *walker, Plan *plan,
                 * Note that the PGPA_SCAN_PARTITIONWISE case also includes
                 * partitionwise joins; this module considers those to be a form of
                 * scan, since they lack internal structure that we can decompose.
+                *
+                * Note also that it's possible for relids to be NULL here, if the
+                * elided Append node is part of a partitionwise aggregate. In that
+                * case, it doesn't matter what strategy we choose, but we do need to
+                * avoid calling unique_nonjoin_rtekind(), which would fail an
+                * assertion.
                 */
                if ((nodetype == T_Append || nodetype == T_MergeAppend) &&
+                       relids != NULL &&
                        unique_nonjoin_rtekind(relids,
                                                                   walker->pstmt->rtable) == RTE_RELATION)
                        strategy = PGPA_SCAN_PARTITIONWISE;