From 0821d62516dc72aa115ce9c0707b037d7c7a0906 Mon Sep 17 00:00:00 2001 From: Ivan Lezhankin Date: Fri, 17 May 2019 17:34:25 +0300 Subject: [PATCH] Merge ITableDeclaration into IStorage. Also a couple of massive include-refactorings with better forwarding --- dbms/src/Client/Connection.h | 3 +- dbms/src/DataStreams/BlockIO.h | 3 +- dbms/src/DataStreams/BlockStreamProfileInfo.h | 7 +- dbms/src/DataStreams/IBlockInputStream.h | 5 +- dbms/src/DataStreams/IBlockOutputStream.h | 13 +- dbms/src/DataStreams/IBlockStream_fwd.h | 16 + .../src/DataStreams/ParallelInputsProcessor.h | 2 +- dbms/src/DataStreams/copyData.h | 4 +- dbms/src/Databases/DatabaseDictionary.h | 2 +- dbms/src/Databases/DatabaseOrdinary.cpp | 37 +-- dbms/src/Databases/DatabasesCommon.cpp | 16 +- dbms/src/Databases/DatabasesCommon.h | 2 +- dbms/src/Databases/IDatabase.h | 4 +- dbms/src/Dictionaries/CacheDictionary.inc.h | 1 + .../Dictionaries/ComplexKeyCacheDictionary.h | 1 + .../Dictionaries/ComplexKeyHashedDictionary.h | 1 + .../Dictionaries/DictionarySourceFactory.h | 1 + .../Dictionaries/ExecutableDictionarySource.h | 6 +- dbms/src/Dictionaries/FileDictionarySource.h | 1 + dbms/src/Dictionaries/FlatDictionary.h | 1 + dbms/src/Dictionaries/HashedDictionary.h | 1 + dbms/src/Dictionaries/IDictionary.h | 12 +- dbms/src/Dictionaries/IDictionarySource.h | 4 +- .../Dictionaries/MongoDBDictionarySource.h | 1 + dbms/src/Dictionaries/MySQLDictionarySource.h | 1 + dbms/src/Dictionaries/readInvalidateQuery.h | 5 +- dbms/src/Formats/FormatFactory.h | 15 +- dbms/src/Functions/FunctionJoinGet.h | 3 +- dbms/src/Interpreters/ActionLocksManager.h | 6 +- dbms/src/Interpreters/Aggregator.h | 2 +- .../ClusterProxy/IStreamFactory.h | 3 +- .../ClusterProxy/SelectStreamFactory.h | 4 +- .../Interpreters/ClusterProxy/executeQuery.h | 1 - dbms/src/Interpreters/Context.h | 11 +- .../ExecuteScalarSubqueriesVisitor.cpp | 1 + dbms/src/Interpreters/ExpressionActions.h | 16 +- dbms/src/Interpreters/ExpressionAnalyzer.cpp | 1 + dbms/src/Interpreters/ExpressionAnalyzer.h | 11 +- .../InJoinSubqueriesPreprocessor.h | 9 +- dbms/src/Interpreters/InterpreterCheckQuery.h | 3 +- .../src/Interpreters/InterpreterCreateQuery.h | 3 +- .../Interpreters/InterpreterKillQueryQuery.h | 3 +- .../src/Interpreters/InterpreterSelectQuery.h | 3 +- .../src/Interpreters/InterpreterSystemQuery.h | 6 +- dbms/src/Interpreters/Join.h | 2 +- dbms/src/Interpreters/MutationsInterpreter.h | 6 +- dbms/src/Interpreters/ProcessList.h | 36 +-- dbms/src/Interpreters/SyntaxAnalyzer.h | 6 +- dbms/src/Storages/AlterCommands.h | 2 +- dbms/src/Storages/IStorage.cpp | 269 ++++++++++++++++- dbms/src/Storages/IStorage.h | 95 +++--- dbms/src/Storages/IStorage_fwd.h | 17 ++ dbms/src/Storages/ITableDeclaration.cpp | 285 ------------------ dbms/src/Storages/ITableDeclaration.h | 62 ---- .../Storages/MergeTree/DataPartsExchange.h | 2 +- dbms/src/Storages/MutationCommands.h | 3 +- dbms/src/Storages/PartitionCommands.h | 7 +- dbms/src/Storages/StorageFactory.h | 4 +- dbms/src/Storages/StorageMaterializedView.cpp | 2 + .../System/StorageSystemPartsBase.cpp | 4 +- .../System/StorageSystemPartsColumns.h | 1 - dbms/src/TableFunctions/ITableFunction.h | 6 +- 62 files changed, 517 insertions(+), 543 deletions(-) create mode 100644 dbms/src/DataStreams/IBlockStream_fwd.h create mode 100644 dbms/src/Storages/IStorage_fwd.h delete mode 100644 dbms/src/Storages/ITableDeclaration.cpp delete mode 100644 dbms/src/Storages/ITableDeclaration.h diff --git a/dbms/src/Client/Connection.h b/dbms/src/Client/Connection.h index e0478f4c75..4139bcacae 100644 --- a/dbms/src/Client/Connection.h +++ b/dbms/src/Client/Connection.h @@ -12,8 +12,7 @@ #include #include -#include -#include +#include #include #include diff --git a/dbms/src/DataStreams/BlockIO.h b/dbms/src/DataStreams/BlockIO.h index 4618b183d4..68d8ce284f 100644 --- a/dbms/src/DataStreams/BlockIO.h +++ b/dbms/src/DataStreams/BlockIO.h @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include namespace DB diff --git a/dbms/src/DataStreams/BlockStreamProfileInfo.h b/dbms/src/DataStreams/BlockStreamProfileInfo.h index 1f6047ab70..ebc8320445 100644 --- a/dbms/src/DataStreams/BlockStreamProfileInfo.h +++ b/dbms/src/DataStreams/BlockStreamProfileInfo.h @@ -1,8 +1,10 @@ #pragma once -#include -#include #include +#include +#include + +#include namespace DB { @@ -10,7 +12,6 @@ namespace DB class Block; class ReadBuffer; class WriteBuffer; -class IBlockInputStream; /// Information for profiling. See IBlockInputStream.h struct BlockStreamProfileInfo diff --git a/dbms/src/DataStreams/IBlockInputStream.h b/dbms/src/DataStreams/IBlockInputStream.h index cd5c48867c..b9e55763d4 100644 --- a/dbms/src/DataStreams/IBlockInputStream.h +++ b/dbms/src/DataStreams/IBlockInputStream.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -21,14 +22,10 @@ namespace ErrorCodes extern const int QUERY_WAS_CANCELLED; } -class IBlockInputStream; class ProcessListElement; class QuotaForIntervals; class QueryStatus; -using BlockInputStreamPtr = std::shared_ptr; -using BlockInputStreams = std::vector; - /** Callback to track the progress of the query. * Used in IBlockInputStream and Context. * The function takes the number of rows in the last block, the number of bytes in the last block. diff --git a/dbms/src/DataStreams/IBlockOutputStream.h b/dbms/src/DataStreams/IBlockOutputStream.h index f4269a6642..060438ba45 100644 --- a/dbms/src/DataStreams/IBlockOutputStream.h +++ b/dbms/src/DataStreams/IBlockOutputStream.h @@ -1,12 +1,15 @@ #pragma once -#include -#include -#include -#include #include +#include #include +#include + +#include +#include +#include + namespace DB { @@ -64,6 +67,4 @@ private: std::vector table_locks; }; -using BlockOutputStreamPtr = std::shared_ptr; - } diff --git a/dbms/src/DataStreams/IBlockStream_fwd.h b/dbms/src/DataStreams/IBlockStream_fwd.h new file mode 100644 index 0000000000..06319a5526 --- /dev/null +++ b/dbms/src/DataStreams/IBlockStream_fwd.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +namespace DB +{ + +class IBlockInputStream; +class IBlockOutputStream; + +using BlockInputStreamPtr = std::shared_ptr; +using BlockInputStreams = std::vector; +using BlockOutputStreamPtr = std::shared_ptr; + +} diff --git a/dbms/src/DataStreams/ParallelInputsProcessor.h b/dbms/src/DataStreams/ParallelInputsProcessor.h index 9088323af4..3f85238814 100644 --- a/dbms/src/DataStreams/ParallelInputsProcessor.h +++ b/dbms/src/DataStreams/ParallelInputsProcessor.h @@ -8,7 +8,7 @@ #include -#include +#include #include #include #include diff --git a/dbms/src/DataStreams/copyData.h b/dbms/src/DataStreams/copyData.h index 18ae8f2ab0..f2bce8f411 100644 --- a/dbms/src/DataStreams/copyData.h +++ b/dbms/src/DataStreams/copyData.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include @@ -7,8 +9,6 @@ namespace DB { -class IBlockInputStream; -class IBlockOutputStream; class Block; /** Copies data from the InputStream into the OutputStream diff --git a/dbms/src/Databases/DatabaseDictionary.h b/dbms/src/Databases/DatabaseDictionary.h index 178f12965a..3bff84c36b 100644 --- a/dbms/src/Databases/DatabaseDictionary.h +++ b/dbms/src/Databases/DatabaseDictionary.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include namespace Poco diff --git a/dbms/src/Databases/DatabaseOrdinary.cpp b/dbms/src/Databases/DatabaseOrdinary.cpp index bd2786b89a..9fa7d1b119 100644 --- a/dbms/src/Databases/DatabaseOrdinary.cpp +++ b/dbms/src/Databases/DatabaseOrdinary.cpp @@ -1,27 +1,28 @@ #include -#include -#include -#include - -#include +#include #include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include #include diff --git a/dbms/src/Databases/DatabasesCommon.cpp b/dbms/src/Databases/DatabasesCommon.cpp index 6292c4f414..2d0fc6f4b3 100644 --- a/dbms/src/Databases/DatabasesCommon.cpp +++ b/dbms/src/Databases/DatabasesCommon.cpp @@ -1,14 +1,16 @@ -#include +#include -#include -#include -#include -#include -#include #include #include +#include +#include +#include +#include +#include #include -#include +#include + +#include namespace DB diff --git a/dbms/src/Databases/DatabasesCommon.h b/dbms/src/Databases/DatabasesCommon.h index f31e600007..29fcb57055 100644 --- a/dbms/src/Databases/DatabasesCommon.h +++ b/dbms/src/Databases/DatabasesCommon.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include diff --git a/dbms/src/Databases/IDatabase.h b/dbms/src/Databases/IDatabase.h index 7c0d501fc6..d53de1dfcb 100644 --- a/dbms/src/Databases/IDatabase.h +++ b/dbms/src/Databases/IDatabase.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -20,9 +21,6 @@ namespace DB class Context; -class IStorage; -using StoragePtr = std::shared_ptr; - struct Settings; diff --git a/dbms/src/Dictionaries/CacheDictionary.inc.h b/dbms/src/Dictionaries/CacheDictionary.inc.h index ac451d8499..2cba6122b6 100644 --- a/dbms/src/Dictionaries/CacheDictionary.inc.h +++ b/dbms/src/Dictionaries/CacheDictionary.inc.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/dbms/src/Dictionaries/ComplexKeyCacheDictionary.h b/dbms/src/Dictionaries/ComplexKeyCacheDictionary.h index 6d00597533..b2ff0ec391 100644 --- a/dbms/src/Dictionaries/ComplexKeyCacheDictionary.h +++ b/dbms/src/Dictionaries/ComplexKeyCacheDictionary.h @@ -20,6 +20,7 @@ #include "DictionaryStructure.h" #include "IDictionary.h" #include "IDictionarySource.h" +#include namespace ProfileEvents diff --git a/dbms/src/Dictionaries/ComplexKeyHashedDictionary.h b/dbms/src/Dictionaries/ComplexKeyHashedDictionary.h index fc1fc70938..52b9f444ff 100644 --- a/dbms/src/Dictionaries/ComplexKeyHashedDictionary.h +++ b/dbms/src/Dictionaries/ComplexKeyHashedDictionary.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include "DictionaryStructure.h" diff --git a/dbms/src/Dictionaries/DictionarySourceFactory.h b/dbms/src/Dictionaries/DictionarySourceFactory.h index 1ac6e70f85..453ca43e0c 100644 --- a/dbms/src/Dictionaries/DictionarySourceFactory.h +++ b/dbms/src/Dictionaries/DictionarySourceFactory.h @@ -1,6 +1,7 @@ #pragma once #include "IDictionarySource.h" +#include #include #include diff --git a/dbms/src/Dictionaries/ExecutableDictionarySource.h b/dbms/src/Dictionaries/ExecutableDictionarySource.h index a7f60fedbe..c5ace9ab78 100644 --- a/dbms/src/Dictionaries/ExecutableDictionarySource.h +++ b/dbms/src/Dictionaries/ExecutableDictionarySource.h @@ -2,12 +2,10 @@ #include "DictionaryStructure.h" #include "IDictionarySource.h" +#include -namespace Poco -{ -class Logger; -} +namespace Poco { class Logger; } namespace DB diff --git a/dbms/src/Dictionaries/FileDictionarySource.h b/dbms/src/Dictionaries/FileDictionarySource.h index d8400f475c..083c3c6a3a 100644 --- a/dbms/src/Dictionaries/FileDictionarySource.h +++ b/dbms/src/Dictionaries/FileDictionarySource.h @@ -2,6 +2,7 @@ #include #include "IDictionarySource.h" +#include namespace DB diff --git a/dbms/src/Dictionaries/FlatDictionary.h b/dbms/src/Dictionaries/FlatDictionary.h index ccdf522162..a63f4fd2c6 100644 --- a/dbms/src/Dictionaries/FlatDictionary.h +++ b/dbms/src/Dictionaries/FlatDictionary.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include "DictionaryStructure.h" diff --git a/dbms/src/Dictionaries/HashedDictionary.h b/dbms/src/Dictionaries/HashedDictionary.h index 0ced0726b9..232e3e7bbd 100644 --- a/dbms/src/Dictionaries/HashedDictionary.h +++ b/dbms/src/Dictionaries/HashedDictionary.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include "DictionaryStructure.h" diff --git a/dbms/src/Dictionaries/IDictionary.h b/dbms/src/Dictionaries/IDictionary.h index 105f00e123..05f9806dc0 100644 --- a/dbms/src/Dictionaries/IDictionary.h +++ b/dbms/src/Dictionaries/IDictionary.h @@ -1,27 +1,27 @@ #pragma once -#include -#include + #include #include +#include #include #include #include #include #include "IDictionarySource.h" +#include +#include + namespace DB { + struct IDictionaryBase; using DictionaryPtr = std::unique_ptr; struct DictionaryStructure; class ColumnString; -class IBlockInputStream; -using BlockInputStreamPtr = std::shared_ptr; - - struct IDictionaryBase : public IExternalLoadable { using Key = UInt64; diff --git a/dbms/src/Dictionaries/IDictionarySource.h b/dbms/src/Dictionaries/IDictionarySource.h index bc2df7c3c5..145b2e03dd 100644 --- a/dbms/src/Dictionaries/IDictionarySource.h +++ b/dbms/src/Dictionaries/IDictionarySource.h @@ -1,7 +1,9 @@ #pragma once +#include +#include + #include -#include namespace DB diff --git a/dbms/src/Dictionaries/MongoDBDictionarySource.h b/dbms/src/Dictionaries/MongoDBDictionarySource.h index ce5c743afd..d5d6fee680 100644 --- a/dbms/src/Dictionaries/MongoDBDictionarySource.h +++ b/dbms/src/Dictionaries/MongoDBDictionarySource.h @@ -1,6 +1,7 @@ #pragma once #include +#include #if USE_POCO_MONGODB # include "DictionaryStructure.h" diff --git a/dbms/src/Dictionaries/MySQLDictionarySource.h b/dbms/src/Dictionaries/MySQLDictionarySource.h index 1ca1739759..24c3a8ca79 100644 --- a/dbms/src/Dictionaries/MySQLDictionarySource.h +++ b/dbms/src/Dictionaries/MySQLDictionarySource.h @@ -1,6 +1,7 @@ #pragma once #include +#include #if USE_MYSQL # include diff --git a/dbms/src/Dictionaries/readInvalidateQuery.h b/dbms/src/Dictionaries/readInvalidateQuery.h index 48fbfa0362..0a259e1ec2 100644 --- a/dbms/src/Dictionaries/readInvalidateQuery.h +++ b/dbms/src/Dictionaries/readInvalidateQuery.h @@ -1,11 +1,12 @@ #pragma once + +#include + #include namespace DB { -class IBlockInputStream; - /// Using in MySQLDictionarySource and XDBCDictionarySource after processing invalidate_query. std::string readInvalidateQuery(IBlockInputStream & block_input_stream); diff --git a/dbms/src/Formats/FormatFactory.h b/dbms/src/Formats/FormatFactory.h index 66ab1e6fa6..843d866301 100644 --- a/dbms/src/Formats/FormatFactory.h +++ b/dbms/src/Formats/FormatFactory.h @@ -1,10 +1,12 @@ #pragma once -#include +#include +#include +#include + #include +#include #include -#include -#include namespace DB @@ -17,13 +19,6 @@ struct FormatSettings; class ReadBuffer; class WriteBuffer; -class IBlockInputStream; -class IBlockOutputStream; - -using BlockInputStreamPtr = std::shared_ptr; -using BlockOutputStreamPtr = std::shared_ptr; - - /** Allows to create an IBlockInputStream or IBlockOutputStream by the name of the format. * Note: format and compression are independent things. */ diff --git a/dbms/src/Functions/FunctionJoinGet.h b/dbms/src/Functions/FunctionJoinGet.h index a0dcb77563..81f54b8433 100644 --- a/dbms/src/Functions/FunctionJoinGet.h +++ b/dbms/src/Functions/FunctionJoinGet.h @@ -1,11 +1,10 @@ #include +#include #include namespace DB { class Context; -class IStorage; -using StoragePtr = std::shared_ptr; class Join; using JoinPtr = std::shared_ptr; diff --git a/dbms/src/Interpreters/ActionLocksManager.h b/dbms/src/Interpreters/ActionLocksManager.h index 4e3d28e485..0f493e548b 100644 --- a/dbms/src/Interpreters/ActionLocksManager.h +++ b/dbms/src/Interpreters/ActionLocksManager.h @@ -1,14 +1,16 @@ #pragma once + #include +#include #include -#include + #include +#include namespace DB { -class IStorage; class Context; /// Holds ActionLocks for tables diff --git a/dbms/src/Interpreters/Aggregator.h b/dbms/src/Interpreters/Aggregator.h index c3f17f37b0..793179e060 100644 --- a/dbms/src/Interpreters/Aggregator.h +++ b/dbms/src/Interpreters/Aggregator.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include diff --git a/dbms/src/Interpreters/ClusterProxy/IStreamFactory.h b/dbms/src/Interpreters/ClusterProxy/IStreamFactory.h index beceaaecce..783ab0020c 100644 --- a/dbms/src/Interpreters/ClusterProxy/IStreamFactory.h +++ b/dbms/src/Interpreters/ClusterProxy/IStreamFactory.h @@ -1,9 +1,8 @@ #pragma once +#include #include #include -#include -#include namespace DB { diff --git a/dbms/src/Interpreters/ClusterProxy/SelectStreamFactory.h b/dbms/src/Interpreters/ClusterProxy/SelectStreamFactory.h index 75c6938b56..20bac52d39 100644 --- a/dbms/src/Interpreters/ClusterProxy/SelectStreamFactory.h +++ b/dbms/src/Interpreters/ClusterProxy/SelectStreamFactory.h @@ -1,8 +1,8 @@ #pragma once -#include #include -#include +#include +#include namespace DB { diff --git a/dbms/src/Interpreters/ClusterProxy/executeQuery.h b/dbms/src/Interpreters/ClusterProxy/executeQuery.h index 5c07c28795..e8704b73d5 100644 --- a/dbms/src/Interpreters/ClusterProxy/executeQuery.h +++ b/dbms/src/Interpreters/ClusterProxy/executeQuery.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include namespace DB diff --git a/dbms/src/Interpreters/Context.h b/dbms/src/Interpreters/Context.h index d590bb41c4..73b280072b 100644 --- a/dbms/src/Interpreters/Context.h +++ b/dbms/src/Interpreters/Context.h @@ -2,14 +2,16 @@ #include #include +#include #include +#include #include -#include #include #include #include #include #include +#include #include #include @@ -65,14 +67,7 @@ struct MergeTreeSettings; class IDatabase; class DDLGuard; class DDLWorker; -class IStorage; class ITableFunction; -using StoragePtr = std::shared_ptr; -using Tables = std::map; -class IBlockInputStream; -class IBlockOutputStream; -using BlockInputStreamPtr = std::shared_ptr; -using BlockOutputStreamPtr = std::shared_ptr; class Block; class ActionLocksManager; using ActionLocksManagerPtr = std::shared_ptr; diff --git a/dbms/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp b/dbms/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp index b6b731d866..88049565ae 100644 --- a/dbms/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp +++ b/dbms/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp @@ -10,6 +10,7 @@ #include #include +#include #include namespace DB diff --git a/dbms/src/Interpreters/ExpressionActions.h b/dbms/src/Interpreters/ExpressionActions.h index 3e892be142..3c244eeff1 100644 --- a/dbms/src/Interpreters/ExpressionActions.h +++ b/dbms/src/Interpreters/ExpressionActions.h @@ -1,15 +1,16 @@ #pragma once +#include +#include +#include +#include +#include #include -#include #include -#include -#include -#include -#include +#include -#include #include +#include namespace DB @@ -37,9 +38,6 @@ using FunctionBuilderPtr = std::shared_ptr; class IDataType; using DataTypePtr = std::shared_ptr; -class IBlockInputStream; -using BlockInputStreamPtr = std::shared_ptr; - class ExpressionActions; /** Action on the block. diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index d980cc8c36..33d47b6de7 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -39,6 +39,7 @@ #include #include +#include #include diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.h b/dbms/src/Interpreters/ExpressionAnalyzer.h index 02e8982ff3..6bba6860f6 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.h +++ b/dbms/src/Interpreters/ExpressionAnalyzer.h @@ -1,10 +1,12 @@ #pragma once +#include +#include #include #include -#include #include #include +#include namespace DB @@ -19,13 +21,6 @@ using ExpressionActionsPtr = std::shared_ptr; struct ASTTableJoin; -class IBlockInputStream; -using BlockInputStreamPtr = std::shared_ptr; - -class IStorage; -using StoragePtr = std::shared_ptr; -using Tables = std::map; - class ASTFunction; class ASTExpressionList; class ASTSelectQuery; diff --git a/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.h b/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.h index 8f7853720c..c1d0afe787 100644 --- a/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.h +++ b/dbms/src/Interpreters/InJoinSubqueriesPreprocessor.h @@ -1,16 +1,17 @@ #pragma once -#include -#include -#include #include +#include #include +#include + +#include +#include namespace DB { -class IStorage; class ASTSelectQuery; class Context; diff --git a/dbms/src/Interpreters/InterpreterCheckQuery.h b/dbms/src/Interpreters/InterpreterCheckQuery.h index a0a0d67723..ca6af4af7b 100644 --- a/dbms/src/Interpreters/InterpreterCheckQuery.h +++ b/dbms/src/Interpreters/InterpreterCheckQuery.h @@ -1,7 +1,8 @@ #pragma once +#include #include -#include +#include namespace DB { diff --git a/dbms/src/Interpreters/InterpreterCreateQuery.h b/dbms/src/Interpreters/InterpreterCreateQuery.h index 2f124e7df9..82ba09fb47 100644 --- a/dbms/src/Interpreters/InterpreterCreateQuery.h +++ b/dbms/src/Interpreters/InterpreterCreateQuery.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -12,8 +13,6 @@ namespace DB class Context; class ASTCreateQuery; class ASTExpressionList; -class IStorage; -using StoragePtr = std::shared_ptr; /** Allows to create new table or database, diff --git a/dbms/src/Interpreters/InterpreterKillQueryQuery.h b/dbms/src/Interpreters/InterpreterKillQueryQuery.h index fab4b30486..cca4314c78 100644 --- a/dbms/src/Interpreters/InterpreterKillQueryQuery.h +++ b/dbms/src/Interpreters/InterpreterKillQueryQuery.h @@ -1,7 +1,8 @@ #pragma once +#include #include -#include +#include namespace DB diff --git a/dbms/src/Interpreters/InterpreterSelectQuery.h b/dbms/src/Interpreters/InterpreterSelectQuery.h index 54ef3f8e60..75747694d9 100644 --- a/dbms/src/Interpreters/InterpreterSelectQuery.h +++ b/dbms/src/Interpreters/InterpreterSelectQuery.h @@ -4,13 +4,14 @@ #include #include -#include +#include #include #include #include #include #include #include +#include namespace Poco { class Logger; } diff --git a/dbms/src/Interpreters/InterpreterSystemQuery.h b/dbms/src/Interpreters/InterpreterSystemQuery.h index 65aaf78941..65a6b13884 100644 --- a/dbms/src/Interpreters/InterpreterSystemQuery.h +++ b/dbms/src/Interpreters/InterpreterSystemQuery.h @@ -2,16 +2,16 @@ #include #include +#include +namespace Poco { class Logger; } + namespace DB { class Context; class ASTSystemQuery; -class IStorage; -using StoragePtr = std::shared_ptr; - class InterpreterSystemQuery : public IInterpreter { diff --git a/dbms/src/Interpreters/Join.h b/dbms/src/Interpreters/Join.h index cd0632527f..4b3d699415 100644 --- a/dbms/src/Interpreters/Join.h +++ b/dbms/src/Interpreters/Join.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include diff --git a/dbms/src/Interpreters/MutationsInterpreter.h b/dbms/src/Interpreters/MutationsInterpreter.h index 8c91c9cef6..e49ef28402 100644 --- a/dbms/src/Interpreters/MutationsInterpreter.h +++ b/dbms/src/Interpreters/MutationsInterpreter.h @@ -1,10 +1,10 @@ #pragma once -#include +#include #include +#include #include -#include -#include +#include #include diff --git a/dbms/src/Interpreters/ProcessList.h b/dbms/src/Interpreters/ProcessList.h index 9737acc178..32f5974945 100644 --- a/dbms/src/Interpreters/ProcessList.h +++ b/dbms/src/Interpreters/ProcessList.h @@ -1,25 +1,28 @@ #pragma once -#include -#include -#include -#include -#include -#include -#include -#include + #include +#include #include -#include -#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include #include -#include -#include -#include -#include -#include + +#include +#include +#include +#include +#include +#include +#include namespace CurrentMetrics @@ -30,9 +33,6 @@ namespace CurrentMetrics namespace DB { -class IStorage; -using StoragePtr = std::shared_ptr; -using Tables = std::map; class Context; struct Settings; class IAST; diff --git a/dbms/src/Interpreters/SyntaxAnalyzer.h b/dbms/src/Interpreters/SyntaxAnalyzer.h index 90ab01c239..5896358eb8 100644 --- a/dbms/src/Interpreters/SyntaxAnalyzer.h +++ b/dbms/src/Interpreters/SyntaxAnalyzer.h @@ -1,15 +1,13 @@ #pragma once -#include #include +#include #include +#include namespace DB { -class IStorage; -using StoragePtr = std::shared_ptr; - NameSet removeDuplicateColumns(NamesAndTypesList & columns); struct SyntaxAnalyzerResult diff --git a/dbms/src/Storages/AlterCommands.h b/dbms/src/Storages/AlterCommands.h index 8871f76802..4905b80f92 100644 --- a/dbms/src/Storages/AlterCommands.h +++ b/dbms/src/Storages/AlterCommands.h @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -89,7 +90,6 @@ struct AlterCommand bool isMutable() const; }; -class IStorage; class Context; class AlterCommands : public std::vector diff --git a/dbms/src/Storages/IStorage.cpp b/dbms/src/Storages/IStorage.cpp index 77575ecbc8..a95083ead7 100644 --- a/dbms/src/Storages/IStorage.cpp +++ b/dbms/src/Storages/IStorage.cpp @@ -1,11 +1,277 @@ #include + #include +#include +#include + namespace DB { -void IStorage::alter(const AlterCommands & params, const String & database_name, const String & table_name, const Context & context, TableStructureWriteLockHolder & table_lock_holder) +namespace ErrorCodes +{ + extern const int COLUMN_QUERIED_MORE_THAN_ONCE; + extern const int DUPLICATE_COLUMN; + extern const int EMPTY_LIST_OF_COLUMNS_PASSED; + extern const int EMPTY_LIST_OF_COLUMNS_QUERIED; + extern const int NO_SUCH_COLUMN_IN_TABLE; + extern const int NOT_FOUND_COLUMN_IN_BLOCK; + extern const int TYPE_MISMATCH; +} + +IStorage::IStorage(ColumnsDescription columns_) +{ + setColumns(std::move(columns_)); +} + +const ColumnsDescription & IStorage::getColumns() const +{ + return columns; +} + +void IStorage::setColumns(ColumnsDescription columns_) +{ + if (columns_.getOrdinary().empty()) + throw Exception("Empty list of columns passed", ErrorCodes::EMPTY_LIST_OF_COLUMNS_PASSED); + columns = std::move(columns_); +} + +const IndicesDescription & IStorage::getIndices() const +{ + return indices; +} + +void IStorage::setIndices(IndicesDescription indices_) +{ + indices = std::move(indices_); +} + +NameAndTypePair IStorage::getColumn(const String & column_name) const +{ + /// By default, we assume that there are no virtual columns in the storage. + return getColumns().getPhysical(column_name); +} + +bool IStorage::hasColumn(const String & column_name) const +{ + /// By default, we assume that there are no virtual columns in the storage. + return getColumns().hasPhysical(column_name); +} + +Block IStorage::getSampleBlock() const +{ + Block res; + + for (const auto & column : getColumns().getAllPhysical()) + res.insert({column.type->createColumn(), column.type, column.name}); + + return res; +} + +Block IStorage::getSampleBlockNonMaterialized() const +{ + Block res; + + for (const auto & column : getColumns().getOrdinary()) + res.insert({column.type->createColumn(), column.type, column.name}); + + return res; +} + +Block IStorage::getSampleBlockForColumns(const Names & column_names) const +{ + Block res; + + NamesAndTypesList all_columns = getColumns().getAll(); + std::unordered_map columns_map; + for (const auto & elem : all_columns) + columns_map.emplace(elem.name, elem.type); + + for (const auto & name : column_names) + { + auto it = columns_map.find(name); + if (it != columns_map.end()) + { + res.insert({it->second->createColumn(), it->second, it->first}); + } + else + { + /// Virtual columns. + NameAndTypePair elem = getColumn(name); + res.insert({elem.type->createColumn(), elem.type, elem.name}); + } + } + + return res; +} + +namespace +{ + using NamesAndTypesMap = GOOGLE_NAMESPACE::dense_hash_map; + using UniqueStrings = GOOGLE_NAMESPACE::dense_hash_set; + + String listOfColumns(const NamesAndTypesList & available_columns) + { + std::stringstream ss; + for (auto it = available_columns.begin(); it != available_columns.end(); ++it) + { + if (it != available_columns.begin()) + ss << ", "; + ss << it->name; + } + return ss.str(); + } + + NamesAndTypesMap getColumnsMap(const NamesAndTypesList & columns) + { + NamesAndTypesMap res; + res.set_empty_key(StringRef()); + + for (const auto & column : columns) + res.insert({column.name, column.type.get()}); + + return res; + } + + UniqueStrings initUniqueStrings() + { + UniqueStrings strings; + strings.set_empty_key(StringRef()); + return strings; + } +} + +void IStorage::check(const Names & column_names) const +{ + const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); + const String list_of_columns = listOfColumns(available_columns); + + if (column_names.empty()) + throw Exception("Empty list of columns queried. There are columns: " + list_of_columns, ErrorCodes::EMPTY_LIST_OF_COLUMNS_QUERIED); + + const auto columns_map = getColumnsMap(available_columns); + + auto unique_names = initUniqueStrings(); + for (const auto & name : column_names) + { + if (columns_map.end() == columns_map.find(name)) + throw Exception( + "There is no column with name " + name + " in table. There are columns: " + list_of_columns, + ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + + if (unique_names.end() != unique_names.find(name)) + throw Exception("Column " + name + " queried more than once", ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); + unique_names.insert(name); + } +} + +void IStorage::check(const NamesAndTypesList & provided_columns) const +{ + const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); + const auto columns_map = getColumnsMap(available_columns); + + auto unique_names = initUniqueStrings(); + for (const NameAndTypePair & column : provided_columns) + { + auto it = columns_map.find(column.name); + if (columns_map.end() == it) + throw Exception( + "There is no column with name " + column.name + ". There are columns: " + listOfColumns(available_columns), + ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + + if (!column.type->equals(*it->second)) + throw Exception( + "Type mismatch for column " + column.name + ". Column has type " + it->second->getName() + ", got type " + + column.type->getName(), + ErrorCodes::TYPE_MISMATCH); + + if (unique_names.end() != unique_names.find(column.name)) + throw Exception("Column " + column.name + " queried more than once", ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); + unique_names.insert(column.name); + } +} + +void IStorage::check(const NamesAndTypesList & provided_columns, const Names & column_names) const +{ + const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); + const auto available_columns_map = getColumnsMap(available_columns); + const auto & provided_columns_map = getColumnsMap(provided_columns); + + if (column_names.empty()) + throw Exception( + "Empty list of columns queried. There are columns: " + listOfColumns(available_columns), + ErrorCodes::EMPTY_LIST_OF_COLUMNS_QUERIED); + + auto unique_names = initUniqueStrings(); + for (const String & name : column_names) + { + auto it = provided_columns_map.find(name); + if (provided_columns_map.end() == it) + continue; + + auto jt = available_columns_map.find(name); + if (available_columns_map.end() == jt) + throw Exception( + "There is no column with name " + name + ". There are columns: " + listOfColumns(available_columns), + ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + + if (!it->second->equals(*jt->second)) + throw Exception( + "Type mismatch for column " + name + ". Column has type " + jt->second->getName() + ", got type " + it->second->getName(), + ErrorCodes::TYPE_MISMATCH); + + if (unique_names.end() != unique_names.find(name)) + throw Exception("Column " + name + " queried more than once", ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); + unique_names.insert(name); + } +} + +void IStorage::check(const Block & block, bool need_all) const +{ + const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); + const auto columns_map = getColumnsMap(available_columns); + + NameSet names_in_block; + + block.checkNumberOfRows(); + + for (const auto & column : block) + { + if (names_in_block.count(column.name)) + throw Exception("Duplicate column " + column.name + " in block", ErrorCodes::DUPLICATE_COLUMN); + + names_in_block.insert(column.name); + + auto it = columns_map.find(column.name); + if (columns_map.end() == it) + throw Exception( + "There is no column with name " + column.name + ". There are columns: " + listOfColumns(available_columns), + ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + + if (!column.type->equals(*it->second)) + throw Exception( + "Type mismatch for column " + column.name + ". Column has type " + it->second->getName() + ", got type " + + column.type->getName(), + ErrorCodes::TYPE_MISMATCH); + } + + if (need_all && names_in_block.size() < columns_map.size()) + { + for (auto it = available_columns.begin(); it != available_columns.end(); ++it) + { + if (!names_in_block.count(it->name)) + throw Exception("Expected column " + it->name, ErrorCodes::NOT_FOUND_COLUMN_IN_BLOCK); + } + } +} + +void IStorage::alter( + const AlterCommands & params, + const String & database_name, + const String & table_name, + const Context & context, + TableStructureWriteLockHolder & table_lock_holder) { for (const auto & param : params) { @@ -20,5 +286,4 @@ void IStorage::alter(const AlterCommands & params, const String & database_name, context.getDatabase(database_name)->alterTable(context, table_name, new_columns, new_indices, {}); setColumns(std::move(new_columns)); } - } diff --git a/dbms/src/Storages/IStorage.h b/dbms/src/Storages/IStorage.h index e4721050a8..a98e62c69b 100644 --- a/dbms/src/Storages/IStorage.h +++ b/dbms/src/Storages/IStorage.h @@ -1,18 +1,19 @@ #pragma once -#include -#include #include #include +#include #include -#include -#include -#include #include -#include -#include -#include +#include +#include +#include #include +#include +#include + +#include +#include namespace DB @@ -25,22 +26,11 @@ namespace ErrorCodes } class Context; -class IBlockInputStream; -class IBlockOutputStream; using StorageActionBlockType = size_t; -using BlockOutputStreamPtr = std::shared_ptr; -using BlockInputStreamPtr = std::shared_ptr; -using BlockInputStreams = std::vector; - class ASTCreateQuery; -class IStorage; - -using StoragePtr = std::shared_ptr; -using StorageWeakPtr = std::weak_ptr; - struct Settings; class AlterCommands; @@ -48,42 +38,85 @@ class MutationCommands; class PartitionCommands; -/** Storage. Responsible for +/** Storage. Describes the table. Responsible for * - storage of the table data; * - the definition in which files (or not in files) the data is stored; * - data lookups and appends; * - data storage structure (compression, etc.) * - concurrent access to data (locks, etc.) */ -class IStorage : public std::enable_shared_from_this, private boost::noncopyable, public ITableDeclaration +class IStorage : public std::enable_shared_from_this { public: + IStorage() = default; + explicit IStorage(ColumnsDescription columns_); + + virtual ~IStorage() = default; + IStorage(const IStorage &) = delete; + IStorage & operator=(const IStorage &) = delete; + /// The main name of the table type (for example, StorageMergeTree). virtual std::string getName() const = 0; /// The name of the table. virtual std::string getTableName() const = 0; - virtual std::string getDatabaseName() const { return {}; } // FIXME: should be abstract method. + virtual std::string getDatabaseName() const { return {}; } // FIXME: should be an abstract method! - /** Returns true if the storage receives data from a remote server or servers. */ + /// Returns true if the storage receives data from a remote server or servers. virtual bool isRemote() const { return false; } - /** Returns true if the storage supports queries with the SAMPLE section. */ + /// Returns true if the storage supports queries with the SAMPLE section. virtual bool supportsSampling() const { return false; } - /** Returns true if the storage supports queries with the FINAL section. */ + /// Returns true if the storage supports queries with the FINAL section. virtual bool supportsFinal() const { return false; } - /** Returns true if the storage supports queries with the PREWHERE section. */ + /// Returns true if the storage supports queries with the PREWHERE section. virtual bool supportsPrewhere() const { return false; } - /** Returns true if the storage replicates SELECT, INSERT and ALTER commands among replicas. */ + /// Returns true if the storage replicates SELECT, INSERT and ALTER commands among replicas. virtual bool supportsReplication() const { return false; } - /** Returns true if the storage supports deduplication of inserted data blocks . */ + /// Returns true if the storage supports deduplication of inserted data blocks. virtual bool supportsDeduplication() const { return false; } +public: /// thread-unsafe part + const ColumnsDescription & getColumns() const; + void setColumns(ColumnsDescription columns_); + + const IndicesDescription & getIndices() const; + void setIndices(IndicesDescription indices_); + + /// NOTE: these methods should include virtual columns, + /// but should NOT include ALIAS columns (they are treated separately). + virtual NameAndTypePair getColumn(const String & column_name) const; + virtual bool hasColumn(const String & column_name) const; + + Block getSampleBlock() const; + Block getSampleBlockNonMaterialized() const; + Block getSampleBlockForColumns(const Names & column_names) const; /// including virtual and alias columns. + + /// Verify that all the requested names are in the table and are set correctly: + /// list of names is not empty and the names do not repeat. + void check(const Names & column_names) const; + + /// Check that all the requested names are in the table and have the correct types. + void check(const NamesAndTypesList & columns) const; + + /// Check that all names from the intersection of `names` and `columns` are in the table and have the same types. + void check(const NamesAndTypesList & columns, const Names & column_names) const; + + /// Check that the data block contains all the columns of the table with the correct types, + /// contains only the columns of the table, and all the columns are different. + /// If |need_all| is set, then checks that all the columns of the table are in the block. + void check(const Block & block, bool need_all = false) const; + +private: + ColumnsDescription columns; + IndicesDescription indices; + +public: /// Acquire this lock if you need the table structure to remain constant during the execution of /// the query. If will_add_new_data is true, this means that the query will add new data to the table /// (INSERT or a parts merge). @@ -335,9 +368,6 @@ public: /// Returns additional columns that need to be read for FINAL to work. virtual Names getColumnsRequiredForFinal() const { return {}; } - using ITableDeclaration::ITableDeclaration; - using std::enable_shared_from_this::shared_from_this; - private: /// You always need to take the next three locks in this order. @@ -357,7 +387,4 @@ private: mutable RWLock structure_lock = RWLockImpl::create(); }; -/// table name -> table -using Tables = std::map; - } diff --git a/dbms/src/Storages/IStorage_fwd.h b/dbms/src/Storages/IStorage_fwd.h new file mode 100644 index 0000000000..e80fa2a0eb --- /dev/null +++ b/dbms/src/Storages/IStorage_fwd.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +#include +#include + +namespace DB +{ + +class IStorage; + +using StoragePtr = std::shared_ptr; +using StorageWeakPtr = std::weak_ptr; +using Tables = std::map; + +} diff --git a/dbms/src/Storages/ITableDeclaration.cpp b/dbms/src/Storages/ITableDeclaration.cpp deleted file mode 100644 index bdd68a7ddb..0000000000 --- a/dbms/src/Storages/ITableDeclaration.cpp +++ /dev/null @@ -1,285 +0,0 @@ -#include -#include - -#include -#include -#include - -#include -#include - - -namespace DB -{ - -namespace ErrorCodes -{ - extern const int NO_SUCH_COLUMN_IN_TABLE; - extern const int EMPTY_LIST_OF_COLUMNS_QUERIED; - extern const int COLUMN_QUERIED_MORE_THAN_ONCE; - extern const int TYPE_MISMATCH; - extern const int DUPLICATE_COLUMN; - extern const int NOT_FOUND_COLUMN_IN_BLOCK; - extern const int EMPTY_LIST_OF_COLUMNS_PASSED; -} - -const ColumnsDescription & ITableDeclaration::getColumns() const -{ - return columns; -} - -const IndicesDescription & ITableDeclaration::getIndices() const -{ - return indices; -} - - -void ITableDeclaration::setColumns(ColumnsDescription columns_) -{ - if (columns_.getOrdinary().empty()) - throw Exception("Empty list of columns passed", ErrorCodes::EMPTY_LIST_OF_COLUMNS_PASSED); - columns = std::move(columns_); -} - -void ITableDeclaration::setIndices(IndicesDescription indices_) -{ - indices = std::move(indices_); -} - - -bool ITableDeclaration::hasColumn(const String & column_name) const -{ - return getColumns().hasPhysical(column_name); /// By default, we assume that there are no virtual columns in the storage. -} - -NameAndTypePair ITableDeclaration::getColumn(const String & column_name) const -{ - return getColumns().getPhysical(column_name); /// By default, we assume that there are no virtual columns in the storage. -} - - -Block ITableDeclaration::getSampleBlock() const -{ - Block res; - - for (const auto & col : getColumns().getAllPhysical()) - res.insert({ col.type->createColumn(), col.type, col.name }); - - return res; -} - - -Block ITableDeclaration::getSampleBlockNonMaterialized() const -{ - Block res; - - for (const auto & col : getColumns().getOrdinary()) - res.insert({ col.type->createColumn(), col.type, col.name }); - - return res; -} - - -Block ITableDeclaration::getSampleBlockForColumns(const Names & column_names) const -{ - Block res; - - NamesAndTypesList all_columns = getColumns().getAll(); - std::unordered_map columns_map; - for (const auto & elem : all_columns) - columns_map.emplace(elem.name, elem.type); - - for (const auto & name : column_names) - { - auto it = columns_map.find(name); - if (it != columns_map.end()) - { - res.insert({ it->second->createColumn(), it->second, it->first }); - } - else - { - /// Virtual columns. - NameAndTypePair elem = getColumn(name); - res.insert({ elem.type->createColumn(), elem.type, elem.name }); - } - } - - return res; -} - - -static std::string listOfColumns(const NamesAndTypesList & available_columns) -{ - std::stringstream s; - for (auto it = available_columns.begin(); it != available_columns.end(); ++it) - { - if (it != available_columns.begin()) - s << ", "; - s << it->name; - } - return s.str(); -} - - -using NamesAndTypesMap = GOOGLE_NAMESPACE::dense_hash_map; - -static NamesAndTypesMap & getColumnsMapImpl(NamesAndTypesMap & res) { return res; } - -template -static NamesAndTypesMap & getColumnsMapImpl(NamesAndTypesMap & res, const Arg & arg, const Args &... args) -{ - static_assert(std::is_same_v, "getColumnsMap requires arguments of type NamesAndTypesList"); - - for (const auto & column : arg) - res.insert({column.name, column.type.get()}); - - return getColumnsMapImpl(res, args...); -} - -template -static NamesAndTypesMap getColumnsMap(const Args &... args) -{ - NamesAndTypesMap res; - res.set_empty_key(StringRef()); - - return getColumnsMapImpl(res, args...); -} - - -void ITableDeclaration::check(const Names & column_names) const -{ - const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); - - if (column_names.empty()) - throw Exception("Empty list of columns queried. There are columns: " + listOfColumns(available_columns), - ErrorCodes::EMPTY_LIST_OF_COLUMNS_QUERIED); - - const auto columns_map = getColumnsMap(available_columns); - - using UniqueStrings = GOOGLE_NAMESPACE::dense_hash_set; - UniqueStrings unique_names; - unique_names.set_empty_key(StringRef()); - - for (const auto & name : column_names) - { - if (columns_map.end() == columns_map.find(name)) - throw Exception("There is no column with name " + name + " in table. There are columns: " + listOfColumns(available_columns), - ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); - - if (unique_names.end() != unique_names.find(name)) - throw Exception("Column " + name + " queried more than once", - ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); - unique_names.insert(name); - } -} - - -void ITableDeclaration::check(const NamesAndTypesList & provided_columns) const -{ - const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); - const auto columns_map = getColumnsMap(available_columns); - - using UniqueStrings = GOOGLE_NAMESPACE::dense_hash_set; - UniqueStrings unique_names; - unique_names.set_empty_key(StringRef()); - - for (const NameAndTypePair & column : provided_columns) - { - NamesAndTypesMap::const_iterator it = columns_map.find(column.name); - if (columns_map.end() == it) - throw Exception("There is no column with name " + column.name + ". There are columns: " - + listOfColumns(available_columns), ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); - - if (!column.type->equals(*it->second)) - throw Exception("Type mismatch for column " + column.name + ". Column has type " - + it->second->getName() + ", got type " + column.type->getName(), ErrorCodes::TYPE_MISMATCH); - - if (unique_names.end() != unique_names.find(column.name)) - throw Exception("Column " + column.name + " queried more than once", - ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); - unique_names.insert(column.name); - } -} - - -void ITableDeclaration::check(const NamesAndTypesList & provided_columns, const Names & column_names) const -{ - const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); - const auto available_columns_map = getColumnsMap(available_columns); - const NamesAndTypesMap & provided_columns_map = getColumnsMap(provided_columns); - - if (column_names.empty()) - throw Exception("Empty list of columns queried. There are columns: " + listOfColumns(available_columns), - ErrorCodes::EMPTY_LIST_OF_COLUMNS_QUERIED); - - using UniqueStrings = GOOGLE_NAMESPACE::dense_hash_set; - UniqueStrings unique_names; - unique_names.set_empty_key(StringRef()); - - for (const String & name : column_names) - { - NamesAndTypesMap::const_iterator it = provided_columns_map.find(name); - if (provided_columns_map.end() == it) - continue; - - NamesAndTypesMap::const_iterator jt = available_columns_map.find(name); - if (available_columns_map.end() == jt) - throw Exception("There is no column with name " + name + ". There are columns: " - + listOfColumns(available_columns), ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); - - if (!it->second->equals(*jt->second)) - throw Exception("Type mismatch for column " + name + ". Column has type " - + jt->second->getName() + ", got type " + it->second->getName(), ErrorCodes::TYPE_MISMATCH); - - if (unique_names.end() != unique_names.find(name)) - throw Exception("Column " + name + " queried more than once", - ErrorCodes::COLUMN_QUERIED_MORE_THAN_ONCE); - unique_names.insert(name); - } -} - - -void ITableDeclaration::check(const Block & block, bool need_all) const -{ - const NamesAndTypesList & available_columns = getColumns().getAllPhysical(); - const auto columns_map = getColumnsMap(available_columns); - - NameSet names_in_block; - - block.checkNumberOfRows(); - - for (const auto & column : block) - { - if (names_in_block.count(column.name)) - throw Exception("Duplicate column " + column.name + " in block", - ErrorCodes::DUPLICATE_COLUMN); - - names_in_block.insert(column.name); - - NamesAndTypesMap::const_iterator it = columns_map.find(column.name); - if (columns_map.end() == it) - throw Exception("There is no column with name " + column.name + ". There are columns: " - + listOfColumns(available_columns), ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); - - if (!column.type->equals(*it->second)) - throw Exception("Type mismatch for column " + column.name + ". Column has type " - + it->second->getName() + ", got type " + column.type->getName(), ErrorCodes::TYPE_MISMATCH); - } - - if (need_all && names_in_block.size() < columns_map.size()) - { - for (NamesAndTypesList::const_iterator it = available_columns.begin(); it != available_columns.end(); ++it) - { - if (!names_in_block.count(it->name)) - throw Exception("Expected column " + it->name, ErrorCodes::NOT_FOUND_COLUMN_IN_BLOCK); - } - } -} - - -ITableDeclaration::ITableDeclaration(ColumnsDescription columns_) -{ - setColumns(std::move(columns_)); -} - -} diff --git a/dbms/src/Storages/ITableDeclaration.h b/dbms/src/Storages/ITableDeclaration.h deleted file mode 100644 index 9970cac542..0000000000 --- a/dbms/src/Storages/ITableDeclaration.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once - -#include -#include - - -namespace DB -{ - -/** Description of the table. - * Is not thread safe. See IStorage::lockStructure (). - */ -class ITableDeclaration -{ -public: - const ColumnsDescription & getColumns() const; - void setColumns(ColumnsDescription columns_); - - const IndicesDescription & getIndices() const; - void setIndices(IndicesDescription indices_); - - /// NOTE: These methods should include virtual columns, but should NOT include ALIAS columns - /// (they are treated separately). - virtual NameAndTypePair getColumn(const String & column_name) const; - virtual bool hasColumn(const String & column_name) const; - - Block getSampleBlock() const; - Block getSampleBlockNonMaterialized() const; - - /// Including virtual and alias columns. - Block getSampleBlockForColumns(const Names & column_names) const; - - /** Verify that all the requested names are in the table and are set correctly. - * (the list of names is not empty and the names do not repeat) - */ - void check(const Names & column_names) const; - - /** Check that all the requested names are in the table and have the correct types. - */ - void check(const NamesAndTypesList & columns) const; - - /** Check that all names from the intersection of `names` and `columns` are in the table and have the same types. - */ - void check(const NamesAndTypesList & columns, const Names & column_names) const; - - /** Check that the data block contains all the columns of the table with the correct types, - * contains only the columns of the table, and all the columns are different. - * If need_all, checks that all the columns of the table are in the block. - */ - void check(const Block & block, bool need_all = false) const; - - - ITableDeclaration() = default; - explicit ITableDeclaration(ColumnsDescription columns_); - virtual ~ITableDeclaration() = default; - -private: - ColumnsDescription columns; - IndicesDescription indices; -}; - -} diff --git a/dbms/src/Storages/MergeTree/DataPartsExchange.h b/dbms/src/Storages/MergeTree/DataPartsExchange.h index d97687da88..596d19aa79 100644 --- a/dbms/src/Storages/MergeTree/DataPartsExchange.h +++ b/dbms/src/Storages/MergeTree/DataPartsExchange.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include diff --git a/dbms/src/Storages/MutationCommands.h b/dbms/src/Storages/MutationCommands.h index b5894c9359..b75409dc52 100644 --- a/dbms/src/Storages/MutationCommands.h +++ b/dbms/src/Storages/MutationCommands.h @@ -1,6 +1,8 @@ #pragma once #include +#include + #include #include @@ -8,7 +10,6 @@ namespace DB { -class IStorage; class Context; class WriteBuffer; class ReadBuffer; diff --git a/dbms/src/Storages/PartitionCommands.h b/dbms/src/Storages/PartitionCommands.h index 987af8baef..1f66c3f0c3 100644 --- a/dbms/src/Storages/PartitionCommands.h +++ b/dbms/src/Storages/PartitionCommands.h @@ -1,16 +1,17 @@ #pragma once -#include #include +#include #include -#include +#include + #include +#include namespace DB { -class IStorage; class ASTAlterCommand; struct PartitionCommand diff --git a/dbms/src/Storages/StorageFactory.h b/dbms/src/Storages/StorageFactory.h index 125758cef0..2c97fb798e 100644 --- a/dbms/src/Storages/StorageFactory.h +++ b/dbms/src/Storages/StorageFactory.h @@ -1,7 +1,9 @@ #pragma once #include -#include +#include +#include +#include #include #include diff --git a/dbms/src/Storages/StorageMaterializedView.cpp b/dbms/src/Storages/StorageMaterializedView.cpp index 93c42473d4..0779132c37 100644 --- a/dbms/src/Storages/StorageMaterializedView.cpp +++ b/dbms/src/Storages/StorageMaterializedView.cpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include diff --git a/dbms/src/Storages/System/StorageSystemPartsBase.cpp b/dbms/src/Storages/System/StorageSystemPartsBase.cpp index 72fcfa0c50..85fd64195c 100644 --- a/dbms/src/Storages/System/StorageSystemPartsBase.cpp +++ b/dbms/src/Storages/System/StorageSystemPartsBase.cpp @@ -259,7 +259,7 @@ NameAndTypePair StorageSystemPartsBase::getColumn(const String & column_name) co if (column_name == "_state") return NameAndTypePair("_state", std::make_shared()); - return ITableDeclaration::getColumn(column_name); + return IStorage::getColumn(column_name); } bool StorageSystemPartsBase::hasColumn(const String & column_name) const @@ -267,7 +267,7 @@ bool StorageSystemPartsBase::hasColumn(const String & column_name) const if (column_name == "_state") return true; - return ITableDeclaration::hasColumn(column_name); + return IStorage::hasColumn(column_name); } StorageSystemPartsBase::StorageSystemPartsBase(std::string name_, NamesAndTypesList && columns_) diff --git a/dbms/src/Storages/System/StorageSystemPartsColumns.h b/dbms/src/Storages/System/StorageSystemPartsColumns.h index 64106b1d97..bd03e65557 100644 --- a/dbms/src/Storages/System/StorageSystemPartsColumns.h +++ b/dbms/src/Storages/System/StorageSystemPartsColumns.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include diff --git a/dbms/src/TableFunctions/ITableFunction.h b/dbms/src/TableFunctions/ITableFunction.h index 39ef7857a3..026ff94497 100644 --- a/dbms/src/TableFunctions/ITableFunction.h +++ b/dbms/src/TableFunctions/ITableFunction.h @@ -1,18 +1,16 @@ #pragma once #include +#include -#include #include +#include namespace DB { class Context; -class IStorage; -using StoragePtr = std::shared_ptr; - /** Interface for table functions. * -- GitLab