SQL Property Graph Queries (SQL/PGQ)

Peter Eisentraut <peter@eisentraut.org>

Commit: 2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c
Author: Peter Eisentraut <peter@eisentraut.org>
Date: 2026-03-16T09:14:18Z
SQL Property Graph Queries (SQL/PGQ)

Implementation of SQL property graph queries, according to SQL/PGQ
standard (ISO/IEC 9075-16:2023).

This adds:

- GRAPH_TABLE table function for graph pattern matching
- DDL commands CREATE/ALTER/DROP PROPERTY GRAPH
- several new system catalogs and information schema views
- psql \dG command
- pg_get_propgraphdef() function for pg_dump and psql

A property graph is a relation with a new relkind RELKIND_PROPGRAPH.
It acts like a view in many ways.  It is rewritten to a standard
relational query in the rewriter.  Access privileges act similar to a
security invoker view.  (The security definer variant is not currently
implemented.)

Starting documentation can be found in doc/src/sgml/ddl.sgml and
doc/src/sgml/queries.sgml.

Author: Peter Eisentraut <peter@eisentraut.org>
Author: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Reviewed-by: Junwang Zhao <zhjwpku@gmail.com>
Reviewed-by: Ajay Pal <ajay.pal.k@gmail.com>
Reviewed-by: Henson Choi <assam258@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/a855795d-e697-4fa5-8698-d20122126567@eisentraut.org

Files

