Skip to content

Commit cc17700

Browse files
Revert "Use system.completions table for suggestions"
1 parent 0df0b53 commit cc17700

8 files changed

Lines changed: 32 additions & 340 deletions

File tree

src/Client/LocalConnection.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include <QueryPipeline/Pipe.h>
1717
#include <Parsers/ASTInsertQuery.h>
1818
#include <Storages/IStorage.h>
19-
#include <Common/config_version.h>
2019
#include <Common/ConcurrentBoundedQueue.h>
2120
#include <Common/CurrentThread.h>
2221
#include <Interpreters/InternalTextLogsQueue.h>
@@ -733,15 +732,11 @@ Packet LocalConnection::receivePacket()
733732
}
734733

735734
void LocalConnection::getServerVersion(
736-
const ConnectionTimeouts & /* timeouts */, String & name,
737-
UInt64 & version_major, UInt64 & version_minor,
738-
UInt64 & version_patch, UInt64 & revision)
739-
{
740-
name = std::string(VERSION_NAME);
741-
version_major = VERSION_MAJOR;
742-
version_minor = VERSION_MINOR;
743-
version_patch = VERSION_PATCH;
744-
revision = DBMS_TCP_PROTOCOL_VERSION;
735+
const ConnectionTimeouts & /* timeouts */, String & /* name */,
736+
UInt64 & /* version_major */, UInt64 & /* version_minor */,
737+
UInt64 & /* version_patch */, UInt64 & /* revision */)
738+
{
739+
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Not implemented");
745740
}
746741

747742
void LocalConnection::setDefaultDatabase(const String & database)

src/Client/Suggest.cpp

Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@ namespace ErrorCodes
2828
extern const int USER_SESSION_LIMIT_EXCEEDED;
2929
}
3030

