From a66dba767eb925bbfe8f167686161389ed6bd530 Mon Sep 17 00:00:00 2001 From: catbref Date: Tue, 29 Dec 2020 09:04:20 +0000 Subject: [PATCH] Fix incorrect LatestATStates SQL table definition This table was previously defined using the TEMPORARY keyword as the rows were used as a cached/index to speed up AT trimming SQL statements. However, the table definition was lacking the "ON COMMIT PRESERVE ROWS" clause, and possibly the "GLOBAL" keyword, which caused the table contents to be emptied, immediately after being filled, when repository.saveChanges() was called (i.e. "COMMIT"). This caused latest AT states to be trimmed in error. AtRepositoryTests.testGetLatestATStatePostTrimming also fixed so that it fails with the previous, broken code. --- .../qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java | 9 +++++++++ src/test/java/org/qortal/test/at/AtRepositoryTests.java | 3 +++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java index e60616d6..763e4b9d 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java @@ -771,6 +771,15 @@ public class HSQLDBDatabaseUpdates { stmt.execute("CHECKPOINT"); break; + case 31: + // Fix latest AT state cache which was previous created as TEMPORARY + stmt.execute("DROP TABLE IF EXISTS LatestATStates"); + stmt.execute("CREATE TABLE IF NOT EXISTS LatestATStates (" + + "AT_address QortalAddress NOT NULL, " + + "height INT NOT NULL" + + ")"); + break; + default: // nothing to do return false; diff --git a/src/test/java/org/qortal/test/at/AtRepositoryTests.java b/src/test/java/org/qortal/test/at/AtRepositoryTests.java index 9d19f0eb..9aed7296 100644 --- a/src/test/java/org/qortal/test/at/AtRepositoryTests.java +++ b/src/test/java/org/qortal/test/at/AtRepositoryTests.java @@ -130,6 +130,9 @@ public class AtRepositoryTests extends Common { // Trim AT state data repository.getATRepository().prepareForAtStateTrimming(); + // COMMIT to check latest AT states persist / TEMPORARY table interaction + repository.saveChanges(); + repository.getATRepository().trimAtStates(2, maxHeight, 1000); ATStateData atStateData = repository.getATRepository().getLatestATState(atAddress);