From 826f6fd4c6b098475ace839e54777f696c032738 Mon Sep 17 00:00:00 2001 From: Guodong Jin Date: Thu, 11 Apr 2024 23:17:59 +0800 Subject: [PATCH] Rewrite transaction copy/ddl tests as end to end tests (#3255) --- test/CMakeLists.txt | 2 - test/copy/CMakeLists.txt | 1 - test/copy/e2e_copy_transaction_test.cpp | 185 ----- test/ddl/CMakeLists.txt | 1 - test/ddl/e2e_ddl_test.cpp | 476 ------------ test/test_files/transaction/copy/copy.test | 93 +++ .../{create_macro => ddl}/create_macro.test | 0 test/test_files/transaction/ddl/ddl.test | 733 ++++++++++++++++++ 8 files changed, 826 insertions(+), 665 deletions(-) delete mode 100644 test/copy/CMakeLists.txt delete mode 100644 test/copy/e2e_copy_transaction_test.cpp delete mode 100644 test/ddl/CMakeLists.txt delete mode 100644 test/ddl/e2e_ddl_test.cpp create mode 100644 test/test_files/transaction/copy/copy.test rename test/test_files/transaction/{create_macro => ddl}/create_macro.test (100%) create mode 100644 test/test_files/transaction/ddl/ddl.test diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a4f3c51010..9988e06d50 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,5 +18,3 @@ add_subdirectory(runner) add_subdirectory(storage) add_subdirectory(transaction) add_subdirectory(util_tests) -add_subdirectory(ddl) -add_subdirectory(copy) diff --git a/test/copy/CMakeLists.txt b/test/copy/CMakeLists.txt deleted file mode 100644 index 27570d7965..0000000000 --- a/test/copy/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_kuzu_test(e2e_copy_csv_transaction_test e2e_copy_transaction_test.cpp) diff --git a/test/copy/e2e_copy_transaction_test.cpp b/test/copy/e2e_copy_transaction_test.cpp deleted file mode 100644 index 34a286ffd9..0000000000 --- a/test/copy/e2e_copy_transaction_test.cpp +++ /dev/null @@ -1,185 +0,0 @@ -#include - -#include "binder/bound_statement_result.h" -#include "catalog/catalog.h" -#include "graph_test/graph_test.h" -#include "processor/plan_mapper.h" -#include "processor/processor.h" -#include "storage/storage_manager.h" -#include "transaction/transaction.h" - -using namespace kuzu::catalog; -using namespace kuzu::common; -using namespace kuzu::main; -using namespace kuzu::processor; -using namespace kuzu::storage; -using namespace kuzu::testing; -using namespace kuzu::transaction; - -namespace kuzu { -namespace testing { - -class TinySnbCopyCSVTransactionTest : public EmptyDBTest { - -public: - void SetUp() override { - EmptyDBTest::SetUp(); - createDBAndConn(); - catalog = getCatalog(*database); - profiler = std::make_unique(); - executionContext = - std::make_unique(profiler.get(), getClientContext(*conn)); - } - - void initWithoutLoadingGraph() { - createDBAndConn(); - catalog = getCatalog(*database); - } - - void validateTinysnbPersonAgeProperty() { - std::multiset> expectedResult = {20, 20, 25, 30, 35, 40, 45, 83}; - std::multiset> actualResult; - auto queryResult = conn->query("match (p:person) return p.age"); - while (queryResult->hasNext()) { - auto tuple = queryResult->getNext(); - actualResult.insert(tuple->getValue(0)->getValue()); - } - ASSERT_EQ(expectedResult, actualResult); - } - - void validateDatabaseStateBeforeCheckPointCopyNode(table_id_t tableID) { - ASSERT_EQ(std::make_unique(database.get()) - ->query("MATCH (p:person) return *") - ->getNumTuples(), - 0); - ASSERT_EQ(getStorageManager(*database)->getNodesStatisticsAndDeletedIDs()->getMaxNodeOffset( - &transaction::DUMMY_READ_TRANSACTION, tableID), - UINT64_MAX); - } - - void validateDatabaseStateAfterCheckPointCopyNode(table_id_t tableID) { - validateTinysnbPersonAgeProperty(); - ASSERT_EQ(getStorageManager(*database)->getNodesStatisticsAndDeletedIDs()->getMaxNodeOffset( - &transaction::DUMMY_READ_TRANSACTION, tableID), - 7); - } - - void copyNodeCSVCommitAndRecoveryTest(TransactionTestType transactionTestType) { - conn->query(createPersonTableCMD); - auto preparedStatement = conn->getClientContext()->prepareTest(copyPersonTableCMD); - if (!preparedStatement->success) { - ASSERT_TRUE(false) << preparedStatement->errMsg; - } - 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()); - auto tableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, "person"); - validateDatabaseStateBeforeCheckPointCopyNode(tableID); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - validateDatabaseStateBeforeCheckPointCopyNode(tableID); - physicalPlan.reset(); - initWithoutLoadingGraph(); - validateDatabaseStateAfterCheckPointCopyNode(tableID); - } else { - conn->query("COMMIT"); - validateDatabaseStateAfterCheckPointCopyNode(tableID); - } - } - - void validateTinysnbKnowsDateProperty() { - std::multiset> expectedResult = { - Date::fromCString("2021-06-30", strlen("2021-06-30")), - Date::fromCString("2021-06-30", strlen("2021-06-30")), - Date::fromCString("2021-06-30", strlen("2021-06-30")), - Date::fromCString("2021-06-30", strlen("2021-06-30")), - Date::fromCString("1950-05-14", strlen("1950-05-14")), - Date::fromCString("1950-05-14", strlen("1950-05-14"))}; - std::multiset> actualResult; - auto queryResult = conn->query("match (:person)-[e:knows]->(:person) return e.date"); - while (queryResult->hasNext()) { - auto tuple = queryResult->getNext(); - actualResult.insert(tuple->getValue(0)->getValue()); - } - ASSERT_EQ(expectedResult, actualResult); - } - - void validateDatabaseStateBeforeCheckPointCopyRel(table_id_t tableID) { - auto dummyWriteTrx = transaction::Transaction::getDummyWriteTrx(); - ASSERT_EQ(getStorageManager(*database)->getRelsStatistics()->getNextRelOffset( - dummyWriteTrx.get(), tableID), - 6); - } - - void validateDatabaseStateAfterCheckPointCopyRel(table_id_t knowsTableID) { - validateTinysnbKnowsDateProperty(); - auto relsStatistics = getStorageManager(*database)->getRelsStatistics(); - auto dummyWriteTrx = transaction::Transaction::getDummyWriteTrx(); - ASSERT_EQ(relsStatistics->getNextRelOffset(dummyWriteTrx.get(), knowsTableID), 6); - ASSERT_EQ(relsStatistics->getReadOnlyVersion()->tableStatisticPerTable.size(), 1); - auto knowsRelStatistics = (RelTableStats*)relsStatistics->getReadOnlyVersion() - ->tableStatisticPerTable.at(knowsTableID) - .get(); - ASSERT_EQ(knowsRelStatistics->getNumTuples(), 6); - } - - void copyRelCSVCommitAndRecoveryTest(TransactionTestType transactionTestType) { - conn->query(createPersonTableCMD); - conn->query(copyPersonTableCMD); - conn->query(createKnowsTableCMD); - auto preparedStatement = conn->getClientContext()->prepareTest(copyKnowsTableCMD); - 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()); - auto tableID = catalog->getTableID(&DUMMY_READ_TRANSACTION, "knows"); - validateDatabaseStateBeforeCheckPointCopyRel(tableID); - if (transactionTestType == TransactionTestType::RECOVERY) { - conn->query("COMMIT_SKIP_CHECKPOINT"); - validateDatabaseStateBeforeCheckPointCopyRel(tableID); - physicalPlan.reset(); - initWithoutLoadingGraph(); - validateDatabaseStateAfterCheckPointCopyRel(tableID); - } else { - conn->query("COMMIT"); - validateDatabaseStateAfterCheckPointCopyRel(tableID); - } - } - - Catalog* catalog = nullptr; - std::string createPersonTableCMD = - "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))"; - std::string copyPersonTableCMD = - "COPY person FROM \"" + - TestHelper::appendKuzuRootPath("dataset/tinysnb/vPerson.csv\" (HEADER=true)"); - std::string createKnowsTableCMD = - "create rel table knows (FROM person TO person, date DATE, meetTime TIMESTAMP, " - "validInterval INTERVAL, comments STRING[], summary STRUCT(locations STRING[], transfer " - "STRUCT(day DATE, amount INT64[])), notes UNION(firstmet DATE, type INT16, comment " - "STRING), someMap MAP(STRING, STRING), MANY_MANY);"; - std::string copyKnowsTableCMD = - "COPY knows FROM \"" + TestHelper::appendKuzuRootPath("dataset/tinysnb/eKnows.csv\""); - std::unique_ptr profiler; - std::unique_ptr executionContext; -}; - -TEST_F(TinySnbCopyCSVTransactionTest, CopyNodeCommitRecovery) { - copyNodeCSVCommitAndRecoveryTest(TransactionTestType::RECOVERY); -} - -TEST_F(TinySnbCopyCSVTransactionTest, CopyRelCommitRecovery) { - copyRelCSVCommitAndRecoveryTest(TransactionTestType::RECOVERY); -} - -} // namespace testing -} // namespace kuzu 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 ce756460da..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->getClientContext()->prepareTest(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/transaction/copy/copy.test b/test/test_files/transaction/copy/copy.test new file mode 100644 index 0000000000..01e99f54c0 --- /dev/null +++ b/test/test_files/transaction/copy/copy.test @@ -0,0 +1,93 @@ +-GROUP TinySnbCopyCSVTransactionTest +-DATASET CSV empty +-- + +-CASE CopyNodeCommit +-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 COPY person FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/vPerson.csv" (HEADER=true) +---- ok +-STATEMENT COMMIT; +---- ok +-STATEMENT MATCH (p:person) return count(p); +---- 1 +8 +-STATEMENT MATCH (p:person) return p.age; +---- 8 +20 +20 +25 +30 +35 +40 +45 +83 + +-CASE CopyNodeCommitRecovery +-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 COPY person FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/vPerson.csv" (HEADER=true) +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT; +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return count(p); +---- 1 +8 +-STATEMENT MATCH (p:person) return p.age; +---- 8 +20 +20 +25 +30 +35 +40 +45 +83 + +-CASE CopyRelCommit +-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 COPY person FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/vPerson.csv" (HEADER=true) +---- ok +-STATEMENT create rel table knows (FROM person TO person, date DATE, meetTime TIMESTAMP, validInterval INTERVAL, comments STRING[], summary STRUCT(locations STRING[], transfer STRUCT(day DATE, amount INT64[])), notes UNION(firstmet DATE, type INT16, comment STRING), someMap MAP(STRING, STRING), MANY_MANY); +---- ok +-STATEMENT COPY knows FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/eKnows.csv" +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:knows]->(:person) RETURN COUNT(e); +---- 1 +6 +-STATEMENT MATCH (:person)-[e:knows]->(:person) return e.date; +---- 6 +2021-06-30 +2021-06-30 +2021-06-30 +2021-06-30 +1950-05-14 +1950-05-14 + +-CASE CopyRelCommitRecovery +-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 COPY person FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/vPerson.csv" (HEADER=true) +---- ok +-STATEMENT create rel table knows (FROM person TO person, date DATE, meetTime TIMESTAMP, validInterval INTERVAL, comments STRING[], summary STRUCT(locations STRING[], transfer STRUCT(day DATE, amount INT64[])), notes UNION(firstmet DATE, type INT16, comment STRING), someMap MAP(STRING, STRING), MANY_MANY); +---- ok +-STATEMENT COPY knows FROM "${KUZU_ROOT_DIRECTORY}/dataset/tinysnb/eKnows.csv" +---- ok +-STATEMENT COMMIT_SKIP_CHECKPOINT +---- ok +-RELOADDB +-STATEMENT MATCH (:person)-[e:knows]->(:person) RETURN COUNT(e); +---- 1 +6 +-STATEMENT MATCH (:person)-[e:knows]->(:person) return e.date; +---- 6 +2021-06-30 +2021-06-30 +2021-06-30 +2021-06-30 +1950-05-14 +1950-05-14 diff --git a/test/test_files/transaction/create_macro/create_macro.test b/test/test_files/transaction/ddl/create_macro.test similarity index 100% rename from test/test_files/transaction/create_macro/create_macro.test rename to test/test_files/transaction/ddl/create_macro.test diff --git a/test/test_files/transaction/ddl/ddl.test b/test/test_files/transaction/ddl/ddl.test new file mode 100644 index 0000000000..e29b6c402f --- /dev/null +++ b/test/test_files/transaction/ddl/ddl.test @@ -0,0 +1,733 @@ +-GROUP TinySnbDDLTest +-DATASET CSV tinysnb +-- + + +-CASE CreateNodeTableCommitRecovery +-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 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 CreateRelTableCommitRecovery +-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 CREATE REL TABLE likes(FROM person TO organisation, RATING INT64, MANY_ONE) +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH ()-[r:likes]->() RETURN r +---- ok + + +-CASE DropNodeTableCommitRecovery +-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 DROP TABLE movies +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (n:movies) RETURN n +---- error +Binder exception: Table movies does not exist. + + +-CASE DropRelTableCommitRecovery +-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 DROP TABLE knows +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (n)-[:knows]->(r) RETURN n +---- error +Binder exception: Table knows does not exist. + + +-CASE DropNodeTablePropertyRecovery +-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 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 DropRelTablePropertyRecovery +-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 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 AddInt64PropertyToPersonTableWithoutDefaultValueRecovery +-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 ALTER TABLE person ADD random INT64 +---- ok +-STATEMENT COMMIT +---- ok +-RELOADDB +-STATEMENT MATCH (p:person) return Count(p.random) +---- 1 +0 + +-CASE AddArrayPropertyToPersonTableWithoutDefaultValueRecovery +-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 ALTER TABLE person ADD random DOUBLE[5] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return Count(p.random) +---- 1 +0 + +-CASE AddStringPropertyToPersonTableWithoutDefaultValueRecovery +-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 ALTER TABLE person ADD random STRING +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + +-CASE AddListPropertyToPersonTableWithoutDefaultValueRecovery +-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 ALTER TABLE person ADD random INT64[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + + +-CASE AddListOfStringPropertyToPersonTableWithoutDefaultValueRecovery +-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 ALTER TABLE person ADD random STRING[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + + +-CASE AddListOfStructPropertyToPersonTableWithoutDefaultValueRecovery + +-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 ALTER TABLE person ADD random STRUCT(revenue int64, ages double[])[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + + +-CASE AddMapPropertyToPersonTableWithoutDefaultValueRecovery + +-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 ALTER TABLE person ADD random MAP(STRING, INT64) +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + + +-CASE AddStructPropertyToPersonTableWithoutDefaultValueRecovery + +-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 ALTER TABLE person ADD random STRUCT(price INT64[], volume INT64) +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random +---- ok + + +-CASE AddInt64PropertyToPersonTableWithDefaultValueRecovery + +-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 ALTER TABLE person ADD random INT64 default 21 +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (p:person) return p.random limit 1 +---- 1 +21 + + +-CASE AddStringPropertyToPersonTableWithDefaultValueRecovery + +-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 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 AddListOfInt64PropertyToPersonTableWithDefaultValueRecovery + +-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 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 AddListOfStringPropertyToPersonTableWithDefaultValueRecovery + +-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 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 AddListOfListOfStringPropertyToPersonTableWithDefaultValueRecovery + +-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 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 AddListOfStructPropertyToPersonTableWithDefaultValueRecovery + +-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 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 AddMapPropertyToPersonTableWithDefaultValueRecovery + +-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 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 AddStructPropertyToPersonTableWithDefaultValueRecovery + +-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 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 AddInt64PropertyToStudyAtTableWithoutDefaultValueRecovery + +-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 ALTER TABLE studyAt ADD random INT64 +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + + +-CASE AddSTRINGPropertyToStudyAtTableWithoutDefaultValueRecovery + +-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 ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + + +-CASE AddStringPropertyToStudyAtTableWithoutDefaultValueRecovery + +-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 ALTER TABLE studyAt ADD random STRING +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + + +-CASE AddListOfInt64PropertyToStudyAtTableWithoutDefaultValueRecovery + +-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 ALTER TABLE studyAt ADD random INT64[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + + +-CASE AddListOfStringPropertyToStudyAtTableWithoutDefaultValueRecovery + +-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 ALTER TABLE studyAt ADD random STRING[] +---- ok +-STATEMENT COMMIT +---- ok +-STATEMENT MATCH (:person)-[e:studyAt]->(:organisation) return e.random +---- ok + + +-CASE AddInt64PropertyToStudyAtTableWithDefaultValueRecovery + +-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 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 AddStringPropertyToStudyAtTableWithDefaultValueRecovery + +-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 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 AddListOfINT64PropertyToStudyAtTableWithDefaultValueRecovery + +-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 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 AddListOfStringPropertyToStudyAtTableWithDefaultValueRecovery + +-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 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 AddListOfListOfStringPropertyToStudyAtTableWithDefaultValueRecovery + +-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 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 RenameTableRecovery + +-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 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 RenamePropertyRecovery + +-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 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.