citus/src/backend/distributed/citus--7.3-2--7.3-3.sql

76 lines
2.1 KiB
SQL

/* citus--7.3-2--7.3-3 */
/*****************************************************************************
* Citus json aggregate helpers
*****************************************************************************/
CREATE FUNCTION pg_catalog.citus_jsonb_concatenate(state jsonb, val jsonb)
RETURNS jsonb
LANGUAGE SQL
AS $function$
SELECT CASE
WHEN val IS NULL THEN state
WHEN jsonb_typeof(state) = 'null' THEN val
ELSE state || val
END;
$function$;
CREATE FUNCTION pg_catalog.citus_jsonb_concatenate_final(state jsonb)
RETURNS jsonb
LANGUAGE SQL
AS $function$
SELECT CASE WHEN jsonb_typeof(state) = 'null' THEN NULL ELSE state END;
$function$;
CREATE FUNCTION pg_catalog.citus_json_concatenate(state json, val json)
RETURNS json
LANGUAGE SQL
AS $function$
SELECT CASE
WHEN val IS NULL THEN state
WHEN json_typeof(state) = 'null' THEN val
WHEN json_typeof(state) = 'object' THEN
(SELECT json_object_agg(key, value) FROM (
SELECT * FROM json_each(state)
UNION ALL
SELECT * FROM json_each(val)
) t)
ELSE
(SELECT json_agg(a) FROM (
SELECT json_array_elements(state) AS a
UNION ALL
SELECT json_array_elements(val) AS a
) t)
END;
$function$;
CREATE FUNCTION pg_catalog.citus_json_concatenate_final(state json)
RETURNS json
LANGUAGE SQL
AS $function$
SELECT CASE WHEN json_typeof(state) = 'null' THEN NULL ELSE state END;
$function$;
/*****************************************************************************
* Citus json aggregates
*****************************************************************************/
CREATE AGGREGATE pg_catalog.jsonb_cat_agg(jsonb) (
SFUNC = citus_jsonb_concatenate,
FINALFUNC = citus_jsonb_concatenate_final,
STYPE = jsonb,
INITCOND = 'null'
);
COMMENT ON AGGREGATE pg_catalog.jsonb_cat_agg(jsonb)
IS 'concatenate input jsonbs into a single jsonb';
CREATE AGGREGATE pg_catalog.json_cat_agg(json) (
SFUNC = citus_json_concatenate,
FINALFUNC = citus_json_concatenate_final,
STYPE = json,
INITCOND = 'null'
);
COMMENT ON AGGREGATE pg_catalog.json_cat_agg(json)
IS 'concatenate input jsons into a single json';