break out set and delete calls into seperate lateral join calls

This commit is contained in:
Paul Trowbridge 2018-12-27 11:04:53 -05:00
parent 908a63b1c7
commit 0909c7da19
3 changed files with 126 additions and 53 deletions

View File

@ -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

View File

@ -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;

View File

@ -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