Re: SQL Property Graph Queries (SQL/PGQ)

From: Henson Choi <assam258(at)gmail(dot)com>
To: zengman <zengman(at)halodbtech(dot)com>, Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>
Cc: Peter Eisentraut <peter(at)eisentraut(dot)org>, Amit Langote <amitlangote09(at)gmail(dot)com>, Junwang Zhao <zhjwpku(at)gmail(dot)com>, Vik Fearing <vik(at)postgresfriends(dot)org>, Ajay Pal <ajay(dot)pal(dot)k(at)gmail(dot)com>, Imran Zaheer <imran(dot)zhir(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: SQL Property Graph Queries (SQL/PGQ)
Date: 2026-03-18 07:21:36
Message-ID: CAAAe_zCFB4p2m_MFxoj16MYJKRWqJixA5EDDk8CAqDS7N0erJA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi Ashutosh, Man,

I reproduced the crash and identified the root cause.

I checked the code and found that `found_mapping` was a null pointer because
>
I didn't enable assertions. The code in question is in
> `src/backend/rewrite/rewriteGraphTable.c`:

Should we remove this assertion and throw an error message instead to
> handle this case?
>

The assertion itself is correct — transformGraphTablePropertyRef() should
never create a GraphPropertyRef for a variable not present in the path
pattern. The real problem is that the element's WHERE clause was only
receiving its own mapping instead of all mappings in the path pattern.

In generate_query_for_graph_path():

tr = replace_property_refs(rte->relid, pf->whereClause, list_make1(pe));

list_make1(pe) passes only the current element's mapping to
replace_property_refs_mutator(). When the element WHERE clause references
another variable (e.g., `b.name != a.name` inside the `b` element pattern),
the mutator cannot find `a` in the mappings list, leaving found_mapping
NULL.

Note that the graph pattern-level WHERE clause already passes
graph_path (the full mapping list), which is why the same condition works
when placed outside the element pattern.

The fix is simply:

tr = replace_property_refs(rte->relid, pf->whereClause, graph_path);

Ashutosh, could you include this fix in the next patch revision?

With this fix, the reported query runs without crash and returns the
correct result. The graph_table regression test also passes cleanly.

Also, I'd like to check — do you see any potential side effects from
passing the full graph_path instead of list_make1(pe)? Since the mutator
now has access to all element mappings, I want to make sure there are no
unintended interactions in other code paths.

Regards,
Henson

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message SATYANARAYANA NARLAPURAM 2026-03-18 07:28:44 Re: An attempt to avoid locally-committed-but-not-replicated-to-standby-transactions in synchronous replication
Previous Message Lakshmi N 2026-03-18 07:17:40 log XLogPrefetch stats at end of recovery