Re: SQL Property Graph Queries (SQL/PGQ)

From: Henson Choi <assam258(at)gmail(dot)com>
To: Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>
Cc: Alexander Lakhin <exclusion(at)gmail(dot)com>, 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-24 01:05:28
Message-ID: CAAAe_zCg4xpB7Giu_KjLaa39LKF=cVm58tBveezLxpLLVC8=rw@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi Ashutosh,

I have also added a few tests. I didn't add queries with all the
> patterns you mentioned above. I tested a few by hand and all of them
> worked as expected. Can you please check?
>

I tested all the patterns and they all work correctly. No crashes,
correct results.

One thing I noticed while reviewing the rewriter changes: the Assert
at generate_queries_for_path_pattern() that checks alternating
implicit/explicit elements doesn't actually work:

#ifdef USE_ASSERT_CHECKING
GraphElementPattern *prev_gep = NULL;
#endif
...
Assert(!prev_gep || prev_gep->implicit != gep->implicit);

prev_gep is never updated in the loop -- it stays NULL throughout,
so the Assert is always trivially true. It needs a
"prev_gep = gep;" at the end of the loop body to actually perform
the intended check.

> Yes. That's a grammar issue. gram.y doesn't support it. Peter, do you
> remember or know the reason why we don't support full edge left or
> right? In fact, I am wondering what's the difference between full edge
> left or right and full edge any direction?
>

I looked into this. The lexer tokenizes "]->` as "]" + RIGHT_ARROW,
so gram.y needs two alternatives -- just like the existing full edge
right rule already does. The full edge left or right was simply
missing both forms. Adding them fixes it:

| '<' '-' '[' ... ']' '-' '>'
| '<' '-' '[' ... ']' RIGHT_ARROW

Per the standard, <-[]-> matches left or right direction while -[]-
matches any direction. For simple directed graphs the results are
the same, so EDGE_PATTERN_ANY seems like a reasonable mapping.

Regards,
Henson

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tender Wang 2026-03-24 01:10:07 Re: Fix "could not find memoization table entry"
Previous Message Amit Langote 2026-03-24 00:59:33 Re: Batching in executor