]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Resolve unknown-type literals in GRAPH_TABLE COLUMNS
authorPeter Eisentraut <peter@eisentraut.org>
Fri, 3 Jul 2026 14:58:31 +0000 (16:58 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Fri, 3 Jul 2026 15:10:42 +0000 (17:10 +0200)
The unknown-type literals in the COLUMNS clause of a GRAPH_TABLE are
now resolved to the appropriate types.  Without that, this could cause
various failures.

Author: Satya Narlapuram <satyanarlapuram@gmail.com>
Author: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Reviewed-by: Junwang Zhao <zhjwpku@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/CAHg%2BQDcyKNWyzDoKMxiZNjv7C-wAxs8y0ZoNkOV137Y%2Bnk3UXg%40mail.gmail.com

src/backend/parser/parse_clause.c
src/test/regress/expected/graph_table.out
src/test/regress/sql/graph_table.sql

index 5fe5257b019e8ef234ede30858937ada8ba7178d..881fba2e7b5bcb4b57bd61050b8bc2682c67f038 100644 (file)
@@ -1005,6 +1005,10 @@ transformRangeGraphTable(ParseState *pstate, RangeGraphTable *rgt)
                columns = lappend(columns, te);
        }
 
+       /* resolve any still-unresolved output columns as being type text */
+       if (pstate->p_resolve_unknowns)
+               resolveTargetListUnknowns(pstate, columns);
+
        /*
         * Assign collations to column expressions now since
         * assign_query_collations() does not process rangetable entries.
index 70d986e8ab0d59c250fffbc8649eb898fa4fe93f..bd603ea0d77df719768d8e61f2a6f378af1d75d5 100644 (file)
@@ -160,6 +160,15 @@ SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers) COLUMNS (c.name));
  customer3
 (3 rows)
 
+-- unknown type resolution
+SELECT *, pg_typeof(unknown_col) AS unknown_col_type, pg_typeof(null_col) AS null_col_type FROM GRAPH_TABLE (myshop MATCH (c IS customers) COLUMNS (c.name, 'unknown-literal' AS unknown_col, NULL AS null_col));
+   name    |   unknown_col   | null_col | unknown_col_type | null_col_type 
+-----------+-----------------+----------+------------------+---------------
+ customer1 | unknown-literal |          | text             | text
+ customer2 | unknown-literal |          | text             | text
+ customer3 | unknown-literal |          | text             | text
+(3 rows)
+
 SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US')-[IS customer_orders]->(o IS orders) COLUMNS (c.name));
    name    
 -----------
index 0b44f70d7e7af8ba81b96bc9c1d2b60fc6e63ecc..5c8049ed242a14dd5b0942d07f84a11dc0acd6af 100644 (file)
@@ -134,6 +134,8 @@ INSERT INTO wishlist_items (wishlist_items_id, wishlist_id, product_no) VALUES
 
 -- single element path pattern
 SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers) COLUMNS (c.name));
+-- unknown type resolution
+SELECT *, pg_typeof(unknown_col) AS unknown_col_type, pg_typeof(null_col) AS null_col_type FROM GRAPH_TABLE (myshop MATCH (c IS customers) COLUMNS (c.name, 'unknown-literal' AS unknown_col, NULL AS null_col));
 SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US')-[IS customer_orders]->(o IS orders) COLUMNS (c.name));
 -- graph element specification without label or variable
 SELECT * FROM GRAPH_TABLE (myshop MATCH (c IS customers WHERE c.address = 'US')-[]->(o IS orders) COLUMNS (c.name AS customer_name));