add recoup_by_reserve as sql function

This commit is contained in:
Marco Boss 2022-05-13 15:28:43 +02:00
parent d6c161a72e
commit 42f3f83b7d
No known key found for this signature in database
GPG Key ID: 89A3EC33C625C3DF
3 changed files with 76 additions and 33 deletions

View File

@ -82,6 +82,7 @@ DROP TABLE IF EXISTS purse_actions CASCADE;
DROP FUNCTION IF EXISTS exchange_do_withdraw;
DROP FUNCTION IF EXISTS exchange_do_withdraw_limit_check;
DROP FUNCTION IF EXISTS exchange_do_recoup_by_reserve;
DROP FUNCTION IF EXISTS recoup_insert_trigger;
DROP FUNCTION IF EXISTS recoup_delete_trigger;
DROP FUNCTION IF EXISTS deposits_insert_trigger;

View File

@ -1915,6 +1915,72 @@ END IF;
END $$;
CREATE OR REPLACE FUNCTION exchange_do_recoup_by_reserve(
IN res_pub BYTEA
)
RETURNS TABLE
(
denom_sig BYTEA,
denominations_serial BIGINT,
coin_pub BYTEA,
coin_sig BYTEA,
coin_blind BYTEA,
amount_val BIGINT,
amount_frac INTEGER,
recoup_timestamp BIGINT
)
LANGUAGE plpgsql
AS $$
DECLARE
res_uuid BIGINT;
blind_ev BYTEA;
c_pub BYTEA;
BEGIN
SELECT reserve_uuid
INTO res_uuid
FROM reserves
WHERE reserves.reserve_pub = res_pub;
FOR blind_ev IN
SELECT h_blind_ev
FROM reserves_out_by_reserve
WHERE reserves_out_by_reserve.reserve_uuid = res_uuid
LOOP
SELECT robr.coin_pub
INTO c_pub
FROM recoup_by_reserve robr
WHERE robr.reserve_out_serial_id = (
SELECT reserves_out.reserve_out_serial_id
FROM reserves_out
WHERE reserves_out.h_blind_ev = blind_ev
);
RETURN QUERY
SELECT kc.denom_sig,
kc.denominations_serial,
rc.coin_pub,
rc.coin_sig,
rc.coin_blind,
rc.amount_val,
rc.amount_frac,
rc.recoup_timestamp
FROM (
SELECT *
FROM known_coins
WHERE known_coins.coin_pub = c_pub
) kc
JOIN (
SELECT *
FROM recoup
WHERE recoup.coin_pub = c_pub
) rc USING (coin_pub);
END LOOP;
END;
$$;
COMMENT ON FUNCTION exchange_do_recoup_by_reserve
IS 'Recoup by reserve as a function to make sure we hit only the needed partition and not all when joining as joins on distributed tables fetch ALL rows from the shards';
CREATE OR REPLACE FUNCTION exchange_do_deposit(
IN in_amount_with_fee_val INT8,
IN in_amount_with_fee_frac INT4,

View File

@ -2064,41 +2064,17 @@ prepare_statements (struct PostgresClosure *pg)
" ON (recoup_by_reserve.reserve_out_serial_id = reserves_out.reserve_out_serial_id)"
" WHERE reserves.reserve_pub=$1);",
*/
"WITH res AS MATERIALIZED ( "
" SELECT * "
" FROM reserves "
" WHERE reserve_pub = $1 "
"), "
"coin_pub AS MATERIALIZED ( "
" SELECT coin_pub "
" FROM recoup_by_reserve "
" JOIN (reserves_out "
" JOIN ( "
" SELECT * "
" FROM reserves_out_by_reserve "
" WHERE reserves_out_by_reserve.reserve_uuid = ( "
" SELECT reserve_uuid FROM res "
" ) "
" ) reserves_out_by_reserve "
" ON (reserves_out_by_reserve.h_blind_ev = reserves_out.h_blind_ev)) "
" ON (recoup_by_reserve.reserve_out_serial_id = reserves_out.reserve_out_serial_id) "
") "
"SELECT recoup.coin_pub "
" ,recoup.coin_sig "
" ,recoup.coin_blind "
" ,recoup.amount_val "
" ,recoup.amount_frac "
" ,recoup.recoup_timestamp "
"SELECT robr.coin_pub "
" ,robr.coin_sig "
" ,robr.coin_blind "
" ,robr.amount_val "
" ,robr.amount_frac "
" ,robr.recoup_timestamp "
" ,denominations.denom_pub_hash "
" ,known_coins.denom_sig "
" ,robr.denom_sig "
"FROM denominations "
" JOIN (known_coins "
" JOIN recoup "
" ON (recoup.coin_pub = known_coins.coin_pub)) "
" ON (known_coins.denominations_serial = denominations.denominations_serial) "
"WHERE recoup.coin_pub = ( "
" SELECT coin_pub FROM coin_pub "
"); ",
" JOIN exchange_do_recoup_by_reserve($1) robr"
" USING (denominations_serial);",
1),
/* Used in #postgres_get_coin_transactions() to obtain recoup transactions
affecting old coins of refreshed coins */