#pragma once #include #include #include namespace duckdb { typedef std::string (*simple_tf_t)(ClientContext &); struct RunOnceTableFunctionState : GlobalTableFunctionState { RunOnceTableFunctionState() : run(false) {}; std::atomic run; static unique_ptr Init(ClientContext &, TableFunctionInitInput &) { return make_uniq(); } }; namespace internal { unique_ptr SingleBoolResultBind(ClientContext &, TableFunctionBindInput &, vector &out_types, vector &out_names); unique_ptr SingleStringResultBind(ClientContext &, TableFunctionBindInput &, vector &, vector &); bool ShouldRun(TableFunctionInput &input); template struct CallFunctionHelper; template <> struct CallFunctionHelper { static std::string call(ClientContext &context, TableFunctionInput &input, std::string (*f)(ClientContext &)) { return f(context); } }; template <> struct CallFunctionHelper { static std::string call(ClientContext &context, TableFunctionInput &input, std::string (*f)(ClientContext &, TableFunctionInput &)) { return f(context, input); } }; template void TableFunc(ClientContext &context, TableFunctionInput &input, DataChunk &output) { if (!ShouldRun(input)) { return; } const std::string result = CallFunctionHelper::call(context, input, func); output.SetCardinality(1); output.SetValue(0, 0, result); } template void RegisterTF(DatabaseInstance &instance, const char *name) { TableFunction tf(name, {}, internal::TableFunc, internal::SingleStringResultBind, RunOnceTableFunctionState::Init); ExtensionUtil::RegisterFunction(instance, tf); } } // namespace internal #define RESISTER_TF(name, func) \ internal::RegisterTF(instance, name) } // namespace duckdb