Fixes #1109 Use `NOT VALID` on constraint and don't put data updates in schema migration. Instead, migrate data using script based on @amandasposito's scripts.pull/1111/head
parent
d61a06605d
commit
39b6eccfda
@ -0,0 +1,64 @@ |
||||
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 $$; |
Loading…
Reference in new issue