diff --git a/age--1.4.0.sql b/age--1.4.0.sql index 1d5116637..d9fbcc555 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 cb729a341..1f7e48aa3 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 1f6c94691..2249897ab 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 238259af7..916f4df3b 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)); }