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

Apache AGE 1.1.0 - Release Notes 

    Support for Agtype containment ops and GIN Indices.
    Add CALL [YIELD] grammar rules for the implementation of CALL procedures.
    VLE path variable integration performance patch.
    Improve WHERE clause performance and support index scans.
    Allow global graph contexts to see currentCommandIds.
    Cache Agtype and GRAPHID OIDs.
    Allow lists and maps to be used in the SET clause.
    Fix bug in aggregate function collect().
    Fix Bug in WHERE clause and property constraints.
    Fix VLE local cache bug (crash).
    Fix bug where integers were not being serialized correctly when stored in GIN indices.
    Fix the VLE peek_stack_head routine to return a NULL if the stack is NULL.
    Fix MERGE visibility in chained commands, SET specifically.
    Fix github issue #212 - Add access operator (`->`, `->>`) to Agtype.
    Fix github issue #220 - fix local cached contexts for static procedures.
    Fix github issue #224 - fix regression tests to fix issues on mac with trigonometric functions.
    Fix github issue #235 - when MERGE and SET were used together.
    Fix github issue #240 - negative array bounds.
    Fix github issue #240 - negative array bounds - addendum.
    Updated README.

