mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
add hints for column description
This commit is contained in:
parent
44293e6f94
commit
4547ed370a
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <base/types.h>
|
#include <base/types.h>
|
||||||
#include <Common/PODArray.h>
|
#include <Common/PODArray.h>
|
||||||
|
#include <IO/WriteHelpers.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
@ -102,6 +103,12 @@ public:
|
|||||||
return prompter.getHints(name, getAllRegisteredNames());
|
return prompter.getHints(name, getAllRegisteredNames());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getHintsString(const String & name) const
|
||||||
|
{
|
||||||
|
const auto hints = getHints(name);
|
||||||
|
return !hints.empty() ? ", may be you meant: " + toString(hints) : "";
|
||||||
|
}
|
||||||
|
|
||||||
IHints() = default;
|
IHints() = default;
|
||||||
|
|
||||||
IHints(const IHints &) = default;
|
IHints(const IHints &) = default;
|
||||||
|
@ -230,8 +230,8 @@ void ColumnsDescription::remove(const String & column_name)
|
|||||||
{
|
{
|
||||||
auto range = getNameRange(columns, column_name);
|
auto range = getNameRange(columns, column_name);
|
||||||
if (range.first == range.second)
|
if (range.first == range.second)
|
||||||
throw Exception("There is no column " + column_name + " in table.",
|
throw Exception(
|
||||||
ErrorCodes::NO_SUCH_COLUMN_IN_TABLE);
|
"There is no column " + column_name + " in table" + getHintsString(column_name), ErrorCodes::NO_SUCH_COLUMN_IN_TABLE);
|
||||||
|
|
||||||
for (auto list_it = range.first; list_it != range.second;)
|
for (auto list_it = range.first; list_it != range.second;)
|
||||||
{
|
{
|
||||||
@ -244,7 +244,10 @@ void ColumnsDescription::rename(const String & column_from, const String & colum
|
|||||||
{
|
{
|
||||||
auto it = columns.get<1>().find(column_from);
|
auto it = columns.get<1>().find(column_from);
|
||||||
if (it == columns.get<1>().end())
|
if (it == columns.get<1>().end())
|
||||||
throw Exception("Cannot find column " + column_from + " in ColumnsDescription", ErrorCodes::LOGICAL_ERROR);
|
{
|
||||||
|
throw Exception(
|
||||||
|
"Cannot find column " + column_from + " in ColumnsDescription" + getHintsString(column_from), ErrorCodes::LOGICAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
columns.get<1>().modify_key(it, [&column_to] (String & old_name)
|
columns.get<1>().modify_key(it, [&column_to] (String & old_name)
|
||||||
{
|
{
|
||||||
@ -745,6 +748,18 @@ void ColumnsDescription::removeSubcolumns(const String & name_in_storage)
|
|||||||
subcolumns.get<1>().erase(range.first, range.second);
|
subcolumns.get<1>().erase(range.first, range.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<String> ColumnsDescription::getAllRegisteredNames() const
|
||||||
|
{
|
||||||
|
std::vector<String> names;
|
||||||
|
names.reserve(columns.size());
|
||||||
|
for (const auto & column : columns)
|
||||||
|
{
|
||||||
|
if (column.name.find('.') == std::string::npos)
|
||||||
|
names.push_back(column.name);
|
||||||
|
}
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
Block validateColumnsDefaultsAndGetSampleBlock(ASTPtr default_expr_list, const NamesAndTypesList & all_columns, ContextPtr context)
|
Block validateColumnsDefaultsAndGetSampleBlock(ASTPtr default_expr_list, const NamesAndTypesList & all_columns, ContextPtr context)
|
||||||
{
|
{
|
||||||
for (const auto & child : default_expr_list->children)
|
for (const auto & child : default_expr_list->children)
|
||||||
|
@ -91,7 +91,7 @@ struct ColumnDescription
|
|||||||
|
|
||||||
|
|
||||||
/// Description of multiple table columns (in CREATE TABLE for example).
|
/// Description of multiple table columns (in CREATE TABLE for example).
|
||||||
class ColumnsDescription
|
class ColumnsDescription : public IHints<2, ColumnsDescription>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ColumnsDescription() = default;
|
ColumnsDescription() = default;
|
||||||
@ -149,7 +149,8 @@ public:
|
|||||||
{
|
{
|
||||||
auto it = columns.get<1>().find(column_name);
|
auto it = columns.get<1>().find(column_name);
|
||||||
if (it == columns.get<1>().end())
|
if (it == columns.get<1>().end())
|
||||||
throw Exception("Cannot find column " + column_name + " in ColumnsDescription", ErrorCodes::LOGICAL_ERROR);
|
throw Exception(
|
||||||
|
"Cannot find column " + column_name + " in ColumnsDescription" + getHintsString(column_name), ErrorCodes::LOGICAL_ERROR);
|
||||||
|
|
||||||
removeSubcolumns(it->name);
|
removeSubcolumns(it->name);
|
||||||
if (!columns.get<1>().modify(it, std::forward<F>(f)))
|
if (!columns.get<1>().modify(it, std::forward<F>(f)))
|
||||||
@ -196,6 +197,8 @@ public:
|
|||||||
return columns.empty();
|
return columns.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<String> getAllRegisteredNames() const override;
|
||||||
|
|
||||||
/// Keep the sequence of columns and allow to lookup by name.
|
/// Keep the sequence of columns and allow to lookup by name.
|
||||||
using ColumnsContainer = boost::multi_index_container<
|
using ColumnsContainer = boost::multi_index_container<
|
||||||
ColumnDescription,
|
ColumnDescription,
|
||||||
|
@ -74,7 +74,6 @@ struct IndicesDescription : public std::vector<IndexDescription>, IHints<1, Indi
|
|||||||
/// Return common expression for all stored indices
|
/// Return common expression for all stored indices
|
||||||
ExpressionActionsPtr getSingleExpressionForIndices(const ColumnsDescription & columns, ContextPtr context) const;
|
ExpressionActionsPtr getSingleExpressionForIndices(const ColumnsDescription & columns, ContextPtr context) const;
|
||||||
|
|
||||||
public:
|
|
||||||
Names getAllRegisteredNames() const override;
|
Names getAllRegisteredNames() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user