diff --git a/age--1.4.0.sql b/age--1.4.0.sql index fb75648a2..31e6e39f8 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 08f17a504..a8650ae28 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 9489eabae..015c1108e 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 62f7efde2..007d23a0a 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 715b72660..b1e8f666f 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)); }