Skip to content

Commit 48fa4a6

Browse files
committed
vendor: Update vendored sources to duckdb/duckdb@f3dd1d2
Expose qualified table names in GetTableNames and add duckdb_get_table_names to C API (duckdb/duckdb#17472)
1 parent 277fea2 commit 48fa4a6

File tree

15 files changed

+84
-24
lines changed

15 files changed

+84
-24
lines changed

src/duckdb/src/common/enum_util.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -579,19 +579,20 @@ const StringUtil::EnumStringLiteral *GetBindingModeValues() {
579579
static constexpr StringUtil::EnumStringLiteral values[] {
580580
{ static_cast<uint32_t>(BindingMode::STANDARD_BINDING), "STANDARD_BINDING" },
581581
{ static_cast<uint32_t>(BindingMode::EXTRACT_NAMES), "EXTRACT_NAMES" },
582-
{ static_cast<uint32_t>(BindingMode::EXTRACT_REPLACEMENT_SCANS), "EXTRACT_REPLACEMENT_SCANS" }
582+
{ static_cast<uint32_t>(BindingMode::EXTRACT_REPLACEMENT_SCANS), "EXTRACT_REPLACEMENT_SCANS" },
583+
{ static_cast<uint32_t>(BindingMode::EXTRACT_QUALIFIED_NAMES), "EXTRACT_QUALIFIED_NAMES" }
583584
};
584585
return values;
585586
}
586587

587588
template<>
588589
const char* EnumUtil::ToChars<BindingMode>(BindingMode value) {
589-
return StringUtil::EnumToString(GetBindingModeValues(), 3, "BindingMode", static_cast<uint32_t>(value));
590+
return StringUtil::EnumToString(GetBindingModeValues(), 4, "BindingMode", static_cast<uint32_t>(value));
590591
}
591592

592593
template<>
593594
BindingMode EnumUtil::FromString<BindingMode>(const char *value) {
594-
return static_cast<BindingMode>(StringUtil::StringToEnum(GetBindingModeValues(), 3, "BindingMode", value));
595+
return static_cast<BindingMode>(StringUtil::StringToEnum(GetBindingModeValues(), 4, "BindingMode", value));
595596
}
596597

597598
const StringUtil::EnumStringLiteral *GetBitpackingModeValues() {

src/duckdb/src/function/table/version/pragma_version.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#ifndef DUCKDB_PATCH_VERSION
2-
#define DUCKDB_PATCH_VERSION "0-dev3450"
2+
#define DUCKDB_PATCH_VERSION "0-dev3457"
33
#endif
44
#ifndef DUCKDB_MINOR_VERSION
55
#define DUCKDB_MINOR_VERSION 3
@@ -8,10 +8,10 @@
88
#define DUCKDB_MAJOR_VERSION 1
99
#endif
1010
#ifndef DUCKDB_VERSION
11-
#define DUCKDB_VERSION "v1.3.0-dev3450"
11+
#define DUCKDB_VERSION "v1.3.0-dev3457"
1212
#endif
1313
#ifndef DUCKDB_SOURCE_ID
14-
#define DUCKDB_SOURCE_ID "db45dd41cd"
14+
#define DUCKDB_SOURCE_ID "f3dd1d2a16"
1515
#endif
1616
#include "duckdb/function/table/system_functions.hpp"
1717
#include "duckdb/main/database.hpp"

src/duckdb/src/include/duckdb.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,18 @@ Usually used for developing C extensions that must return this for a compatibili
841841
*/
842842
DUCKDB_C_API const char *duckdb_library_version();
843843

844+
/*!
845+
Get the list of (fully qualified) table names of the query.
846+
847+
* @param connection The connection for which to get the table names.
848+
* @param query The query for which to get the table names.
849+
* @param qualified Returns fully qualified table names (catalog.schema.table), if set to true, else only the (not
850+
escaped) table names.
851+
* @return A duckdb_value of type VARCHAR[] containing the (fully qualified) table names of the query. Must be destroyed
852+
with duckdb_destroy_value.
853+
*/
854+
DUCKDB_C_API duckdb_value duckdb_get_table_names(duckdb_connection connection, const char *query, bool qualified);
855+
844856
//===--------------------------------------------------------------------===//
845857
// Configuration
846858
//===--------------------------------------------------------------------===//

src/duckdb/src/include/duckdb/main/capi/extension_api.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ typedef struct {
476476
idx_t (*duckdb_client_context_get_connection_id)(duckdb_client_context context);
477477
void (*duckdb_destroy_client_context)(duckdb_client_context *context);
478478
void (*duckdb_connection_get_client_context)(duckdb_connection connection, duckdb_client_context *out_context);
479+
duckdb_value (*duckdb_get_table_names)(duckdb_connection connection, const char *query, bool qualified);
479480
// New functions around scalar function binding
480481

481482
void (*duckdb_scalar_function_set_bind)(duckdb_scalar_function scalar_function, duckdb_scalar_function_bind_t bind);
@@ -920,6 +921,7 @@ inline duckdb_ext_api_v1 CreateAPIv1() {
920921
result.duckdb_client_context_get_connection_id = duckdb_client_context_get_connection_id;
921922
result.duckdb_destroy_client_context = duckdb_destroy_client_context;
922923
result.duckdb_connection_get_client_context = duckdb_connection_get_client_context;
924+
result.duckdb_get_table_names = duckdb_get_table_names;
923925
result.duckdb_scalar_function_set_bind = duckdb_scalar_function_set_bind;
924926
result.duckdb_scalar_function_bind_set_error = duckdb_scalar_function_bind_set_error;
925927
result.duckdb_scalar_function_get_client_context = duckdb_scalar_function_get_client_context;

src/duckdb/src/include/duckdb/main/client_context.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,10 @@ class ClientContext : public enable_shared_from_this<ClientContext> {
209209

210210
connection_t GetConnectionId() const;
211211

212-
//! Fetch a list of table names that are required for a given query
213-
DUCKDB_API unordered_set<string> GetTableNames(const string &query);
212+
//! Fetch the set of tables names of the query.
213+
//! Returns the fully qualified, escaped table names, if qualified is set to true,
214+
//! else returns the not qualified, not escaped table names.
215+
DUCKDB_API unordered_set<string> GetTableNames(const string &query, const bool qualified = false);
214216

215217
DUCKDB_API ClientProperties GetClientProperties();
216218

src/duckdb/src/include/duckdb/main/connection.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,10 @@ class Connection {
178178
DUCKDB_API bool IsAutoCommit();
179179
DUCKDB_API bool HasActiveTransaction();
180180

181-
//! Fetch a list of table names that are required for a given query
182-
DUCKDB_API unordered_set<string> GetTableNames(const string &query);
181+
//! Fetch the set of tables names of the query.
182+
//! Returns the fully qualified, escaped table names, if qualified is set to true,
183+
//! else returns the not qualified, not escaped table names.
184+
DUCKDB_API unordered_set<string> GetTableNames(const string &query, const bool qualified = false);
183185

184186
// NOLINTBEGIN
185187
template <typename TR, typename... ARGS>

src/duckdb/src/include/duckdb/planner/binder.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,12 @@ struct EntryLookupInfo;
6666
struct PivotColumnEntry;
6767
struct UnpivotEntry;
6868

69-
enum class BindingMode : uint8_t { STANDARD_BINDING, EXTRACT_NAMES, EXTRACT_REPLACEMENT_SCANS };
69+
enum class BindingMode : uint8_t {
70+
STANDARD_BINDING,
71+
EXTRACT_NAMES,
72+
EXTRACT_REPLACEMENT_SCANS,
73+
EXTRACT_QUALIFIED_NAMES
74+
};
7075
enum class BinderType : uint8_t { REGULAR_BINDER, VIEW_BINDER };
7176

7277
struct CorrelatedColumnInfo {
@@ -254,7 +259,7 @@ class Binder : public enable_shared_from_this<Binder> {
254259
optional_ptr<SQLStatement> root_statement;
255260
//! Binding mode
256261
BindingMode mode = BindingMode::STANDARD_BINDING;
257-
//! Table names extracted for BindingMode::EXTRACT_NAMES
262+
//! Table names extracted for BindingMode::EXTRACT_NAMES or BindingMode::EXTRACT_QUALIFIED_NAMES.
258263
unordered_set<string> table_names;
259264
//! Replacement Scans extracted for BindingMode::EXTRACT_REPLACEMENT_SCANS
260265
case_insensitive_map_t<unique_ptr<TableRef>> replacement_scans;

src/duckdb/src/include/duckdb_extension.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@ typedef struct {
547547
idx_t (*duckdb_client_context_get_connection_id)(duckdb_client_context context);
548548
void (*duckdb_destroy_client_context)(duckdb_client_context *context);
549549
void (*duckdb_connection_get_client_context)(duckdb_connection connection, duckdb_client_context *out_context);
550+
duckdb_value (*duckdb_get_table_names)(duckdb_connection connection, const char *query, bool qualified);
550551
#endif
551552

552553
// New functions around scalar function binding
@@ -1009,6 +1010,7 @@ typedef struct {
10091010
#define duckdb_connection_get_client_context duckdb_ext_api.duckdb_connection_get_client_context
10101011
#define duckdb_client_context_get_connection_id duckdb_ext_api.duckdb_client_context_get_connection_id
10111012
#define duckdb_destroy_client_context duckdb_ext_api.duckdb_destroy_client_context
1013+
#define duckdb_get_table_names duckdb_ext_api.duckdb_get_table_names
10121014

10131015
// Version unstable_new_scalar_function_functions
10141016
#define duckdb_scalar_function_set_bind duckdb_ext_api.duckdb_scalar_function_set_bind

src/duckdb/src/main/capi/duckdb-c.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,29 @@ duckdb_state duckdb_query(duckdb_connection connection, const char *query, duckd
173173
const char *duckdb_library_version() {
174174
return DuckDB::LibraryVersion();
175175
}
176+
177+
duckdb_value duckdb_get_table_names(duckdb_connection connection, const char *query, bool qualified) {
178+
Connection *conn = reinterpret_cast<Connection *>(connection);
179+
auto table_names = conn->GetTableNames(query, qualified);
180+
181+
auto count = table_names.size();
182+
auto ptr = malloc(count * sizeof(duckdb_value));
183+
auto list_values = reinterpret_cast<duckdb_value *>(ptr);
184+
185+
idx_t name_ix = 0;
186+
for (const auto &name : table_names) {
187+
list_values[name_ix] = duckdb_create_varchar(name.c_str());
188+
name_ix++;
189+
}
190+
191+
auto varchar_type = duckdb_create_logical_type(DUCKDB_TYPE_VARCHAR);
192+
auto list_value = duckdb_create_list_value(varchar_type, list_values, count);
193+
194+
for (idx_t i = 0; i < count; i++) {
195+
duckdb_destroy_value(&list_values[i]);
196+
}
197+
duckdb_free(ptr);
198+
duckdb_destroy_logical_type(&varchar_type);
199+
200+
return list_value;
201+
}

src/duckdb/src/main/client_context.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,7 @@ void ClientContext::TryBindRelation(Relation &relation, vector<ColumnDefinition>
12431243
RunFunctionInTransaction([&]() { InternalTryBindRelation(relation, result_columns); });
12441244
}
12451245

1246-
unordered_set<string> ClientContext::GetTableNames(const string &query) {
1246+
unordered_set<string> ClientContext::GetTableNames(const string &query, const bool qualified) {
12471247
auto lock = LockContext();
12481248

12491249
auto statements = ParseStatementsInternal(*lock, query);
@@ -1255,7 +1255,8 @@ unordered_set<string> ClientContext::GetTableNames(const string &query) {
12551255
RunFunctionInTransactionInternal(*lock, [&]() {
12561256
// bind the expressions
12571257
auto binder = Binder::CreateBinder(*this);
1258-
binder->SetBindingMode(BindingMode::EXTRACT_NAMES);
1258+
auto mode = qualified ? BindingMode::EXTRACT_QUALIFIED_NAMES : BindingMode::EXTRACT_NAMES;
1259+
binder->SetBindingMode(mode);
12591260
binder->Bind(*statements[0]);
12601261
result = binder->GetTableNames();
12611262
});

0 commit comments

Comments
 (0)