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

Attachment: v1-0001-Coerce-GRAPH_TABLE-pattern-WHERE-clauses-to-boolean.patch
Description: Binary data

Reply via email to