1#include "catch.hpp"
2#include "duckdb/common/file_system.hpp"
3#include "test_helpers.hpp"
4#include "duckdb/storage/storage_info.hpp"
5
6#include <fstream>
7
8using namespace duckdb;
9using namespace std;
10
11TEST_CASE("Test repeated load and checkpoint of storage", "[storage][.]") {
12 unique_ptr<MaterializedQueryResult> result;
13 auto storage_database = TestCreatePath("repeated_load");
14 auto csv_file = TestCreatePath("rload.csv");
15 auto config = GetTestConfig();
16
17 vector<string> model{"M11", "F22", "U33"};
18 vector<string> shop{"www.goodshop.com", "www.badshop.com"};
19 vector<string> name{"Electronics Something One", "Electronics Something Two",
20 "Electronics Something Three", "Electronics Something Four",
21 "Electronics Something Five", "Electronics Something Six",
22 "Electronics Something Seven", "Electronics Something Eight",
23 "Electronics Something Nine", "Electronics Something Ten"};
24 vector<string> brand{"AAAAA", "BBBBB", "CCCC", "DDDDDD", "PPPP"};
25 vector<string> color{"violet", "indigo", "blue", "green", "yellow", "orange", "red"};
26 idx_t row_count = 1000;
27
28 DeleteDatabase(storage_database);
29 for (idx_t counter = 0; counter < 100; counter++) {
30 DuckDB db(storage_database);
31 Connection con(db);
32
33 if (counter > 0) {
34 result = con.Query("SELECT COUNT(*) FROM pdata");
35 REQUIRE(CHECK_COLUMN(result, 0, {Value::BIGINT(counter * row_count)}));
36 }
37 // generate the csv file
38 ofstream csv_writer(csv_file);
39 for (idx_t i = 0; i < row_count; i++) {
40 idx_t z = i + counter;
41 idx_t record_id = i + (row_count * counter);
42 csv_writer << record_id << "|";
43 csv_writer << i % 99 << "|";
44 csv_writer << shop[z % 2] << "|";
45 csv_writer << "electronics"
46 << "|";
47 csv_writer << name[z % 10] << "|";
48 csv_writer << brand[z % 5] << "|";
49 csv_writer << color[z % 7] << "|";
50 csv_writer << model[z % 3] << "|";
51 csv_writer << "\n";
52 }
53 csv_writer.close();
54 // create and load the table
55 REQUIRE_NO_FAIL(
56 con.Query("CREATE TABLE IF NOT EXISTS pdata (record_id BIGINT PRIMARY KEY , price DOUBLE, shop VARCHAR, "
57 "category VARCHAR, name VARCHAR, brand VARCHAR, color VARCHAR, model VARCHAR);"));
58 REQUIRE_NO_FAIL(con.Query("COPY pdata(record_id,price,shop,category,name,brand,color,model) FROM '" + csv_file +
59 "' ( DELIMITER '|' );"));
60 result = con.Query("SELECT MIN(record_id), MIN(price), MIN(shop), MIN(category), MIN(name), MIN(brand), "
61 "MIN(color), MIN(model) FROM pdata");
62 REQUIRE(CHECK_COLUMN(result, 0, {0}));
63 REQUIRE(CHECK_COLUMN(result, 1, {0}));
64 REQUIRE(CHECK_COLUMN(result, 2, {"www.badshop.com"}));
65 REQUIRE(CHECK_COLUMN(result, 3, {"electronics"}));
66 REQUIRE(CHECK_COLUMN(result, 4, {"Electronics Something Eight"}));
67 REQUIRE(CHECK_COLUMN(result, 5, {"AAAAA"}));
68 REQUIRE(CHECK_COLUMN(result, 6, {"blue"}));
69 REQUIRE(CHECK_COLUMN(result, 7, {"F22"}));
70
71 result = con.Query("SELECT COUNT(*) FROM pdata");
72 REQUIRE(CHECK_COLUMN(result, 0, {Value::BIGINT((counter + 1) * row_count)}));
73 }
74}
75