From ee892d31484c630d4bbf2e9d4a9f4f931e20f9d8 Mon Sep 17 00:00:00 2001 From: hououou Date: Wed, 27 Mar 2024 01:55:11 -0400 Subject: [PATCH 1/3] solve comments --- src/include/common/enums/statement_type.h | 14 +- .../operator/persistent/batch_insert.h | 2 +- src/include/storage/storage_manager.h | 1 + src/include/storage/store/table_data.h | 1 + src/include/transaction/transaction_context.h | 2 +- src/main/client_context.cpp | 3 +- src/main/database.cpp | 3 +- src/processor/operator/ddl/drop_table.cpp | 3 + .../operator/persistent/batch_insert.cpp | 5 +- .../operator/persistent/node_batch_insert.cpp | 12 +- .../operator/persistent/rel_batch_insert.cpp | 2 +- src/storage/wal_replayer.cpp | 27 +- src/transaction/transaction_context.cpp | 9 +- test/CMakeLists.txt | 1 - test/c_api/prepared_statement_test.cpp | 19 - test/ddl/CMakeLists.txt | 1 - test/ddl/e2e_ddl_test.cpp | 476 ----- test/test_files/csv/edge-cases.test | 1 + .../exceptions/copy/auto_commit.test | 9 - .../exceptions/ddl/auto_commit.test | 32 - .../transaction/ddl/create_alter_table.test | 117 ++ .../transaction/ddl/create_copy.test | 180 ++ .../transaction/ddl/create_drop_table.test | 120 ++ .../transaction/ddl/create_table.test | 65 + test/test_files/transaction/ddl/ddl.test | 1580 +++++++++++++++++ .../kuzudb/test/PreparedStatementTest.java | 18 - 26 files changed, 2096 insertions(+), 607 deletions(-) delete mode 100644 test/ddl/CMakeLists.txt delete mode 100644 test/ddl/e2e_ddl_test.cpp delete mode 100644 test/test_files/exceptions/ddl/auto_commit.test create mode 100644 test/test_files/transaction/ddl/create_alter_table.test create mode 100644 test/test_files/transaction/ddl/create_copy.test create mode 100644 test/test_files/transaction/ddl/create_drop_table.test create mode 100644 test/test_files/transaction/ddl/create_table.test create mode 100644 test/test_files/transaction/ddl/ddl.test diff --git a/src/include/common/enums/statement_type.h b/src/include/common/enums/statement_type.h index 6bc13472b9..46f10bed40 100644 --- a/src/include/common/enums/statement_type.h +++ b/src/include/common/enums/statement_type.h @@ -25,17 +25,9 @@ enum class StatementType : uint8_t { }; struct StatementTypeUtils { - static bool allowActiveTransaction(StatementType statementType) { - switch (statementType) { - case StatementType::CREATE_TABLE: - case StatementType::DROP_TABLE: - case StatementType::ALTER: - case StatementType::CREATE_MACRO: - case StatementType::COPY_FROM: - return false; - default: - return true; - } + static bool allowActiveTransaction(StatementType /*statementType*/) { + // TODO(Chang): remove this function + return true; } }; diff --git a/src/include/processor/operator/persistent/batch_insert.h b/src/include/processor/operator/persistent/batch_insert.h index 1fcb5548d5..829ee0abf8 100644 --- a/src/include/processor/operator/persistent/batch_insert.h +++ b/src/include/processor/operator/persistent/batch_insert.h @@ -74,7 +74,7 @@ class BatchInsert : public Sink { inline std::shared_ptr getSharedState() const { return sharedState; } protected: - void checkIfTableIsEmpty(); + void checkIfTableIsEmpty(transaction::Transaction* transaction); protected: std::unique_ptr info; diff --git a/src/include/storage/storage_manager.h b/src/include/storage/storage_manager.h index a65bb49053..e3d4859c27 100644 --- a/src/include/storage/storage_manager.h +++ b/src/include/storage/storage_manager.h @@ -60,6 +60,7 @@ class StorageManager { WAL* wal; bool enableCompression; common::VirtualFileSystem* vfs; + std::set deleteTables; }; } // namespace storage diff --git a/src/include/storage/store/table_data.h b/src/include/storage/store/table_data.h index 65ad23b1aa..55a706f9b0 100644 --- a/src/include/storage/store/table_data.h +++ b/src/include/storage/store/table_data.h @@ -27,6 +27,7 @@ class TableData { virtual void append(ChunkedNodeGroup* nodeGroup) = 0; inline void dropColumn(common::column_id_t columnID) { + KU_ASSERT(columnID != common::INVALID_COLUMN_ID && columnID < columns.size()); columns.erase(columns.begin() + columnID); } void addColumn(transaction::Transaction* transaction, const std::string& colNamePrefix, diff --git a/src/include/transaction/transaction_context.h b/src/include/transaction/transaction_context.h index 05f1549e44..8bce49963c 100644 --- a/src/include/transaction/transaction_context.h +++ b/src/include/transaction/transaction_context.h @@ -37,7 +37,7 @@ class TransactionContext { void beginReadTransaction(); void beginWriteTransaction(); void beginAutoTransaction(bool readOnlyStatement); - void validateManualTransaction(bool allowActiveTransaction, bool readOnlyStatement); + void validateManualTransaction(bool readOnlyStatement); void commit(); void rollback(); diff --git a/src/main/client_context.cpp b/src/main/client_context.cpp index 6a809f69cd..c678159733 100644 --- a/src/main/client_context.cpp +++ b/src/main/client_context.cpp @@ -282,8 +282,7 @@ std::unique_ptr ClientContext::prepareNoLock( if (transactionContext->isAutoTransaction()) { transactionContext->beginAutoTransaction(preparedStatement->readOnly); } else { - transactionContext->validateManualTransaction( - preparedStatement->allowActiveTransaction(), preparedStatement->readOnly); + transactionContext->validateManualTransaction(preparedStatement->readOnly); } if (!this->getTx()->isReadOnly()) { database->catalog->initCatalogContentForWriteTrxIfNecessary(); diff --git a/src/main/database.cpp b/src/main/database.cpp index 7a34406fa3..a4691b1ef5 100644 --- a/src/main/database.cpp +++ b/src/main/database.cpp @@ -230,8 +230,7 @@ void Database::commit(Transaction* transaction, bool skipCheckpointForTestingRec transactionManager->allowReceivingNewTransactions(); } -void Database::rollback( - transaction::Transaction* transaction, bool skipCheckpointForTestingRecovery) { +void Database::rollback(Transaction* transaction, bool skipCheckpointForTestingRecovery) { if (transaction->isReadOnly()) { transactionManager->rollback(transaction); return; diff --git a/src/processor/operator/ddl/drop_table.cpp b/src/processor/operator/ddl/drop_table.cpp index 71196bfc00..6e806c20f1 100644 --- a/src/processor/operator/ddl/drop_table.cpp +++ b/src/processor/operator/ddl/drop_table.cpp @@ -2,9 +2,12 @@ #include "catalog/catalog.h" #include "common/string_format.h" +#include "storage/storage_manager.h" +#include "storage/wal_replayer_utils.h" using namespace kuzu::catalog; using namespace kuzu::common; +using namespace kuzu::storage; namespace kuzu { namespace processor { diff --git a/src/processor/operator/persistent/batch_insert.cpp b/src/processor/operator/persistent/batch_insert.cpp index 1511e42769..a583c34410 100644 --- a/src/processor/operator/persistent/batch_insert.cpp +++ b/src/processor/operator/persistent/batch_insert.cpp @@ -4,12 +4,13 @@ #include "common/exception/message.h" using namespace kuzu::common; +using namespace kuzu::transaction; namespace kuzu { namespace processor { -void BatchInsert::checkIfTableIsEmpty() { - if (sharedState->table->getNumTuples(&transaction::DUMMY_READ_TRANSACTION) != 0) { +void BatchInsert::checkIfTableIsEmpty(Transaction* transaction) { + if (sharedState->table->getNumTuples(transaction) != 0) { throw CopyException(ExceptionMessage::notAllowCopyOnNonEmptyTableException()); } } diff --git a/src/processor/operator/persistent/node_batch_insert.cpp b/src/processor/operator/persistent/node_batch_insert.cpp index b84eb5b844..553961b80e 100644 --- a/src/processor/operator/persistent/node_batch_insert.cpp +++ b/src/processor/operator/persistent/node_batch_insert.cpp @@ -4,10 +4,12 @@ #include "common/types/types.h" #include "function/table/scan_functions.h" #include "processor/result/factorized_table.h" +#include "storage/storage_manager.h" using namespace kuzu::catalog; using namespace kuzu::common; using namespace kuzu::storage; +using namespace kuzu::transaction; namespace kuzu { namespace processor { @@ -52,7 +54,7 @@ void NodeBatchInsertSharedState::appendIncompleteNodeGroup( } void NodeBatchInsert::initGlobalStateInternal(ExecutionContext* context) { - checkIfTableIsEmpty(); + checkIfTableIsEmpty(context->clientContext->getTx()); sharedState->logBatchInsertWALRecord(); auto nodeSharedState = ku_dynamic_cast(sharedState.get()); @@ -190,6 +192,14 @@ void NodeBatchInsert::finalize(ExecutionContext* context) { sharedState->getNumRows(), info->tableEntry->getName()); FactorizedTableUtils::appendStringToTable( sharedState->fTable.get(), outputMsg, context->clientContext->getMemoryManager()); + auto tableID = sharedState->table->getTableID(); + auto catalogEntry = context->clientContext->getCatalog()->getTableCatalogEntry( + context->clientContext->getTx(), tableID); + auto nodeTableEntry = ku_dynamic_cast(catalogEntry); + auto table = context->clientContext->getStorageManager()->getTable(tableID); + KU_ASSERT(table->getTableType() == TableType::NODE); + ku_dynamic_cast(table)->initializePKIndex( + nodeTableEntry, false /* readOnly */, context->clientContext->getVFSUnsafe()); } } // namespace processor } // namespace kuzu diff --git a/src/processor/operator/persistent/rel_batch_insert.cpp b/src/processor/operator/persistent/rel_batch_insert.cpp index d439cdc86e..0a3d623f27 100644 --- a/src/processor/operator/persistent/rel_batch_insert.cpp +++ b/src/processor/operator/persistent/rel_batch_insert.cpp @@ -16,7 +16,7 @@ namespace processor { void RelBatchInsert::initGlobalStateInternal(ExecutionContext* context) { if (!context->clientContext->getClientConfig()->enableMultiCopy) { - checkIfTableIsEmpty(); + checkIfTableIsEmpty(context->clientContext->getTx()); } sharedState->logBatchInsertWALRecord(); } diff --git a/src/storage/wal_replayer.cpp b/src/storage/wal_replayer.cpp index c3639f2293..fbf43f18b1 100644 --- a/src/storage/wal_replayer.cpp +++ b/src/storage/wal_replayer.cpp @@ -1,6 +1,5 @@ #include "storage/wal_replayer.h" -#include "catalog/catalog_entry/node_table_catalog_entry.h" #include "common/exception/storage.h" #include "storage/storage_manager.h" #include "storage/storage_utils.h" @@ -169,6 +168,7 @@ void WALReplayer::replayCatalogRecord() { void WALReplayer::replayCreateTableRecord(const WALRecord& walRecord) { if (!isCheckpoint) { storageManager->dropTable(walRecord.createTableRecord.tableID); + wal->getUpdatedTables().erase(walRecord.createTableRecord.tableID); } } @@ -188,24 +188,10 @@ void WALReplayer::replayRdfGraphRecord(const WALRecord& walRecord) { replayCreateTableRecord(literalTripleTableWALRecord); } -void WALReplayer::replayCopyTableRecord(const WALRecord& walRecord) { - auto tableID = walRecord.copyTableRecord.tableID; +void WALReplayer::replayCopyTableRecord(const WALRecord& /*walRecord*/) { if (isCheckpoint) { if (!isRecovering) { // CHECKPOINT. - // If we are not recovering, i.e., we are checkpointing during normal execution, - // then we need to update the nodeTable because the actual columns and lists - // files have been changed during checkpoint. So the in memory - // fileHandles are obsolete and should be reconstructed (e.g. since the numPages - // have likely changed they need to reconstruct their page locks). - auto catalogEntry = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID); - if (catalogEntry->getType() == CatalogEntryType::NODE_TABLE_ENTRY) { - auto nodeTableEntry = - ku_dynamic_cast(catalogEntry); - auto nodeTable = - ku_dynamic_cast(storageManager->getTable(tableID)); - nodeTable->initializePKIndex(nodeTableEntry, false /* readOnly */, vfs); - } } else { // RECOVERY. if (wal->isLastLoggedRecordCommit()) { @@ -216,6 +202,7 @@ void WALReplayer::replayCopyTableRecord(const WALRecord& walRecord) { } else { // ROLLBACK. // TODO(Guodong): Do nothing for now. Should remove metaDA and reclaim free pages. + // TODO(Jiamin): should rollback hash index } } @@ -225,11 +212,7 @@ void WALReplayer::replayDropTableRecord(const WALRecord& walRecord) { if (!isRecovering) { auto tableEntry = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID); switch (tableEntry->getTableType()) { - case TableType::NODE: { - storageManager->dropTable(tableID); - // TODO(Guodong): Do nothing for now. Should remove metaDA and reclaim free pages. - WALReplayerUtils::removeHashIndexFile(vfs, tableID, wal->getDirectory()); - } break; + case TableType::NODE: case TableType::REL: { storageManager->dropTable(tableID); // TODO(Guodong): Do nothing for now. Should remove metaDA and reclaim free pages. @@ -292,7 +275,7 @@ void WALReplayer::replayAddPropertyRecord(const WALRecord& walRecord) { auto tableID = walRecord.addPropertyRecord.tableID; auto propertyID = walRecord.addPropertyRecord.propertyID; if (!isCheckpoint) { - auto tableEntry = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID); + auto tableEntry = catalog->getTableCatalogEntry(&DUMMY_WRITE_TRANSACTION, tableID); storageManager->getTable(tableID)->dropColumn(tableEntry->getColumnID(propertyID)); } } diff --git a/src/transaction/transaction_context.cpp b/src/transaction/transaction_context.cpp index 8f57607b8e..6ffec80da8 100644 --- a/src/transaction/transaction_context.cpp +++ b/src/transaction/transaction_context.cpp @@ -40,18 +40,11 @@ void TransactionContext::beginAutoTransaction(bool readOnlyStatement) { readOnlyStatement ? TransactionType::READ_ONLY : TransactionType::WRITE); } -void TransactionContext::validateManualTransaction( - bool allowActiveTransaction, bool readOnlyStatement) { +void TransactionContext::validateManualTransaction(bool readOnlyStatement) { KU_ASSERT(hasActiveTransaction()); if (activeTransaction->isReadOnly() && !readOnlyStatement) { throw ConnectionException("Can't execute a write query inside a read-only transaction."); } - if (!allowActiveTransaction) { - throw ConnectionException( - "DDL, Copy, createMacro statements can only run in the AUTO_COMMIT mode. Please commit " - "or rollback your previous transaction if there is any and issue the query without " - "beginning a transaction"); - } } void TransactionContext::commit() { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a4f3c51010..93e02b7544 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,5 +18,4 @@ add_subdirectory(runner) add_subdirectory(storage) add_subdirectory(transaction) add_subdirectory(util_tests) -add_subdirectory(ddl) add_subdirectory(copy) diff --git a/test/c_api/prepared_statement_test.cpp b/test/c_api/prepared_statement_test.cpp index e05d2cb0ed..eb33bfe8e3 100644 --- a/test/c_api/prepared_statement_test.cpp +++ b/test/c_api/prepared_statement_test.cpp @@ -48,25 +48,6 @@ TEST_F(CApiPreparedStatementTest, GetErrorMessage) { free(message); } -TEST_F(CApiPreparedStatementTest, AllowActiveTransaction) { - auto connection = getConnection(); - auto query = "MATCH (a:person) WHERE a.isStudent = $1 RETURN COUNT(*)"; - auto preparedStatement = kuzu_connection_prepare(connection, query); - ASSERT_NE(preparedStatement, nullptr); - ASSERT_NE(preparedStatement->_prepared_statement, nullptr); - ASSERT_TRUE(kuzu_prepared_statement_is_success(preparedStatement)); - ASSERT_TRUE(kuzu_prepared_statement_allow_active_transaction(preparedStatement)); - kuzu_prepared_statement_destroy(preparedStatement); - - query = "create node table npytable (id INT64,i64 INT64[12],PRIMARY KEY(id));"; - preparedStatement = kuzu_connection_prepare(connection, query); - ASSERT_NE(preparedStatement, nullptr); - ASSERT_NE(preparedStatement->_prepared_statement, nullptr); - ASSERT_TRUE(kuzu_prepared_statement_is_success(preparedStatement)); - ASSERT_FALSE(kuzu_prepared_statement_allow_active_transaction(preparedStatement)); - kuzu_prepared_statement_destroy(preparedStatement); -} - TEST_F(CApiPreparedStatementTest, BindBool) { auto connection = getConnection(); auto query = "MATCH (a:person) WHERE a.isStudent = $1 RETURN COUNT(*)"; diff --git a/test/ddl/CMakeLists.txt b/test/ddl/CMakeLists.txt deleted file mode 100644 index ccf88ec326..0000000000 --- a/test/ddl/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_kuzu_test(e2e_ddl_test e2e_ddl_test.cpp) diff --git a/test/ddl/e2e_ddl_test.cpp b/test/ddl/e2e_ddl_test.cpp deleted file mode 100644 index 02b21b5cde..0000000000 --- a/test/ddl/e2e_ddl_test.cpp +++ /dev/null @@ -1,476 +0,0 @@ -#include "binder/bound_statement_result.h" -#include "catalog/catalog.h" -#include "common/string_format.h" -#include "graph_test/graph_test.h" -#include "processor/plan_mapper.h" -#include "processor/processor.h" -#include "storage/storage_manager.h" - -using namespace kuzu::catalog; -using namespace kuzu::common; -using namespace kuzu::processor; -using namespace kuzu::storage; -using namespace kuzu::testing; -using namespace kuzu::transaction; - -namespace kuzu { -namespace testing { - -class TinySnbDDLTest : public DBTest { - -public: - void SetUp() override { - DBTest::SetUp(); - catalog = getCatalog(*database); - profiler = std::make_unique(); - bufferManager = std::make_unique( - BufferPoolConstants::DEFAULT_BUFFER_POOL_SIZE_FOR_TESTING, - BufferPoolConstants::DEFAULT_VM_REGION_MAX_SIZE); - memoryManager = - std::make_unique(bufferManager.get(), getFileSystem(*database)); - executionContext = - std::make_unique(profiler.get(), conn->clientContext.get()); - personTableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, "person"); - studyAtTableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, "studyAt"); - } - - void initWithoutLoadingGraph() { - createDBAndConn(); - catalog = getCatalog(*database); - } - - std::string getInputDir() override { - return TestHelper::appendKuzuRootPath("dataset/tinysnb/"); - } - - void validateDatabaseStateAfterCommitCreateNodeTable() { - ASSERT_TRUE(catalog->containsTable(&DUMMY_READ_TRANSACTION, "EXAM_PAPER")); - ASSERT_EQ(getStorageManager(*database) - ->getNodesStatisticsAndDeletedIDs() - ->getNumNodeStatisticsAndDeleteIDsPerTable(), - 4); - } - - // Since DDL statements are in an auto-commit transaction, we can't use the query interface to - // test the recovery algorithm and parallel read. - void createTable(TableType tableType, TransactionTestType transactionTestType) { - std::string tableName; - switch (tableType) { - case TableType::NODE: { - tableName = "EXAM_PAPER"; - executeQueryWithoutCommit("CREATE NODE TABLE EXAM_PAPER(STUDENT_ID INT64, MARK DOUBLE, " - "PRIMARY KEY(STUDENT_ID))"); - } break; - case TableType::REL: { - tableName = "likes"; - executeQueryWithoutCommit( - "CREATE REL TABLE likes(FROM person TO organisation, RATING INT64, MANY_ONE)"); - } break; - default: { - KU_UNREACHABLE; - } - } - ASSERT_FALSE(catalog->containsTable(&DUMMY_READ_TRANSACTION, tableName)); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - ASSERT_FALSE(catalog->containsTable(&DUMMY_READ_TRANSACTION, tableName)); - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - ASSERT_TRUE(catalog->containsTable(&DUMMY_READ_TRANSACTION, tableName)); - } - - void validateBelongsRelTable() { - // Valid relations in belongs table: person->organisation, organisation->country. - auto result = conn->query("MATCH (:person)-[:belongs]->(:organisation) RETURN count(*)"); - ASSERT_TRUE(result->isSuccess()); - ASSERT_EQ(TestHelper::convertResultToString(*result), std::vector{"2"}); - result = conn->query("MATCH (a:person)-[e:belongs]->(b:country) RETURN count(*)"); - ASSERT_FALSE(result->isSuccess()); - ASSERT_EQ(result->getErrorMessage(), - "Binder exception: Nodes a and b are not connected through rel e."); - result = conn->query("MATCH (:organisation)-[:belongs]->(:country) RETURN count(*)"); - ASSERT_TRUE(result->isSuccess()); - ASSERT_EQ(TestHelper::convertResultToString(*result), std::vector{"1"}); - result = conn->query("MATCH (a:organisation)-[e:belongs]->(b:person) RETURN count(*)"); - ASSERT_FALSE(result->isSuccess()); - ASSERT_EQ(result->getErrorMessage(), - "Binder exception: Nodes a and b are not connected through rel e."); - result = conn->query("MATCH (a:country)-[e:belongs]->(b:person) RETURN count(*)"); - ASSERT_FALSE(result->isSuccess()); - ASSERT_EQ(result->getErrorMessage(), - "Binder exception: Nodes a and b are not connected through rel e."); - result = conn->query("MATCH (a:country)-[e:belongs]->(b:organisation) RETURN count(*)"); - ASSERT_FALSE(result->isSuccess()); - ASSERT_EQ(result->getErrorMessage(), - "Binder exception: Nodes a and b are not connected through rel e."); - } - - void dropTableCommitAndRecoveryTest( - std::string tableName, TransactionTestType transactionTestType) { - auto tableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, tableName); - auto tableSchema = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID)->copy(); - executeQueryWithoutCommit(stringFormat("DROP TABLE {}", tableName)); - ASSERT_TRUE(catalog->containsTable(&DUMMY_READ_TRANSACTION, tableName)); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - ASSERT_TRUE(catalog->containsTable(&DUMMY_READ_TRANSACTION, tableName)); - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - ASSERT_FALSE(catalog->containsTable(&DUMMY_READ_TRANSACTION, tableName)); - } - - void dropNodeTableProperty(TransactionTestType transactionTestType) { - executeQueryWithoutCommit("ALTER TABLE person DROP gender"); - ASSERT_TRUE(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID) - ->containProperty("gender")); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - // The file for property gender should still exist until we do checkpoint. - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - ASSERT_FALSE(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID) - ->containProperty("gender")); - auto result = conn->query("MATCH (p:person) RETURN * ORDER BY p.ID LIMIT 1"); - ASSERT_EQ(TestHelper::convertResultToString(*result), - std::vector{ - "{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, isStudent: True, isWorker: False, " - "age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 " - "11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], " - "usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]], grades: [96,54,86,92], " - "height: 1.731000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}"}); - } - - void dropRelTableProperty(TransactionTestType transactionTestType) { - executeQueryWithoutCommit("ALTER TABLE studyAt DROP places"); - ASSERT_TRUE(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, studyAtTableID) - ->containProperty("places")); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - // The file for property places should still exist until we do checkpoint. - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - ASSERT_FALSE(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID) - ->containProperty("places")); - auto result = conn->query( - "MATCH (:person)-[s:studyAt]->(:organisation) RETURN * ORDER BY s.year DESC LIMIT 1"); - ASSERT_EQ(TestHelper::convertResultToString(*result), - std::vector{ - "(0:0)-{_LABEL: studyAt, _ID: 4:0, year: 2021, length: 5, level: 5, code: " - "9223372036854775808, temprature: 32800, ulength: 33768, ulevel: 250, hugedata: " - "1844674407370955161811111111}->(1:0)"}); - } - - void executeQueryWithoutCommit(std::string query) { - auto preparedStatement = conn->prepare(query); - auto mapper = PlanMapper(conn->getClientContext()); - auto physicalPlan = - mapper.mapLogicalPlanToPhysical(preparedStatement->logicalPlans[0].get(), - preparedStatement->statementResult->getColumns()); - executionContext->clientContext->resetActiveQuery(); - getQueryProcessor(*database)->execute(physicalPlan.get(), executionContext.get()); - } - - void addPropertyToPersonTableWithoutDefaultValue( - std::string propertyType, TransactionTestType transactionTestType) { - executeQueryWithoutCommit(stringFormat("ALTER TABLE person ADD random {}", propertyType)); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - // The default value of the property is NULL if not specified by the user. - auto result = conn->query("MATCH (p:person) return p.random"); - while (result->hasNext()) { - ASSERT_TRUE(result->getNext()->getValue(0 /* idx */)->isNull()); - } - } - - void addPropertyToPersonTableWithDefaultValue(std::string propertyType, std::string defaultVal, - TransactionTestType transactionTestType, std::string expectedVal = "") { - executeQueryWithoutCommit( - "ALTER TABLE person ADD random " + propertyType + " DEFAULT " + defaultVal); - // The convertResultToString function will remove the single quote around the result - // std::string, so we should also remove the single quote in the expected result. - defaultVal.erase(remove(defaultVal.begin(), defaultVal.end(), '\''), defaultVal.end()); - std::vector expectedResult( - 8 /* numOfNodesInPesron */, expectedVal.empty() ? defaultVal : expectedVal); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - ASSERT_EQ( - TestHelper::convertResultToString(*conn->query("MATCH (p:person) return p.random")), - expectedResult); - } - - void addPropertyToStudyAtTableWithoutDefaultValue( - std::string propertyType, TransactionTestType transactionTestType) { - executeQueryWithoutCommit(stringFormat("ALTER TABLE studyAt ADD random {}", propertyType)); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - // Note: the default value of the new property is NULL if not specified by the user. - auto result = conn->query("MATCH (:person)-[e:studyAt]->(:organisation) return e.random"); - while (result->hasNext()) { - ASSERT_TRUE(result->getNext()->getValue(0 /* idx */)->isNull()); - } - } - - void addPropertyToStudyAtTableWithDefaultValue( - std::string propertyType, std::string defaultVal, TransactionTestType transactionTestType) { - executeQueryWithoutCommit( - stringFormat("ALTER TABLE studyAt ADD random {} DEFAULT {}", propertyType, defaultVal)); - defaultVal.erase(remove(defaultVal.begin(), defaultVal.end(), '\''), defaultVal.end()); - std::vector expectedResult(3 /* numOfRelsInStudyAt */, defaultVal); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - ASSERT_EQ(TestHelper::convertResultToString( - *conn->query("MATCH (:person)-[e:studyAt]->(:organisation) return e.random")), - expectedResult); - } - - void renameTable(TransactionTestType transactionTestType) { - executeQueryWithoutCommit("ALTER TABLE person RENAME TO student"); - ASSERT_EQ(catalog->getTableCatalogEntry(&DUMMY_WRITE_TRANSACTION, personTableID)->getName(), - "student"); - ASSERT_EQ(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID)->getName(), - "person"); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - ASSERT_EQ( - catalog->getTableCatalogEntry(&DUMMY_WRITE_TRANSACTION, personTableID)->getName(), - "student"); - ASSERT_EQ( - catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID)->getName(), - "person"); - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - ASSERT_EQ(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID)->getName(), - "student"); - auto result = conn->query("MATCH (s:student) return s.age order by s.age"); - ASSERT_EQ(TestHelper::convertResultToString(*result), - std::vector({"20", "20", "25", "30", "35", "40", "45", "83"})); - } - - void renameProperty(TransactionTestType transactionTestType) { - executeQueryWithoutCommit("ALTER TABLE person RENAME fName TO name"); - ASSERT_TRUE(catalog->getTableCatalogEntry(&DUMMY_WRITE_TRANSACTION, personTableID) - ->containProperty("name")); - ASSERT_TRUE(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID) - ->containProperty("fName")); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - ASSERT_TRUE(catalog->getTableCatalogEntry(&DUMMY_WRITE_TRANSACTION, personTableID) - ->containProperty("name")); - ASSERT_TRUE(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID) - ->containProperty("fName")); - initWithoutLoadingGraph(); - } else { - conn->query("COMMIT"); - } - ASSERT_TRUE(catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, personTableID) - ->containProperty("name")); - auto result = conn->query("MATCH (p:person) return p.name order by p.name"); - ASSERT_EQ(TestHelper::convertResultToString(*result), - std::vector({"Alice", "Bob", "Carol", "Dan", "Elizabeth", "Farooq", "Greg", - "Hubert Blaine Wolfeschlegelsteinhausenbergerdorff"})); - } - - Catalog* catalog; - std::unique_ptr bufferManager; - std::unique_ptr memoryManager; - std::unique_ptr executionContext; - std::unique_ptr profiler; - table_id_t personTableID; - table_id_t studyAtTableID; -}; - -TEST_F(TinySnbDDLTest, CreateNodeTableCommitRecovery) { - createTable(TableType::NODE, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, CreateRelTableCommitRecovery) { - createTable(TableType::REL, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, DropNodeTableCommitRecovery) { - dropTableCommitAndRecoveryTest("movies", TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, DropRelTableCommitRecovery) { - dropTableCommitAndRecoveryTest("knows", TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, DropNodeTablePropertyRecovery) { - dropNodeTableProperty(TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, DropRelTablePropertyRecovery) { - dropRelTableProperty(TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddInt64PropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "INT64" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddArrayPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "DOUBLE[5]" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddStringPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "STRING" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfInt64PropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "INT64[]" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfStringPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "STRING[]" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfStructPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "STRUCT(revenue int64, ages double[])[]" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddMapPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "MAP(STRING, INT64)" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddStructPropertyToPersonTableWithoutDefaultValueRecovery) { - addPropertyToPersonTableWithoutDefaultValue( - "STRUCT(price INT64[], volume INT64)" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddInt64PropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue( - "INT64" /* propertyType */, "21" /* defaultVal */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddStringPropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue("STRING" /* propertyType */, - "'long long string'" /* defaultVal */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfInt64PropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue("INT64[]" /* propertyType */, - "[142,123,789]" /* defaultVal */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfStringPropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue("STRING[]" /* propertyType */, - "['142','short','long long long string']" /* defaultValue */, - TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfListOfStringPropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue("STRING[][]" /* propertyType */, - "[['142','51'],['short','long','123'],['long long long string','short short short short'," - "'short']]" /* defaultValue */, - TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfStructPropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue( - "STRUCT(revenue int64, ages double[])[]" /* propertyType */, - "[{revenue: 144, ages: [3.200000,7.200000]}]" /* defaultValue */, - TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddMapPropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue("MAP(STRING, INT64[])" /* propertyType */, - "map(['key3'],[[3,2,1]])" /* defaultValue */, TransactionTestType::RECOVERY, - "{key3=[3,2,1]}" /* expectedVal */); -} - -TEST_F(TinySnbDDLTest, AddStructPropertyToPersonTableWithDefaultValueRecovery) { - addPropertyToPersonTableWithDefaultValue( - "STRUCT(price INT64[], volume INT64)" /* propertyType */, - "{price: [5,3,2], volume: 24}" /* defaultValue */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddInt64PropertyToStudyAtTableWithoutDefaultValueRecovery) { - addPropertyToStudyAtTableWithoutDefaultValue( - "INT64" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddStringPropertyToStudyAtTableWithoutDefaultValueRecovery) { - addPropertyToStudyAtTableWithoutDefaultValue( - "STRING" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfInt64PropertyToStudyAtTableWithoutDefaultValueRecovery) { - addPropertyToStudyAtTableWithoutDefaultValue( - "INT64[]" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfStringPropertyToStudyAtTableWithoutDefaultValueRecovery) { - addPropertyToStudyAtTableWithoutDefaultValue( - "STRING[]" /* propertyType */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddInt64PropertyToStudyAtTableWithDefaultValueRecovery) { - addPropertyToStudyAtTableWithDefaultValue( - "INT64" /* propertyType */, "42" /* defaultVal */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddStringPropertyToStudyAtTableWithDefaultValueRecovery) { - addPropertyToStudyAtTableWithDefaultValue("STRING" /* propertyType */, - "'VERY SHORT STRING!!'" /* defaultVal */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfINT64PropertyToStudyAtTableWithDefaultValueRecovery) { - addPropertyToStudyAtTableWithDefaultValue("INT64[]" /* propertyType */, - "[5,6,7,1,3]" /* defaultVal */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfStringPropertyToStudyAtTableWithDefaultValueRecovery) { - addPropertyToStudyAtTableWithDefaultValue("STRING[]" /* propertyType */, - "['2','SHORT','SUPER LONG STRINGS']" /* defaultVal */, TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, AddListOfListOfStringPropertyToStudyAtTableWithDefaultValueRecovery) { - addPropertyToStudyAtTableWithDefaultValue("STRING[][]" /* propertyType */, - "[['hello','good','long long string test'],['6'],['very very long string']]" /* - defaultVal*/ - , - TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, RenameTableRecovery) { - renameTable(TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbDDLTest, RenamePropertyRecovery) { - renameProperty(TransactionTestType::RECOVERY); -} - -} // namespace testing -} // namespace kuzu diff --git a/test/test_files/csv/edge-cases.test b/test/test_files/csv/edge-cases.test index d1a8c29fad..4775635e74 100644 --- a/test/test_files/csv/edge-cases.test +++ b/test/test_files/csv/edge-cases.test @@ -1,4 +1,5 @@ -GROUP CSV +-BUFFER_POOL_SIZE 1073741824 -DATASET CSV csv-edge-case-tests -- diff --git a/test/test_files/exceptions/copy/auto_commit.test b/test/test_files/exceptions/copy/auto_commit.test index 0a967a772f..29234e9bb0 100644 --- a/test/test_files/exceptions/copy/auto_commit.test +++ b/test/test_files/exceptions/copy/auto_commit.test @@ -3,15 +3,6 @@ -- --CASE CopyCSVStatementWithActiveTransactionError --STATEMENT CREATE NODE TABLE person (ID INT64, fName STRING, gender INT64, isStudent BOOLEAN, isWorker BOOLEAN, age INT64, eyeSight DOUBLE, birthdate DATE, registerTime TIMESTAMP, lastJobDuration INTERVAL, workedHours INT64[], usedNames STRING[], courseScoresPerTerm INT64[][], grades INT64[4], height float, u UUID, PRIMARY KEY (ID)) ----- ok --STATEMENT BEGIN TRANSACTION ----- ok --STATEMENT COPY person FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/vPerson.csv" (HEADER=TRUE, DELIM=',') ----- error -DDL, Copy, createMacro statements can only run in the AUTO_COMMIT mode. Please commit or rollback your previous transaction if there is any and issue the query without beginning a transaction - -CASE CopyNodeOutputMsg -STATEMENT CREATE NODE TABLE person (ID INT64, fName STRING, gender INT64, isStudent BOOLEAN, isWorker BOOLEAN, age INT64, eyeSight DOUBLE, birthdate DATE, registerTime TIMESTAMP, lastJobDuration INTERVAL, workedHours INT64[], usedNames STRING[], courseScoresPerTerm INT64[][], grades INT64[4], height float, u UUID, PRIMARY KEY (ID)) ---- ok diff --git a/test/test_files/exceptions/ddl/auto_commit.test b/test/test_files/exceptions/ddl/auto_commit.test deleted file mode 100644 index 3daf96f57a..0000000000 --- a/test/test_files/exceptions/ddl/auto_commit.test +++ /dev/null @@ -1,32 +0,0 @@ --GROUP DDLAutoCommit --DATASET CSV tinysnb - --- - --CASE CreateTableAutoTransactionError --STATEMENT BEGIN TRANSACTION ----- ok --STATEMENT CREATE NODE TABLE UNIVERSITY(NAME STRING, WEBSITE STRING, REGISTER_TIME DATE, PRIMARY KEY (NAME)) ----- error -DDL, Copy, createMacro statements can only run in the AUTO_COMMIT mode. Please commit or rollback your previous transaction if there is any and issue the query without beginning a transaction - --CASE DropTableAutoTransactionError --STATEMENT BEGIN TRANSACTION ----- ok --STATEMENT DROP TABLE knows ----- error -DDL, Copy, createMacro statements can only run in the AUTO_COMMIT mode. Please commit or rollback your previous transaction if there is any and issue the query without beginning a transaction - --CASE AlterTableAutoTransactionError --STATEMENT BEGIN TRANSACTION ----- ok --STATEMENT ALTER TABLE person DROP gender ----- error -DDL, Copy, createMacro statements can only run in the AUTO_COMMIT mode. Please commit or rollback your previous transaction if there is any and issue the query without beginning a transaction - --CASE CreateMacroAutoTransactionError --STATEMENT BEGIN TRANSACTION ----- ok --STATEMENT CREATE MACRO var_macro(x) AS x ----- error -DDL, Copy, createMacro statements can only run in the AUTO_COMMIT mode. Please commit or rollback your previous transaction if there is any and issue the query without beginning a transaction diff --git a/test/test_files/transaction/ddl/create_alter_table.test b/test/test_files/transaction/ddl/create_alter_table.test new file mode 100644 index 0000000000..4a223aa82b --- /dev/null +++ b/test/test_files/transaction/ddl/create_alter_table.test @@ -0,0 +1,117 @@ +-GROUP CreateDeleteInt64NodeTrxTest +-DATASET CSV empty +-- + +-DEFINE_STATEMENT_BLOCK CREATE_TABLE_TEST [ +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follow(FROM User TO User, since INT64) +---- ok +] + +-DEFINE_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST [ +-STATEMENT ALTER TABLE User ADD email STRING +---- ok +] + +-DEFINE_STATEMENT_BLOCK ALTER_NODE_TABLE_ROLLBACK [ +-STATEMENT MATCH (u:User) return u.email +---- error +Binder exception: Cannot find property email for u. +] + +-DEFINE_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT [ +-STATEMENT MATCH (u:User) return u.email +---- ok +] + + +-DEFINE_STATEMENT_BLOCK ALTER_REL_TABLE_TEST [ +-STATEMENT ALTER TABLE Follow ADD email STRING +---- ok +] + +-DEFINE_STATEMENT_BLOCK ALTER_REL_TABLE_ROLLBACK [ +-STATEMENT MATCH (u:User)-[e:Follow]->() return e.email +---- error +Binder exception: Cannot find property email for e. +] + +-DEFINE_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT [ +-STATEMENT MATCH (u:User)-[e:Follow]->() return e.email +---- ok +] + +-CASE createAlterTableCommit +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT + +-CASE createAlterTableCommitRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT + +-CASE createAlterTableRollback +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST +-STATEMENT Rollback +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_ROLLBACK + +-CASE createAlterTableRollbackRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST +-STATEMENT Rollback_skip_checkpoint +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_ROLLBACK + +-CASE createAlterRelTableCommit +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT + +-CASE createAlterRelTableCommitRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT + +-CASE createAlterRelTableRollback +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST +-STATEMENT Rollback +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_ROLLBACK + +-CASE createAlterRelTableRollbackRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST +-STATEMENT Rollback_skip_checkpoint +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_ROLLBACK \ No newline at end of file diff --git a/test/test_files/transaction/ddl/create_copy.test b/test/test_files/transaction/ddl/create_copy.test new file mode 100644 index 0000000000..89fc56f805 --- /dev/null +++ b/test/test_files/transaction/ddl/create_copy.test @@ -0,0 +1,180 @@ +-GROUP CreateDeleteInt64NodeTrxTest +-DATASET CSV empty +-- + +-DEFINE_STATEMENT_BLOCK CREATE_COPY [ +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv" +---- ok +-STATEMENT MATCH (u:User) return u.name +---- 4 +Adam +Karissa +Noura +Zhang +-STATEMENT MATCH (u:User) where u.name='Adam' return u.name +---- 1 +Adam +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 2 +Karissa +Zhang +] + +-CASE createCopyRelMunalCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_COPY +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (u:User) where u.name='Adam' return u.name +---- 1 +Adam +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 2 +Karissa +Zhang + +-CASE createCopyRelMunalCommitRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_COPY +-STATEMENT commit_skip_checkpoint +---- ok +-RELOADDB +-STATEMENT MATCH (u:User) where u.name='Adam' return u.name +---- 1 +Adam +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 2 +Karissa +Zhang + +-CASE createCopyRelMunalRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_COPY +-STATEMENT Rollback +---- ok +-STATEMENT MATCH (u:User) return u.name +---- error +Binder exception: Table User does not exist. +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- error +Binder exception: Table User does not exist. + +-CASE createCopyRelMunalRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_COPY +-STATEMENT Rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (u:User) return u.name +---- error +Binder exception: Table User does not exist. +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- error +Binder exception: Table User does not exist. + + +-CASE createCopyCommitErrorRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv2" +---- error +Binder exception: No file found that matches the pattern: ${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv2. +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (u:User) WHERE u.name = 'Adam' RETURN u.age +---- error +Binder exception: Table User does not exist. + + +-CASE copyRelCommit +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" +---- ok +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv" +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (u:User) WHERE u.name = 'Adam' RETURN u.age +---- ok +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 2 +Karissa +Zhang + +-CASE copyRelCommitRecovery +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" +---- ok +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv" +---- ok +-STATEMENT COMMIT_skip_checkpoint +---- ok +-RELOADDB +-STATEMENT MATCH (u:User) WHERE u.name = 'Adam' RETURN u.age +---- ok +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 2 +Karissa +Zhang + +-CASE copyRelRollback +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" +---- ok +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv" +---- ok +-STATEMENT Rollback +---- ok +-STATEMENT MATCH (u:User) WHERE u.name = 'Adam' RETURN u.age +---- ok +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 0 + +-CASE copyRelRollbackRecovery +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" +---- ok +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv" +---- ok +-STATEMENT Rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (u:User) WHERE u.name = 'Adam' RETURN u.age +---- ok +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 0 + diff --git a/test/test_files/transaction/ddl/create_drop_table.test b/test/test_files/transaction/ddl/create_drop_table.test new file mode 100644 index 0000000000..f5db982d9e --- /dev/null +++ b/test/test_files/transaction/ddl/create_drop_table.test @@ -0,0 +1,120 @@ +-GROUP CreateDeleteInt64NodeTrxTest +-DATASET CSV empty +-- + +-DEFINE_STATEMENT_BLOCK CREATE_TABLE_TEST [ +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +] + +-DEFINE_STATEMENT_BLOCK DROP_TABLE_TEST [ +-STATEMENT DROP TABLE Follows; +---- ok +-STATEMENT DROP TABLE User; +---- ok +] + +-DEFINE_STATEMENT_BLOCK CREATE_DROP_TABLE_ROLLBACK [ +-STATEMENT MATCH (u:User) return u.* +---- 0 +] + +-DEFINE_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT [ +-STATEMENT MATCH (u:User) return u.* +---- error +Binder exception: Table User does not exist. +] + + +-DEFINE_STATEMENT_BLOCK DROP_REL_TABLE_TEST [ +-STATEMENT DROP TABLE Follows; +---- ok +] + +-DEFINE_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_ROLLBACK [ +-STATEMENT MATCH (u:User)-[:Follows]->() return u.* +---- 0 +] + +-DEFINE_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_COMMIT [ +-STATEMENT MATCH (u:User)-[:Follows]->() return u.* +---- error +Binder exception: Table Follows does not exist. +] + +-CASE createDropTableCommit +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK DROP_TABLE_TEST +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT + +-CASE createDropTableCommitRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK DROP_TABLE_TEST +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT + +-CASE createDropTableRollback +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK DROP_TABLE_TEST +-STATEMENT Rollback +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_ROLLBACK + +-CASE createDropTableRollbackRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK DROP_TABLE_TEST +-STATEMENT Rollback_skip_checkpoint +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_ROLLBACK + + +-CASE createDropRelTableCommit +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_COMMIT + +-CASE createDropRelTableCommitRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST +-STATEMENT COMMIT_skip_checkpoint +---- ok +-RELOADDB +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_COMMIT + +-CASE createDropRelTableCommitRollback +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST +-STATEMENT Rollback +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_ROLLBACK + +-CASE createDropRelTableCommitRollbackRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST +-STATEMENT Rollback_SKIP_CHECKPOINT +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_ROLLBACK \ No newline at end of file diff --git a/test/test_files/transaction/ddl/create_table.test b/test/test_files/transaction/ddl/create_table.test new file mode 100644 index 0000000000..798c3ab12d --- /dev/null +++ b/test/test_files/transaction/ddl/create_table.test @@ -0,0 +1,65 @@ +-GROUP CreateDeleteInt64NodeTrxTest +-DATASET CSV empty +-- + +-DEFINE_STATEMENT_BLOCK CREATE_TABLE_TEST [ +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT Create (u:User {name: 'Adam', age: 42}) return u +---- 1 +{_ID: 0:0, _LABEL: User, name: Adam, age: 42} +-STATEMENT Create (u:User {name: 'Bob', age: 24}) return u +---- 1 +{_ID: 0:1, _LABEL: User, name: Bob, age: 24} +-STATEMENT MATCH (u:User) return u.* +---- 2 +Adam +Bob +] +#-STATEMENT MATCH (u:User) where u.name='Adam' return u.age +#---- 1 +#42 +#-STATEMENT Match (a:User {name: 'Adam'}),(b:User {name: 'Bob'}) Create (a)-[:Follows {since: 2019}]->(b) +#---- ok +#-STATEMENT MATCH (u:User) where u.name='Adam' return u.age +#---- 1 +#42 +#-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +#---- 1 +#Bob +#] + +-DEFINE_STATEMENT_BLOCK CHECK_CREATE_TABLE_TEST_COMMIT [ +-STATEMENT MATCH (u:User) return u.name +---- 2 +Adam +Bob +] +#-STATEMENT MATCH (u:User) where u.name='Adam' return u.age +#---- 1 +#42 +#-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +#---- 1 +#Bob +#] + +-DEFINE_STATEMENT_BLOCK CHECK_CREATE_TABLE_TEST_ROLLBACK [ +-STATEMENT MATCH (u:User) where u.name='Adam' return u.age +---- error +Binder exception: Table User does not exist. +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- error +Binder exception: Table User does not exist. +] + +-CASE createTableMunalCommit +-SKIP +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK CHECK_CREATE_TABLE_TEST_COMMIT + diff --git a/test/test_files/transaction/ddl/ddl.test b/test/test_files/transaction/ddl/ddl.test new file mode 100644 index 0000000000..c449d1104e --- /dev/null +++ b/test/test_files/transaction/ddl/ddl.test @@ -0,0 +1,1580 @@ +-GROUP TinySnbDDLTest +-DATASET CSV tinysnb +-- + + +-CASE CreateNodeTableCommitRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE NODE TABLE EXAM_PAPER(STUDENT_ID INT64, MARK DOUBLE, PRIMARY KEY (STUDENT_ID)) +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (n:EXAM_PAPER) RETURN n +---- ok + +-CASE CreateNodeTableCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE NODE TABLE EXAM_PAPER(STUDENT_ID INT64, MARK DOUBLE, PRIMARY KEY (STUDENT_ID)) +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (n:EXAM_PAPER) RETURN n +---- ok + + +-CASE CreateNodeTableRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE NODE TABLE EXAM_PAPER(STUDENT_ID INT64, MARK DOUBLE, PRIMARY KEY (STUDENT_ID)) +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (n:EXAM_PAPER) RETURN n +---- error +Binder exception: Table EXAM_PAPER does not exist. + +-CASE CreateNodeTableRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE NODE TABLE EXAM_PAPER(STUDENT_ID INT64, MARK DOUBLE, PRIMARY KEY (STUDENT_ID)) +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (n:EXAM_PAPER) RETURN n +---- error +Binder exception: Table EXAM_PAPER does not exist. + +-CASE CreateRelTableCommitRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE REL TABLE likes(FROM person TO organisation, RATING INT64, MANY_ONE) +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH ()-[r:likes]->() RETURN r +---- ok + +-CASE CreateRelTableCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE REL TABLE likes(FROM person TO organisation, RATING INT64, MANY_ONE) +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH ()-[r:likes]->() RETURN r +---- ok + +-CASE CreateRelTableRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE REL TABLE likes(FROM person TO organisation, RATING INT64, MANY_ONE) +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH ()-[r:likes]->() RETURN r +---- error +Binder exception: Table likes does not exist. + +-CASE CreateRelTableRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE REL TABLE likes(FROM person TO organisation, RATING INT64, MANY_ONE) +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH ()-[r:likes]->() RETURN r +---- error +Binder exception: Table likes does not exist. + +-CASE DropNodeTableCommitRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT DROP TABLE movies +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (n:movies) RETURN n +---- error +Binder exception: Table movies does not exist. + +-CASE DropNodeTableCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT DROP TABLE movies +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (n:movies) RETURN n +---- error +Binder exception: Table movies does not exist. + +-CASE DropNodeTableRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT DROP TABLE movies +---- ok +-STATEMENT Rollback +---- ok +-STATEMENT MATCH (n:movies) RETURN n +---- ok + +-CASE DropNodeTableRollbackRecovry +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT DROP TABLE movies +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (n:movies) RETURN n +---- ok + +-CASE DropRelTableCommitRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT DROP TABLE knows +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (n)-[:knows]->(r) RETURN n +---- error +Binder exception: Table knows does not exist. + +-CASE DropRelTableCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT DROP TABLE knows +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (n)-[:knows]->(r) RETURN n +---- error +Binder exception: Table knows does not exist. + +-CASE DropRelTableRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT DROP TABLE knows +---- ok +-STATEMENT Rollback +---- ok +-STATEMENT MATCH (n)-[:knows]->(r) RETURN n +---- ok + +-CASE DropRelTableRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT DROP TABLE knows +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (n)-[:knows]->(r) RETURN n +---- ok + +-CASE DropNodeTablePropertyRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person DROP gender +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) RETURN * ORDER BY p.ID LIMIT 1 +---- 1 +{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]], grades: [96,54,86,92], height: 1.731000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} + +-CASE DropNodeTablePropertyCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person DROP gender +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) RETURN * ORDER BY p.ID LIMIT 1 +---- 1 +{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]], grades: [96,54,86,92], height: 1.731000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} + +-CASE DropNodeTablePropertyRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person DROP gender +---- ok +-STATEMENT Rollback +---- ok +-STATEMENT MATCH (p:person) RETURN * ORDER BY p.ID LIMIT 1 +---- 1 +{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]], grades: [96,54,86,92], height: 1.731000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} + +-CASE DropNodeTablePropertyRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person DROP gender +---- ok +-STATEMENT Rollback_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (p:person) RETURN * ORDER BY p.ID LIMIT 1 +---- 1 +{_ID: 0:0, _LABEL: person, ID: 0, fName: Alice, gender: 1, isStudent: True, isWorker: False, age: 35, eyeSight: 5.000000, birthdate: 1900-01-01, registerTime: 2011-08-20 11:25:30, lastJobDuration: 3 years 2 days 13:02:00, workedHours: [10,5], usedNames: [Aida], courseScoresPerTerm: [[10,8],[6,7,8]], grades: [96,54,86,92], height: 1.731000, u: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} + + +-CASE DropRelTablePropertyRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt DROP places +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[s:studyAt]->(:organisation) RETURN * ORDER BY s.year DESC LIMIT 1 +---- 1 +(0:0)-{_LABEL: studyAt, _ID: 4:0, year: 2021, length: 5, level: 5, code: 9223372036854775808, temprature: 32800, ulength: 33768, ulevel: 250, hugedata: 1844674407370955161811111111}->(1:0) + +-CASE DropRelTablePropertyCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt DROP places +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[s:studyAt]->(:organisation) RETURN * ORDER BY s.year DESC LIMIT 1 +---- 1 +(0:0)-{_LABEL: studyAt, _ID: 4:0, year: 2021, length: 5, level: 5, code: 9223372036854775808, temprature: 32800, ulength: 33768, ulevel: 250, hugedata: 1844674407370955161811111111}->(1:0) + +-CASE DropRelTablePropertyRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt DROP places +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (:person)-[s:studyAt]->(:organisation) RETURN * ORDER BY s.year DESC LIMIT 1 +---- 1 +(0:0)-{_LABEL: studyAt, _ID: 4:0, year: 2021, places: [wwAewsdndweusd,wek], length: 5, level: 5, code: 9223372036854775808, temprature: 32800, ulength: 33768, ulevel: 250, hugedata: 1844674407370955161811111111}->(1:0) + +-CASE DropRelTablePropertyRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt DROP places +---- ok +-STATEMENT rollback_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[s:studyAt]->(:organisation) RETURN * ORDER BY s.year DESC LIMIT 1 +---- 1 +(0:0)-{_LABEL: studyAt, _ID: 4:0, year: 2021, places: [wwAewsdndweusd,wek], length: 5, level: 5, code: 9223372036854775808, temprature: 32800, ulength: 33768, ulevel: 250, hugedata: 1844674407370955161811111111}->(1:0) + + +-CASE AddInt64PropertyToPersonTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64 +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return Count(p.random) +---- 1 +0 + + +-CASE AddInt64PropertyToPersonTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64 +---- ok +-STATEMENT COMMIT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return Count(p.random) +---- 1 +0 + +-CASE AddInt64PropertyToPersonTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64 +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + +-CASE AddInt64PropertyToPersonTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64 +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + +-CASE AddArrayPropertyToPersonTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random DOUBLE[5] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return Count(p.random) +---- 1 +0 + +-CASE AddArrayPropertyToPersonTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random DOUBLE[5] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return Count(p.random) +---- 1 +0 + +-CASE AddArrayPropertyToPersonTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random DOUBLE[5] +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + +-CASE AddArrayPropertyToPersonTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random DOUBLE[5] +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + +-CASE AddStringPropertyToPersonTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddStringPropertyToPersonTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddStringPropertyToPersonTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING +---- ok +-STATEMENT Rollback +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + +-CASE AddStringPropertyToPersonTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING +---- ok +-STATEMENT Rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + + +-CASE AddListPropertyToPersonTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64[] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddListPropertyToPersonTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddListPropertyToPersonTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64[] +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + +-CASE AddListPropertyToPersonTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64[] +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + + +-CASE AddListOfStringPropertyToPersonTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddListOfStringPropertyToPersonTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddListOfStringPropertyToPersonTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[] +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + +-CASE AddListOfStringPropertyToPersonTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[] +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + + +-CASE AddListOfStructPropertyToPersonTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddListOfStructPropertyToPersonTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddListOfStructPropertyToPersonTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + +-CASE AddListOfStructPropertyToPersonTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + + +-CASE AddMapPropertyToPersonTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random MAP(STRING, INT64) +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddMapPropertyToPersonTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random MAP(STRING, INT64) +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddMapPropertyToPersonTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random MAP(STRING, INT64) +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + +-CASE AddMapPropertyToPersonTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random MAP(STRING, INT64) +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + +-CASE AddStructPropertyToPersonTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddStructPropertyToPersonTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + + +-CASE AddStructPropertyToPersonTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + +-CASE AddStructPropertyToPersonTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + +-CASE AddInt64PropertyToPersonTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64 default 21 +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +21 + +-CASE AddInt64PropertyToPersonTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64 default 21 +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +21 + +-CASE AddInt64PropertyToPersonTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64 default 21 +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddInt64PropertyToPersonTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64 default 21 +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddStringPropertyToPersonTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random String default 'long long string' +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +long long string + +-CASE AddStringPropertyToPersonTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random String default 'long long string' +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +long long string + +-CASE AddStringPropertyToPersonTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random String default 'long long string' +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddStringPropertyToPersonTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random String default 'long long string' +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddListOfInt64PropertyToPersonTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64[] default [142,123,789] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +[142,123,789] + +-CASE AddListOfInt64PropertyToPersonTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64[] default [142,123,789] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +[142,123,789] + +-CASE AddListOfInt64PropertyToPersonTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64[] default [142,123,789] +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddListOfInt64PropertyToPersonTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random INT64[] default [142,123,789] +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + + +-CASE AddListOfStringPropertyToPersonTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[] default ['142','short','long long long string'] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +[142,short,long long long string] + +-CASE AddListOfStringPropertyToPersonTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[] default ['142','short','long long long string'] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +[142,short,long long long string] + +-CASE AddListOfStringPropertyToPersonTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[] default ['142','short','long long long string'] +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + +-CASE AddListOfStringPropertyToPersonTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[] default ['142','short','long long long string'] +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- error +Binder exception: Cannot find property random for p. + + +-CASE AddListOfListOfStringPropertyToPersonTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[][] default [['142','51'],['short','long','123'],['long long long string','short short short short','short']] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random LIMIT 1 +---- 1 +[[142,51],[short,long,123],[long long long string,short short short short,short]] + +-CASE AddListOfListOfStringPropertyToPersonTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[][] default [['142','51'],['short','long','123'],['long long long string','short short short short','short']] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random LIMIT 1 +---- 1 +[[142,51],[short,long,123],[long long long string,short short short short,short]] + +-CASE AddListOfListOfStringPropertyToPersonTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[][] default [['142','51'],['short','long','123'],['long long long string','short short short short','short']] +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (p:person) return p.random LIMIT 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddListOfListOfStringPropertyToPersonTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRING[][] default [['142','51'],['short','long','123'],['long long long string','short short short short','short']] +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (p:person) return p.random LIMIT 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddListOfStructPropertyToPersonTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] default [{revenue: 144, ages: [3.200000,7.200000]}] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +[{revenue: 144, ages: [3.200000,7.200000]}] + +-CASE AddListOfStructPropertyToPersonTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] default [{revenue: 144, ages: [3.200000,7.200000]}] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +[{revenue: 144, ages: [3.200000,7.200000]}] + + +-CASE AddListOfStructPropertyToPersonTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] default [{revenue: 144, ages: [3.200000,7.200000]}] +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddListOfStructPropertyToPersonTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] default [{revenue: 144, ages: [3.200000,7.200000]}] +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddMapPropertyToPersonTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random MAP(STRING, INT64[]) default map(['key3'],[[3,2,1]]) +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +{key3=[3,2,1]} + +-CASE AddMapPropertyToPersonTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random MAP(STRING, INT64[]) default map(['key3'],[[3,2,1]]) +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +{key3=[3,2,1]} + +-CASE AddMapPropertyToPersonTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random MAP(STRING, INT64[]) default map(['key3'],[[3,2,1]]) +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddMapPropertyToPersonTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random MAP(STRING, INT64[]) default map(['key3'],[[3,2,1]]) +---- ok +-STATEMENT rollback_skip_checkpoint +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + + +-CASE AddStructPropertyToPersonTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) default {price: [5,3,2], volume: 24} +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +{price: [5,3,2], volume: 24} + +-CASE AddStructPropertyToPersonTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) default {price: [5,3,2], volume: 24} +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +{price: [5,3,2], volume: 24} + +-CASE AddStructPropertyToPersonTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) default {price: [5,3,2], volume: 24} +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddStructPropertyToPersonTableWithDefaultValueRollbackReovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) default {price: [5,3,2], volume: 24} +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- error +Binder exception: Cannot find property random for p. + +-CASE AddInt64PropertyToStudyAtTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64 +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddInt64PropertyToStudyAtTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64 +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddInt64PropertyToStudyAtTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64 +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddInt64PropertyToStudyAtTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64 +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + + + +-CASE AddSTRINGPropertyToStudyAtTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddSTRINGPropertyToStudyAtTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddSTRINGPropertyToStudyAtTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddSTRINGPropertyToStudyAtTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + + + +-CASE AddStringPropertyToStudyAtTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddStringPropertyToStudyAtTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + + +-CASE AddStringPropertyToStudyAtTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddStringPropertyToStudyAtTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + + + +-CASE AddListOfInt64PropertyToStudyAtTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64[] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddListOfInt64PropertyToStudyAtTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddListOfInt64PropertyToStudyAtTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64[] +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddListOfInt64PropertyToStudyAtTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64[] +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + + + +-CASE AddListOfStringPropertyToStudyAtTableWithoutDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddListOfStringPropertyToStudyAtTableWithoutDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + +-CASE AddListOfStringPropertyToStudyAtTableWithoutDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[] +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + + +-CASE AddListOfStringPropertyToStudyAtTableWithoutDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[] +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + + +-CASE AddInt64PropertyToStudyAtTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64 default 42 +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +42 +42 +42 + +-CASE AddInt64PropertyToStudyAtTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64 default 42 +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +42 +42 +42 + +-CASE AddInt64PropertyToStudyAtTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64 default 42 +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddInt64PropertyToStudyAtTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64 default 42 +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddStringPropertyToStudyAtTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random String default 'VERY SHORT STRING!!' +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +VERY SHORT STRING!! +VERY SHORT STRING!! +VERY SHORT STRING!! + + +-CASE AddStringPropertyToStudyAtTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random String default 'VERY SHORT STRING!!' +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +VERY SHORT STRING!! +VERY SHORT STRING!! +VERY SHORT STRING!! + +-CASE AddStringPropertyToStudyAtTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random String default 'VERY SHORT STRING!!' +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddStringPropertyToStudyAtTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random String default 'VERY SHORT STRING!!' +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddListOfINT64PropertyToStudyAtTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64[] default [5,6,7,1,3] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +[5,6,7,1,3] +[5,6,7,1,3] +[5,6,7,1,3] + +-CASE AddListOfINT64PropertyToStudyAtTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64[] default [5,6,7,1,3] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +[5,6,7,1,3] +[5,6,7,1,3] +[5,6,7,1,3] + +-CASE AddListOfINT64PropertyToStudyAtTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64[] default [5,6,7,1,3] +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddListOfINT64PropertyToStudyAtTableWithDefaultValueRollbackReovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random INT64[] default [5,6,7,1,3] +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddListOfStringPropertyToStudyAtTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[] default ['2','SHORT','SUPER LONG STRINGS'] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +[2,SHORT,SUPER LONG STRINGS] +[2,SHORT,SUPER LONG STRINGS] +[2,SHORT,SUPER LONG STRINGS] + + +-CASE AddListOfStringPropertyToStudyAtTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[] default ['2','SHORT','SUPER LONG STRINGS'] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +[2,SHORT,SUPER LONG STRINGS] +[2,SHORT,SUPER LONG STRINGS] +[2,SHORT,SUPER LONG STRINGS] + +-CASE AddListOfStringPropertyToStudyAtTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[] default ['2','SHORT','SUPER LONG STRINGS'] +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + + +-CASE AddListOfStringPropertyToStudyAtTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[] default ['2','SHORT','SUPER LONG STRINGS'] +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + + +-CASE AddListOfListOfStringPropertyToStudyAtTableWithDefaultValueRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[][] default [['hello','good','long long string test'],['6'],['very very long string']] +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +[[hello,good,long long string test],[6],[very very long string]] +[[hello,good,long long string test],[6],[very very long string]] +[[hello,good,long long string test],[6],[very very long string]] + +-CASE AddListOfListOfStringPropertyToStudyAtTableWithDefaultValueCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[][] default [['hello','good','long long string test'],['6'],['very very long string']] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- 3 +[[hello,good,long long string test],[6],[very very long string]] +[[hello,good,long long string test],[6],[very very long string]] +[[hello,good,long long string test],[6],[very very long string]] + +-CASE AddListOfListOfStringPropertyToStudyAtTableWithDefaultValueRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[][] default [['hello','good','long long string test'],['6'],['very very long string']] +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE AddListOfListOfStringPropertyToStudyAtTableWithDefaultValueRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE studyAt ADD random STRING[][] default [['hello','good','long long string test'],['6'],['very very long string']] +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- error +Binder exception: Cannot find property random for e. + +-CASE RenameTableRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person RENAME TO student +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (n:student) RETURN n +---- ok +-STATEMENT MATCH (n:person) RETURN n +---- error +Binder exception: Table person does not exist. + +-CASE RenameTableCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person RENAME TO student +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (n:student) RETURN n +---- ok +-STATEMENT MATCH (n:person) RETURN n +---- error +Binder exception: Table person does not exist. + +-CASE RenameTableRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person RENAME TO student +---- ok +-STATEMENT ROLLBACK +---- ok +-STATEMENT MATCH (n:person) RETURN n +---- ok +-STATEMENT MATCH (n:student) RETURN n +---- error +Binder exception: Table student does not exist. + +-CASE RenameTableRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person RENAME TO student +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (n:person) RETURN n +---- ok +-STATEMENT MATCH (n:student) RETURN n +---- error +Binder exception: Table student does not exist. + +-CASE RenamePropertyRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person RENAME fName TO name +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (n:person) RETURN n.name +---- ok +-STATEMENT MATCH (n:person) RETURN n.fName +---- error +Binder exception: Cannot find property fName for n. + + +-CASE RenamePropertyCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person RENAME fName TO name +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (n:person) RETURN n.name +---- ok +-STATEMENT MATCH (n:person) RETURN n.fName +---- error +Binder exception: Cannot find property fName for n. + +-CASE RenamePropertyRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person RENAME fName TO name +---- ok +-STATEMENT rollback +---- ok +-STATEMENT MATCH (n:person) RETURN n.fName +---- ok +-STATEMENT MATCH (n:person) RETURN n.name +---- error +Binder exception: Cannot find property name for n. + + +-CASE RenamePropertyRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT ALTER TABLE person RENAME fName TO name +---- ok +-STATEMENT ROLLBACK_SKIP_CHECKPOINT +---- ok +-STATEMENT MATCH (n:person) RETURN n.fName +---- ok +-STATEMENT MATCH (n:person) RETURN n.name +---- error +Binder exception: Cannot find property name for n. diff --git a/tools/java_api/src/test/java/com/kuzudb/test/PreparedStatementTest.java b/tools/java_api/src/test/java/com/kuzudb/test/PreparedStatementTest.java index 4fb6eaa341..3d2ded5b58 100644 --- a/tools/java_api/src/test/java/com/kuzudb/test/PreparedStatementTest.java +++ b/tools/java_api/src/test/java/com/kuzudb/test/PreparedStatementTest.java @@ -39,22 +39,4 @@ void PrepStmtGetErrorMessage() throws KuzuObjectRefDestroyedException { preparedStatement2.destroy(); } - @Test - void PrepStmtAllowActiveTransaction() throws KuzuObjectRefDestroyedException { - String query = "MATCH (a:person) WHERE a.isStudent = $1 RETURN COUNT(*)"; - KuzuPreparedStatement preparedStatement1 = conn.prepare(query); - assertNotNull(preparedStatement1); - assertTrue(preparedStatement1.isSuccess()); - assertTrue(preparedStatement1.allowActiveTransaction()); - preparedStatement1.destroy(); - - query = "create node table npytable (id INT64,i64 INT64[12],PRIMARY KEY(id));"; - KuzuPreparedStatement preparedStatement2 = conn.prepare(query); - assertNotNull(preparedStatement2); - assertTrue(preparedStatement2.isSuccess()); - assertFalse(preparedStatement2.allowActiveTransaction()); - preparedStatement2.destroy(); - } - - } From c5c60540c364fb4e08db7b549622fa69bac1ebbc Mon Sep 17 00:00:00 2001 From: hououou Date: Wed, 27 Mar 2024 12:59:30 -0400 Subject: [PATCH 2/3] fix clang --- src/include/storage/storage_manager.h | 1 - src/processor/operator/ddl/drop_table.cpp | 2 - src/storage/wal_replayer.cpp | 1 - .../transaction/ddl/create_copy.test | 65 +++++++++++++------ 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/include/storage/storage_manager.h b/src/include/storage/storage_manager.h index e3d4859c27..a65bb49053 100644 --- a/src/include/storage/storage_manager.h +++ b/src/include/storage/storage_manager.h @@ -60,7 +60,6 @@ class StorageManager { WAL* wal; bool enableCompression; common::VirtualFileSystem* vfs; - std::set deleteTables; }; } // namespace storage diff --git a/src/processor/operator/ddl/drop_table.cpp b/src/processor/operator/ddl/drop_table.cpp index 6e806c20f1..1527dfdfae 100644 --- a/src/processor/operator/ddl/drop_table.cpp +++ b/src/processor/operator/ddl/drop_table.cpp @@ -2,8 +2,6 @@ #include "catalog/catalog.h" #include "common/string_format.h" -#include "storage/storage_manager.h" -#include "storage/wal_replayer_utils.h" using namespace kuzu::catalog; using namespace kuzu::common; diff --git a/src/storage/wal_replayer.cpp b/src/storage/wal_replayer.cpp index fbf43f18b1..f01668e02c 100644 --- a/src/storage/wal_replayer.cpp +++ b/src/storage/wal_replayer.cpp @@ -3,7 +3,6 @@ #include "common/exception/storage.h" #include "storage/storage_manager.h" #include "storage/storage_utils.h" -#include "storage/store/node_table.h" #include "storage/wal_replayer_utils.h" #include "transaction/transaction.h" diff --git a/test/test_files/transaction/ddl/create_copy.test b/test/test_files/transaction/ddl/create_copy.test index 89fc56f805..6d823af437 100644 --- a/test/test_files/transaction/ddl/create_copy.test +++ b/test/test_files/transaction/ddl/create_copy.test @@ -81,26 +81,6 @@ Binder exception: Table User does not exist. ---- error Binder exception: Table User does not exist. - --CASE createCopyCommitErrorRollback --STATEMENT BEGIN TRANSACTION ----- ok --STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) ----- ok --STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) ----- ok --STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" ----- ok --STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv2" ----- error -Binder exception: No file found that matches the pattern: ${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv2. --STATEMENT COMMIT ----- ok --STATEMENT MATCH (u:User) WHERE u.name = 'Adam' RETURN u.age ----- error -Binder exception: Table User does not exist. - - -CASE copyRelCommit -STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) ---- ok @@ -178,3 +158,48 @@ Zhang -STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name ---- 0 +-CASE createCopyCommitErrorAutoRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv2" +---- error +Binder exception: No file found that matches the pattern: ${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv2. +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (u:User) WHERE u.name = 'Adam' RETURN u.age +---- error +Binder exception: Table User does not exist. + +-CASE copyRelCommitAfterRollback +-STATEMENT CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name)) +---- ok +-STATEMENT CREATE REL TABLE Follows(FROM User TO User, since INT64) +---- ok +-STATEMENT COPY User From "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/user.csv" +---- ok +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv" +---- ok +-STATEMENT Rollback +---- ok +-STATEMENT MATCH (u:User) WHERE u.name = 'Adam' RETURN u.age +---- ok +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 0 +-STATEMENT BEGIN TRANSACTION +---- ok +-STATEMENT COPY Follows FROM "${KUZU_ROOT_DIRECTORY}/dataset/demo-db/csv/follows.csv" +---- ok +-STATEMENT Commit +---- ok +-STATEMENT MATCH (u:User)-[r:Follows]->(u2:User) WHERE u.name = 'Adam' RETURN u2.name +---- 2 +Karissa +Zhang From 402d00995dfaff9d79056f12296f1e132f13cca6 Mon Sep 17 00:00:00 2001 From: hououou Date: Wed, 27 Mar 2024 22:38:02 -0400 Subject: [PATCH 3/3] add tests --- src/storage/wal_replayer.cpp | 44 +++++---- .../transaction/ddl/create_alter_table.test | 94 ++++++++++++++++++- .../transaction/ddl/create_drop_table.test | 94 ++++++++++++++++++- 3 files changed, 211 insertions(+), 21 deletions(-) diff --git a/src/storage/wal_replayer.cpp b/src/storage/wal_replayer.cpp index f01668e02c..e2ef64bf30 100644 --- a/src/storage/wal_replayer.cpp +++ b/src/storage/wal_replayer.cpp @@ -38,11 +38,25 @@ void WALReplayer::replay() { "Cannot checkpointInMemory WAL because last logged record is not a commit record."); } if (!wal->isEmptyWAL()) { - auto walIterator = wal->getIterator(); - WALRecord walRecord; - while (walIterator->hasNextRecord()) { - walIterator->getNextRecord(walRecord); - replayWALRecord(walRecord); + // for rollback, we should replay in reverse order. + if ((!isCheckpoint && !isRecovering)) { + auto walIterator = wal->getIterator(); + std::vector walRecords; + while (walIterator->hasNextRecord()) { + WALRecord walRecord; + walIterator->getNextRecord(walRecord); + walRecords.push_back(walRecord); + } + for (auto iter = walRecords.rbegin(); iter != walRecords.rend(); ++iter) { + replayWALRecord(*iter); + } + } else { + auto walIterator = wal->getIterator(); + WALRecord walRecord; + while (walIterator->hasNextRecord()) { + walIterator->getNextRecord(walRecord); + replayWALRecord(walRecord); + } } } // We next perform an in-memory checkpointing or rolling back of node/relTables. @@ -169,6 +183,7 @@ void WALReplayer::replayCreateTableRecord(const WALRecord& walRecord) { storageManager->dropTable(walRecord.createTableRecord.tableID); wal->getUpdatedTables().erase(walRecord.createTableRecord.tableID); } + // should recovery } void WALReplayer::replayRdfGraphRecord(const WALRecord& walRecord) { @@ -209,20 +224,11 @@ void WALReplayer::replayDropTableRecord(const WALRecord& walRecord) { if (isCheckpoint) { auto tableID = walRecord.dropTableRecord.tableID; if (!isRecovering) { - auto tableEntry = catalog->getTableCatalogEntry(&DUMMY_READ_TRANSACTION, tableID); - switch (tableEntry->getTableType()) { - case TableType::NODE: - case TableType::REL: { - storageManager->dropTable(tableID); - // TODO(Guodong): Do nothing for now. Should remove metaDA and reclaim free pages. - } break; - case TableType::RDF: { - // Do nothing. - } break; - default: { - KU_UNREACHABLE; - } - } + // we will not access rdf/rel_group tabletype + storageManager->dropTable(tableID); + // need to delete table id from wal, otherwise it will trigger in-memory + // checkpoint/rollback + wal->getUpdatedTables().erase(tableID); } else { if (!wal->isLastLoggedRecordCommit()) { // Nothing to undo. diff --git a/test/test_files/transaction/ddl/create_alter_table.test b/test/test_files/transaction/ddl/create_alter_table.test index 4a223aa82b..d95ddb1185 100644 --- a/test/test_files/transaction/ddl/create_alter_table.test +++ b/test/test_files/transaction/ddl/create_alter_table.test @@ -20,6 +20,12 @@ Binder exception: Cannot find property email for u. ] +-DEFINE_STATEMENT_BLOCK ALTER_NODE_TABLE_ONE_TX_ROLLBACK [ +-STATEMENT MATCH (u:User) return u.email +---- error +Binder exception: Table User does not exist. +] + -DEFINE_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT [ -STATEMENT MATCH (u:User) return u.email ---- ok @@ -37,6 +43,12 @@ Binder exception: Cannot find property email for u. Binder exception: Cannot find property email for e. ] +-DEFINE_STATEMENT_BLOCK ALTER_REL_TABLE_ONE_TX_ROLLBACK [ +-STATEMENT MATCH (u:User)-[e:Follow]->() return e.email +---- error +Binder exception: Table User does not exist. +] + -DEFINE_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT [ -STATEMENT MATCH (u:User)-[e:Follow]->() return e.email ---- ok @@ -114,4 +126,84 @@ Binder exception: Cannot find property email for e. -INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST -STATEMENT Rollback_skip_checkpoint ---- ok --INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_ROLLBACK \ No newline at end of file +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_ROLLBACK + + +-CASE createAlterTableOneTxCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT + +-CASE createAlterTableOneTxCommitRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT + +-CASE createAlterTableOneTxRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT +-STATEMENT Rollback +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_ONE_TX_ROLLBACK + +-CASE createAlterTableOneTxRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_COMMIT +-STATEMENT Rollback_Skip_Checkpoint +---- ok +-INSERT_STATEMENT_BLOCK ALTER_NODE_TABLE_ONE_TX_ROLLBACK + +-CASE createAlterRelTableOneTxCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT + +-CASE createAlterRelTableOneTxCommitRecovery +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT + +-CASE createAlterRelTableOneTxRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_COMMIT +-STATEMENT Rollback +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_ONE_TX_ROLLBACK + +-CASE createAlterRelTablOneTxeRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_TEST +-STATEMENT Rollback_skip_checkpoint +---- ok +-INSERT_STATEMENT_BLOCK ALTER_REL_TABLE_ONE_TX_ROLLBACK diff --git a/test/test_files/transaction/ddl/create_drop_table.test b/test/test_files/transaction/ddl/create_drop_table.test index f5db982d9e..aa0ccbd2ec 100644 --- a/test/test_files/transaction/ddl/create_drop_table.test +++ b/test/test_files/transaction/ddl/create_drop_table.test @@ -21,6 +21,12 @@ ---- 0 ] +-DEFINE_STATEMENT_BLOCK CREATE_DROP_TABLE_ONE_TX_ROLLBACK [ +-STATEMENT MATCH (u:User) return u.* +---- error +Binder exception: Table User does not exist. +] + -DEFINE_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT [ -STATEMENT MATCH (u:User) return u.* ---- error @@ -38,6 +44,12 @@ Binder exception: Table User does not exist. ---- 0 ] +-DEFINE_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_ONE_TX_ROLLBACK [ +-STATEMENT MATCH (u:User)-[:Follows]->() return u.* +---- error +Binder exception: Table User does not exist. +] + -DEFINE_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_COMMIT [ -STATEMENT MATCH (u:User)-[:Follows]->() return u.* ---- error @@ -117,4 +129,84 @@ Binder exception: Table Follows does not exist. -INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST -STATEMENT Rollback_SKIP_CHECKPOINT ---- ok --INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_ROLLBACK \ No newline at end of file +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_ROLLBACK + +-CASE createDropTableOneTxCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK DROP_TABLE_TEST +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT + +-CASE createDropTableOneTxCommitRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK DROP_TABLE_TEST +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT + +-CASE createDropTableOneTxRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK DROP_TABLE_TEST +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT +-STATEMENT Rollback +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_ONE_TX_ROLLBACK + +-CASE createDropTableOneTxRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK DROP_TABLE_TEST +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_COMMIT +-STATEMENT Rollback_skip_checkpoint +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_TABLE_ONE_TX_ROLLBACK + +-CASE createDropRelTableOneTxCommit +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST +-STATEMENT COMMIT +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_COMMIT + +-CASE createDropRelTableOneTxCommitRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_COMMIT + +-CASE createDropRelTableOneTxCommitRollback +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_COMMIT +-STATEMENT Rollback +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_ONE_TX_ROLLBACK + +-CASE createDropRelTableOneTxCommitRollbackRecovery +-STATEMENT BEGIN TRANSACTION +---- ok +-INSERT_STATEMENT_BLOCK CREATE_TABLE_TEST +-INSERT_STATEMENT_BLOCK DROP_REL_TABLE_TEST +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_COMMIT +-STATEMENT Rollback_SKIP_CHECKPOINT +---- ok +-INSERT_STATEMENT_BLOCK CREATE_DROP_REL_TABLE_ONE_TX_ROLLBACK