agora inbox for pgsql-committers@postgresql.org  
help / color / mirror / Atom feed
pgsql: Revert SQL Property Graph Queries (SQL/PGQ)
2+ messages / 1 participants
[nested] [flat]

* pgsql: Revert SQL Property Graph Queries (SQL/PGQ)
@ 2026-09-07 19:33 Peter Eisentraut <peter@eisentraut.org>
  0 siblings, 0 replies; 2+ messages in thread

From: Peter Eisentraut @ 2026-09-07 19:33 UTC (permalink / raw)
  To: pgsql-committers@lists.postgresql.org

Revert SQL Property Graph Queries (SQL/PGQ)

List of commits reverted:

  2f094e7ac69  SQL Property Graph Queries (SQL/PGQ)
  cd8844e7db6  Make some tests more stable by adding more explicit ordering
  182cdf5aeaf  pg_dump: Add appropriate version check
  c9babbc8816  Dump labels in reproducible order
  040a56be4bc  Cleanup users and roles in graph_table_rls test
  5282bf535e4  Fix some typos and make small stylistic improvements
  720f0f89d69  Reject consecutive element patterns of same kind
  288ae968726  Add a graph pattern variable only once
  c5b3253b8ab  Property references are preferred over regular column references
  a0dd0702e46  Fix cross variable references in graph pattern causing segfault
  2ff289d0393  Check for stack overflow when rewriting graph queries
  9082680c34e  Fix typos and grammar in graph table rewrite code
  ac3bcc041c5  Fix collation of expressions in GRAPH_TABLE COLUMNS clause
  9d2979dd685  pg_get_viewdef() and lateral references in COLUMNS of GRAPH_TABLE
  891a57c7394  Do not define type for a property graph
  dc9e7c9ed93  Handle nodes that may appear in GraphPattern expression trees
  f6edd8ed708  Add ORDER BY to test query to stabilize test
  1190f858eaf  doc: Small synopsis wording change for consistency
  d0eac3cafb0  Make spelling consistent
  6827de95ee0  Simplify code in objectaddress.c for some property graph objects
  5778fb3eafd  Fix typo in error message
  72498a86989  Handle element label and label property objects in object address functions
  4cb2a9863d8  Fix LATERAL references in GRAPH_TABLE with multi-label pattern
  9d8cdcbe0c8  Record dependencies on graph labels and properties
  2a7e95b659d  Readable identity strings for property graph objects
  7afa11feca6  Prevent dropping the last label from a property graph element
  96418a6da9d  Fix handling of dropping a property not associated with the given label
  efd7d8d7d49  Resolve unknown-type literals in GRAPH_TABLE COLUMNS
  e0ff7fd9aa2  Make property graph object descriptions better translatable
  0e4f0827f63  Fix properties orphaned by dropping a label
  73dfe79fd60  Remove apparent support for SECURITY LABEL ON PROPERTY GRAPH
  592de8bd21e  Fix pg_dump ACL minimization for PROPERTY GRAPH.
  16a4b3ef8ee  Fix replace_property_refs() ignoring the root of expression tree
  57f93af36f0  Resolve unknown-type literals in property expressions
  2e6578292a9  Prohibit locking clauses on GRAPH_TABLE
  2521f9e75e9  doc: Fix SQL quoting in example
  0316593146d  Restore the ability to use | and -> as prefix operators.
  780fa49746d  Fix missing space before WHERE in GRAPH_TABLE deparse
  fa62d4f6ea7  Prohibit GRANT ... ON TABLE on a property graph
  63c3bbb39f9  doc: Add PROPERTY GRAPH to the access privilege tables
  0a51a06cdb0  More tab-completion for DROP PROPERTY GRAPH
  f585671055d  Disallow aggregates, window functions, and SRFs in GRAPH_TABLE COLUMNS
  9b917a93116  Report duplicate property and label names with a proper error
  a82e33a83d7  Make generate_queries_for_path_pattern_recurse() interruptible
  3c982c9bf1a  Add test for view referencing labels shared by vertex and edge tables
  8646d1d5904  Fix inferred property graph keys with INCLUDE columns
  0417bf52969  Fix pg_event_trigger_ddl_commands for GRANT ON PROPERTY GRAPH
  a20d3e35f2c  doc: reformat GRAPH_TABLE examples
  792094a5ce8  Coerce GRAPH_TABLE pattern WHERE clauses to boolean

