Blockchain explorer for Ethereum based network and a tool for inspecting and analyzing EVM based blockchains.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
blockscout/apps/explorer/priv/repo/migrations/scripts/20181107164103_eip6.sql

65 lines
2.3 KiB

DO $$
DECLARE
row_count integer := 1;
batch_size integer := 50000; -- HOW MANY ITEMS WILL BE UPDATED AT TIME
iterator integer := batch_size;
max_row_number integer;
next_iterator integer;
updated_row_count integer;
deleted_row_count integer;
BEGIN
DROP TABLE IF EXISTS current_suicide_internal_transactions_temp;
-- CREATES TEMP TABLE TO STORE DATA TO BE UPDATED
CREATE TEMP TABLE current_suicide_internal_transactions_temp(
transaction_hash bytea NOT NULL,
index bigint NOT NULL,
row_number integer
);
INSERT INTO current_suicide_internal_transactions_temp
SELECT DISTINCT ON (transaction_hash, index)
transaction_hash,
index,
ROW_NUMBER () OVER ()
FROM internal_transactions
WHERE type = 'suicide'
ORDER BY transaction_hash, index DESC;
max_row_number := (SELECT MAX(row_number) FROM current_suicide_internal_transactions_temp);
RAISE NOTICE '% items to be updated', max_row_number + 1;
-- ITERATES THROUGH THE ITEMS UNTIL THE TEMP TABLE IS EMPTY
WHILE iterator <= max_row_number LOOP
next_iterator := iterator + batch_size;
RAISE NOTICE '-> suicide internal transactions % to % to be updated', iterator, next_iterator - 1;
UPDATE internal_transactions
SET type = 'selfdestruct'
FROM current_suicide_internal_transactions_temp
WHERE internal_transactions.transaction_hash = current_suicide_internal_transactions_temp.transaction_hash AND
internal_transactions.index = current_suicide_internal_transactions_temp.index AND
current_suicide_internal_transactions_temp.row_number < next_iterator;
GET DIAGNOSTICS updated_row_count = ROW_COUNT;
RAISE NOTICE '-> % internal transactions updated from suicide to selfdesruct', updated_row_count;
DELETE FROM current_suicide_internal_transactions_temp
WHERE row_number < next_iterator;
GET DIAGNOSTICS deleted_row_count = ROW_COUNT;
ASSERT updated_row_count = deleted_row_count;
-- COMMITS THE BATCH UPDATES
CHECKPOINT;
-- UPDATES THE COUNTER SO IT DOESN'T TURN INTO AN INFINITE LOOP
iterator := next_iterator;
END LOOP;
RAISE NOTICE 'All suicide type internal transactions updated to selfdestruct. Validating constraint.';
ALTER TABLE internal_transactions VALIDATE CONSTRAINT selfdestruct_has_from_and_to_address;
END $$;