break out set and delete calls into seperate lateral join calls
This commit is contained in:
parent
908a63b1c7
commit
0909c7da19
@ -2054,6 +2054,7 @@ DECLARE
|
||||
_PG_EXCEPTION_DETAIL text;
|
||||
_PG_EXCEPTION_HINT text;
|
||||
_rebuild BOOLEAN;
|
||||
_list text;
|
||||
BEGIN
|
||||
|
||||
WITH
|
||||
@ -2078,29 +2079,55 @@ BEGIN
|
||||
_set.srce = _srce.srce
|
||||
)
|
||||
--call functions from list
|
||||
,_do AS (
|
||||
,_do_set AS (
|
||||
SELECT
|
||||
f.srce
|
||||
,f.actn
|
||||
,COALESCE(setd.message, deld.message) message
|
||||
,setd.message
|
||||
FROM
|
||||
_full f
|
||||
LEFT JOIN LATERAL tps.srce_set(defn) setd(message) ON f.actn = 'SET'
|
||||
LEFT JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
|
||||
JOIN LATERAL tps.srce_set(defn) setd(message) ON f.actn = 'SET'
|
||||
--dual left joins for functions that touch the same table causes the first left join actions to be undone
|
||||
--LEFT JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
|
||||
)
|
||||
,_do_del AS (
|
||||
SELECT
|
||||
f.srce
|
||||
,f.actn
|
||||
,deld.message
|
||||
FROM
|
||||
_full f
|
||||
JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
|
||||
)
|
||||
--aggregate all the messages into one message
|
||||
----
|
||||
---- should look at rolling back the whole thing if one of the function returns a fail. stored proc could do this.
|
||||
----
|
||||
SELECT
|
||||
jsonb_agg(jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message'))
|
||||
jsonb_agg(m)
|
||||
INTO
|
||||
_message
|
||||
FROM
|
||||
_do;
|
||||
(
|
||||
SELECT
|
||||
jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message') m
|
||||
FROM
|
||||
_do_set
|
||||
UNION ALL
|
||||
SELECT
|
||||
jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message') m
|
||||
FROM
|
||||
_do_del
|
||||
) x;
|
||||
|
||||
SELECT string_agg(srce,',') INTO _list FROM tps.srce;
|
||||
RAISE NOTICE 'multi source list: %', _list;
|
||||
|
||||
RETURN _message;
|
||||
|
||||
SELECT string_agg(srce,',') INTO _list FROM tps.srce;
|
||||
RAISE NOTICE 'after return: %', _list;
|
||||
|
||||
|
||||
|
||||
EXCEPTION WHEN OTHERS THEN
|
||||
@ -2120,4 +2147,4 @@ BEGIN
|
||||
RETURN _message;
|
||||
END;
|
||||
$f$
|
||||
LANGUAGE plpgsql;
|
||||
LANGUAGE plpgsql
|
@ -37,27 +37,46 @@ BEGIN
|
||||
_set.srce = _srce.srce
|
||||
)
|
||||
--call functions from list
|
||||
,_do AS (
|
||||
,_do_set AS (
|
||||
SELECT
|
||||
f.srce
|
||||
,f.actn
|
||||
,COALESCE(setd.message, '{"message":"not inserted"}'::jsonb/*deld.message*/) message
|
||||
,setd.message
|
||||
FROM
|
||||
_full f
|
||||
LEFT JOIN LATERAL tps.srce_set(defn) setd(message) ON f.actn = 'SET'
|
||||
JOIN LATERAL tps.srce_set(defn) setd(message) ON f.actn = 'SET'
|
||||
--dual left joins for functions that touch the same table causes the first left join actions to be undone
|
||||
--LEFT JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
|
||||
)
|
||||
,_do_del AS (
|
||||
SELECT
|
||||
f.srce
|
||||
,f.actn
|
||||
,deld.message
|
||||
FROM
|
||||
_full f
|
||||
JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
|
||||
)
|
||||
--aggregate all the messages into one message
|
||||
----
|
||||
---- should look at rolling back the whole thing if one of the function returns a fail. stored proc could do this.
|
||||
----
|
||||
SELECT
|
||||
jsonb_agg(jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message'))
|
||||
jsonb_agg(m)
|
||||
INTO
|
||||
_message
|
||||
FROM
|
||||
_do;
|
||||
(
|
||||
SELECT
|
||||
jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message') m
|
||||
FROM
|
||||
_do_set
|
||||
UNION ALL
|
||||
SELECT
|
||||
jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message') m
|
||||
FROM
|
||||
_do_del
|
||||
) x;
|
||||
|
||||
SELECT string_agg(srce,',') INTO _list FROM tps.srce;
|
||||
RAISE NOTICE 'multi source list: %', _list;
|
||||
|
@ -12,6 +12,7 @@ DECLARE
|
||||
_PG_EXCEPTION_DETAIL text;
|
||||
_PG_EXCEPTION_HINT text;
|
||||
_rebuild BOOLEAN;
|
||||
_list text;
|
||||
BEGIN
|
||||
|
||||
WITH
|
||||
@ -36,29 +37,55 @@ BEGIN
|
||||
_set.srce = _srce.srce
|
||||
)
|
||||
--call functions from list
|
||||
,_do AS (
|
||||
,_do_set AS (
|
||||
SELECT
|
||||
f.srce
|
||||
,f.actn
|
||||
,COALESCE(setd.message, deld.message) message
|
||||
,setd.message
|
||||
FROM
|
||||
_full f
|
||||
LEFT JOIN LATERAL tps.srce_set(defn) setd(message) ON f.actn = 'SET'
|
||||
LEFT JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
|
||||
JOIN LATERAL tps.srce_set(defn) setd(message) ON f.actn = 'SET'
|
||||
--dual left joins for functions that touch the same table causes the first left join actions to be undone
|
||||
--LEFT JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
|
||||
)
|
||||
,_do_del AS (
|
||||
SELECT
|
||||
f.srce
|
||||
,f.actn
|
||||
,deld.message
|
||||
FROM
|
||||
_full f
|
||||
JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
|
||||
)
|
||||
--aggregate all the messages into one message
|
||||
----
|
||||
---- should look at rolling back the whole thing if one of the function returns a fail. stored proc could do this.
|
||||
----
|
||||
SELECT
|
||||
jsonb_agg(jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message'))
|
||||
jsonb_agg(m)
|
||||
INTO
|
||||
_message
|
||||
FROM
|
||||
_do;
|
||||
(
|
||||
SELECT
|
||||
jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message') m
|
||||
FROM
|
||||
_do_set
|
||||
UNION ALL
|
||||
SELECT
|
||||
jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message') m
|
||||
FROM
|
||||
_do_del
|
||||
) x;
|
||||
|
||||
SELECT string_agg(srce,',') INTO _list FROM tps.srce;
|
||||
RAISE NOTICE 'multi source list: %', _list;
|
||||
|
||||
RETURN _message;
|
||||
|
||||
SELECT string_agg(srce,',') INTO _list FROM tps.srce;
|
||||
RAISE NOTICE 'after return: %', _list;
|
||||
|
||||
|
||||
|
||||
EXCEPTION WHEN OTHERS THEN
|
||||
|
Loading…
Reference in New Issue
Block a user