This is an automated email from the ASF dual-hosted git repository.
rafsun42 pushed a commit to branch PG12
in repository https://gitbox.apache.org/repos/asf/age.git
The following commit(s) were added to refs/heads/PG12 by this push:
new cc0bdc52 Add additional index support and performance enhancements
(#1232) (#1250) (#1300)
cc0bdc52 is described below
commit cc0bdc52f326a71f362d87e426d3af8fb43709b9
Author: John Gemignani <[email protected]>
AuthorDate: Thu Oct 26 12:42:59 2023 -0700
Add additional index support and performance enhancements (#1232) (#1250)
(#1300)
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 ++++++++++++++++++-------------------
regress/expected/cypher_match.out | 6 +-
src/backend/parser/cypher_clause.c | 46 ++++++--
src/backend/parser/cypher_expr.c | 67 ++++++++++-
src/backend/utils/adt/agtype_ops.c | 13 ++-
5 files changed, 228 insertions(+), 134 deletions(-)
diff --git a/age--1.4.0.sql b/age--1.4.0.sql
index fb75648a..31e6e39f 100644
--- a/age--1.4.0.sql
+++ b/age--1.4.0.sql
@@ -146,7 +146,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';
@@ -154,7 +154,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';
@@ -250,7 +250,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';
@@ -268,7 +268,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';
@@ -286,7 +286,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';
@@ -309,7 +309,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';
@@ -318,7 +318,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';
@@ -385,7 +385,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';
@@ -393,7 +393,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';
@@ -1425,7 +1425,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';
@@ -1444,7 +1444,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';
@@ -1462,7 +1462,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';
@@ -1480,7 +1480,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';
@@ -1498,7 +1498,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';
@@ -1516,7 +1516,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';
@@ -1534,7 +1534,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';
@@ -1552,7 +1552,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';
@@ -1570,7 +1570,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';
@@ -1588,7 +1588,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';
@@ -1606,7 +1606,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';
@@ -1624,7 +1624,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';
@@ -1642,7 +1642,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';
@@ -1660,7 +1660,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';
@@ -1678,7 +1678,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';
@@ -1696,7 +1696,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';
@@ -1714,7 +1714,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';
@@ -1732,7 +1732,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';
@@ -1750,7 +1750,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';
@@ -1768,7 +1768,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';
@@ -1786,7 +1786,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';
@@ -1804,7 +1804,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';
@@ -1822,7 +1822,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';
@@ -1840,7 +1840,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';
@@ -1858,7 +1858,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';
@@ -1876,7 +1876,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';
@@ -1894,7 +1894,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';
@@ -1912,7 +1912,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';
@@ -1930,7 +1930,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';
@@ -1948,7 +1948,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';
@@ -1966,7 +1966,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';
@@ -1984,7 +1984,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';
@@ -2002,7 +2002,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';
@@ -2020,7 +2020,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';
@@ -2038,7 +2038,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';
@@ -2056,7 +2056,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';
@@ -2074,7 +2074,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';
@@ -2092,7 +2092,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';
@@ -2110,7 +2110,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';
@@ -2128,7 +2128,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';
@@ -2146,7 +2146,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';
@@ -2164,7 +2164,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';
@@ -2182,7 +2182,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';
@@ -2200,7 +2200,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';
@@ -2218,7 +2218,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';
@@ -2236,7 +2236,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';
@@ -2254,7 +2254,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';
@@ -2272,7 +2272,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';
@@ -2290,7 +2290,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';
@@ -2308,7 +2308,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';
@@ -2326,7 +2326,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';
@@ -2344,7 +2344,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';
@@ -2362,7 +2362,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';
@@ -2380,7 +2380,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';
@@ -2398,7 +2398,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';
@@ -2416,7 +2416,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';
@@ -2434,7 +2434,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';
@@ -2452,7 +2452,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';
@@ -2470,7 +2470,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';
@@ -2488,7 +2488,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';
@@ -2506,7 +2506,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';
@@ -2524,7 +2524,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';
@@ -2542,7 +2542,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';
@@ -2560,7 +2560,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';
@@ -2578,7 +2578,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';
@@ -2596,7 +2596,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';
@@ -2614,7 +2614,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';
@@ -2632,7 +2632,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';
@@ -2650,7 +2650,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';
@@ -2668,7 +2668,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';
@@ -2686,7 +2686,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';
@@ -2704,7 +2704,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';
@@ -2722,7 +2722,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';
@@ -2740,7 +2740,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';
@@ -2758,7 +2758,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';
@@ -2776,7 +2776,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';
@@ -2794,7 +2794,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';
@@ -2812,7 +2812,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';
@@ -2830,7 +2830,7 @@ CREATE OPERATOR >= (
CREATE FUNCTION ag_catalog.agtype_btree_cmp(agtype, agtype)
RETURNS INTEGER
LANGUAGE c
-STABLE
+IMMUTABLE
PARALLEL SAFE
AS 'MODULE_PATHNAME';
@@ -2959,7 +2959,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';
@@ -2976,7 +2976,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';
@@ -3159,7 +3159,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';
@@ -3170,7 +3170,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';
@@ -3185,7 +3185,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';
@@ -3227,7 +3227,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';
@@ -3235,7 +3235,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';
@@ -3243,7 +3243,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';
@@ -3269,7 +3269,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';
@@ -3277,7 +3277,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';
@@ -3289,7 +3289,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';
@@ -3301,7 +3301,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';
@@ -3314,7 +3314,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';
@@ -3326,7 +3326,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';
@@ -3338,7 +3338,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';
@@ -3350,7 +3350,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';
@@ -3362,7 +3362,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';
@@ -3375,7 +3375,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';
@@ -3387,7 +3387,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';
@@ -3399,7 +3399,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';
@@ -3422,14 +3422,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';
@@ -3456,7 +3456,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';
@@ -3884,21 +3884,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';
@@ -4229,7 +4229,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/regress/expected/cypher_match.out
b/regress/expected/cypher_match.out
index 08f17a50..a8650ae2 100644
--- a/regress/expected/cypher_match.out
+++ b/regress/expected/cypher_match.out
@@ -2330,10 +2330,10 @@ SELECT count(*) FROM cypher('test_enable_containment',
$$ MATCH (x:Customer {pho
(1 row)
SELECT * FROM cypher('test_enable_containment', $$ EXPLAIN (COSTS OFF) MATCH
(x:Customer
{school:{name:'XYZ',program:{degree:'BSc'}},phone:[987654321],parents:{}})
RETURN x $$) as (a agtype);
-
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on "Customer" x
- Filter: (properties @> agtype_build_map('school'::text,
agtype_build_map_nonull('name'::text, '"XYZ"'::agtype, 'program'::text,
agtype_build_map_nonull('degree'::text, '"BSc"'::agtype)), 'phone'::text,
agtype_build_list('987654321'::agtype), 'parents'::text, agtype_build_map()))
+ Filter: (properties @> '{"phone": [987654321], "school": {"name": "XYZ",
"program": {"degree": "BSc"}}, "parents": {}}'::agtype)
(2 rows)
-- Previous set of queries, with enable_containment off
diff --git a/src/backend/parser/cypher_clause.c
b/src/backend/parser/cypher_clause.c
index 9489eaba..015c1108 100644
--- a/src/backend/parser/cypher_clause.c
+++ b/src/backend/parser/cypher_clause.c
@@ -4385,11 +4385,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)
{
@@ -4399,28 +4400,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 62f7efde..007d23a0 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, RangeTblEntry *rte,
int location);
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,
@@ -786,6 +788,50 @@ 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;
+ RangeTblEntry *rte = NULL;
+ Node *field1 = linitial(cr->fields);
+ char *relname = NULL;
+ Node *node = NULL;
+
+ Assert(IsA(field1, String));
+ relname = strVal(field1);
+
+ /* locate the referenced RTE */
+ rte = find_rte(cpstate, relname);
+
+ /* if we didn't find anything, return NULL */
+ if (!rte)
+ {
+ return NULL;
+ }
+
+ /* find the properties column of the NSI and return a var for it */
+ node = scanRTEForColumn(pstate, rte, "properties", cr->location, 0, NULL);
+
+ /*
+ * 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)
{
@@ -807,8 +853,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 715b7266..b1e8f666 100644
--- a/src/backend/utils/adt/agtype_ops.c
+++ b/src/backend/utils/adt/agtype_ops.c
@@ -1165,8 +1165,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))
{
@@ -1176,8 +1178,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));
}