Skip to content

Commit

Permalink
Merge pull request #9815 from Mytherin/duckdboptimizers
Browse files Browse the repository at this point in the history
Add duckdb_optimizers function
  • Loading branch information
Mytherin committed Nov 28, 2023
2 parents e46ece4 + e780275 commit 7d02d9c
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/common/enums/optimizer_type.cpp
Expand Up @@ -40,6 +40,14 @@ string OptimizerTypeToString(OptimizerType type) {
throw InternalException("Invalid optimizer type");
}

vector<string> ListAllOptimizers() {
vector<string> result;
for (idx_t i = 0; internal_optimizer_types[i].name; i++) {
result.push_back(internal_optimizer_types[i].name);
}
return result;
}

OptimizerType OptimizerTypeFromString(const string &str) {
for (idx_t i = 0; internal_optimizer_types[i].name; i++) {
if (internal_optimizer_types[i].name == str) {
Expand Down
1 change: 1 addition & 0 deletions src/function/table/system/CMakeLists.txt
Expand Up @@ -9,6 +9,7 @@ add_library_unity(
duckdb_functions.cpp
duckdb_keywords.cpp
duckdb_indexes.cpp
duckdb_optimizers.cpp
duckdb_schemas.cpp
duckdb_sequences.cpp
duckdb_settings.cpp
Expand Down
57 changes: 57 additions & 0 deletions src/function/table/system/duckdb_optimizers.cpp
@@ -0,0 +1,57 @@
#include "duckdb/function/table/system_functions.hpp"
#include "duckdb/common/types/chunk_collection.hpp"
#include "duckdb/main/config.hpp"
#include "duckdb/main/client_context.hpp"
#include "duckdb/common/enum_util.hpp"
#include "duckdb/common/enums/optimizer_type.hpp"

namespace duckdb {

struct DuckDBOptimizersData : public GlobalTableFunctionState {
DuckDBOptimizersData() : offset(0) {
}

vector<string> optimizers;
idx_t offset;
};

static unique_ptr<FunctionData> DuckDBOptimizersBind(ClientContext &context, TableFunctionBindInput &input,
vector<LogicalType> &return_types, vector<string> &names) {
names.emplace_back("name");
return_types.emplace_back(LogicalType::VARCHAR);

return nullptr;
}

unique_ptr<GlobalTableFunctionState> DuckDBOptimizersInit(ClientContext &context, TableFunctionInitInput &input) {
auto result = make_uniq<DuckDBOptimizersData>();
result->optimizers = ListAllOptimizers();
return std::move(result);
}

void DuckDBOptimizersFunction(ClientContext &context, TableFunctionInput &data_p, DataChunk &output) {
auto &data = data_p.global_state->Cast<DuckDBOptimizersData>();
if (data.offset >= data.optimizers.size()) {
// finished returning values
return;
}
// start returning values
// either fill up the chunk or return all the remaining columns
idx_t count = 0;
while (data.offset < data.optimizers.size() && count < STANDARD_VECTOR_SIZE) {
auto &entry = data.optimizers[data.offset++];

// return values:
// name, LogicalType::VARCHAR
output.SetValue(0, count, Value(entry));
count++;
}
output.SetCardinality(count);
}

void DuckDBOptimizersFun::RegisterFunction(BuiltinFunctions &set) {
set.AddFunction(
TableFunction("duckdb_optimizers", {}, DuckDBOptimizersFunction, DuckDBOptimizersBind, DuckDBOptimizersInit));
}

} // namespace duckdb
1 change: 1 addition & 0 deletions src/function/table/system_functions.cpp
Expand Up @@ -29,6 +29,7 @@ void BuiltinFunctions::RegisterSQLiteFunctions() {
DuckDBSchemasFun::RegisterFunction(*this);
DuckDBDependenciesFun::RegisterFunction(*this);
DuckDBExtensionsFun::RegisterFunction(*this);
DuckDBOptimizersFun::RegisterFunction(*this);
DuckDBSequencesFun::RegisterFunction(*this);
DuckDBSettingsFun::RegisterFunction(*this);
DuckDBTablesFun::RegisterFunction(*this);
Expand Down
2 changes: 2 additions & 0 deletions src/include/duckdb/common/enums/optimizer_type.hpp
Expand Up @@ -9,6 +9,7 @@
#pragma once

#include "duckdb/common/constants.hpp"
#include "duckdb/common/vector.hpp"

namespace duckdb {

Expand Down Expand Up @@ -36,5 +37,6 @@ enum class OptimizerType : uint32_t {

string OptimizerTypeToString(OptimizerType type);
OptimizerType OptimizerTypeFromString(const string &str);
vector<string> ListAllOptimizers();

} // namespace duckdb
4 changes: 4 additions & 0 deletions src/include/duckdb/function/table/system_functions.hpp
Expand Up @@ -85,6 +85,10 @@ struct DuckDBIndexesFun {
static void RegisterFunction(BuiltinFunctions &set);
};

struct DuckDBOptimizersFun {
static void RegisterFunction(BuiltinFunctions &set);
};

struct DuckDBSequencesFun {
static void RegisterFunction(BuiltinFunctions &set);
};
Expand Down
11 changes: 11 additions & 0 deletions test/sql/table_function/duckdb_optimizers.test
@@ -0,0 +1,11 @@
# name: test/sql/table_function/duckdb_optimizers.test
# description: Test duckdb_optimizers function
# group: [table_function]

statement ok
SELECT * FROM duckdb_optimizers();

query I
SELECT name FROM duckdb_optimizers() WHERE name='join_order';
----
join_order

0 comments on commit 7d02d9c

Please sign in to comment.