Re: [Bug][patch]: After dropping the last label from a property graph element, invoking pg_get_propgraphdef() triggers an assertion failure - Mailing list pgsql-hackers

From Ashutosh Bapat
Subject Re: [Bug][patch]: After dropping the last label from a property graph element, invoking pg_get_propgraphdef() triggers an assertion failure
Date
Msg-id CAExHW5tsOK7ja2dMykD_qQSLwsuZxCTHx_jFyx-7-O+9WRBDXQ@mail.gmail.com
Whole thread
In response to [Bug][patch]: After dropping the last label from a property graph element, invoking pg_get_propgraphdef() triggers an assertion failure  (SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com>)
Responses Re: [Bug][patch]: After dropping the last label from a property graph element, invoking pg_get_propgraphdef() triggers an assertion failure
List pgsql-hackers
On Mon, Apr 20, 2026 at 11:42 PM SATYANARAYANA NARLAPURAM
<satyanarlapuram@gmail.com> wrote:
>
> Hi hackers,
>
> ALTER PROPERTY GRAPH ... ALTER ... DROP LABEL currently allows removing
> the last label from an element, leaving it with zero labels.
>
> On assert-enabled builds, pg_get_propgraphdef() hits
> TRAP: failed Assert("count > 0"), File: "ruleutils.c", Line: 1837, PID: 1821840
>
> Repro:
>
> CREATE TABLE t (x int PRIMARY KEY, y int, z int);
> CREATE PROPERTY GRAPH g VERTEX TABLES (t KEY (x) LABEL l1 LABEL l2);
> ALTER PROPERTY GRAPH g ALTER VERTEX TABLE t DROP LABEL l2;
> ALTER PROPERTY GRAPH g ALTER VERTEX TABLE t DROP LABEL l1;
> SELECT pg_get_propgraphdef('g'::regclass);
>
> We can fix it two ways, (1) Prevent dropping the last label; (2) handle zero labels.
> I feel it is easier to prevent dropping the last label than handling zero labels. Thoughts?
>

SQL/PGQ standard section 11.25 syntax rule 6 says
"Element table descriptor shall include two or more labels, one of
which has an <identifier> that is equivalent to the <label name>
simply contained in the <drop element table label clause>."

IIUC this simply means that the last label can not be dropped. That
agrees with your chosen option.

In the patch,
+ while (HeapTupleIsValid(systable_getnext(elscan)))
+ nlabels++;

It's better to break from the while loop after incrementing nlabels
and avoid scanning the entire table in the worst case. All we want to
check is whether another label exists and not all the labels.

> The attached patch adds a check in AlterPropGraph() before
> performDeletion(). It scans pg_propgraph_element_label to count labels
> for the element, and raises an error if only one remains. A regression test is included
> that drops labels down to the last one, verifies the error, then re-adds them back.

I would add a test to make sure ADD LABEL ... DROP LABEL .. is allowed.

While investigating this, I also looked at the DROP PROPERTIES
specification. It's allowed to drop even the last property.

--
Best Wishes,
Ashutosh Bapat



pgsql-hackers by date:

Previous
From: Hu Xunqi
Date:
Subject: Re: logical: fix recomputation required LSN on restart_lsn-only advancement
Next
From: 南拓弥
Date:
Subject: Warn on missing replica identity in CREATE/ALTER PUBLICATION