PathChange+/−
contrib/pg_overexplain/expected/pg_overexplain.out modified +54 −0
contrib/pg_overexplain/pg_overexplain.c modified +20 −0
contrib/pg_overexplain/sql/pg_overexplain.sql modified +11 −0
doc/src/sgml/catalogs.sgml modified +519 −1
doc/src/sgml/ddl.sgml modified +238 −0
doc/src/sgml/features.sgml modified +2 −2
doc/src/sgml/func/func-info.sgml modified +15 −0
doc/src/sgml/information_schema.sgml modified +1092 −0
doc/src/sgml/keywords/sql2023-16-nonreserved.txt added +27 −0
doc/src/sgml/keywords/sql2023-16-reserved.txt added +12 −0
doc/src/sgml/queries.sgml modified +162 −0
doc/src/sgml/ref/allfiles.sgml modified +3 −0
doc/src/sgml/ref/alter_extension.sgml modified +2 −1
doc/src/sgml/ref/alter_property_graph.sgml added +299 −0
doc/src/sgml/ref/comment.sgml modified +1 −0
doc/src/sgml/ref/create_property_graph.sgml added +318 −0
doc/src/sgml/ref/drop_property_graph.sgml added +111 −0
doc/src/sgml/reference.sgml modified +3 −0
doc/src/sgml/ref/grant.sgml modified +6 −1
doc/src/sgml/ref/psql-ref.sgml modified +7 −6
doc/src/sgml/ref/revoke.sgml modified +7 −0
doc/src/sgml/ref/security_label.sgml modified +1 −0
doc/src/sgml/ref/select.sgml modified +43 −0
src/backend/catalog/aclchk.c modified +36 −0
src/backend/catalog/dependency.c modified +11 −0
src/backend/catalog/information_schema.sql modified +366 −0
src/backend/catalog/objectaddress.c modified +335 −0
src/backend/catalog/pg_class.c modified +2 −0
src/backend/catalog/sql_features.txt modified +100 −0
src/backend/commands/alter.c modified +23 −5
src/backend/commands/dropcmds.c modified +1 −0
src/backend/commands/event_trigger.c modified +2 −0
src/backend/commands/Makefile modified +1 −0
src/backend/commands/meson.build modified +1 −0
src/backend/commands/propgraphcmds.c added +1882 −0
src/backend/commands/seclabel.c modified +1 −0
src/backend/commands/tablecmds.c modified +18 −2
src/backend/executor/execMain.c modified +15 −2
src/backend/nodes/nodeFuncs.c modified +71 −0
src/backend/nodes/outfuncs.c modified +9 −0
src/backend/nodes/print.c modified +4 −0
src/backend/nodes/readfuncs.c modified +9 −0
src/backend/optimizer/path/allpaths.c modified +10 −0
src/backend/optimizer/prep/prepjointree.c modified +8 −0
src/backend/parser/analyze.c modified +1 −4
src/backend/parser/gram.y modified +703 −10
src/backend/parser/Makefile modified +1 −0
src/backend/parser/meson.build modified +1 −0
src/backend/parser/parse_agg.c modified +11 −0
src/backend/parser/parse_clause.c modified +136 −0
src/backend/parser/parse_collate.c modified +1 −0
src/backend/parser/parse_expr.c modified +11 −0
src/backend/parser/parse_func.c modified +3 −0
src/backend/parser/parse_graphtable.c added +309 −0
src/backend/parser/parse_relation.c modified +97 −2
src/backend/parser/parse_target.c modified +5 −0
src/backend/parser/scan.l modified +11 −2
src/backend/rewrite/Makefile modified +1 −0
src/backend/rewrite/meson.build modified +1 −0
src/backend/rewrite/rewriteGraphTable.c added +1318 −0
src/backend/rewrite/rewriteHandler.c modified +12 −0
src/backend/tcop/utility.c modified +34 −0
src/backend/utils/adt/acl.c modified +4 −0
src/backend/utils/adt/ruleutils.c modified +531 −0
src/backend/utils/cache/lsyscache.c modified +38 −0
src/backend/utils/cache/plancache.c modified +5 −1
src/bin/pg_dump/common.c modified +2 −1
src/bin/pg_dump/dumputils.c modified +3 −0
src/bin/pg_dump/pg_backup_archiver.c modified +1 −0
src/bin/pg_dump/pg_dump.c modified +74 −9
src/bin/pg_dump/t/002_pg_dump.pl modified +28 −0
src/bin/psql/command.c modified +2 −1
src/bin/psql/describe.c modified +91 −3
src/bin/psql/help.c modified +3 −2
src/bin/psql/tab-complete.in.c modified +65 −2
src/fe_utils/psqlscan.l modified +7 −1
src/include/catalog/catversion.h modified +1 −1
src/include/catalog/Makefile modified +6 −1
src/include/catalog/meson.build modified +5 −0
src/include/catalog/pg_class.h modified +1 −0
src/include/catalog/pg_proc.dat modified +3 −0
src/include/catalog/pg_propgraph_element.h added +118 −0
src/include/catalog/pg_propgraph_element_label.h added +55 −0
src/include/catalog/pg_propgraph_label.h added +55 −0
src/include/catalog/pg_propgraph_label_property.h added +63 −0
src/include/catalog/pg_propgraph_property.h added +64 −0
src/include/commands/propgraphcmds.h added +23 −0
src/include/nodes/parsenodes.h modified +139 −0
src/include/nodes/primnodes.h modified +24 −0
src/include/parser/analyze.h modified +3 −0
src/include/parser/kwlist.h modified +9 −0
src/include/parser/parse_graphtable.h added +24 −0
src/include/parser/parse_node.h modified +21 −0
src/include/parser/parse_relation.h modified +8 −0
src/include/rewrite/rewriteGraphTable.h added +21 −0
src/include/tcop/cmdtaglist.h modified +3 −0
src/include/utils/acl.h modified +1 −0
src/include/utils/lsyscache.h modified +3 −0
src/interfaces/ecpg/preproc/pgc.l modified +10 −2
src/interfaces/ecpg/test/ecpg_schedule modified +1 −0
src/interfaces/ecpg/test/expected/sql-sqlpgq.c added +285 −0
src/interfaces/ecpg/test/expected/sql-sqlpgq.stderr added +190 −0
src/interfaces/ecpg/test/expected/sql-sqlpgq.stdout added +7 −0
src/interfaces/ecpg/test/sql/.gitignore modified +2 −0
src/interfaces/ecpg/test/sql/Makefile modified +1 −0
src/interfaces/ecpg/test/sql/meson.build modified +1 −0
src/interfaces/ecpg/test/sql/sqlpgq.pgc added +105 −0
src/test/regress/expected/alter_generic.out modified +49 −2
src/test/regress/expected/create_property_graph.out added +926 −0
src/test/regress/expected/graph_table.out added +976 −0
src/test/regress/expected/graph_table_rls.out added +774 −0
src/test/regress/expected/object_address.out modified +23 −3
src/test/regress/expected/oidjoins.out modified +12 −0
src/test/regress/expected/privileges.out modified +91 −0
src/test/regress/parallel_schedule modified +3 −3
src/test/regress/sql/alter_generic.sql modified +34 −0
src/test/regress/sql/create_property_graph.sql added +365 −0
src/test/regress/sql/graph_table_rls.sql added +363 −0
src/test/regress/sql/graph_table.sql added +567 −0
src/test/regress/sql/object_address.sql modified +8 −2
src/test/regress/sql/privileges.sql modified +58 −0
src/tools/pgindent/typedefs.list modified +19 −0

Discussion