Re: GRAPH_TABLE pattern WHERE clause is not coerced to boolean

From: Ewan Young <kdbase(dot)hack(at)gmail(dot)com>
To: Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Peter Eisentraut <peter(at)eisentraut(dot)org>, Ashutosh Bapat <ashutosh(dot)bapat(dot)oss(at)gmail(dot)com>
Subject: Re: GRAPH_TABLE pattern WHERE clause is not coerced to boolean
Date: 2026-09-01 02:34:38
Message-ID: CAON2xHP-59HB9AsOFN-R5vdnbHBkoOVWafudPzCGLic9S5BEKw@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Thanks for adding it!

On Mon, Aug 31, 2026 at 7:27 PM Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> wrote:
>
>
>
> > On Aug 31, 2026, at 18:08, Ewan Young <kdbase(dot)hack(at)gmail(dot)com> wrote:
> >
> > Thanks for the review!
> >
> > On Mon, Aug 31, 2026 at 4:38 PM Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> wrote:
> >>
> >>
> >>
> >>> On Aug 31, 2026, at 15:32, Ewan Young <kdbase(dot)hack(at)gmail(dot)com> wrote:
> >>>
> >>> Hi
> >>>
> >>> The WHERE clauses inside a GRAPH_TABLE pattern -- both the element-level
> >>> one (MATCH (c IS customers WHERE ...)) and the graph-pattern-level one
> >>> (MATCH ... WHERE ...) -- are transformed with a bare transformExpr()
> >>> and never go through coerce_to_boolean(). So a WHERE clause of any
> >>> type is accepted, and its raw datum is used as the qual:
> >>>
> >>> create table customers (id int primary key, name text);
> >>> insert into customers values (1,'alice'),(2,null),(3,'carol');
> >>> create property graph g
> >>> vertex tables (customers key (id) label customer properties (id, name));
> >>>
> >>> select * from graph_table (g match (c is customer where c.name)
> >>> columns (c.id));
> >>> id
> >>> ----
> >>> 1
> >>> 3
> >>> (2 rows)
> >>>
> >>> EXPLAIN shows "Filter: name". The never-null text pointer is always
> >>> taken as true, so the condition silently degenerates to roughly
> >>> "name IS NOT NULL": the NULL-name row disappears with no error.
> >>> Numeric quals are evaluated by bit pattern ("WHERE 1" is true,
> >>> "WHERE 0" is false), and even "WHERE row(1,2)" is accepted. The same
> >>> clause outside GRAPH_TABLE gives the usual
> >>>
> >>> ERROR: argument of WHERE must be type boolean, not type text
> >>>
> >>> The attached patch routes both sites through transformWhereClause(),
> >>> like every other WHERE clause, and adds regression tests for the
> >>> element-level and pattern-level cases. make check passes. The code is
> >>> the same in REL_19_STABLE, so v19 is affected as well.
> >>>
> >>> --
> >>> Regards,
> >>> Ewan Young
> >>> <v1-0001-Coerce-GRAPH_TABLE-pattern-WHERE-clauses-to-boolean.patch>
> >>
> >> The patch looks good to me. As this is a v19 bug, it might be worth noting in the Open Items list.
> >
> > Agreed -- I don't have wiki edit access though; could someone add it
> > under "Open Issues"?
> >
>
> I just helped add the item.
>
> Best regards,
> --
> Chao Li (Evan)
> HighGo Software Co., Ltd.
> https://www.highgo.com/
>
>
>
>

--
Regards,
Ewan Young

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Fujii Masao 2026-09-01 02:48:59 Re: Failing assertion while taking a restartpoint during crash recovery
Previous Message Scott Ray 2026-09-01 02:24:27 Re: pg_xmin_horizon: a system view of everything pinning the xmin horizon