# 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.

Release Notes for Apache AGE release 1.5.0 for PostgreSQL version 16

Apache AGE 1.5.0 - Release Notes

NOTE: This is an initial release of Apache AGE for PostgreSQL version
      16. There are no upgrade scripts to this release.

Add additional index support and performance enhancements (#1232)
Add an additional way to find a previous variable ref (#1450)
Add auto apply labeler workflow for PRs (#1161)
Add checks for array functions to recognize and decode VPC (#1064)
Add concat || operator to agtype (#1198)
Add exist(?, ?|, ?&) operators for agtype (#1218)
Add missing dependency in cypher_expr.c (#1256)
Add path extraction(#>, #>>)operators to agtype (#1224)
Add support for chained expressions in CASE (#1431)
Clean up agtype_to_int8, agtype_to_int4, & agtype_to_int2 (#1354)
Clean up #included files in parser directory (#1465)
Converted SQL main file into multiple files. (#1401)
docs: Add to Docker setup (#1204)
Extend access(->, ->>), addition and subtraction operators (#1258)
Extend agtype containment operators (@>, <@) (#1285)
Extend EXPLAIN and add config param to switch transformation of property filter (#1262)
Fix ambiguous conditions (#1373)
Fix Docker file to reflect PostgreSQL version 15 (#1449)
Fix DockerHub warning messages for latest (#1380)
Fix issue #1045 - error using path var in WHERE (#1295)
Fix Issue #1159 - Server terminates for SET plus-equal (#1160)
Fix issue #1219 - MERGE not seeing previous clause var (#1441)
Fix issue #1302 - crash on NULL input to UNWIND (#1304)
Fix issue #1303: Server crashes on executing SELECT * FROM agtype(null); (#1317)
Fix Issue #1305 - drop_label NULL cases (#1306)
Fix Issue #1329 - agtype_to_int4 crash (#1339)
Fix issue #1347 - unknow type of agtype container 0 (#1349)
Fix issue #1389 - Server crash on using null operand for access operators (#1390)
Fix issue #1393 - previous clause variables not seen with EXISTS (#1426)
Fix issue #1398 - SET followed by DELETE does not delete (#1412)
Fix issue #1399 EXISTS doesn't handle non-existent labels (#1400)
Fix Issue #945 - incorrect count(*) return values (#1288)
Fix typo in agtype_raw.h header guard (#1368)
Implement chained expression order of operations (#1402)
Implemented age_tail function (#1283)
Implemented the toBooleanList() function (#1014)
Implement EXISTS subquery for CASE (#1345)
Master to PostgreSQL version 16 (#1451)
Minor fix in `agtype_volatile_wrapper` function (#1172)
Modify COUNT() to output agtype (#1311)
Optimize performance of detach delete (#1271)
Optimize vertex and edge builder functions (#1252)
py_driver : optimised Antlr4ResultHandler to improve time (#1107)
Refactor Regression Tests for CASE statement (#1268)
Refactor the IN operator to use '= ANY()' syntax (#1236)
Removed unnecessary assignment (#1185)
Remove redundant job from CIs (#1473)
Remove unnecessary #include in src/backend/utils
Updated age.control.
Updated files, format, and version information.
Updated Makefile.
Updated RELEASE.
Update Discord channel in README.md (#1253)
Update README.md file for PostgreSQL version 16 support (#1463)
Update the Python Driver (#1246)
