mirror of https://github.com/citusdata/citus.git
76 lines
2.1 KiB
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';
|