This is an automated email from the ASF dual-hosted git repository.

jgemignani pushed a commit to branch PG15
in repository https://gitbox.apache.org/repos/asf/age.git

commit 942c9de61bc1c8b01579ce42e7c779c760c723f2
Author: John Gemignani <[email protected]>
AuthorDate: Mon Sep 18 09:48:58 2023 -0700

    Add additional index support and performance enhancements (#1232)
    
    Added additional index support for the WHERE clause. This work was
    partly from another patch authored by Josh Innis.
    
    Changed the volatility flag to IMMUTABLE for many functions related
    to indexes. I.e. comparison and build functions.
    
    Updated _agtype_build_path to be IMMUTABLE.
    
    No regression tests were impacted by these changes.
---
 age--1.4.0.sql                     | 230 ++++++++++++++++++-------------------
 src/backend/parser/cypher_clause.c |  46 ++++++--
 src/backend/parser/cypher_expr.c   |  69 ++++++++++-
 src/backend/utils/adt/agtype_ops.c |  13 ++-
 4 files changed, 227 insertions(+), 131 deletions(-)

diff --git a/age--1.4.0.sql b/age--1.4.0.sql
index 1d511663..d9fbcc55 100644
--- a/age--1.4.0.sql
+++ b/age--1.4.0.sql
@@ -147,7 +147,7 @@ CREATE TYPE graphid;
 CREATE FUNCTION ag_catalog.graphid_in(cstring)
 RETURNS graphid
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -155,7 +155,7 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.graphid_out(graphid)
 RETURNS cstring
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -251,7 +251,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.graphid_gt(graphid, graphid)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -269,7 +269,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.graphid_le(graphid, graphid)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -287,7 +287,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.graphid_ge(graphid, graphid)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -310,7 +310,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.graphid_btree_cmp(graphid, graphid)
 RETURNS int
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -319,7 +319,7 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.graphid_btree_sort(internal)
 RETURNS void
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -386,7 +386,7 @@ CREATE TYPE agtype;
 CREATE FUNCTION ag_catalog.agtype_in(cstring)
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -394,7 +394,7 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.agtype_out(agtype)
 RETURNS cstring
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1426,7 +1426,7 @@ CREATE OPERATOR CLASS graphid_ops_hash
 CREATE FUNCTION ag_catalog.agtype_eq(agtype, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1445,7 +1445,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(agtype, smallint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1463,7 +1463,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(smallint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1481,7 +1481,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(agtype, integer)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1499,7 +1499,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(integer, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1517,7 +1517,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(agtype, bigint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1535,7 +1535,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(bigint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1553,7 +1553,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(agtype, real)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1571,7 +1571,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(real, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1589,7 +1589,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(agtype, double precision)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1607,7 +1607,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(double precision, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1625,7 +1625,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(agtype, numeric)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1643,7 +1643,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_any_eq(numeric, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1661,7 +1661,7 @@ CREATE OPERATOR = (
 CREATE FUNCTION ag_catalog.agtype_ne(agtype, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1679,7 +1679,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(agtype, smallint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1697,7 +1697,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(smallint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1715,7 +1715,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(agtype, integer)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1733,7 +1733,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(integer, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1751,7 +1751,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(agtype, bigint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1769,7 +1769,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(bigint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1787,7 +1787,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(agtype, real)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1805,7 +1805,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(real, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1823,7 +1823,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(agtype, double precision)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1841,7 +1841,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(double precision, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1859,7 +1859,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(agtype, numeric)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1877,7 +1877,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_any_ne(numeric, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1895,7 +1895,7 @@ CREATE OPERATOR <> (
 CREATE FUNCTION ag_catalog.agtype_lt(agtype, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1913,7 +1913,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(agtype, smallint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1931,7 +1931,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(smallint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1949,7 +1949,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(agtype, integer)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1967,7 +1967,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(integer, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -1985,7 +1985,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(agtype, bigint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2003,7 +2003,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(bigint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2021,7 +2021,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(agtype, real)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2039,7 +2039,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(real, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2057,7 +2057,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(agtype, double precision)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2075,7 +2075,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(double precision, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2093,7 +2093,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(agtype, numeric)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2111,7 +2111,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_any_lt(numeric, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2129,7 +2129,7 @@ CREATE OPERATOR < (
 CREATE FUNCTION ag_catalog.agtype_gt(agtype, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2147,7 +2147,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(agtype, smallint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2165,7 +2165,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(smallint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2183,7 +2183,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(agtype, integer)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2201,7 +2201,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(integer, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2219,7 +2219,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(agtype, bigint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2237,7 +2237,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(bigint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2255,7 +2255,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(agtype, real)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2273,7 +2273,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(real, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2291,7 +2291,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(agtype, double precision)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2309,7 +2309,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(double precision, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2327,7 +2327,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(agtype, numeric)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2345,7 +2345,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_any_gt(numeric, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2363,7 +2363,7 @@ CREATE OPERATOR > (
 CREATE FUNCTION ag_catalog.agtype_le(agtype, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2381,7 +2381,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(agtype, smallint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2399,7 +2399,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(smallint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2417,7 +2417,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(agtype, integer)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2435,7 +2435,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(integer, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2453,7 +2453,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(agtype, bigint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2471,7 +2471,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(bigint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2489,7 +2489,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(agtype, real)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2507,7 +2507,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(real, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2525,7 +2525,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(agtype, double precision)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2543,7 +2543,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(double precision, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2561,7 +2561,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(agtype, numeric)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2579,7 +2579,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_any_le(numeric, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2597,7 +2597,7 @@ CREATE OPERATOR <= (
 CREATE FUNCTION ag_catalog.agtype_ge(agtype, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2615,7 +2615,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(agtype, smallint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2633,7 +2633,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(smallint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2651,7 +2651,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(agtype, integer)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2669,7 +2669,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(integer, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2687,7 +2687,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(agtype, bigint)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2705,7 +2705,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(bigint, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2723,7 +2723,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(agtype, real)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2741,7 +2741,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(real, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2759,7 +2759,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(agtype, double precision)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2777,7 +2777,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(double precision, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2795,7 +2795,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(agtype, numeric)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2813,7 +2813,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_any_ge(numeric, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2831,7 +2831,7 @@ CREATE OPERATOR >= (
 CREATE FUNCTION ag_catalog.agtype_btree_cmp(agtype, agtype)
 RETURNS INTEGER
 LANGUAGE c
-STABLE
+IMMUTABLE
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
 
@@ -2930,7 +2930,7 @@ CREATE OPERATOR ->> (
 CREATE FUNCTION ag_catalog.agtype_contains(agtype, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -2947,7 +2947,7 @@ CREATE OPERATOR @> (
 CREATE FUNCTION ag_catalog.agtype_contained_by(agtype, agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3130,7 +3130,7 @@ STORAGE text;
 CREATE FUNCTION ag_catalog.graphid_to_agtype(graphid)
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3141,7 +3141,7 @@ WITH FUNCTION ag_catalog.graphid_to_agtype(graphid);
 CREATE FUNCTION ag_catalog.agtype_to_graphid(agtype)
 RETURNS graphid
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3156,7 +3156,7 @@ AS IMPLICIT;
 CREATE FUNCTION ag_catalog._agtype_build_path(VARIADIC "any")
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 CALLED ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3198,7 +3198,7 @@ as 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.agtype_build_map(VARIADIC "any")
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 CALLED ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3206,7 +3206,7 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.agtype_build_map()
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 CALLED ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME', 'agtype_build_map_noargs';
@@ -3214,7 +3214,7 @@ AS 'MODULE_PATHNAME', 'agtype_build_map_noargs';
 CREATE FUNCTION ag_catalog.agtype_build_map_nonull(VARIADIC "any")
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 CALLED ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3240,7 +3240,7 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.agtype_build_list(VARIADIC "any")
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 CALLED ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3248,7 +3248,7 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.agtype_build_list()
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 CALLED ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME', 'agtype_build_list_noargs';
@@ -3260,7 +3260,7 @@ AS 'MODULE_PATHNAME', 'agtype_build_list_noargs';
 CREATE FUNCTION ag_catalog.agtype_to_text(agtype)
 RETURNS text
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3272,7 +3272,7 @@ WITH FUNCTION ag_catalog.agtype_to_text(agtype);
 CREATE FUNCTION ag_catalog.agtype_to_bool(agtype)
 RETURNS boolean
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3285,7 +3285,7 @@ AS IMPLICIT;
 CREATE FUNCTION ag_catalog.bool_to_agtype(boolean)
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3297,7 +3297,7 @@ WITH FUNCTION ag_catalog.bool_to_agtype(boolean);
 CREATE FUNCTION ag_catalog.float8_to_agtype(float8)
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3309,7 +3309,7 @@ WITH FUNCTION ag_catalog.float8_to_agtype(float8);
 CREATE FUNCTION ag_catalog.agtype_to_float8(agtype)
 RETURNS float8
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3321,7 +3321,7 @@ WITH FUNCTION ag_catalog.agtype_to_float8(agtype);
 CREATE FUNCTION ag_catalog.int8_to_agtype(int8)
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3333,7 +3333,7 @@ WITH FUNCTION ag_catalog.int8_to_agtype(int8);
 CREATE FUNCTION ag_catalog.agtype_to_int8(variadic "any")
 RETURNS bigint
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3346,7 +3346,7 @@ AS ASSIGNMENT;
 CREATE FUNCTION ag_catalog.agtype_to_int4(variadic "any")
 RETURNS int
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3358,7 +3358,7 @@ WITH FUNCTION ag_catalog.agtype_to_int4(variadic "any");
 CREATE FUNCTION ag_catalog.agtype_to_int2(variadic "any")
 RETURNS smallint
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3370,7 +3370,7 @@ WITH FUNCTION ag_catalog.agtype_to_int2(variadic "any");
 CREATE FUNCTION ag_catalog.agtype_to_int4_array(variadic "any")
     RETURNS int[]
     LANGUAGE c
-    STABLE
+    IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3393,14 +3393,14 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.agtype_access_slice(agtype, agtype, agtype)
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
 
 CREATE FUNCTION ag_catalog.agtype_in_operator(agtype, agtype)
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
 
@@ -3427,7 +3427,7 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.agtype_string_match_contains(agtype, agtype)
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 RETURNS NULL ON NULL INPUT
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
@@ -3848,21 +3848,21 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.age_abs(variadic "any")
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
 
 CREATE FUNCTION ag_catalog.age_sign(variadic "any")
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
 
 CREATE FUNCTION ag_catalog.age_log(variadic "any")
 RETURNS agtype
 LANGUAGE c
-STABLE
+IMMUTABLE
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
 
@@ -4193,7 +4193,7 @@ AS 'MODULE_PATHNAME';
 CREATE FUNCTION ag_catalog.age_build_vle_match_edge(agtype, agtype)
 RETURNS agtype
 LANGUAGE C
-STABLE
+IMMUTABLE
 PARALLEL SAFE
 AS 'MODULE_PATHNAME';
 
diff --git a/src/backend/parser/cypher_clause.c 
b/src/backend/parser/cypher_clause.c
index cb729a34..1f7e48aa 100644
--- a/src/backend/parser/cypher_clause.c
+++ b/src/backend/parser/cypher_clause.c
@@ -4269,11 +4269,12 @@ transform_match_create_path_variable(cypher_parsestate 
*cpstate,
                                      cypher_path *path, List *entities)
 {
     ParseState *pstate = (ParseState *)cpstate;
-    Oid build_path_oid;
-    FuncExpr *fexpr;
-    int resno;
+    Oid build_path_oid = InvalidOid;
+    Expr *expr = NULL;
+    int resno = -1;
     List *entity_exprs = NIL;
-    ListCell *lc;
+    ListCell *lc = NULL;
+    bool null_path_entity = false;
 
     if (list_length(entities) < 1)
     {
@@ -4283,28 +4284,51 @@ transform_match_create_path_variable(cypher_parsestate 
*cpstate,
                  parser_errposition(pstate, path->location)));
     }
 
-    // extract the expr for each entity
+    /* extract the expr for each entity */
     foreach (lc, entities)
     {
         transform_entity *entity = lfirst(lc);
 
         if (entity->expr != NULL)
         {
+            /*
+             * Is it a NULL constant, meaning there was an invalid label?
+             * If so, flag it for later
+             */
+            if (IsA(entity->expr, Const) &&
+                ((Const*)(entity->expr))->constisnull)
+            {
+                null_path_entity = true;
+            }
+
             entity_exprs = lappend(entity_exprs, entity->expr);
         }
     }
 
-    // get the oid for the path creation function
+    /* get the oid for the path creation function */
     build_path_oid = get_ag_func_oid("_agtype_build_path", 1, ANYOID);
 
-    // build the expr node for the function
-    fexpr = makeFuncExpr(build_path_oid, AGTYPEOID, entity_exprs, InvalidOid,
-                         InvalidOid, COERCE_EXPLICIT_CALL);
+    /*
+     * If we have a NULL in the path, there is an invalid label, so there 
aren't
+     * any paths to be selected - the path variable will be NULL. In this case
+     * we need to return a NULL constant instead.
+     */
+    if (null_path_entity)
+    {
+        expr = (Expr*)makeNullConst(AGTYPEOID, -1, InvalidOid);
+    }
+    /* otherwise, build the expr node for the function */
+    else
+    {
+        expr = (Expr*)makeFuncExpr(build_path_oid, AGTYPEOID, entity_exprs,
+                                   InvalidOid, InvalidOid,
+                                   COERCE_EXPLICIT_CALL);
+    }
 
     resno = cpstate->pstate.p_next_resno++;
 
-    // create the target entry
-    return makeTargetEntry((Expr *)fexpr, resno, path->var_name, false);
+    /* create the target entry */
+    return makeTargetEntry(expr, resno, path->var_name, false);
 }
 
 /*
diff --git a/src/backend/parser/cypher_expr.c b/src/backend/parser/cypher_expr.c
index 1f6c9469..2249897a 100644
--- a/src/backend/parser/cypher_expr.c
+++ b/src/backend/parser/cypher_expr.c
@@ -96,6 +96,8 @@ static Node *transform_FuncCall(cypher_parsestate *cpstate, 
FuncCall *fn);
 static Node *transform_WholeRowRef(ParseState *pstate, ParseNamespaceItem 
*pnsi,
                                    int location, int sublevels_up);
 static ArrayExpr *make_agtype_array_expr(List *args);
+static Node *transform_column_ref_for_indirection(cypher_parsestate *cpstate,
+                                                  ColumnRef *cr);
 
 /* transform a cypher expression */
 Node *transform_cypher_expr(cypher_parsestate *cpstate, Node *expr,
@@ -806,6 +808,52 @@ static ArrayExpr *make_agtype_array_expr(List *args)
     return newa;
 }
 
+/*
+ * Transform a ColumnRef for indirection. Try to find the rte that the 
ColumnRef
+ * references and pass the properties of that rte as what the ColumnRef is
+ * referencing. Otherwise, reference the Var.
+ */
+static Node *transform_column_ref_for_indirection(cypher_parsestate *cpstate,
+                                                  ColumnRef *cr)
+{
+    ParseState *pstate = (ParseState *)cpstate;
+    ParseNamespaceItem *pnsi = NULL;
+    Node *field1 = linitial(cr->fields);
+    char *relname = NULL;
+    Node *node = NULL;
+    int levels_up = 0;
+
+    Assert(IsA(field1, String));
+    relname = strVal(field1);
+
+    /* locate the referenced RTE (used to be find_rte(cpstate, relname)) */
+    pnsi = refnameNamespaceItem(pstate, NULL, relname, cr->location,
+                                &levels_up);
+
+    /* if we didn't find anything, return NULL */
+    if (!pnsi)
+    {
+        return NULL;
+    }
+
+    /* find the properties column of the NSI and return a var for it */
+    node = scanNSItemForColumn(pstate, pnsi, 0, "properties", cr->location);
+
+    /*
+     * Error out if we couldn't find it.
+     *
+     * TODO: Should we error out or return NULL for further processing?
+     *       For now, just error out.
+     */
+    if (!node)
+    {
+        ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT),
+                        errmsg("could not find properties for %s", relname)));
+    }
+
+    return node;
+}
+
 static Node *transform_A_Indirection(cypher_parsestate *cpstate,
                                      A_Indirection *a_ind)
 {
@@ -827,8 +875,25 @@ static Node *transform_A_Indirection(cypher_parsestate 
*cpstate,
     func_slice_oid = get_ag_func_oid("agtype_access_slice", 3, AGTYPEOID,
                                      AGTYPEOID, AGTYPEOID);
 
-    /* transform indirection argument expression */
-    ind_arg_expr = transform_cypher_expr_recurse(cpstate, a_ind->arg);
+    /*
+     * If the indirection argument is a ColumnRef, we want to pull out the
+     * properties, as a var node, if possible.
+     */
+    if (IsA(a_ind->arg, ColumnRef))
+    {
+        ColumnRef *cr = (ColumnRef *)a_ind->arg;
+
+        ind_arg_expr = transform_column_ref_for_indirection(cpstate, cr);
+    }
+
+    /*
+     * If we didn't get the properties from a ColumnRef, just transform the
+     * indirection argument.
+     */
+    if (ind_arg_expr == NULL)
+    {
+        ind_arg_expr = transform_cypher_expr_recurse(cpstate, a_ind->arg);
+    }
 
     /* get the location of the expression */
     location = exprLocation(ind_arg_expr);
diff --git a/src/backend/utils/adt/agtype_ops.c 
b/src/backend/utils/adt/agtype_ops.c
index 238259af..916f4df3 100644
--- a/src/backend/utils/adt/agtype_ops.c
+++ b/src/backend/utils/adt/agtype_ops.c
@@ -1163,8 +1163,10 @@ PG_FUNCTION_INFO_V1(agtype_contains);
  */
 Datum agtype_contains(PG_FUNCTION_ARGS)
 {
-    agtype_iterator *constraint_it, *property_it;
-    agtype *properties, *constraints;
+    agtype_iterator *constraint_it = NULL;
+    agtype_iterator *property_it = NULL;
+    agtype *properties = NULL;
+    agtype *constraints = NULL;
 
     if (PG_ARGISNULL(0) || PG_ARGISNULL(1))
     {
@@ -1174,8 +1176,13 @@ Datum agtype_contains(PG_FUNCTION_ARGS)
     properties = AG_GET_ARG_AGTYPE_P(0);
     constraints = AG_GET_ARG_AGTYPE_P(1);
 
-    constraint_it = agtype_iterator_init(&constraints->root);
+    if (AGT_ROOT_IS_OBJECT(properties) != AGT_ROOT_IS_OBJECT(constraints))
+    {
+        PG_RETURN_BOOL(false);
+    }
+
     property_it = agtype_iterator_init(&properties->root);
+    constraint_it = agtype_iterator_init(&constraints->root);
 
     PG_RETURN_BOOL(agtype_deep_contains(&property_it, &constraint_it));
 }

Reply via email to