plus typedefs.list changes.

Discussion: https://www.postgresql.org/message-id/CAAKRu_bEtjWYWhYxSo0o_t3DaZYRQd5PkC0abA0g9Mp4%2BovH0w%40mail.g...

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/b1f106c80cbeb18d3a0219994d98a51a6eca8ede

Modified Files
--------------
contrib/pg_overexplain/expected/pg_overexplain.out |   54 -
contrib/pg_overexplain/pg_overexplain.c            |   20 -
contrib/pg_overexplain/sql/pg_overexplain.sql      |   11 -
doc/src/sgml/catalogs.sgml                         |  520 +-----
doc/src/sgml/ddl.sgml                              |  251 ---
doc/src/sgml/features.sgml                         |    4 +-
doc/src/sgml/func/func-info.sgml                   |   15 -
doc/src/sgml/information_schema.sgml               | 1092 -----------
doc/src/sgml/keywords/sql2023-16-nonreserved.txt   |   27 -
doc/src/sgml/keywords/sql2023-16-reserved.txt      |   12 -
doc/src/sgml/queries.sgml                          |  167 --
doc/src/sgml/ref/allfiles.sgml                     |    3 -
doc/src/sgml/ref/alter_extension.sgml              |    3 +-
doc/src/sgml/ref/alter_property_graph.sgml         |  301 ---
doc/src/sgml/ref/comment.sgml                      |    1 -
doc/src/sgml/ref/create_property_graph.sgml        |  318 ----
doc/src/sgml/ref/drop_property_graph.sgml          |  111 --
doc/src/sgml/ref/grant.sgml                        |    7 +-
doc/src/sgml/ref/psql-ref.sgml                     |   13 +-
doc/src/sgml/ref/revoke.sgml                       |    7 -
doc/src/sgml/ref/select.sgml                       |   43 -
doc/src/sgml/reference.sgml                        |    3 -
src/backend/catalog/aclchk.c                       |   56 +-
src/backend/catalog/dependency.c                   |   30 -
src/backend/catalog/heap.c                         |    6 +-
src/backend/catalog/information_schema.sql         |  366 ----
src/backend/catalog/objectaddress.c                |  421 -----
src/backend/catalog/pg_class.c                     |    2 -
src/backend/catalog/sql_features.txt               |  100 -
src/backend/commands/Makefile                      |    1 -
src/backend/commands/alter.c                       |   28 +-
src/backend/commands/dropcmds.c                    |    1 -
src/backend/commands/event_trigger.c               |    3 -
src/backend/commands/meson.build                   |    1 -
src/backend/commands/propgraphcmds.c               | 1959 --------------------
src/backend/commands/seclabel.c                    |    1 -
src/backend/commands/tablecmds.c                   |   20 +-
src/backend/executor/execMain.c                    |   17 +-
src/backend/nodes/nodeFuncs.c                      |  102 -
src/backend/nodes/outfuncs.c                       |    9 -
src/backend/nodes/print.c                          |    4 -
src/backend/nodes/readfuncs.c                      |    9 -
src/backend/optimizer/path/allpaths.c              |   10 -
src/backend/optimizer/prep/prepjointree.c          |    8 -
src/backend/parser/Makefile                        |    1 -
src/backend/parser/analyze.c                       |   14 +-
src/backend/parser/gram.y                          |  721 +------
src/backend/parser/meson.build                     |    1 -
src/backend/parser/parse_agg.c                     |   11 -
src/backend/parser/parse_clause.c                  |  176 --
src/backend/parser/parse_collate.c                 |    1 -
src/backend/parser/parse_expr.c                    |   17 -
src/backend/parser/parse_func.c                    |    3 -
src/backend/parser/parse_graphtable.c              |  397 ----
src/backend/parser/parse_relation.c                |   99 +-
src/backend/parser/parse_target.c                  |    5 -
src/backend/parser/scan.l                          |   13 +-
src/backend/rewrite/Makefile                       |    1 -
src/backend/rewrite/meson.build                    |    1 -
src/backend/rewrite/rewriteGraphTable.c            | 1343 --------------
src/backend/rewrite/rewriteHandler.c               |   12 -
src/backend/tcop/utility.c                         |   34 -
src/backend/utils/adt/acl.c                        |    7 -
src/backend/utils/adt/ruleutils.c                  |  553 ------
src/backend/utils/cache/lsyscache.c                |   38 -
src/backend/utils/cache/plancache.c                |    6 +-
src/bin/pg_dump/common.c                           |    3 +-
src/bin/pg_dump/dumputils.c                        |    3 -
src/bin/pg_dump/pg_backup_archiver.c               |    1 -
src/bin/pg_dump/pg_dump.c                          |  121 +-
src/bin/pg_dump/t/002_pg_dump.pl                   |   28 -
src/bin/psql/command.c                             |    3 +-
src/bin/psql/describe.c                            |   96 +-
src/bin/psql/help.c                                |    5 +-
src/bin/psql/tab-complete.in.c                     |   65 +-
src/fe_utils/psqlscan.l                            |    8 +-
src/include/catalog/Makefile                       |    7 +-
src/include/catalog/catversion.h                   |    2 +-
src/include/catalog/meson.build                    |    5 -
src/include/catalog/pg_class.h                     |    1 -
src/include/catalog/pg_proc.dat                    |    3 -
src/include/catalog/pg_propgraph_element.h         |  118 --
src/include/catalog/pg_propgraph_element_label.h   |   55 -
src/include/catalog/pg_propgraph_label.h           |   55 -
src/include/catalog/pg_propgraph_label_property.h  |   63 -
src/include/catalog/pg_propgraph_property.h        |   64 -
src/include/commands/propgraphcmds.h               |   23 -
src/include/nodes/parsenodes.h                     |  139 --
src/include/nodes/primnodes.h                      |   24 -
src/include/parser/analyze.h                       |    3 -
src/include/parser/kwlist.h                        |    9 -
src/include/parser/parse_graphtable.h              |   24 -
src/include/parser/parse_node.h                    |   24 -
src/include/parser/parse_relation.h                |    8 -
src/include/rewrite/rewriteGraphTable.h            |   21 -
src/include/tcop/cmdtaglist.h                      |    3 -
src/include/utils/acl.h                            |    1 -
src/include/utils/lsyscache.h                      |    3 -
src/interfaces/ecpg/preproc/pgc.l                  |   12 +-
src/interfaces/ecpg/test/ecpg_schedule             |    1 -
src/interfaces/ecpg/test/expected/sql-sqlpgq.c     |  285 ---
.../ecpg/test/expected/sql-sqlpgq.stderr           |  190 --
.../ecpg/test/expected/sql-sqlpgq.stdout           |    7 -
src/interfaces/ecpg/test/sql/.gitignore            |    2 -
src/interfaces/ecpg/test/sql/Makefile              |    1 -
src/interfaces/ecpg/test/sql/meson.build           |    1 -
src/interfaces/ecpg/test/sql/sqlpgq.pgc            |  105 --
src/test/regress/expected/alter_generic.out        |   51 +-
.../regress/expected/create_property_graph.out     |  999 ----------
src/test/regress/expected/event_trigger.out        |   33 -
src/test/regress/expected/graph_table.out          | 1153 ------------
src/test/regress/expected/graph_table_rls.out      |  789 --------
src/test/regress/expected/object_address.out       |   33 +-
src/test/regress/expected/oidjoins.out             |   12 -
src/test/regress/expected/privileges.out           |   99 -
src/test/regress/parallel_schedule                 |    6 +-
src/test/regress/sql/alter_generic.sql             |   34 -
src/test/regress/sql/create_property_graph.sql     |  404 ----
src/test/regress/sql/event_trigger.sql             |   20 -
src/test/regress/sql/graph_table.sql               |  646 -------
src/test/regress/sql/graph_table_rls.sql           |  378 ----
src/test/regress/sql/object_address.sql            |   13 +-
src/test/regress/sql/privileges.sql                |   59 -
src/tools/pgindent/typedefs.list                   |   24 -
124 files changed, 77 insertions(+), 15859 deletions(-)



