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 d6c4c1d39..dad7f1032 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@   - +   @@ -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, & 18. 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 @@ -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, & 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. +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..4a5eb45f3 100644 --- a/RELEASE +++ b/RELEASE @@ -15,91 +15,44 @@ # 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 master branch (currently PG18) -Apache AGE 1.6.0 - Release Notes +# +# WARNING! +# +# Please note the upgrade script (age--1.6.0--1.7.0.sql) may take a while to +# complete for large graphs, due to creation of indexes for existing labels. +# +# WARNING! +# + +Apache AGE 1.7.0 - Release Notes + +Master to PostgreSQL version 18 (#2315) +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 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) - 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) 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.6.0--1.7.0.sql similarity index 92% rename from age--1.6.0--y.y.y.sql rename to age--1.6.0--1.7.0.sql index c5a31b373..768cb6f1b 100644 --- a/age--1.6.0--y.y.y.sql +++ b/age--1.6.0--1.7.0.sql @@ -17,19 +17,11 @@ * 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. -- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "ALTER EXTENSION age UPDATE TO '1.X.0'" to load this file. \quit - ---* 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 --* +\echo Use "ALTER EXTENSION age UPDATE TO '1.7.0'" to load this file. \quit CREATE FUNCTION ag_catalog._ag_enforce_edge_uniqueness2(graphid, graphid) RETURNS bool diff --git a/age--1.7.0--y.y.y.sql b/age--1.7.0--y.y.y.sql new file mode 100644 index 000000000..c95bb0002 --- /dev/null +++ b/age--1.7.0--y.y.y.sql @@ -0,0 +1,32 @@ +/* + * 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. + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "ALTER EXTENSION age UPDATE TO '1.X.0'" to load this file. \quit + +--* 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 --* 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