Skip to content

Commit ae901d3

Browse files
committed
Create PreparedStatement to execute query
1 parent 16f2404 commit ae901d3

File tree

1 file changed

+23
-1
lines changed

1 file changed

+23
-1
lines changed

src/serialize_queries_plans.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <duckdb/common/serializer/binary_serializer.hpp>
1717
#include <duckdb/common/serializer/memory_stream.hpp>
1818
#include <duckdb/common/types/uuid.hpp>
19+
#include <duckdb/main/prepared_statement_data.hpp>
1920
#include <duckdb/parser/parser.hpp>
2021
#include <duckdb/parser/parsed_data/transaction_info.hpp>
2122
#include <duckdb/parser/statement/logical_plan_statement.hpp>
@@ -154,6 +155,21 @@ void LoadSQLLogicQueries(FileSystem &fs, const std::string &input_file, vector<S
154155
}
155156
}
156157

158+
shared_ptr<PreparedStatementData> CreatePreparedStatement(Planner &planner, unique_ptr<SQLStatement> statement) {
159+
auto result = make_shared_ptr<PreparedStatementData>(statement->type);
160+
result->unbound_statement = std::move(statement);
161+
result->names = std::move(planner.names);
162+
result->types = std::move(planner.types);
163+
result->properties = std::move(planner.properties);
164+
165+
// TODO Optimize?
166+
167+
// Create physical plan
168+
PhysicalPlanGenerator physical_planner(planner.context);
169+
result->physical_plan = physical_planner.Plan(std::move(planner.plan));
170+
return result;
171+
}
172+
157173
static void SerializeQueryStatements(Connection &con, BinarySerializer &serializer, SQLLogicQuery &slq,
158174
TUStorageExtensionInfo &state, Parser &parser,
159175
TestDrivenTransactionState &test_driven_transaction_state) {
@@ -176,6 +192,7 @@ static void SerializeQueryStatements(Connection &con, BinarySerializer &serializ
176192

177193
Planner planner(*con.context);
178194
bool plan_created = false;
195+
auto statement_copy = statement->Copy();
179196
try {
180197
planner.CreatePlan(std::move(statement));
181198
plan_created = !!planner.plan;
@@ -251,7 +268,12 @@ static void SerializeQueryStatements(Connection &con, BinarySerializer &serializ
251268
// If we can deserialize the plan, we execute it
252269
type = planner.plan->type;
253270
planner.plan->ResolveOperatorTypes();
254-
result = con.context->Query(make_uniq<LogicalPlanStatement>(std::move(planner.plan)), false);
271+
272+
auto prepared = CreatePreparedStatement(planner, std::move(statement_copy));
273+
274+
// Execute the prepared statement
275+
case_insensitive_map_t<BoundParameterData> empty_params;
276+
result = con.context->Execute(query, prepared, empty_params);
255277
} else {
256278
result = con.context->Query(query, false);
257279
}

0 commit comments

Comments
 (0)