^ permalink  raw  reply  [nested|flat] 2+ messages in thread

* pgsql: Revert SQL Property Graph Queries (SQL/PGQ)
@ 2026-09-07 19:33 Peter Eisentraut <peter@eisentraut.org>
  0 siblings, 0 replies; 2+ messages in thread

From: Peter Eisentraut @ 2026-09-07 19:33 UTC (permalink / raw)
  To: pgsql-committers@lists.postgresql.org

Revert SQL Property Graph Queries (SQL/PGQ)

List of commits reverted:

  2f094e7ac69  SQL Property Graph Queries (SQL/PGQ)
  cd8844e7db6  Make some tests more stable by adding more explicit ordering
  182cdf5aeaf  pg_dump: Add appropriate version check
  c9babbc8816  Dump labels in reproducible order
  040a56be4bc  Cleanup users and roles in graph_table_rls test
  5282bf535e4  Fix some typos and make small stylistic improvements
  720f0f89d69  Reject consecutive element patterns of same kind
  288ae968726  Add a graph pattern variable only once
  c5b3253b8ab  Property references are preferred over regular column references
  a0dd0702e46  Fix cross variable references in graph pattern causing segfault
  2ff289d0393  Check for stack overflow when rewriting graph queries
  9082680c34e  Fix typos and grammar in graph table rewrite code
  ac3bcc041c5  Fix collation of expressions in GRAPH_TABLE COLUMNS clause
  9d2979dd685  pg_get_viewdef() and lateral references in COLUMNS of GRAPH_TABLE
  891a57c7394  Do not define type for a property graph
  dc9e7c9ed93  Handle nodes that may appear in GraphPattern expression trees
  f6edd8ed708  Add ORDER BY to test query to stabilize test
  1190f858eaf  doc: Small synopsis wording change for consistency
  d0eac3cafb0  Make spelling consistent
  6827de95ee0  Simplify code in objectaddress.c for some property graph objects
  5778fb3eafd  Fix typo in error message
  72498a86989  Handle element label and label property objects in object address functions
  4cb2a9863d8  Fix LATERAL references in GRAPH_TABLE with multi-label pattern
  9d8cdcbe0c8  Record dependencies on graph labels and properties
  2a7e95b659d  Readable identity strings for property graph objects
  ac0ad6a7c9d  Prevent dropping the last label from a property graph element
  36aae3d0297  Fix handling of dropping a property not associated with the given label
  cc9aa7f3a98  Resolve unknown-type literals in GRAPH_TABLE COLUMNS
  d8687368300  Make property graph object descriptions better translatable
  45d4c917ff4  Fix properties orphaned by dropping a label
  33bfad0f3ca  Remove apparent support for SECURITY LABEL ON PROPERTY GRAPH
  ccca2cd81b2  Fix pg_dump ACL minimization for PROPERTY GRAPH.
  7883ea13ffd  Fix replace_property_refs() ignoring the root of expression tree
  b820c623dd5  Resolve unknown-type literals in property expressions
  01c544e1afb  Prohibit locking clauses on GRAPH_TABLE
  8d2beee027a  Restore the ability to use | and -> as prefix operators.
  d2ac26eb9b1  Fix missing space before WHERE in GRAPH_TABLE deparse
  4054ec5b4f3  Prohibit GRANT ... ON TABLE on a property graph
  77964322d60  doc: Add PROPERTY GRAPH to the access privilege tables
  c5e11de2f37  More tab-completion for DROP PROPERTY GRAPH
  8ce749f8f65  Disallow aggregates, window functions, and SRFs in GRAPH_TABLE COLUMNS
  22d0eebfef7  Report duplicate property and label names with a proper error
  41a300ae3df  Make generate_queries_for_path_pattern_recurse() interruptible
  58af2138740  Fix inferred property graph keys with INCLUDE columns
  63f8e9773aa  Fix pg_event_trigger_ddl_commands for GRANT ON PROPERTY GRAPH
  07df2b25327  doc: reformat GRAPH_TABLE examples
  1c8c790ec10  Coerce GRAPH_TABLE pattern WHERE clauses to boolean

