2019-12-06 14:37:21 +00:00
# include <Common/config.h>
# if USE_AWS_S3
2019-12-03 16:23:24 +00:00
# include <IO/S3Common.h>
2019-05-31 07:27:14 +00:00
# include <Storages/StorageS3.h>
2019-11-04 19:57:03 +00:00
# include <Interpreters/evaluateConstantExpression.h>
2020-02-10 15:50:12 +00:00
# include <Interpreters/Context.h>
2019-05-31 07:27:14 +00:00
# include <TableFunctions/TableFunctionFactory.h>
# include <TableFunctions/TableFunctionS3.h>
2019-12-11 14:21:48 +00:00
# include <TableFunctions/parseColumnsListForTableFunction.h>
2019-11-04 19:57:03 +00:00
# include <Parsers/ASTLiteral.h>
2019-12-15 06:34:43 +00:00
# include "registerTableFunctions.h"
2019-05-31 07:27:14 +00:00
namespace DB
{
2019-09-22 22:13:42 +00:00
2019-11-04 19:57:03 +00:00
namespace ErrorCodes
{
2020-02-25 18:02:41 +00:00
extern const int LOGICAL_ERROR ;
2019-11-04 19:57:03 +00:00
extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH ;
}
2020-10-14 10:59:29 +00:00
StoragePtr TableFunctionS3 : : executeImpl ( const ASTPtr & ast_function , const Context & context , const std : : string & table_name ) const
2019-11-04 19:57:03 +00:00
{
/// Parse args
ASTs & args_func = ast_function - > children ;
if ( args_func . size ( ) ! = 1 )
throw Exception ( " Table function ' " + getName ( ) + " ' must have arguments. " , ErrorCodes : : LOGICAL_ERROR ) ;
ASTs & args = args_func . at ( 0 ) - > children ;
if ( args . size ( ) < 3 | | args . size ( ) > 6 )
throw Exception ( " Table function ' " + getName ( ) + " ' requires 3 to 6 arguments: url, [access_key_id, secret_access_key,] format, structure and [compression_method]. " ,
ErrorCodes : : NUMBER_OF_ARGUMENTS_DOESNT_MATCH ) ;
2020-03-09 02:31:05 +00:00
for ( auto & arg : args )
arg = evaluateConstantExpressionOrIdentifierAsLiteral ( arg , context ) ;
2019-11-04 19:57:03 +00:00
2020-10-14 10:59:29 +00:00
String filename = args [ 0 ] - > as < ASTLiteral & > ( ) . value . safeGet < String > ( ) ;
String format ;
String structure ;
String access_key_id ;
String secret_access_key ;
2019-11-04 19:57:03 +00:00
if ( args . size ( ) < 5 )
{
format = args [ 1 ] - > as < ASTLiteral & > ( ) . value . safeGet < String > ( ) ;
structure = args [ 2 ] - > as < ASTLiteral & > ( ) . value . safeGet < String > ( ) ;
}
else
{
access_key_id = args [ 1 ] - > as < ASTLiteral & > ( ) . value . safeGet < String > ( ) ;
secret_access_key = args [ 2 ] - > as < ASTLiteral & > ( ) . value . safeGet < String > ( ) ;
format = args [ 3 ] - > as < ASTLiteral & > ( ) . value . safeGet < String > ( ) ;
structure = args [ 4 ] - > as < ASTLiteral & > ( ) . value . safeGet < String > ( ) ;
}
2020-10-14 10:59:29 +00:00
String compression_method ;
2019-11-04 19:57:03 +00:00
if ( args . size ( ) = = 4 | | args . size ( ) = = 6 )
compression_method = args . back ( ) - > as < ASTLiteral & > ( ) . value . safeGet < String > ( ) ;
2020-10-14 10:59:29 +00:00
else
compression_method = " auto " ;
2019-11-04 19:57:03 +00:00
2020-10-14 10:59:29 +00:00
ColumnsDescription columns = parseColumnsListFromString ( structure , context ) ;
2019-11-04 19:57:03 +00:00
2020-10-14 10:59:29 +00:00
/// Create table
StoragePtr storage = getStorage ( filename , access_key_id , secret_access_key , format , columns , const_cast < Context & > ( context ) , table_name , compression_method ) ;
2019-11-04 19:57:03 +00:00
storage - > startup ( ) ;
return storage ;
}
2020-10-14 10:59:29 +00:00
StoragePtr TableFunctionS3 : : getStorage (
const String & source ,
const String & access_key_id ,
const String & secret_access_key ,
const String & format ,
const ColumnsDescription & columns ,
Context & global_context ,
const std : : string & table_name ,
const String & compression_method )
{
Poco : : URI uri ( source ) ;
S3 : : URI s3_uri ( uri ) ;
UInt64 min_upload_part_size = global_context . getSettingsRef ( ) . s3_min_upload_part_size ;
return StorageS3 : : create (
s3_uri ,
access_key_id ,
secret_access_key ,
StorageID ( getDatabaseName ( ) , table_name ) ,
format ,
min_upload_part_size ,
columns ,
ConstraintsDescription { } ,
global_context ,
compression_method ) ;
}
2019-05-31 07:27:14 +00:00
void registerTableFunctionS3 ( TableFunctionFactory & factory )
{
factory . registerFunction < TableFunctionS3 > ( ) ;
}
2019-09-22 22:13:42 +00:00
2020-07-13 14:13:30 +00:00
void registerTableFunctionCOS ( TableFunctionFactory & factory )
{
2020-07-17 03:33:29 +00:00
factory . registerFunction < TableFunctionCOS > ( ) ;
2020-07-13 14:13:30 +00:00
}
2019-05-31 07:27:14 +00:00
}
2019-12-06 14:37:21 +00:00
2019-12-09 12:36:06 +00:00
# endif