diff --git a/dbms/include/DB/Interpreters/InterpreterDescribeQuery.h b/dbms/include/DB/Interpreters/InterpreterDescribeQuery.h index 0ff5400ea2f..a8a489ecb71 100644 --- a/dbms/include/DB/Interpreters/InterpreterDescribeQuery.h +++ b/dbms/include/DB/Interpreters/InterpreterDescribeQuery.h @@ -10,6 +10,8 @@ #include #include #include +#include + namespace DB @@ -59,13 +61,18 @@ private: col.name = "name"; col.type = new DataTypeString; col.column = col.type->createColumn(); - block.insert(col); col.name = "type"; - block.insert(col); + col.name = "default_type"; + block.insert(col); + + col.name = "default_expression"; + block.insert(col); + + return block; } @@ -74,27 +81,48 @@ private: const ASTDescribeQuery & ast = typeid_cast(*query_ptr); NamesAndTypesList columns; + ColumnDefaults column_defaults; { StoragePtr table = context.getTable(ast.database, ast.table); auto table_lock = table->lockStructure(false); columns = table->getColumnsList(); + columns.insert(std::end(columns), std::begin(table->alias_columns), std::end(table->alias_columns)); + column_defaults = table->column_defaults; } - ColumnString * name_column = new ColumnString; - ColumnString * type_column = new ColumnString; + ColumnWithNameAndType name_column{new ColumnString, new DataTypeString, "name"}; + ColumnWithNameAndType type_column{new ColumnString, new DataTypeString, "type" }; + ColumnWithNameAndType default_type_column{new ColumnString, new DataTypeString, "default_type" }; + ColumnWithNameAndType default_expression_column{new ColumnString, new DataTypeString, "default_expression" };; - Block block; - block.insert(ColumnWithNameAndType(name_column, new DataTypeString, "name")); - block.insert(ColumnWithNameAndType(type_column, new DataTypeString, "type")); - - for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end(); ++it) + auto has_defaults = false; + for (const auto column : columns) { - name_column->insert(it->name); - type_column->insert(it->type->getName()); + name_column.column->insert(column.name); + type_column.column->insert(column.type->getName()); + + const auto it = column_defaults.find(column.name); + if (it == std::end(column_defaults)) + { + default_type_column.column->insertDefault(); + default_expression_column.column->insertDefault(); + } + else + { + has_defaults = true; + default_type_column.column->insert(toString(it->second.type)); + default_expression_column.column->insert(queryToString( + setAlias(it->second.expression->clone(), ""))); + } } - return new OneBlockInputStream(block); + + return new OneBlockInputStream{ + has_defaults + ? Block{name_column, type_column, default_type_column, default_expression_column} + : Block{name_column, type_column} + }; } }; diff --git a/dbms/include/DB/Parsers/formatAST.h b/dbms/include/DB/Parsers/formatAST.h index f9f903037ca..acb0f85f83a 100644 --- a/dbms/include/DB/Parsers/formatAST.h +++ b/dbms/include/DB/Parsers/formatAST.h @@ -73,4 +73,12 @@ void formatAST(const ASTShowProcesslistQuery & ast, std::ostream & s, String formatColumnsForCreateQuery(NamesAndTypesList & columns); String backQuoteIfNeed(const String & x); +inline String queryToString(const ASTPtr & query) +{ + std::ostringstream out; + formatAST(*query, out, 0, false, true); + + return out.str(); +} + } diff --git a/dbms/include/DB/Storages/Distributed/DistributedBlockOutputStream.h b/dbms/include/DB/Storages/Distributed/DistributedBlockOutputStream.h index 1bddee6b5cc..db266cb48db 100644 --- a/dbms/include/DB/Storages/Distributed/DistributedBlockOutputStream.h +++ b/dbms/include/DB/Storages/Distributed/DistributedBlockOutputStream.h @@ -1,7 +1,8 @@ #pragma once #include -#include + +#include #include #include diff --git a/dbms/include/DB/Storages/Distributed/queryToString.h b/dbms/include/DB/Storages/Distributed/queryToString.h deleted file mode 100644 index 9f1b243ed9f..00000000000 --- a/dbms/include/DB/Storages/Distributed/queryToString.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include - -namespace DB -{ - inline std::string queryToString(const ASTPtr & query) - { - std::ostringstream s; - formatAST(*query, s, 0, false, true); - - return s.str(); - } -} diff --git a/dbms/src/Storages/StorageDistributed.cpp b/dbms/src/Storages/StorageDistributed.cpp index 242bf3b335e..da45b4f1e67 100644 --- a/dbms/src/Storages/StorageDistributed.cpp +++ b/dbms/src/Storages/StorageDistributed.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include