1313#include " duckdb/function/table_function.hpp"
1414#include " duckdb/main/extension_util.hpp"
1515#include " duckdb/common/file_system.hpp"
16+ #include " duckdb/storage/object_cache.hpp"
1617
1718#include " concurrentqueue.h"
1819
2223#include " vortex_scan.hpp"
2324#include " vortex_common.hpp"
2425#include " vortex_expr.hpp"
26+ #include " vortex_session.hpp"
2527
2628using namespace duckdb ;
2729
@@ -31,6 +33,9 @@ namespace vortex {
3133// / file and its schema. This data is populated during the bind phase, which
3234// / happens during the query planning phase.
3335struct BindData : public TableFunctionData {
36+ // Session used to caching
37+ shared_ptr<VortexSession> session;
38+
3439 shared_ptr<MultiFileList> file_list;
3540 vector<LogicalType> columns_types;
3641 vector<string> column_names;
@@ -182,12 +187,12 @@ std::string EnsureFileProtocol(FileSystem &fs, const std::string &path) {
182187 return prefix + absolute_path;
183188}
184189
185- static unique_ptr<FileReader> OpenFile (const std::string &filename, vector<LogicalType> &column_types ,
186- vector<string> &column_names) {
190+ static unique_ptr<FileReader> OpenFile (const std::string &filename, VortexSession &session ,
191+ vector<LogicalType> &column_types, vector< string> &column_names) {
187192 vx_file_open_options options {
188193 .uri = filename.c_str (), .property_keys = nullptr , .property_vals = nullptr , .property_len = 0 };
189194
190- auto file = FileReader::Open (&options);
195+ auto file = FileReader::Open (&options, session );
191196 if (!file) {
192197 throw IOException (" Failed to open Vortex file: " + filename);
193198 }
@@ -224,15 +229,15 @@ static void VerifyNewFile(const BindData &bind_data, vector<LogicalType> &column
224229 }
225230}
226231
227- static unique_ptr<FileReader> OpenFileAndVerify (FileSystem &fs, const std::string &filename,
232+ static unique_ptr<FileReader> OpenFileAndVerify (FileSystem &fs, VortexSession &session, const std::string &filename,
228233 const BindData &bind_data) {
229234 auto new_column_names = vector<string>();
230235 new_column_names.reserve (bind_data.column_names .size ());
231236
232237 auto new_column_types = vector<LogicalType>();
233238 new_column_types.reserve (bind_data.columns_types .size ());
234239
235- auto file = OpenFile (EnsureFileProtocol (fs, filename), new_column_types, new_column_names);
240+ auto file = OpenFile (EnsureFileProtocol (fs, filename), session, new_column_types, new_column_names);
236241 VerifyNewFile (bind_data, new_column_types, new_column_names);
237242 return file;
238243}
@@ -383,7 +388,8 @@ static void VortexScanFunction(ClientContext &context, TableFunctionInput &data,
383388 if (auto file_idx = global_state.next_file_idx .fetch_add (1 );
384389 file_idx < global_state.expanded_files .size ()) {
385390 auto file_name = global_state.expanded_files [file_idx];
386- auto vortex_file = OpenFileAndVerify (FileSystem::GetFileSystem (context), file_name, bind_data);
391+ auto vortex_file =
392+ OpenFileAndVerify (FileSystem::GetFileSystem (context), *bind_data.session , file_name, bind_data);
387393 global_state.layout_readers [file_idx] = LayoutReader::CreateFromFile (vortex_file.get ());
388394 CreateScanPartitions (context, bind_data, global_state, local_state, file_idx, vortex_file);
389395 }
@@ -412,12 +418,21 @@ static unique_ptr<FunctionData> VortexBind(ClientContext &context, TableFunction
412418 auto result = make_uniq<BindData>();
413419 result->arena = make_uniq<google::protobuf::Arena>();
414420
421+ const static string VortexExtensionKey = std::string (" vortex_extension:vortex_session" );
422+ auto session = ObjectCache::GetObjectCache (context).Get <VortexSession>(VortexExtensionKey);
423+ if (session == nullptr ) {
424+ ObjectCache::GetObjectCache (context).Put (VortexExtensionKey, make_shared_ptr<VortexSession>());
425+ session = ObjectCache::GetObjectCache (context).Get <VortexSession>(VortexExtensionKey);
426+ }
427+
428+ result->session = session;
429+
415430 auto file_glob = duckdb::vector<string> {input.inputs [0 ].GetValue <string>()};
416431 result->file_list = make_shared_ptr<GlobMultiFileList>(context, file_glob, FileGlobOptions::DISALLOW_EMPTY);
417432
418433 // Open the first file to extract the schema.
419434 auto filename = EnsureFileProtocol (FileSystem::GetFileSystem (context), result->file_list ->GetFirstFile ());
420- result->initial_file = OpenFile (filename, column_types, column_names);
435+ result->initial_file = OpenFile (filename, *result-> session , column_types, column_names);
421436
422437 result->column_names = column_names;
423438 result->columns_types = column_types;
0 commit comments