From 1aac3a5c9dff467edbec8a1faea9dc45cbf26035 Mon Sep 17 00:00:00 2001 From: alesapin Date: Tue, 3 Mar 2020 12:05:17 +0300 Subject: [PATCH] Fixing defaults --- .../Interpreters/InterpreterCreateQuery.cpp | 10 +------- dbms/src/Storages/ColumnsDescription.cpp | 24 ++++++++++++++++++- dbms/src/Storages/ColumnsDescription.h | 1 + 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/dbms/src/Interpreters/InterpreterCreateQuery.cpp b/dbms/src/Interpreters/InterpreterCreateQuery.cpp index 4f7f1f98fbd..2aa2810dbc9 100644 --- a/dbms/src/Interpreters/InterpreterCreateQuery.cpp +++ b/dbms/src/Interpreters/InterpreterCreateQuery.cpp @@ -315,15 +315,7 @@ ColumnsDescription InterpreterCreateQuery::getColumnsDescription(const ASTExpres Block defaults_sample_block; /// set missing types and wrap default_expression's in a conversion-function if necessary if (!default_expr_list->children.empty()) - { - auto syntax_analyzer_result = SyntaxAnalyzer(context).analyze(default_expr_list, column_names_and_types); - const auto actions = ExpressionAnalyzer(default_expr_list, syntax_analyzer_result, context).getActions(true); - for (auto & action : actions->getActions()) - if (action.type == ExpressionAction::Type::JOIN || action.type == ExpressionAction::Type::ARRAY_JOIN) - throw Exception("Cannot CREATE table. Unsupported default value that requires ARRAY JOIN or JOIN action", ErrorCodes::THERE_IS_NO_DEFAULT_VALUE); - - defaults_sample_block = actions->getSampleBlock(); - } + defaults_sample_block = validateColumnsDefaultsAndGetSampleBlock(default_expr_list, column_names_and_types, context); ColumnsDescription res; auto name_type_it = column_names_and_types.begin(); diff --git a/dbms/src/Storages/ColumnsDescription.cpp b/dbms/src/Storages/ColumnsDescription.cpp index 8b491679138..b923e9e255e 100644 --- a/dbms/src/Storages/ColumnsDescription.cpp +++ b/dbms/src/Storages/ColumnsDescription.cpp @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include #include @@ -20,7 +22,9 @@ #include #include #include - +#include +#include +#include namespace DB { @@ -30,6 +34,7 @@ namespace ErrorCodes extern const int NO_SUCH_COLUMN_IN_TABLE; extern const int ILLEGAL_COLUMN; extern const int CANNOT_PARSE_TEXT; + extern const int THERE_IS_NO_DEFAULT_VALUE; } ColumnDescription::ColumnDescription(String name_, DataTypePtr type_, bool is_virtual_) @@ -421,4 +426,21 @@ ColumnsDescription ColumnsDescription::parse(const String & str) return result; } + +Block validateColumnsDefaultsAndGetSampleBlock(ASTPtr default_expr_list, const NamesAndTypesList & all_columns, const Context & context) +{ + for (const auto & child : default_expr_list->children) + if (child->as() || child->as()) + throw Exception("Select query is not allowed in columns DEFAULT expression", ErrorCodes::THERE_IS_NO_DEFAULT_VALUE); + + auto syntax_analyzer_result = SyntaxAnalyzer(context).analyze(default_expr_list, all_columns); + const auto actions = ExpressionAnalyzer(default_expr_list, syntax_analyzer_result, context).getActions(true); + for (auto & action : actions->getActions()) + if (action.type == ExpressionAction::Type::JOIN || action.type == ExpressionAction::Type::ARRAY_JOIN) + throw Exception( + "Unsupported default value that requires ARRAY JOIN or JOIN action", + ErrorCodes::THERE_IS_NO_DEFAULT_VALUE); + + return actions->getSampleBlock(); +} } diff --git a/dbms/src/Storages/ColumnsDescription.h b/dbms/src/Storages/ColumnsDescription.h index d0d042498fa..254be091b6b 100644 --- a/dbms/src/Storages/ColumnsDescription.h +++ b/dbms/src/Storages/ColumnsDescription.h @@ -114,4 +114,5 @@ private: Container columns; }; +Block validateColumnsDefaultsAndGetSampleBlock(ASTPtr default_expr_list, const NamesAndTypesList & all_columns, const Context & context); }