@@ -518,7 +518,7 @@ impl<'a> TypeChecker<'a> {
518518 span : None ,
519519 is_try : false ,
520520 expr : Box :: new ( scalar. as_raw_expr_with_col_name ( ) ) ,
521- dest_type : DataType :: from ( & TableDataType :: from_type_name ( target_type) ?) ,
521+ dest_type : DataType :: from ( & resolve_type_name ( target_type) ?) ,
522522 } ;
523523 let registry = & BUILTIN_FUNCTIONS ;
524524 let expr = type_check:: check ( & raw_expr, registry) ?;
@@ -541,7 +541,7 @@ impl<'a> TypeChecker<'a> {
541541 span : None ,
542542 is_try : true ,
543543 expr : Box :: new ( scalar. as_raw_expr_with_col_name ( ) ) ,
544- dest_type : DataType :: from ( & TableDataType :: from_type_name ( target_type) ?) ,
544+ dest_type : DataType :: from ( & resolve_type_name ( target_type) ?) ,
545545 } ;
546546 let registry = & BUILTIN_FUNCTIONS ;
547547 let expr = type_check:: check ( & raw_expr, registry) ?;
@@ -2459,6 +2459,95 @@ impl<'a> TypeChecker<'a> {
24592459 }
24602460}
24612461
2462+ pub fn resolve_type_name_by_str ( name : & str ) -> Result < TableDataType > {
2463+ let sql_tokens = common_ast:: parser:: tokenize_sql ( name) ?;
2464+ let backtrace = common_ast:: Backtrace :: new ( ) ;
2465+ match common_ast:: parser:: expr:: type_name ( common_ast:: Input (
2466+ & sql_tokens,
2467+ common_ast:: Dialect :: default ( ) ,
2468+ & backtrace,
2469+ ) ) {
2470+ Ok ( ( _, typename) ) => resolve_type_name ( & typename) ,
2471+ Err ( err) => {
2472+ return Err ( ErrorCode :: SyntaxException ( format ! (
2473+ "Unsupported type name: {}, error: {}" ,
2474+ name, err
2475+ ) ) ) ;
2476+ }
2477+ }
2478+ }
2479+
2480+ pub fn resolve_type_name ( type_name : & TypeName ) -> Result < TableDataType > {
2481+ let data_type = match type_name {
2482+ TypeName :: Boolean => TableDataType :: Boolean ,
2483+ TypeName :: UInt8 => TableDataType :: Number ( NumberDataType :: UInt8 ) ,
2484+ TypeName :: UInt16 => TableDataType :: Number ( NumberDataType :: UInt16 ) ,
2485+ TypeName :: UInt32 => TableDataType :: Number ( NumberDataType :: UInt32 ) ,
2486+ TypeName :: UInt64 => TableDataType :: Number ( NumberDataType :: UInt64 ) ,
2487+ TypeName :: Int8 => TableDataType :: Number ( NumberDataType :: Int8 ) ,
2488+ TypeName :: Int16 => TableDataType :: Number ( NumberDataType :: Int16 ) ,
2489+ TypeName :: Int32 => TableDataType :: Number ( NumberDataType :: Int32 ) ,
2490+ TypeName :: Int64 => TableDataType :: Number ( NumberDataType :: Int64 ) ,
2491+ TypeName :: Float32 => TableDataType :: Number ( NumberDataType :: Float32 ) ,
2492+ TypeName :: Float64 => TableDataType :: Number ( NumberDataType :: Float64 ) ,
2493+ TypeName :: Decimal { precision, scale } => {
2494+ TableDataType :: Decimal ( DecimalDataType :: from_size ( DecimalSize {
2495+ precision : * precision,
2496+ scale : * scale,
2497+ } ) ?)
2498+ }
2499+ TypeName :: String => TableDataType :: String ,
2500+ TypeName :: Timestamp => TableDataType :: Timestamp ,
2501+ TypeName :: Date => TableDataType :: Date ,
2502+ TypeName :: Array ( item_type) => TableDataType :: Array ( Box :: new ( resolve_type_name ( item_type) ?) ) ,
2503+ TypeName :: Map { key_type, val_type } => {
2504+ let key_type = resolve_type_name ( key_type) ?;
2505+ match key_type {
2506+ TableDataType :: Boolean
2507+ | TableDataType :: String
2508+ | TableDataType :: Number ( _)
2509+ | TableDataType :: Decimal ( _)
2510+ | TableDataType :: Timestamp
2511+ | TableDataType :: Date => {
2512+ let val_type = resolve_type_name ( val_type) ?;
2513+ let inner_type = TableDataType :: Tuple {
2514+ fields_name : vec ! [ "key" . to_string( ) , "value" . to_string( ) ] ,
2515+ fields_type : vec ! [ key_type, val_type] ,
2516+ } ;
2517+ TableDataType :: Map ( Box :: new ( inner_type) )
2518+ }
2519+ _ => {
2520+ return Err ( ErrorCode :: Internal ( format ! (
2521+ "Invalid Map key type \' {:?}\' " ,
2522+ key_type
2523+ ) ) ) ;
2524+ }
2525+ }
2526+ }
2527+ TypeName :: Tuple {
2528+ fields_type,
2529+ fields_name,
2530+ } => TableDataType :: Tuple {
2531+ fields_name : match fields_name {
2532+ None => ( 0 ..fields_type. len ( ) )
2533+ . map ( |i| ( i + 1 ) . to_string ( ) )
2534+ . collect ( ) ,
2535+ Some ( names) => names. clone ( ) ,
2536+ } ,
2537+ fields_type : fields_type
2538+ . iter ( )
2539+ . map ( resolve_type_name)
2540+ . collect :: < Result < Vec < _ > > > ( ) ?,
2541+ } ,
2542+ TypeName :: Nullable ( inner_type) => {
2543+ TableDataType :: Nullable ( Box :: new ( resolve_type_name ( inner_type) ?) )
2544+ }
2545+ TypeName :: Variant => TableDataType :: Variant ,
2546+ } ;
2547+
2548+ Ok ( data_type)
2549+ }
2550+
24622551pub fn validate_function_arg (
24632552 name : & str ,
24642553 args_len : usize ,
0 commit comments