31-
static constexpr const UInt64 CLICKHOUSE_SERVER_MIN_MAJOR_VERSION_WITH_SYSTEM_COMPLETIONS = 25;
32-
static constexpr const UInt64 CLICKHOUSE_SERVER_MIN_MINOR_VERSION_WITH_SYSTEM_COMPLETIONS = 8;
33-
34-
static String getLoadSuggestionQueryUsingSystemTables(Int32 suggestion_limit, bool basic_suggestion, UInt64 server_revision)
31+
static String getLoadSuggestionQuery(Int32 suggestion_limit, bool basic_suggestion, UInt64 server_revision)
3532
{
3633
/// NOTE: Once you will update the completion list,
3734
/// do not forget to update 01676_clickhouse_client_autocomplete.sh
@@ -92,57 +89,6 @@ static String getLoadSuggestionQueryUsingSystemTables(Int32 suggestion_limit, bo
9289
return query;
9390
}
9491

95-
static String getLoadSuggestionQueryUsingSystemCompletionsTable(Int32 suggestion_limit, bool basic_suggestion, UInt64 server_revision)
96-
{
97-
/// NOTE: Once you will update the completion list,
98-
/// do not forget to update 01676_clickhouse_client_autocomplete.sh
99-
/// TODO: Use belongs column for better contextual suggestions
100-
String unlimited_contexts = fmt::format(
101-
"('function', 'table engine', 'format', 'table function', 'data type', 'merge tree setting', 'setting', 'aggregate function combinator pair'{}{})",
102-
(server_revision >= DBMS_MIN_REVISION_WITH_SYSTEM_KEYWORDS_TABLE ? ", 'keyword'" : ""),
103-
(basic_suggestion ? "" : ", 'cluster', 'macro', 'policy'")
104-
);
105-
String query = fmt::format(
106-
"SELECT word FROM system.completions WHERE context IN {}",
107-
unlimited_contexts
108-
);
109-
110-
/// The user may disable loading of databases, tables, columns by setting suggestion_limit to zero.
111-
if (suggestion_limit > 0)
112-
{
113-
String limited_contexts = fmt::format(
114-
"('database', 'table', 'column'{})",
115-
(basic_suggestion ? "" : ", 'dictionary'")
116-
);
117-
query += fmt::format(
118-
" UNION ALL SELECT word FROM ("
119-
" SELECT word, context, ROW_NUMBER() OVER (PARTITION BY context ORDER BY word) AS rn FROM "
120-
" (SELECT DISTINCT word, context FROM system.completions WHERE context IN {})"
121-
") WHERE rn <= {}",
122-
limited_contexts,
123-
suggestion_limit
124-
);
125-
}
126-
127-
query = "SELECT DISTINCT arrayJoin(extractAll(word, '[\\\\w_]{2,}')) AS res FROM (" + query + ") WHERE notEmpty(res)";
128-
return query;
129-
}
130-
131-
static String getLoadSuggestionQuery(IServerConnection & connection, Int32 suggestion_limit, bool basic_suggestion, const ConnectionTimeouts & timeouts)
132-
{
133-
134-
String server_name;
135-
UInt64 server_major_version = 0;
136-
UInt64 server_minor_version = 0;
137-
UInt64 server_patch_version = 0;
138-
UInt64 server_revision = 0;
139-
connection.getServerVersion(timeouts, server_name, server_major_version, server_minor_version, server_patch_version, server_revision);
140-
if (server_major_version > CLICKHOUSE_SERVER_MIN_MAJOR_VERSION_WITH_SYSTEM_COMPLETIONS || (server_major_version == CLICKHOUSE_SERVER_MIN_MAJOR_VERSION_WITH_SYSTEM_COMPLETIONS && server_minor_version >= CLICKHOUSE_SERVER_MIN_MINOR_VERSION_WITH_SYSTEM_COMPLETIONS))
141-
return getLoadSuggestionQueryUsingSystemCompletionsTable(suggestion_limit, basic_suggestion, server_revision);
142-
143-
return getLoadSuggestionQueryUsingSystemTables(suggestion_limit, basic_suggestion, server_revision);
144-
}
145-
14692
template <typename ConnectionType>
14793
void Suggest::load(ContextPtr context, const ConnectionParameters & connection_parameters, Int32 suggestion_limit, bool wait_for_load)
14894
{
@@ -162,11 +108,13 @@ void Suggest::load(ContextPtr context, const ConnectionParameters & connection_p
162108
try
163109
{
164110
auto connection = ConnectionType::createConnection(connection_parameters, my_context);
165-
const auto basic_suggestion = std::is_same_v<ConnectionType, LocalConnection>;
166-
auto suggestion_query = getLoadSuggestionQuery(*connection, suggestion_limit, basic_suggestion, connection_parameters.timeouts);
167111
fetch(*connection,
168112
connection_parameters.timeouts,
169-
suggestion_query,
113+
getLoadSuggestionQuery(
114+
suggestion_limit,
115+
std::is_same_v<ConnectionType, LocalConnection>,
116+
connection->getServerRevision(connection_parameters.timeouts)
117+
),
170118
my_context->getClientInfo());
171119
}
172120
catch (const Exception & e)
@@ -211,8 +159,7 @@ void Suggest::load(IServerConnection & connection,
211159
{
212160
try
213161
{
214-
auto suggestion_query = getLoadSuggestionQuery(connection, suggestion_limit, true, timeouts);
215-
fetch(connection, timeouts, suggestion_query, client_info);
162+
fetch(connection, timeouts, getLoadSuggestionQuery(suggestion_limit, true, connection.getServerRevision(timeouts)), client_info);
216163
}
217164
catch (...)
218165
{

src/Storages/System/StorageSystemCompletions.cpp

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,43 @@
1-
#include <Access/ContextAccess.h>
21
#include <AggregateFunctions/AggregateFunctionFactory.h>
3-
#include <AggregateFunctions/Combinators/AggregateFunctionCombinatorFactory.h>
2+
#include <Access/ContextAccess.h>
43
#include <Columns/ColumnString.h>
4+
#include <Common/Macros.h>
55
#include <Core/Settings.h>
66
#include <DataTypes/DataTypeFactory.h>
77
#include <DataTypes/DataTypeNullable.h>
88
#include <DataTypes/DataTypeString.h>
99
#include <Databases/IDatabase.h>
10-
#include <Dictionaries/DictionaryStructure.h>
1110
#include <Dictionaries/IDictionary.h>
1211
#include <Dictionaries/IDictionarySource.h>
12+
#include <Dictionaries/DictionaryStructure.h>
1313
#include <Formats/FormatFactory.h>
14-
#include <Functions/FunctionFactory.h>
1514
#include <Functions/IFunction.h>
16-
#include <Functions/UserDefined/UserDefinedExecutableFunctionFactory.h>
15+
#include <Functions/FunctionFactory.h>
1716
#include <Functions/UserDefined/UserDefinedSQLFunctionFactory.h>
17+
#include <Functions/UserDefined/UserDefinedExecutableFunctionFactory.h>
1818
#include <Interpreters/Context.h>
1919
#include <Interpreters/DatabaseCatalog.h>
2020
#include <Interpreters/ExternalDictionariesLoader.h>
2121
#include <Parsers/CommonParsers.h>
22-
#include <Storages/MergeTree/MergeTreeSettings.h>
23-
#include <Storages/StorageFactory.h>
2422
#include <Storages/System/StorageSystemCompletions.h>
23+
#include <Storages/StorageFactory.h>
24+
#include <Storages/MergeTree/MergeTreeSettings.h>
2525
#include <TableFunctions/TableFunctionFactory.h>
26-
#include <Common/Macros.h>
2726

2827

2928
namespace DB
3029
{
3130

3231
namespace Setting
3332
{
34-
extern const SettingsUInt64 readonly;
35-
extern const SettingsSeconds lock_acquire_timeout;
33+
extern const SettingsUInt64 readonly;
34+
extern const SettingsSeconds lock_acquire_timeout;
3635
}
3736

3837
static constexpr const char * DATABASE_CONTEXT = "database";
3938
static constexpr const char * TABLE_CONTEXT = "table";
4039
static constexpr const char * COLUMN_CONTEXT = "column";
4140
static constexpr const char * FUNCTION_CONTEXT = "function";
42-
static constexpr const char * AGGREGATE_FUNCTION_COMBINATOR_PAIR_CONTEXT = "aggregate function combinator pair";
4341
static constexpr const char * TABLE_ENGINE_CONTEXT = "table engine";
4442
static constexpr const char * FORMAT_CONTEXT = "format";
4543
static constexpr const char * TABLE_FUNCTION_CONTEXT = "table function";
@@ -53,25 +51,19 @@ static constexpr const char * DICTIONARY_CONTEXT = "dictionary";
5351

5452
ColumnsDescription StorageSystemCompletions::getColumnsDescription()
5553
{
56-
auto description = ColumnsDescription{
54+
auto description = ColumnsDescription
55+
{
5756
{"word", std::make_shared<DataTypeString>(), "Completion token."},
5857
{"context", std::make_shared<DataTypeString>(), "Token entity kind (e.g. table)."},
59-
{"belongs",
60-
std::make_shared<DataTypeNullable>(std::make_shared<DataTypeString>()),
61-
"Token for entity, this token belongs to (e.g. name of owning database)."}};
58+
{"belongs", std::make_shared<DataTypeNullable>(std::make_shared<DataTypeString>()), "Token for entity, this token belongs to (e.g. name of owning database)."}
59+
};
6260
return description;
6361
}
6462

65-
void fillDataWithTableColumns(
66-
const String & database_name,
67-
const String & table_name,
68-
const StoragePtr & table,
69-
MutableColumns & res_columns,
70-
const ContextPtr & context)
63+
void fillDataWithTableColumns(const String & database_name, const String & table_name, const StoragePtr & table, MutableColumns & res_columns, const ContextPtr & context)
7164
{
7265
const auto & access = context->getAccess();
73-
if (!access->isGranted(AccessType::SHOW_TABLES) || !access->isGranted(AccessType::SHOW_TABLES, database_name)
74-
|| !access->isGranted(AccessType::SHOW_TABLES, database_name, table_name))
66+
if (!access->isGranted(AccessType::SHOW_TABLES) || !access->isGranted(AccessType::SHOW_TABLES, database_name) || !access->isGranted(AccessType::SHOW_TABLES, database_name, table_name))
7567
return;
7668

7769
if (!table)
@@ -127,6 +119,7 @@ void fillDataWithDatabasesTablesColumns(MutableColumns & res_columns, const Cont
127119
const auto & table = iterator->table();
128120
fillDataWithTableColumns(database_name, table_name, table, res_columns, context);
129121
}
122+
130123
}
131124

132125
if (context->hasSessionContext())
@@ -161,23 +154,6 @@ void fillDataWithFunctions(MutableColumns & res_columns, const ContextPtr & cont
161154
insert_function(function_name);
162155
}
163156

164-
void fillDataWithAggregateFunctionCombinatorPair(MutableColumns & res_columns)
165-
{
166-
const auto & aggregate_functions = AggregateFunctionFactory::instance().getAllRegisteredNames();
167-
const auto & aggregate_function_combinators = AggregateFunctionCombinatorFactory::instance().getAllAggregateFunctionCombinators();
168-
for (const auto & function_name : aggregate_functions)
169-
{
170-
for (const auto & [combinator_name, combinator] : aggregate_function_combinators)
171-
{
172-
if (combinator->isForInternalUsageOnly())
173-
continue;
174-
res_columns[0]->insert(function_name + combinator_name);
175-
res_columns[1]->insert(AGGREGATE_FUNCTION_COMBINATOR_PAIR_CONTEXT);
176-
res_columns[2]->insertDefault();
177-
}
178-
}
179-
}
180-
181157
void fillDataWithTableEngines(MutableColumns & res_columns)
182158
{
183159
const auto & storage_factory = StorageFactory::instance();
@@ -194,9 +170,9 @@ void fillDataWithFormats(MutableColumns & res_columns)
194170
{
195171
const auto & format_factory = FormatFactory::instance();
196172
const auto & formats = format_factory.getAllFormats();
197-
for (const auto & [_, creators] : formats)
173+
for (const auto & [format_name, _] : formats)
198174
{
199-
res_columns[0]->insert(creators.name);
175+
res_columns[0]->insert(format_name);
200176
res_columns[1]->insert(FORMAT_CONTEXT);
201177
res_columns[2]->insertDefault();
202178
}
@@ -296,7 +272,7 @@ void fillDataWithPolicies(MutableColumns & res_columns, const ContextPtr & conte
296272
void fillDataWithDictionaries(MutableColumns & res_columns, const ContextPtr & context)
297273
{
298274
const auto & access = context->getAccess();
299-
if (!access->isGranted(AccessType::SHOW_DICTIONARIES))
275+
if (access->isGranted(AccessType::SHOW_DICTIONARIES))
300276
return;
301277

302278
const auto & external_dictionaries = context->getExternalDictionariesLoader();
@@ -321,8 +297,7 @@ void fillDataWithDictionaries(MutableColumns & res_columns, const ContextPtr & c
321297
}
322298
}
323299

324-
void StorageSystemCompletions::fillData(
325-
MutableColumns & res_columns, ContextPtr context, const ActionsDAG::Node *, std::vector<UInt8>) const
300+
void StorageSystemCompletions::fillData(MutableColumns & res_columns, ContextPtr context, const ActionsDAG::Node *, std::vector<UInt8>) const
326301
{
327302
fillDataWithDatabasesTablesColumns(res_columns, context);
328303
fillDataWithFunctions(res_columns, context);
@@ -337,7 +312,6 @@ void StorageSystemCompletions::fillData(
337312
fillDataWithMacros(res_columns, context);
338313
fillDataWithPolicies(res_columns, context);
339314
fillDataWithDictionaries(res_columns, context);
340-
fillDataWithAggregateFunctionCombinatorPair(res_columns);
341315
}
342316

343317
}

tests/integration/test_suggestions/__init__.py

Whitespace-only changes.

tests/integration/test_suggestions/configs/dictionary.xml

Lines changed: 0 additions & 41 deletions
This file was deleted.

tests/integration/test_suggestions/configs/macros.xml

Lines changed: 0 additions & 5 deletions
This file was deleted.

tests/integration/test_suggestions/configs/users.xml

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)