From edfcbe0fd8557c1baca36ca992c6fb81e924b803 Mon Sep 17 00:00:00 2001 From: Zuleykha Pavlichenkova Date: Thu, 30 Oct 2025 18:23:22 +0100 Subject: [PATCH 1/5] add PRAGMA STATEMENT --- src/include/statement_generator.hpp | 1 + src/statement_generator.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/include/statement_generator.hpp b/src/include/statement_generator.hpp index 57e8446..916170d 100644 --- a/src/include/statement_generator.hpp +++ b/src/include/statement_generator.hpp @@ -98,6 +98,7 @@ class StatementGenerator { unique_ptr GenerateComparison(); unique_ptr GeneratePositionalReference(); unique_ptr GenerateCase(); + unique_ptr GeneratePragma(); unique_ptr GenerateOrderBy(); unique_ptr GenerateOrderByAll(); diff --git a/src/statement_generator.cpp b/src/statement_generator.cpp index 455833b..4d03d59 100644 --- a/src/statement_generator.cpp +++ b/src/statement_generator.cpp @@ -21,6 +21,7 @@ #include "duckdb/parser/statement/detach_statement.hpp" #include "duckdb/parser/statement/insert_statement.hpp" #include "duckdb/parser/statement/multi_statement.hpp" +#include "duckdb/parser/statement/pragma_statement.hpp" #include "duckdb/parser/statement/select_statement.hpp" #include "duckdb/parser/statement/set_statement.hpp" #include "duckdb/parser/statement/update_statement.hpp" @@ -106,6 +107,9 @@ unique_ptr StatementGenerator::GenerateStatement() { if (RandomPercentage(60)) { return GenerateStatement(StatementType::DETACH_STATEMENT); } + if (RandomPercentage(50)) { + return GenerateStatement(StatementType::PRAGMA_STATEMENT); + } if (RandomPercentage(30)) { return GenerateStatement(StatementType::SET_STATEMENT); } @@ -130,6 +134,8 @@ unique_ptr StatementGenerator::GenerateStatement(StatementType typ return GenerateSet(); case StatementType::DELETE_STATEMENT: return GenerateDelete(); + case StatementType::PRAGMA_STATEMENT: + return GeneratePragma(); default: throw InternalException("Unsupported type"); } @@ -200,6 +206,26 @@ unique_ptr StatementGenerator::GenerateDelete() { return delete_statement; } +//===--------------------------------------------------------------------===// +// Generate Pragma +//===--------------------------------------------------------------------===// + +unique_ptr StatementGenerator::GeneratePragma() { + auto pragma_stmt = make_uniq(); + pragma_stmt->info = make_uniq(); + // getting a random pragma_function + if (!generator_context->pragma_functions.empty()) { + auto &entry = Choose(generator_context->pragma_functions).get(); + pragma_stmt->info->name = entry.name; + } else { + pragma_stmt->info->name = "enable_progress_bar"; + } + if (RandomPercentage(50)) { + pragma_stmt->info->parameters.push_back(GenerateConstant()); + } + return pragma_stmt; +} + //===--------------------------------------------------------------------===// // Generate Detach Info //===--------------------------------------------------------------------===// From 3418db489f4b2c634c3ab4a0cd3db4498ff2bf33 Mon Sep 17 00:00:00 2001 From: Zuleykha Pavlichenkova Date: Fri, 31 Oct 2025 13:57:13 +0100 Subject: [PATCH 2/5] add Copy statement to generator --- src/statement_generator.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/statement_generator.cpp b/src/statement_generator.cpp index 4d03d59..dbe3d46 100644 --- a/src/statement_generator.cpp +++ b/src/statement_generator.cpp @@ -116,6 +116,9 @@ unique_ptr StatementGenerator::GenerateStatement() { if (RandomPercentage(40)) { // 20 return GenerateStatement(StatementType::DELETE_STATEMENT); } + if (RandomPercentage(10)) { + return GenerateStatement(StatementType::COPY_DATABASE_STATEMENT); + } return GenerateStatement(StatementType::CREATE_STATEMENT); } @@ -136,6 +139,8 @@ unique_ptr StatementGenerator::GenerateStatement(StatementType typ return GenerateDelete(); case StatementType::PRAGMA_STATEMENT: return GeneratePragma(); + case StatementType::COPY_STATEMENT: + return GenerateCopy(); default: throw InternalException("Unsupported type"); } @@ -226,6 +231,20 @@ unique_ptr StatementGenerator::GeneratePragma() { return pragma_stmt; } +//===--------------------------------------------------------------------===// +// Copy Statement +//===--------------------------------------------------------------------===// + +unique_ptr StatementGenerator::GenerateCopyDatabase() { + auto copy_stmt = make_uniq(); + copy_stmt->info = make_uniq(); + // Choose from existing dbs and a new path + copy_stmt->info->source = GetRandomAttachedDataBase(); + copy_stmt->info->target = "db_" + RandomString(6); + copy_stmt->info->directory = TESTING_DIRECTORY_NAME; + return copy_stmt; +} + //===--------------------------------------------------------------------===// // Generate Detach Info //===--------------------------------------------------------------------===// From 9ccaa356887e2e2cd2f071d9944b2e2651003c60 Mon Sep 17 00:00:00 2001 From: Zuleykha Pavlichenkova Date: Fri, 31 Oct 2025 14:53:46 +0100 Subject: [PATCH 3/5] add copy database statement --- src/include/statement_generator.hpp | 1 + src/statement_generator.cpp | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/include/statement_generator.hpp b/src/include/statement_generator.hpp index 916170d..952fcef 100644 --- a/src/include/statement_generator.hpp +++ b/src/include/statement_generator.hpp @@ -99,6 +99,7 @@ class StatementGenerator { unique_ptr GeneratePositionalReference(); unique_ptr GenerateCase(); unique_ptr GeneratePragma(); + unique_ptr GenerateCopyDatabase(); unique_ptr GenerateOrderBy(); unique_ptr GenerateOrderByAll(); diff --git a/src/statement_generator.cpp b/src/statement_generator.cpp index dbe3d46..929c249 100644 --- a/src/statement_generator.cpp +++ b/src/statement_generator.cpp @@ -17,6 +17,8 @@ #include "duckdb/parser/query_node/set_operation_node.hpp" #include "duckdb/parser/statement/attach_statement.hpp" #include "duckdb/parser/statement/create_statement.hpp" +#include "duckdb/parser/statement/copy_statement.hpp" +#include "duckdb/parser/statement/copy_database_statement.hpp" #include "duckdb/parser/statement/delete_statement.hpp" #include "duckdb/parser/statement/detach_statement.hpp" #include "duckdb/parser/statement/insert_statement.hpp" @@ -117,7 +119,7 @@ unique_ptr StatementGenerator::GenerateStatement() { return GenerateStatement(StatementType::DELETE_STATEMENT); } if (RandomPercentage(10)) { - return GenerateStatement(StatementType::COPY_DATABASE_STATEMENT); + return GenerateCopyDatabase(); } return GenerateStatement(StatementType::CREATE_STATEMENT); } @@ -139,8 +141,8 @@ unique_ptr StatementGenerator::GenerateStatement(StatementType typ return GenerateDelete(); case StatementType::PRAGMA_STATEMENT: return GeneratePragma(); - case StatementType::COPY_STATEMENT: - return GenerateCopy(); + case StatementType::COPY_DATABASE_STATEMENT: + return GenerateCopyDatabase(); default: throw InternalException("Unsupported type"); } @@ -232,17 +234,14 @@ unique_ptr StatementGenerator::GeneratePragma() { } //===--------------------------------------------------------------------===// -// Copy Statement +// Copy Database Statement //===--------------------------------------------------------------------===// unique_ptr StatementGenerator::GenerateCopyDatabase() { - auto copy_stmt = make_uniq(); - copy_stmt->info = make_uniq(); - // Choose from existing dbs and a new path - copy_stmt->info->source = GetRandomAttachedDataBase(); - copy_stmt->info->target = "db_" + RandomString(6); - copy_stmt->info->directory = TESTING_DIRECTORY_NAME; - return copy_stmt; + auto from_db = GetRandomAttachedDataBase(); + auto to_db = string("db_") + RandomString(6); + auto mode = RandomPercentage(50) ? CopyDatabaseType::COPY_SCHEMA : CopyDatabaseType::COPY_DATA; + return make_uniq(std::move(from_db), std::move(to_db), mode); } //===--------------------------------------------------------------------===// From 26fb2a8efe3323b54a36b1fd160fb71483008014 Mon Sep 17 00:00:00 2001 From: Zuleykha Pavlichenkova Date: Mon, 3 Nov 2025 17:13:24 +0100 Subject: [PATCH 4/5] start adding explain statement --- src/include/statement_generator.hpp | 1 + src/statement_generator.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/include/statement_generator.hpp b/src/include/statement_generator.hpp index 952fcef..2d8f9e4 100644 --- a/src/include/statement_generator.hpp +++ b/src/include/statement_generator.hpp @@ -100,6 +100,7 @@ class StatementGenerator { unique_ptr GenerateCase(); unique_ptr GeneratePragma(); unique_ptr GenerateCopyDatabase(); + unique_ptr GenerateExplain(); unique_ptr GenerateOrderBy(); unique_ptr GenerateOrderByAll(); diff --git a/src/statement_generator.cpp b/src/statement_generator.cpp index 929c249..5dcebf4 100644 --- a/src/statement_generator.cpp +++ b/src/statement_generator.cpp @@ -13,6 +13,7 @@ #include "duckdb/parser/parsed_data/create_type_info.hpp" #include "duckdb/parser/parsed_data/create_view_info.hpp" #include "duckdb/parser/parsed_expression_iterator.hpp" +#include "duckdb/parser/statement/explain_statement.hpp" #include "duckdb/parser/query_node/select_node.hpp" #include "duckdb/parser/query_node/set_operation_node.hpp" #include "duckdb/parser/statement/attach_statement.hpp" @@ -121,6 +122,9 @@ unique_ptr StatementGenerator::GenerateStatement() { if (RandomPercentage(10)) { return GenerateCopyDatabase(); } + if (RandomPercentage(20)) { + return GenerateStatement(StatementType::EXPLAIN_STATEMENT); + } return GenerateStatement(StatementType::CREATE_STATEMENT); } @@ -143,6 +147,8 @@ unique_ptr StatementGenerator::GenerateStatement(StatementType typ return GeneratePragma(); case StatementType::COPY_DATABASE_STATEMENT: return GenerateCopyDatabase(); + case StatementType::EXPLAIN_STATEMENT: + return GenerateExplain(); default: throw InternalException("Unsupported type"); } @@ -244,6 +250,17 @@ unique_ptr StatementGenerator::GenerateCopyDatabase() { return make_uniq(std::move(from_db), std::move(to_db), mode); } +//===--------------------------------------------------------------------===// +// Explain Statement +//===--------------------------------------------------------------------===// + +unique_ptr StatementGenerator::GenerateExplain() { + auto stmt = make_uniq(); + stmt->stmt = GenerateStatement(); + // TODO: stmt->explain_type / analyze etc + return stmt; +} + //===--------------------------------------------------------------------===// // Generate Detach Info //===--------------------------------------------------------------------===// From 3513566502e1eaa749452eaa7c5776eb895769e7 Mon Sep 17 00:00:00 2001 From: Zuleykha Pavlichenkova Date: Mon, 3 Nov 2025 17:36:28 +0100 Subject: [PATCH 5/5] make in generate explain statement with Select and some other statement types --- src/statement_generator.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/statement_generator.cpp b/src/statement_generator.cpp index 5dcebf4..1e967e2 100644 --- a/src/statement_generator.cpp +++ b/src/statement_generator.cpp @@ -255,10 +255,22 @@ unique_ptr StatementGenerator::GenerateCopyDatabase() { //===--------------------------------------------------------------------===// unique_ptr StatementGenerator::GenerateExplain() { - auto stmt = make_uniq(); - stmt->stmt = GenerateStatement(); - // TODO: stmt->explain_type / analyze etc - return stmt; + unique_ptr payload; + if (RandomPercentage(70)) { + payload = GenerateStatement(StatementType::SELECT_STATEMENT); + } else { + payload = GenerateStatement(Choose({ + StatementType::DELETE_STATEMENT, + StatementType::UPDATE_STATEMENT, + StatementType::CREATE_STATEMENT + })); + } + auto stmt = make_uniq( + std::move(payload), + ExplainType::EXPLAIN_STANDARD, + ExplainFormat::DEFAULT + ); + return stmt; } //===--------------------------------------------------------------------===//