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