diff --git a/Makefile b/Makefile index 2d2912571..394951ca0 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ MODULE_big = age -age_sql = age--1.6.0.sql +age_sql = age--1.7.0.sql OBJS = src/backend/age.o \ src/backend/catalog/ag_catalog.o \ diff --git a/README.md b/README.md index 9f99f6ddb..dad7f1032 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,11 @@   - +   - - + +   @@ -125,7 +125,7 @@ Apache AGE is intended to be simple to install and run. It can be installed with  Install PostgreSQL -You will need to install an AGE compatible version of Postgres, for now AGE supports Postgres 11, 12, 13, 14, 15, 16 & 17. Supporting the latest versions is on AGE roadmap. +You will need to install an AGE compatible version of Postgres, for now AGE supports Postgres 11, 12, 13, 14, 15, 16, 17 & 18. Supporting the latest versions is on AGE roadmap.

 Installation via Package Manager @@ -143,7 +143,7 @@ sudo apt install postgresql  Installation From Source Code

-You can
download the Postgres source code and install your own instance of Postgres. You can read instructions on how to install from source code for different versions on the official Postgres Website. +You can download the Postgres source code and install your own instance of Postgres. You can read instructions on how to install from source code for different versions on the official Postgres Website. @@ -152,7 +152,7 @@ You can download the Postgres Clone the github repository or download the download an official release. -Run the pg_config utility and check the version of PostgreSQL. Currently, only PostgreSQL versions 11, 12, 13, 14, 15, 16 & 17 are supported. If you have any other version of Postgres, you will need to install PostgreSQL version 11, 12, 13, 14, 15, 16 & 17. +Run the pg_config utility and check the version of PostgreSQL. Currently, only PostgreSQL versions 11, 12, 13, 14, 15, 16, 17 & 18 are supported. If you have any other version of Postgres, you will need to install PostgreSQL version 11, 12, 13, 14, 15, 16, 17 & 18.
```bash diff --git a/RELEASE b/RELEASE index 4525eab2f..4e8b09032 100644 --- a/RELEASE +++ b/RELEASE @@ -15,91 +15,41 @@ # specific language governing permissions and limitations # under the License. -Release Notes for Apache AGE release 1.6.0 for master branch (currently PG17) +Release Notes for Apache AGE release 1.7.0 for PG18 branch -Apache AGE 1.6.0 - Release Notes +Apache AGE 1.7.0 - Release Notes - Fix issue 2205: left doesn't catch overflow (#2207) - Fix issue 2201: unexpected empty string behavior (#2203) - Add support for operators in cypher query (#2172) - Reimplement list comprehension (#2169) - Update labeler.yml (#2186) - Fix issue with the CI build and labeler (#2183) - Fix CSV import for edge with one property (#2175) - Remove stale bot and update .asf.yaml settings (#2171) - Prevent object access hook from accesing not installed namespace (#2161) - Fix CI build errors caused by missing dependencies (#2163) - Add support for external extensions (#2088) - Fix issue 2093: pfree() called with a NULL pointer (#2095) - Fix issue 1955 - List comprehension in WHERE clause (#2094) - Add support for fuzzystrmatch and other external extensions (#2083) - Fix memory leaks in functions part 1 (#2066) - Issue 1996 - Add agtype to json typecast (#2075) - Fix issue 2046: Memory leak during btree(agtype) (#2060) - Refactor Dockerfile to use multi-stage builds (#2004) - Revamp age csv loader (#2044) - Fix issue 2020: Memory leak (#2028) - Fix Issue 1907: SET on MERGE not storing edge properties (#2019) - Add EmitWarningsOnPlaceholders("age") (#1997) - Fix Issue 1988: How to update a property which is a keyword (#2005) - Fix obsolete docker-compose command in CIs (#2007) - Fix issue 1986: Failure creating label name close to MAX_LABEL_NAME_LEN (#1989) - Fix issue 1953 - PG Boolean used as AGTYPE object (#1959) - Add graph_exists function (#1958) - Fix issue 1956 - null key name passed. (#1957) - docs: add link to .NET open-source driver (#1938) - Add the `load_from_plugins` parameter in the Python driver to load AGE from the $libdir/plugins directory (#1935) - Fix issue 1910: Server crashes when using exists(vle path) (#1924) - Converted single line comments to multiline (#1908) - Add function is_valid_label_name (#1911) (#1912) - Fixes small typos in the python driver's README.md file (#1909) - Fix agtype_build_map to allow more than 50 pairs (#1901) - Agtype hash cmp (#1893) - Order some regression tests for stability on big-endian (#1892) - Update github stale action (#1891) - Make CALL YIELD grammar more precise (#1852) - Fix issue 1878 - Regression test failure with delete global graphs (#1881) - Corrected typos and grammatical errors in apache-age-basic.ipynb (#879) - Add workflow for stale issues and PRs (#1872) - Implement Returnless Unions in Subqueries (#1803) - [CI] Update docker image tags (#1865) - Add branch protection rules in .asf.yaml (#1854) - [CI] Update labeler github action (#1851) - Fix error using list comprehension with WITH * (#1838) - python driver psycopg3 (#1793) - Minor VLE and agtype_eq/ne performance updates (#1808) - Fix issue 1767: CREATE TABLE AS SELECT * FROM cypher, errors (#1799) - Implement Constraints on Subqueries (#1751) - Fix connection string in Python Driver (#1757) - Added integer conversion in toBoolean functions (#1199) - Update README.md (#1756) - Add the command graph_stats and improve VLE messaging for load (#1750) - Add helpful messages to the VLE subsystem (#1742) - Update README.md (#1728) - Added Networkx Support in python driver (#1716) - Remove duplicate check (#1740) - Fix Issue 1709 - MERGE creates incomplete vertices after the first one (#1721) - Fix shift/reduce conflict in grammar (#1719) - Fix Issue 1691 - MERGE incorrectly creates multiple vertices (#1718) - Implement map projection (#1710) - Add hooks for multi-arch builds on dockerhub (#1683) - Sample code for AGE-JDBC driver (#390) - Allow agtype_build_map to use AGTYPE keys (#1666) - Implement EXISTS Subquery (#1562) - Fix Issue 1634: Setting all properties with map object causes error (#1637) - Fix Issue 1630: MERGE using array not working in some cases (#1636) - Implement list comprehension (#1610) - Update Go installation and add in parser files (#1582) - Add optional parameter '=' in property constraints (#1516) - Fix unsorted output of some queries in the cypher_match test (#1507) - Update age_load to make property value conversion optional (#1525) - Update the Go driver documentation, Linux installer, and CI (#1527) - Fix json serialization error in Python Driver (#1228) - Add template for upgrading between versions of Apache AGE (#1506) - Update age_load to load scalar property values with appropriate type (#1519) - Fix apache#1513 - Invalid variable reuse in CREATE and MERGE clause (#1515) - Clean up #included files in src/include directories (#1518) - Bump gopkg.in/yaml.v3 in /drivers/golang (#1202) - Clean up #included files in catalog & commands directories (#1514) - Clean up #included files in nodes, executor, & optimizer directories (#1509) - Correct cleanup of age--x.x.x.sql files (#1505) +NOTE: There isn't an upgrade path for PostgreSQL PG18 1.7.0 as + there isn't a prior version. + +Advance PG18 branch to Apache AGE version 1.7.0 +Add RLS support and fix permission checks (#2309) +Replace libcsv with pg COPY for csv loading (#2310) +Fix Issue 1884: Ambiguous column reference (#2306) +Upgrade Jest to v29 for node: protocol compatibility (#2307) +Optimize vertex/edge field access with direct array indexing (#2302) +feat: Add 32-bit platform support for graphid type (#2286) +Fix and improve index.sql addendum (#2301) +Fix and improve index.sql regression test coverage (#2300) +Fix Issue 2289: handle empty list in IN expression (#2294) +Revise README for Python driver updates (#2298) +Makefile: fix race condition on cypher_gram_def.h (#2273) +Restrict age_load commands (#2274) +Migrate python driver configuration to pyproject.toml (#2272) +Convert string to raw string to remove invalid escape sequence warning (#2267) +Update grammar file for maintainability (#2270) +Fix ORDER BY alias resolution with AS in Cypher queries (#2269) +Fix possible memory and file descriptors leaks (#2258) +Adjust 'could not find rte for' ERROR message (#2266) +Fix Issue 2256: segmentation fault when calling coalesce function (#2259) +Add index on id columns (#2117) +Fix issue 2245 - Creating more than 41 vlabels causes crash in drop_graph (#2248) +Fix DockerHub build warning messages (#2252) +Update CI for BaseDockerizedTest (#2254) +PG18 port for AGE (#2251) +Updated CI, Labeler, Docker, and branch security files for PG18 (#2246) +Fix issue 2243 - Regression in string concatenation (#2244) +Add fast functions for checking edge uniqueness (#2227) +Bump gopkg.in/yaml.v3 from 3.0.0 to 3.0.1 in /drivers/golang (#2212) +Update branch security (#2219) +Fix issue with CALL/YIELD for user defined and qualified functions. (#2217) diff --git a/age--1.5.0--1.6.0.sql b/age--1.5.0--1.6.0.sql deleted file mode 100644 index ede715c11..000000000 --- a/age--1.5.0--1.6.0.sql +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - ---* This is a TEMPLATE for upgrading from the previous version of Apache AGE ---* Please adjust the below ALTER EXTENSION to reflect the -- correct version it ---* is upgrading to. - --- This will only work within a major version of PostgreSQL, not across --- major versions. - ---* Please add all additions, deletions, and modifications to the end of this ---* file. We need to keep the order of these changes. ---* REMOVE ALL LINES ABOVE, and this one, that start with --* - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "ALTER EXTENSION age UPDATE TO '1.6.0'" to load this file. \quit - -CREATE FUNCTION ag_catalog.agtype_contains_top_level(agtype, agtype) - RETURNS boolean - LANGUAGE c - IMMUTABLE -RETURNS NULL ON NULL INPUT -PARALLEL SAFE -AS 'MODULE_PATHNAME'; - -CREATE OPERATOR @>> ( - LEFTARG = agtype, - RIGHTARG = agtype, - FUNCTION = ag_catalog.agtype_contains_top_level, - COMMUTATOR = '<<@', - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -CREATE FUNCTION ag_catalog.agtype_contained_by_top_level(agtype, agtype) - RETURNS boolean - LANGUAGE c - IMMUTABLE -RETURNS NULL ON NULL INPUT -PARALLEL SAFE -AS 'MODULE_PATHNAME'; - -CREATE OPERATOR <<@ ( - LEFTARG = agtype, - RIGHTARG = agtype, - FUNCTION = ag_catalog.agtype_contained_by_top_level, - COMMUTATOR = '@>>', - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -/* - * We have to drop and recreate the operators, because - * commutator is not modifiable using ALTER OPERATOR. - */ -ALTER EXTENSION age - DROP OPERATOR ? (agtype, agtype); -ALTER EXTENSION age - DROP OPERATOR ? (agtype, text); -ALTER EXTENSION age - DROP OPERATOR ?| (agtype, agtype); -ALTER EXTENSION age - DROP OPERATOR ?| (agtype, text[]); -ALTER EXTENSION age - DROP OPERATOR ?& (agtype, agtype); -ALTER EXTENSION age - DROP OPERATOR ?& (agtype, text[]); -ALTER EXTENSION age - DROP OPERATOR @> (agtype, agtype); -ALTER EXTENSION age - DROP OPERATOR <@ (agtype, agtype); - -DROP OPERATOR ? (agtype, agtype), ? (agtype, text), - ?| (agtype, agtype), ?| (agtype, text[]), - ?& (agtype, agtype), ?& (agtype, text[]), - @> (agtype, agtype), <@ (agtype, agtype); - -CREATE OPERATOR ? ( - LEFTARG = agtype, - RIGHTARG = agtype, - FUNCTION = ag_catalog.agtype_exists_agtype, - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -CREATE OPERATOR ? ( - LEFTARG = agtype, - RIGHTARG = text, - FUNCTION = ag_catalog.agtype_exists, - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -CREATE OPERATOR ?| ( - LEFTARG = agtype, - RIGHTARG = agtype, - FUNCTION = ag_catalog.agtype_exists_any_agtype, - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -CREATE OPERATOR ?| ( - LEFTARG = agtype, - RIGHTARG = text[], - FUNCTION = ag_catalog.agtype_exists_any, - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -CREATE OPERATOR ?& ( - LEFTARG = agtype, - RIGHTARG = agtype, - FUNCTION = ag_catalog.agtype_exists_all_agtype, - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -CREATE OPERATOR ?& ( - LEFTARG = agtype, - RIGHTARG = text[], - FUNCTION = ag_catalog.agtype_exists_all, - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -CREATE OPERATOR @> ( - LEFTARG = agtype, - RIGHTARG = agtype, - FUNCTION = ag_catalog.agtype_contains, - COMMUTATOR = '<@', - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -CREATE OPERATOR <@ ( - LEFTARG = agtype, - RIGHTARG = agtype, - FUNCTION = ag_catalog.agtype_contained_by, - COMMUTATOR = '@>', - RESTRICT = matchingsel, - JOIN = matchingjoinsel -); - -/* - * Since there is no option to add or drop operator from class, - * we have to drop and recreate the whole operator class. - * Reference: https://www.postgresql.org/docs/current/sql-alteropclass.html - */ - -ALTER EXTENSION age - DROP OPERATOR CLASS ag_catalog.gin_agtype_ops USING gin; - -DROP OPERATOR CLASS ag_catalog.gin_agtype_ops USING gin; -DROP OPERATOR FAMILY ag_catalog.gin_agtype_ops USING gin; - -CREATE OPERATOR CLASS ag_catalog.gin_agtype_ops -DEFAULT FOR TYPE agtype USING gin AS - OPERATOR 7 @>(agtype, agtype), - OPERATOR 8 <@(agtype, agtype), - OPERATOR 9 ?(agtype, agtype), - OPERATOR 10 ?|(agtype, agtype), - OPERATOR 11 ?&(agtype, agtype), - OPERATOR 12 @>>(agtype, agtype), - OPERATOR 13 <<@(agtype, agtype), - FUNCTION 1 ag_catalog.gin_compare_agtype(text,text), - FUNCTION 2 ag_catalog.gin_extract_agtype(agtype, internal), - FUNCTION 3 ag_catalog.gin_extract_agtype_query(agtype, internal, int2, - internal, internal), - FUNCTION 4 ag_catalog.gin_consistent_agtype(internal, int2, agtype, int4, - internal, internal), - FUNCTION 6 ag_catalog.gin_triconsistent_agtype(internal, int2, agtype, int4, - internal, internal, internal), -STORAGE text; - --- this function went from variadic "any" to just "any" type -CREATE OR REPLACE FUNCTION ag_catalog.age_tostring("any") - RETURNS agtype - LANGUAGE c - IMMUTABLE -RETURNS NULL ON NULL INPUT -PARALLEL SAFE -AS 'MODULE_PATHNAME'; - --- this is a new function for graph statistics -CREATE FUNCTION ag_catalog.age_graph_stats(agtype) - RETURNS agtype - LANGUAGE c - STABLE -PARALLEL SAFE -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION ag_catalog.graph_exists(graph_name name) - RETURNS agtype - LANGUAGE c - AS 'MODULE_PATHNAME', 'age_graph_exists'; - -CREATE FUNCTION ag_catalog.age_is_valid_label_name(agtype) - RETURNS boolean - LANGUAGE c - IMMUTABLE -PARALLEL SAFE -AS 'MODULE_PATHNAME'; - -CREATE OR REPLACE FUNCTION ag_catalog.create_vlabel(graph_name cstring, label_name cstring) - RETURNS void - LANGUAGE c - AS 'MODULE_PATHNAME'; - -CREATE OR REPLACE FUNCTION ag_catalog.create_elabel(graph_name cstring, label_name cstring) - RETURNS void - LANGUAGE c - AS 'MODULE_PATHNAME'; - -CREATE FUNCTION ag_catalog.agtype_to_json(agtype) - RETURNS json - LANGUAGE c - IMMUTABLE -RETURNS NULL ON NULL INPUT -PARALLEL SAFE -AS 'MODULE_PATHNAME'; - -CREATE CAST (agtype AS json) - WITH FUNCTION ag_catalog.agtype_to_json(agtype); - -CREATE FUNCTION ag_catalog.agtype_array_to_agtype(agtype[]) - RETURNS agtype - LANGUAGE c - IMMUTABLE -RETURNS NULL ON NULL INPUT -PARALLEL SAFE -AS 'MODULE_PATHNAME'; - -CREATE CAST (agtype[] AS agtype) - WITH FUNCTION ag_catalog.agtype_array_to_agtype(agtype[]); - -CREATE OPERATOR =~ ( - LEFTARG = agtype, - RIGHTARG = agtype, - FUNCTION = ag_catalog.age_eq_tilde -); diff --git a/age--1.6.0--y.y.y.sql b/age--1.7.0--y.y.y.sql similarity index 74% rename from age--1.6.0--y.y.y.sql rename to age--1.7.0--y.y.y.sql index 2d693a433..c95bb0002 100644 --- a/age--1.6.0--y.y.y.sql +++ b/age--1.7.0--y.y.y.sql @@ -30,24 +30,3 @@ --* Please add all additions, deletions, and modifications to the end of this --* file. We need to keep the order of these changes. --* REMOVE ALL LINES ABOVE, and this one, that start with --* - -CREATE FUNCTION ag_catalog._ag_enforce_edge_uniqueness2(graphid, graphid) - RETURNS bool - LANGUAGE c - STABLE -PARALLEL SAFE -as 'MODULE_PATHNAME'; - -CREATE FUNCTION ag_catalog._ag_enforce_edge_uniqueness3(graphid, graphid, graphid) - RETURNS bool - LANGUAGE c - STABLE -PARALLEL SAFE -as 'MODULE_PATHNAME'; - -CREATE FUNCTION ag_catalog._ag_enforce_edge_uniqueness4(graphid, graphid, graphid, graphid) - RETURNS bool - LANGUAGE c - STABLE -PARALLEL SAFE -as 'MODULE_PATHNAME'; diff --git a/age.control b/age.control index 8bd40360f..57f9fbc12 100644 --- a/age.control +++ b/age.control @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. -default_version = '1.6.0' +default_version = '1.7.0' comment = 'AGE database extension' module_pathname = '$libdir/age' diff --git a/docker/Dockerfile b/docker/Dockerfile index 3eb17c798..abdf0ccd0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -49,7 +49,7 @@ ENV LC_COLLATE=en_US.UTF-8 ENV LC_CTYPE=en_US.UTF-8 COPY --from=build /usr/lib/postgresql/18/lib/age.so /usr/lib/postgresql/18/lib/ -COPY --from=build /usr/share/postgresql/18/extension/age--1.6.0.sql /usr/share/postgresql/18/extension/ +COPY --from=build /usr/share/postgresql/18/extension/age--1.7.0.sql /usr/share/postgresql/18/extension/ COPY --from=build /usr/share/postgresql/18/extension/age.control /usr/share/postgresql/18/extension/ COPY docker/docker-entrypoint-initdb.d/00-create-extension-age.sql /docker-entrypoint-initdb.d/00-create-extension-age.sql