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_DETAIL text;
 | 
				
			||||||
    _PG_EXCEPTION_HINT text;
 | 
					    _PG_EXCEPTION_HINT text;
 | 
				
			||||||
    _rebuild BOOLEAN;
 | 
					    _rebuild BOOLEAN;
 | 
				
			||||||
 | 
					    _list text;
 | 
				
			||||||
BEGIN
 | 
					BEGIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    WITH
 | 
					    WITH
 | 
				
			||||||
@ -2078,29 +2079,55 @@ BEGIN
 | 
				
			|||||||
                _set.srce = _srce.srce
 | 
					                _set.srce = _srce.srce
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    --call functions from list
 | 
					    --call functions from list
 | 
				
			||||||
    ,_do AS (
 | 
					    ,_do_set AS (
 | 
				
			||||||
        SELECT 
 | 
					        SELECT 
 | 
				
			||||||
            f.srce
 | 
					            f.srce
 | 
				
			||||||
            ,f.actn
 | 
					            ,f.actn
 | 
				
			||||||
        ,COALESCE(setd.message, deld.message) message
 | 
					            ,setd.message
 | 
				
			||||||
        FROM 
 | 
					        FROM 
 | 
				
			||||||
            _full f
 | 
					            _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'
 | 
				
			||||||
        LEFT JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
 | 
					            --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
 | 
					    --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.
 | 
					    ----    should look at rolling back the whole thing if one of the function returns a fail. stored proc could do this.
 | 
				
			||||||
    ----
 | 
					    ----
 | 
				
			||||||
    SELECT
 | 
					    SELECT
 | 
				
			||||||
        jsonb_agg(jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message'))
 | 
					        jsonb_agg(m)
 | 
				
			||||||
    INTO
 | 
					    INTO
 | 
				
			||||||
        _message
 | 
					        _message
 | 
				
			||||||
    FROM
 | 
					    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;
 | 
					    RETURN _message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SELECT string_agg(srce,',') INTO _list FROM tps.srce;
 | 
				
			||||||
 | 
					    RAISE NOTICE 'after return: %', _list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXCEPTION WHEN OTHERS THEN
 | 
					    EXCEPTION WHEN OTHERS THEN
 | 
				
			||||||
@ -2120,4 +2147,4 @@ BEGIN
 | 
				
			|||||||
    RETURN _message;
 | 
					    RETURN _message;
 | 
				
			||||||
END;
 | 
					END;
 | 
				
			||||||
$f$
 | 
					$f$
 | 
				
			||||||
LANGUAGE plpgsql;
 | 
					LANGUAGE plpgsql
 | 
				
			||||||
@ -37,27 +37,46 @@ BEGIN
 | 
				
			|||||||
                _set.srce = _srce.srce
 | 
					                _set.srce = _srce.srce
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    --call functions from list
 | 
					    --call functions from list
 | 
				
			||||||
    ,_do AS (
 | 
					    ,_do_set AS (
 | 
				
			||||||
        SELECT 
 | 
					        SELECT 
 | 
				
			||||||
            f.srce
 | 
					            f.srce
 | 
				
			||||||
            ,f.actn
 | 
					            ,f.actn
 | 
				
			||||||
        ,COALESCE(setd.message, '{"message":"not inserted"}'::jsonb/*deld.message*/) message
 | 
					            ,setd.message
 | 
				
			||||||
        FROM 
 | 
					        FROM 
 | 
				
			||||||
            _full f
 | 
					            _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
 | 
					            --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'
 | 
					            --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
 | 
					    --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.
 | 
					    ----    should look at rolling back the whole thing if one of the function returns a fail. stored proc could do this.
 | 
				
			||||||
    ----
 | 
					    ----
 | 
				
			||||||
    SELECT
 | 
					    SELECT
 | 
				
			||||||
        jsonb_agg(jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message'))
 | 
					        jsonb_agg(m)
 | 
				
			||||||
    INTO
 | 
					    INTO
 | 
				
			||||||
        _message
 | 
					        _message
 | 
				
			||||||
    FROM
 | 
					    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;
 | 
					    SELECT string_agg(srce,',') INTO _list FROM tps.srce;
 | 
				
			||||||
    RAISE NOTICE 'multi source list: %', _list;
 | 
					    RAISE NOTICE 'multi source list: %', _list;
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,7 @@ DECLARE
 | 
				
			|||||||
    _PG_EXCEPTION_DETAIL text;
 | 
					    _PG_EXCEPTION_DETAIL text;
 | 
				
			||||||
    _PG_EXCEPTION_HINT text;
 | 
					    _PG_EXCEPTION_HINT text;
 | 
				
			||||||
    _rebuild BOOLEAN;
 | 
					    _rebuild BOOLEAN;
 | 
				
			||||||
 | 
					    _list text;
 | 
				
			||||||
BEGIN
 | 
					BEGIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    WITH
 | 
					    WITH
 | 
				
			||||||
@ -36,29 +37,55 @@ BEGIN
 | 
				
			|||||||
                _set.srce = _srce.srce
 | 
					                _set.srce = _srce.srce
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    --call functions from list
 | 
					    --call functions from list
 | 
				
			||||||
    ,_do AS (
 | 
					    ,_do_set AS (
 | 
				
			||||||
        SELECT 
 | 
					        SELECT 
 | 
				
			||||||
            f.srce
 | 
					            f.srce
 | 
				
			||||||
            ,f.actn
 | 
					            ,f.actn
 | 
				
			||||||
        ,COALESCE(setd.message, deld.message) message
 | 
					            ,setd.message
 | 
				
			||||||
        FROM 
 | 
					        FROM 
 | 
				
			||||||
            _full f
 | 
					            _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'
 | 
				
			||||||
        LEFT JOIN LATERAL tps.srce_delete(defn) deld(message) ON f.actn = 'DELETE'
 | 
					            --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
 | 
					    --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.
 | 
					    ----    should look at rolling back the whole thing if one of the function returns a fail. stored proc could do this.
 | 
				
			||||||
    ----
 | 
					    ----
 | 
				
			||||||
    SELECT
 | 
					    SELECT
 | 
				
			||||||
        jsonb_agg(jsonb_build_object('source',srce,'status',message->>'status','message',message->>'message'))
 | 
					        jsonb_agg(m)
 | 
				
			||||||
    INTO
 | 
					    INTO
 | 
				
			||||||
        _message
 | 
					        _message
 | 
				
			||||||
    FROM
 | 
					    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;
 | 
					    RETURN _message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SELECT string_agg(srce,',') INTO _list FROM tps.srce;
 | 
				
			||||||
 | 
					    RAISE NOTICE 'after return: %', _list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EXCEPTION WHEN OTHERS THEN
 | 
					    EXCEPTION WHEN OTHERS THEN
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user