plus release notes entries and typedefs.list changes.

Discussion: https://www.postgresql.org/message-id/CAAKRu_bEtjWYWhYxSo0o_t3DaZYRQd5PkC0abA0g9Mp4%2BovH0w%40mail.g...

Branch
------
REL_19_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/2b9e1aff4d3d933ae8ee377fef22c2af9c7797e8

Modified Files
--------------
contrib/pg_overexplain/expected/pg_overexplain.out |   54 -
contrib/pg_overexplain/pg_overexplain.c            |   20 -
contrib/pg_overexplain/sql/pg_overexplain.sql      |   11 -
doc/src/sgml/catalogs.sgml                         |  520 +-----
doc/src/sgml/ddl.sgml                              |  251 ---
doc/src/sgml/features.sgml                         |    4 +-
doc/src/sgml/func/func-info.sgml                   |   15 -
doc/src/sgml/information_schema.sgml               | 1092 -----------
doc/src/sgml/keywords/sql2023-16-nonreserved.txt   |   27 -
doc/src/sgml/keywords/sql2023-16-reserved.txt      |   12 -
doc/src/sgml/queries.sgml                          |  167 --
doc/src/sgml/ref/allfiles.sgml                     |    3 -
doc/src/sgml/ref/alter_extension.sgml              |    3 +-
doc/src/sgml/ref/alter_property_graph.sgml         |  301 ---
doc/src/sgml/ref/comment.sgml                      |    1 -
doc/src/sgml/ref/create_property_graph.sgml        |  318 ----
doc/src/sgml/ref/drop_property_graph.sgml          |  111 --
doc/src/sgml/ref/grant.sgml                        |    7 +-
doc/src/sgml/ref/psql-ref.sgml                     |   13 +-
doc/src/sgml/ref/revoke.sgml                       |    7 -
doc/src/sgml/ref/select.sgml                       |   43 -
doc/src/sgml/reference.sgml                        |    3 -
doc/src/sgml/release-19.sgml                       |   30 -
src/backend/catalog/aclchk.c                       |   56 +-
src/backend/catalog/dependency.c                   |   30 -
src/backend/catalog/heap.c                         |    6 +-
src/backend/catalog/information_schema.sql         |  366 ----
src/backend/catalog/objectaddress.c                |  421 -----
src/backend/catalog/pg_class.c                     |    2 -
src/backend/catalog/sql_features.txt               |  100 -
src/backend/commands/Makefile                      |    1 -
src/backend/commands/alter.c                       |   28 +-
src/backend/commands/dropcmds.c                    |    1 -
src/backend/commands/event_trigger.c               |    3 -
src/backend/commands/meson.build                   |    1 -
src/backend/commands/propgraphcmds.c               | 1959 --------------------
src/backend/commands/seclabel.c                    |    1 -
src/backend/commands/tablecmds.c                   |   20 +-
src/backend/executor/execMain.c                    |   17 +-
src/backend/nodes/nodeFuncs.c                      |  102 -
src/backend/nodes/outfuncs.c                       |    9 -
src/backend/nodes/print.c                          |    4 -
src/backend/nodes/readfuncs.c                      |    9 -
src/backend/optimizer/path/allpaths.c              |   10 -
src/backend/optimizer/prep/prepjointree.c          |    8 -
src/backend/parser/Makefile                        |    1 -
src/backend/parser/analyze.c                       |   14 +-
src/backend/parser/gram.y                          |  721 +------
src/backend/parser/meson.build                     |    1 -
src/backend/parser/parse_agg.c                     |   11 -
src/backend/parser/parse_clause.c                  |  176 --
src/backend/parser/parse_collate.c                 |    1 -
src/backend/parser/parse_expr.c                    |   17 -
src/backend/parser/parse_func.c                    |    3 -
src/backend/parser/parse_graphtable.c              |  397 ----
src/backend/parser/parse_relation.c                |   99 +-
src/backend/parser/parse_target.c                  |    5 -
src/backend/parser/scan.l                          |   13 +-
src/backend/rewrite/Makefile                       |    1 -
src/backend/rewrite/meson.build                    |    1 -
src/backend/rewrite/rewriteGraphTable.c            | 1343 --------------
src/backend/rewrite/rewriteHandler.c               |   12 -
src/backend/tcop/utility.c                         |   34 -
src/backend/utils/adt/acl.c                        |    7 -
src/backend/utils/adt/ruleutils.c                  |  553 ------
src/backend/utils/cache/lsyscache.c                |   38 -
src/backend/utils/cache/plancache.c                |    6 +-
src/bin/pg_dump/common.c                           |    3 +-
src/bin/pg_dump/dumputils.c                        |    3 -
src/bin/pg_dump/pg_backup_archiver.c               |    1 -
src/bin/pg_dump/pg_dump.c                          |  121 +-
src/bin/pg_dump/t/002_pg_dump.pl                   |   28 -
src/bin/psql/command.c                             |    3 +-
src/bin/psql/describe.c                            |   96 +-
src/bin/psql/help.c                                |    5 +-
src/bin/psql/tab-complete.in.c                     |   65 +-
src/fe_utils/psqlscan.l                            |    8 +-
src/include/catalog/Makefile                       |    7 +-
src/include/catalog/catversion.h                   |    2 +-
src/include/catalog/meson.build                    |    5 -
src/include/catalog/pg_class.h                     |    1 -
src/include/catalog/pg_proc.dat                    |    3 -
src/include/catalog/pg_propgraph_element.h         |  118 --
src/include/catalog/pg_propgraph_element_label.h   |   55 -
src/include/catalog/pg_propgraph_label.h           |   55 -
src/include/catalog/pg_propgraph_label_property.h  |   63 -
src/include/catalog/pg_propgraph_property.h        |   64 -
src/include/commands/propgraphcmds.h               |   23 -
src/include/nodes/parsenodes.h                     |  139 --
src/include/nodes/primnodes.h                      |   24 -
src/include/parser/analyze.h                       |    3 -
src/include/parser/kwlist.h                        |    9 -
src/include/parser/parse_graphtable.h              |   24 -
src/include/parser/parse_node.h                    |   24 -
src/include/parser/parse_relation.h                |    8 -
src/include/rewrite/rewriteGraphTable.h            |   21 -
src/include/tcop/cmdtaglist.h                      |    3 -
src/include/utils/acl.h                            |    1 -
src/include/utils/lsyscache.h                      |    3 -
src/interfaces/ecpg/preproc/pgc.l                  |   12 +-
src/interfaces/ecpg/test/ecpg_schedule             |    1 -
src/interfaces/ecpg/test/expected/sql-sqlpgq.c     |  285 ---
.../ecpg/test/expected/sql-sqlpgq.stderr           |  190 --
.../ecpg/test/expected/sql-sqlpgq.stdout           |    7 -
src/interfaces/ecpg/test/sql/.gitignore            |    2 -
src/interfaces/ecpg/test/sql/Makefile              |    1 -
src/interfaces/ecpg/test/sql/meson.build           |    1 -
src/interfaces/ecpg/test/sql/sqlpgq.pgc            |  105 --
src/test/regress/expected/alter_generic.out        |   51 +-
.../regress/expected/create_property_graph.out     |  999 ----------
src/test/regress/expected/event_trigger.out        |   33 -
src/test/regress/expected/graph_table.out          | 1134 -----------
src/test/regress/expected/graph_table_rls.out      |  789 --------
src/test/regress/expected/object_address.out       |   33 +-
src/test/regress/expected/oidjoins.out             |   12 -
src/test/regress/expected/privileges.out           |   99 -
src/test/regress/parallel_schedule                 |    6 +-
src/test/regress/sql/alter_generic.sql             |   34 -
src/test/regress/sql/create_property_graph.sql     |  404 ----
src/test/regress/sql/event_trigger.sql             |   20 -
src/test/regress/sql/graph_table.sql               |  633 -------
src/test/regress/sql/graph_table_rls.sql           |  378 ----
src/test/regress/sql/object_address.sql            |   13 +-
src/test/regress/sql/privileges.sql                |   59 -
src/tools/pgindent/typedefs.list                   |   24 -
125 files changed, 77 insertions(+), 15857 deletions(-)



^ permalink  raw  reply  [nested|flat] 2+ messages in thread


end of thread, other threads:[~2026-09-07 19:33 UTC | newest]

Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2026-09-07 19:33 pgsql: Revert SQL Property Graph Queries (SQL/PGQ) Peter Eisentraut <peter@eisentraut.org>
2026-09-07 19:33 pgsql: Revert SQL Property Graph Queries (SQL/PGQ) Peter Eisentraut <peter@eisentraut.org>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox