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+
157173static 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