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

Apache AGE 1.3.0 - Release Notes

    Add additional comments for create_graph function. (#582)
    Optimize age_exists function. (#586)
    Implement plus-equal operator in SET clause. (#638)
    Implement CI test for python driver. (#587)
    Move from travis CI to github actions for build. (#673)
    Update all driver CIs to Github actions.
    Fix build warnings.
    Fix golang driver workflow (#563)
    Updated Readme for drivers folder. (#642)
    Removed async from function definitions. (#680)
    Barbell graph generation (#648) and Barbell regress tests. (#708)
    Updated Python Driver ANTLR 4.9.3 -> 4.11.1 (#706)
    Modify docker url for JDBC driver tests (#716)
    Fix WITH ignoring WHERE clause. (#646)
    Implement isEmpty() predicate function. (#710)
    Fix cypher function input argument checks. (#718)
    Fix Issue 693 - server termination from return exists(path). (#721)
    Update regression tests for cypher_with. (#725)
    Fix issue 733 - create_complete_graph() terminates the server. (#734)
    Prevent MATCH from following OPTIONAL MATCH. (#740)
    Fix property constraints against resolved variables. (#724) (#751) (#701) (#747)
    Include invalid labels in reused variables. (#751) (#762)
    Remove check for scalar agtypes in unwind. (#736)
    Update PG11 CI workflows.
    Update readme and version for python driver. (#780)
    Update README.md
