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

Apache AGE 1.2.0 - Release Notes

    NOTE: Due to additions to core tables, there is no upgrade path from the
          previous version.

    Fix Python driver (#388).
    Patch to apply PR (#203) - typos and incorrect hash init.
    Update SET clause to support assigning a map (#468).
    Fix WHERE clause wrong Expr bug (#339).
    Fix multiple typos (#470).
    Updated the volatility category (from STABLE to IMMUTABLE) of multiple functions.
    Graph naming convention now aligns with Cypher spec. (#349).
    Fixed README typos (#436).
    Create graph instruction fixed (#414).
    Readme added for JDBC driver (#383).
    Regression tests added (#341).
    Regression tests added (#336).
    Updated Python driver Readme for clarity.
    Fixed compare_agtype_scalar to only return 1, 0, or -1.
    Created complete graph function (#342).
    Fix Travis CI warning messages.
    Updated Golang version to 1.19 (#373).
    Fixed NULL pointer on name compare (#376).
    Multiple updates to the README.md file.
    Implemented CI testing for Golang Driver (#372).
    Modify the Python driver's parameterization.
    Added license header to new files that it was missing from.
    Modify the Golang driver's usage of parameterization.
    Added the ability to pass PostgreSQL parameters to the cypher function (specifically for drivers).
    Use Debian Buster base image (#243).
    Updated the CONTRIBUTING.md file (#348).
    Invalid labels now return NULL instead of erroring out.
    Removed incubating from overlooked files.
    Fixed Golang driver module.
    Removed DISCLAIMER file.
    Fixed bug in delete_global_graphs.
    Fixed EXPLAIN to allow for nested cypher commands.
    Fixed bug with Call, YIELD clause ignores WHERE.
    Graph names with empty string '' are now disallowed (#251).
    Implement CALL YIELD for cypher functions.
    Update NOTICE file.

