Merge pull request #17857 from fastio/feature_hints_for_column_names

hints for column names
This commit is contained in:
Nikita Mikhaylov 2020-12-23 04:55:41 +03:00 committed by GitHub
commit dae1e9ba31
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 34 deletions

View File

@ -635,14 +635,24 @@ void TreeRewriterResult::collectUsedColumns(const ASTPtr & query, bool is_select
for (const auto & name : columns_context.requiredColumns()) for (const auto & name : columns_context.requiredColumns())
ss << " '" << name << "'"; ss << " '" << name << "'";
if (!source_column_names.empty()) if (storage)
{ {
ss << ", source columns:"; ss << ", maybe you meant: ";
for (const auto & name : source_column_names) for (const auto & name : columns_context.requiredColumns())
ss << " '" << name << "'"; {
auto hints = storage->getHints(name);
if (!hints.empty())
ss << " '" << toString(hints) << "'";
}
} }
else else
ss << ", no source columns"; {
if (!source_column_names.empty())
for (const auto & name : columns_context.requiredColumns())
ss << " '" << name << "'";
else
ss << ", no source columns";
}
if (columns_context.has_table_join) if (columns_context.has_table_join)
{ {

View File

@ -17,7 +17,6 @@
namespace DB namespace DB
{ {
namespace ErrorCodes namespace ErrorCodes
{ {
extern const int TABLE_IS_DROPPED; extern const int TABLE_IS_DROPPED;
@ -32,17 +31,18 @@ bool IStorage::isVirtualColumn(const String & column_name, const StorageMetadata
} }
RWLockImpl::LockHolder IStorage::tryLockTimed( RWLockImpl::LockHolder IStorage::tryLockTimed(
const RWLock & rwlock, RWLockImpl::Type type, const String & query_id, const std::chrono::milliseconds & acquire_timeout) const const RWLock & rwlock, RWLockImpl::Type type, const String & query_id, const std::chrono::milliseconds & acquire_timeout) const
{ {
auto lock_holder = rwlock->getLock(type, query_id, acquire_timeout); auto lock_holder = rwlock->getLock(type, query_id, acquire_timeout);
if (!lock_holder) if (!lock_holder)
{ {
const String type_str = type == RWLockImpl::Type::Read ? "READ" : "WRITE"; const String type_str = type == RWLockImpl::Type::Read ? "READ" : "WRITE";
throw Exception( throw Exception(
type_str + " locking attempt on \"" + getStorageID().getFullTableName() + type_str + " locking attempt on \"" + getStorageID().getFullTableName() + "\" has timed out! ("
"\" has timed out! (" + std::to_string(acquire_timeout.count()) + "ms) " + std::to_string(acquire_timeout.count())
"Possible deadlock avoided. Client should retry.", + "ms) "
ErrorCodes::DEADLOCK_AVOIDED); "Possible deadlock avoided. Client should retry.",
ErrorCodes::DEADLOCK_AVOIDED);
} }
return lock_holder; return lock_holder;
} }
@ -82,26 +82,26 @@ TableExclusiveLockHolder IStorage::lockExclusively(const String & query_id, cons
} }
Pipe IStorage::read( Pipe IStorage::read(
const Names & /*column_names*/, const Names & /*column_names*/,
const StorageMetadataPtr & /*metadata_snapshot*/, const StorageMetadataPtr & /*metadata_snapshot*/,
SelectQueryInfo & /*query_info*/, SelectQueryInfo & /*query_info*/,
const Context & /*context*/, const Context & /*context*/,
QueryProcessingStage::Enum /*processed_stage*/, QueryProcessingStage::Enum /*processed_stage*/,
size_t /*max_block_size*/, size_t /*max_block_size*/,
unsigned /*num_streams*/) unsigned /*num_streams*/)
{ {
throw Exception("Method read is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED); throw Exception("Method read is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
} }
void IStorage::read( void IStorage::read(
QueryPlan & query_plan, QueryPlan & query_plan,
const Names & column_names, const Names & column_names,
const StorageMetadataPtr & metadata_snapshot, const StorageMetadataPtr & metadata_snapshot,
SelectQueryInfo & query_info, SelectQueryInfo & query_info,
const Context & context, const Context & context,
QueryProcessingStage::Enum processed_stage, QueryProcessingStage::Enum processed_stage,
size_t max_block_size, size_t max_block_size,
unsigned num_streams) unsigned num_streams)
{ {
auto pipe = read(column_names, metadata_snapshot, query_info, context, processed_stage, max_block_size, num_streams); auto pipe = read(column_names, metadata_snapshot, query_info, context, processed_stage, max_block_size, num_streams);
if (pipe.empty()) if (pipe.empty())
@ -117,15 +117,12 @@ void IStorage::read(
} }
Pipe IStorage::alterPartition( Pipe IStorage::alterPartition(
const StorageMetadataPtr & /* metadata_snapshot */, const StorageMetadataPtr & /* metadata_snapshot */, const PartitionCommands & /* commands */, const Context & /* context */)
const PartitionCommands & /* commands */,
const Context & /* context */)
{ {
throw Exception("Partition operations are not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED); throw Exception("Partition operations are not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
} }
void IStorage::alter( void IStorage::alter(const AlterCommands & params, const Context & context, TableLockHolder &)
const AlterCommands & params, const Context & context, TableLockHolder &)
{ {
auto table_id = getStorageID(); auto table_id = getStorageID();
StorageInMemoryMetadata new_metadata = getInMemoryMetadata(); StorageInMemoryMetadata new_metadata = getInMemoryMetadata();
@ -146,7 +143,8 @@ void IStorage::checkAlterIsPossible(const AlterCommands & commands, const Settin
} }
} }
void IStorage::checkAlterPartitionIsPossible(const PartitionCommands & /*commands*/, const StorageMetadataPtr & /*metadata_snapshot*/, const Settings & /*settings*/) const void IStorage::checkAlterPartitionIsPossible(
const PartitionCommands & /*commands*/, const StorageMetadataPtr & /*metadata_snapshot*/, const Settings & /*settings*/) const
{ {
throw Exception("Table engine " + getName() + " doesn't support partitioning", ErrorCodes::NOT_IMPLEMENTED); throw Exception("Table engine " + getName() + " doesn't support partitioning", ErrorCodes::NOT_IMPLEMENTED);
} }
@ -168,4 +166,13 @@ NamesAndTypesList IStorage::getVirtuals() const
return {}; return {};
} }
Names IStorage::getAllRegisteredNames() const
{
Names result;
auto getter = [](const auto & column) { return column.name; };
const NamesAndTypesList & available_columns = getInMemoryMetadata().getColumns().getAllPhysical();
std::transform(available_columns.begin(), available_columns.end(), std::back_inserter(result), getter);
return result;
}
} }

View File

@ -78,7 +78,7 @@ struct ColumnSize
* - data storage structure (compression, etc.) * - data storage structure (compression, etc.)
* - concurrent access to data (locks, etc.) * - concurrent access to data (locks, etc.)
*/ */
class IStorage : public std::enable_shared_from_this<IStorage>, public TypePromotion<IStorage> class IStorage : public std::enable_shared_from_this<IStorage>, public TypePromotion<IStorage>, public IHints<1, IStorage>
{ {
public: public:
IStorage() = delete; IStorage() = delete;
@ -87,7 +87,6 @@ public:
: storage_id(std::move(storage_id_)) : storage_id(std::move(storage_id_))
, metadata(std::make_unique<StorageInMemoryMetadata>()) {} //-V730 , metadata(std::make_unique<StorageInMemoryMetadata>()) {} //-V730
virtual ~IStorage() = default;
IStorage(const IStorage &) = delete; IStorage(const IStorage &) = delete;
IStorage & operator=(const IStorage &) = delete; IStorage & operator=(const IStorage &) = delete;
@ -169,6 +168,7 @@ public:
/// By default return empty list of columns. /// By default return empty list of columns.
virtual NamesAndTypesList getVirtuals() const; virtual NamesAndTypesList getVirtuals() const;
Names getAllRegisteredNames() const override;
protected: protected:
/// Returns whether the column is virtual - by default all columns are real. /// Returns whether the column is virtual - by default all columns are real.