2017-04-16 05:40:17 +00:00
# include <iomanip>
2017-04-01 09:19:00 +00:00
# include <Parsers/ASTInsertQuery.h>
2019-05-30 20:12:44 +00:00
# include <Parsers/ASTFunction.h>
2021-08-13 16:30:28 +00:00
# include <Parsers/ASTLiteral.h>
2019-10-08 18:42:22 +00:00
# include <Common/quoteString.h>
2020-03-02 20:23:58 +00:00
# include <IO/WriteHelpers.h>
2020-11-09 16:05:40 +00:00
# include <IO/Operators.h>
2016-11-20 12:43:20 +00:00
namespace DB
{
2019-05-30 20:12:44 +00:00
namespace ErrorCodes
{
2019-09-05 13:17:01 +00:00
extern const int INVALID_USAGE_OF_INPUT ;
2019-05-30 20:12:44 +00:00
}
2016-11-20 12:43:20 +00:00
void ASTInsertQuery : : formatImpl ( const FormatSettings & settings , FormatState & state , FormatStateStacked frame ) const
{
2018-05-17 15:17:07 +00:00
frame . need_parens = false ;
2017-04-01 07:20:54 +00:00
2017-11-02 14:01:11 +00:00
settings . ostr < < ( settings . hilite ? hilite_keyword : " " ) < < " INSERT INTO " ;
if ( table_function )
2017-12-01 13:23:10 +00:00
{
settings . ostr < < ( settings . hilite ? hilite_keyword : " " ) < < " FUNCTION " ;
2017-11-02 14:01:11 +00:00
table_function - > formatImpl ( settings , state , frame ) ;
2017-12-01 13:23:10 +00:00
}
2017-11-02 14:01:11 +00:00
else
settings . ostr < < ( settings . hilite ? hilite_none : " " )
2020-04-08 01:02:00 +00:00
< < ( ! table_id . database_name . empty ( ) ? backQuoteIfNeed ( table_id . database_name ) + " . " : " " ) < < backQuoteIfNeed ( table_id . table_name ) ;
2017-04-01 07:20:54 +00:00
if ( columns )
{
settings . ostr < < " ( " ;
columns - > formatImpl ( settings , state , frame ) ;
settings . ostr < < " ) " ;
}
if ( select )
{
settings . ostr < < " " ;
select - > formatImpl ( settings , state , frame ) ;
}
2020-04-25 11:33:47 +00:00
else if ( watch )
{
settings . ostr < < " " ;
watch - > formatImpl ( settings , state , frame ) ;
}
2017-04-01 07:20:54 +00:00
else
{
2021-08-13 16:30:28 +00:00
if ( infile )
{
settings . ostr < < ( settings . hilite ? hilite_keyword : " " ) < < " FROM INFILE " < < ( settings . hilite ? hilite_none : " " ) < < infile - > as < ASTLiteral & > ( ) . value . safeGet < std : : string > ( ) ;
}
2017-04-01 07:20:54 +00:00
if ( ! format . empty ( ) )
{
settings . ostr < < ( settings . hilite ? hilite_keyword : " " ) < < " FORMAT " < < ( settings . hilite ? hilite_none : " " ) < < format ;
}
2021-08-13 16:30:28 +00:00
else if ( ! infile )
2017-04-01 07:20:54 +00:00
{
settings . ostr < < ( settings . hilite ? hilite_keyword : " " ) < < " VALUES " < < ( settings . hilite ? hilite_none : " " ) ;
}
}
2019-02-19 19:26:41 +00:00
if ( settings_ast )
{
2020-11-25 18:31:08 +00:00
settings . ostr < < ( settings . hilite ? hilite_keyword : " " ) < < settings . nl_or_ws < < " SETTINGS " < < ( settings . hilite ? hilite_none : " " ) ;
2019-02-19 19:26:41 +00:00
settings_ast - > formatImpl ( settings , state , frame ) ;
}
2016-11-20 12:43:20 +00:00
}
2019-05-30 20:12:44 +00:00
2019-12-15 06:34:43 +00:00
static void tryFindInputFunctionImpl ( const ASTPtr & ast , ASTPtr & input_function )
2019-05-30 20:12:44 +00:00
{
if ( ! ast )
return ;
for ( const auto & child : ast - > children )
2019-05-30 21:33:06 +00:00
tryFindInputFunctionImpl ( child , input_function ) ;
2019-05-30 20:12:44 +00:00
2019-05-30 21:33:06 +00:00
if ( const auto * table_function_ast = ast - > as < ASTFunction > ( ) )
2019-05-30 20:12:44 +00:00
{
2019-05-30 21:33:06 +00:00
if ( table_function_ast - > name = = " input " )
2019-05-30 20:12:44 +00:00
{
if ( input_function )
2019-09-05 13:17:01 +00:00
throw Exception ( " You can use 'input() ' function only once per request . " , ErrorCodes::INVALID_USAGE_OF_INPUT) ;
2019-05-30 20:12:44 +00:00
input_function = ast ;
}
}
}
2019-05-30 21:33:06 +00:00
void ASTInsertQuery : : tryFindInputFunction ( ASTPtr & input_function ) const
{
tryFindInputFunctionImpl ( select , input_function ) ;
}
2016-11-20 12:43:20 +00:00
}