@@ -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 ( & Self :: resolve_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 ( & Self :: resolve_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) ?;
@@ -2457,79 +2457,93 @@ impl<'a> TypeChecker<'a> {
24572457 && names. contains ( & name) ;
24582458 Ok ( result)
24592459 }
2460+ }
24602461
2461- pub fn resolve_type_name ( type_name : & TypeName ) -> Result < TableDataType > {
2462- let data_type = match type_name {
2463- TypeName :: Boolean => TableDataType :: Boolean ,
2464- TypeName :: UInt8 => TableDataType :: Number ( NumberDataType :: UInt8 ) ,
2465- TypeName :: UInt16 => TableDataType :: Number ( NumberDataType :: UInt16 ) ,
2466- TypeName :: UInt32 => TableDataType :: Number ( NumberDataType :: UInt32 ) ,
2467- TypeName :: UInt64 => TableDataType :: Number ( NumberDataType :: UInt64 ) ,
2468- TypeName :: Int8 => TableDataType :: Number ( NumberDataType :: Int8 ) ,
2469- TypeName :: Int16 => TableDataType :: Number ( NumberDataType :: Int16 ) ,
2470- TypeName :: Int32 => TableDataType :: Number ( NumberDataType :: Int32 ) ,
2471- TypeName :: Int64 => TableDataType :: Number ( NumberDataType :: Int64 ) ,
2472- TypeName :: Float32 => TableDataType :: Number ( NumberDataType :: Float32 ) ,
2473- TypeName :: Float64 => TableDataType :: Number ( NumberDataType :: Float64 ) ,
2474- TypeName :: Decimal { precision, scale } => {
2475- TableDataType :: Decimal ( DecimalDataType :: from_size ( DecimalSize {
2476- precision : * precision,
2477- scale : * scale,
2478- } ) ?)
2479- }
2480- TypeName :: String => TableDataType :: String ,
2481- TypeName :: Timestamp => TableDataType :: Timestamp ,
2482- TypeName :: Date => TableDataType :: Date ,
2483- TypeName :: Array ( item_type) => {
2484- TableDataType :: Array ( Box :: new ( Self :: resolve_type_name ( item_type) ?) )
2485- }
2486- TypeName :: Map { key_type, val_type } => {
2487- let key_type = Self :: resolve_type_name ( key_type) ?;
2488- match key_type {
2489- TableDataType :: Boolean
2490- | TableDataType :: String
2491- | TableDataType :: Number ( _)
2492- | TableDataType :: Decimal ( _)
2493- | TableDataType :: Timestamp
2494- | TableDataType :: Date => {
2495- let val_type = Self :: resolve_type_name ( val_type) ?;
2496- let inner_type = TableDataType :: Tuple {
2497- fields_name : vec ! [ "key" . to_string( ) , "value" . to_string( ) ] ,
2498- fields_type : vec ! [ key_type, val_type] ,
2499- } ;
2500- TableDataType :: Map ( Box :: new ( inner_type) )
2501- }
2502- _ => {
2503- return Err ( ErrorCode :: Internal ( format ! (
2504- "Invalid Map key type \' {:?}\' " ,
2505- key_type
2506- ) ) ) ;
2507- }
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) => Err ( ErrorCode :: SyntaxException ( format ! (
2472+ "Unsupported type name: {}, error: {}" ,
2473+ name, err
2474+ ) ) ) ,
2475+ }
2476+ }
2477+
2478+ pub fn resolve_type_name ( type_name : & TypeName ) -> Result < TableDataType > {
2479+ let data_type = match type_name {
2480+ TypeName :: Boolean => TableDataType :: Boolean ,
2481+ TypeName :: UInt8 => TableDataType :: Number ( NumberDataType :: UInt8 ) ,
2482+ TypeName :: UInt16 => TableDataType :: Number ( NumberDataType :: UInt16 ) ,
2483+ TypeName :: UInt32 => TableDataType :: Number ( NumberDataType :: UInt32 ) ,
2484+ TypeName :: UInt64 => TableDataType :: Number ( NumberDataType :: UInt64 ) ,
2485+ TypeName :: Int8 => TableDataType :: Number ( NumberDataType :: Int8 ) ,
2486+ TypeName :: Int16 => TableDataType :: Number ( NumberDataType :: Int16 ) ,
2487+ TypeName :: Int32 => TableDataType :: Number ( NumberDataType :: Int32 ) ,
2488+ TypeName :: Int64 => TableDataType :: Number ( NumberDataType :: Int64 ) ,
2489+ TypeName :: Float32 => TableDataType :: Number ( NumberDataType :: Float32 ) ,
2490+ TypeName :: Float64 => TableDataType :: Number ( NumberDataType :: Float64 ) ,
2491+ TypeName :: Decimal { precision, scale } => {
2492+ TableDataType :: Decimal ( DecimalDataType :: from_size ( DecimalSize {
2493+ precision : * precision,
2494+ scale : * scale,
2495+ } ) ?)
2496+ }
2497+ TypeName :: String => TableDataType :: String ,
2498+ TypeName :: Timestamp => TableDataType :: Timestamp ,
2499+ TypeName :: Date => TableDataType :: Date ,
2500+ TypeName :: Array ( item_type) => TableDataType :: Array ( Box :: new ( resolve_type_name ( item_type) ?) ) ,
2501+ TypeName :: Map { key_type, val_type } => {
2502+ let key_type = resolve_type_name ( key_type) ?;
2503+ match key_type {
2504+ TableDataType :: Boolean
2505+ | TableDataType :: String
2506+ | TableDataType :: Number ( _)
2507+ | TableDataType :: Decimal ( _)
2508+ | TableDataType :: Timestamp
2509+ | TableDataType :: Date => {
2510+ let val_type = resolve_type_name ( val_type) ?;
2511+ let inner_type = TableDataType :: Tuple {
2512+ fields_name : vec ! [ "key" . to_string( ) , "value" . to_string( ) ] ,
2513+ fields_type : vec ! [ key_type, val_type] ,
2514+ } ;
2515+ TableDataType :: Map ( Box :: new ( inner_type) )
2516+ }
2517+ _ => {
2518+ return Err ( ErrorCode :: Internal ( format ! (
2519+ "Invalid Map key type \' {:?}\' " ,
2520+ key_type
2521+ ) ) ) ;
25082522 }
25092523 }
2510- TypeName :: Tuple {
2511- fields_type,
2512- fields_name,
2513- } => TableDataType :: Tuple {
2514- fields_name : match fields_name {
2515- None => ( 0 ..fields_type. len ( ) )
2516- . map ( |i| ( i + 1 ) . to_string ( ) )
2517- . collect ( ) ,
2518- Some ( names) => names. clone ( ) ,
2519- } ,
2520- fields_type : fields_type
2521- . iter ( )
2522- . map ( Self :: resolve_type_name)
2523- . collect :: < Result < Vec < _ > > > ( ) ?,
2524+ }
2525+ TypeName :: Tuple {
2526+ fields_type,
2527+ fields_name,
2528+ } => TableDataType :: Tuple {
2529+ fields_name : match fields_name {
2530+ None => ( 0 ..fields_type. len ( ) )
2531+ . map ( |i| ( i + 1 ) . to_string ( ) )
2532+ . collect ( ) ,
2533+ Some ( names) => names. clone ( ) ,
25242534 } ,
2525- TypeName :: Nullable ( inner_type) => {
2526- TableDataType :: Nullable ( Box :: new ( Self :: resolve_type_name ( inner_type) ?) )
2527- }
2528- TypeName :: Variant => TableDataType :: Variant ,
2529- } ;
2535+ fields_type : fields_type
2536+ . iter ( )
2537+ . map ( resolve_type_name)
2538+ . collect :: < Result < Vec < _ > > > ( ) ?,
2539+ } ,
2540+ TypeName :: Nullable ( inner_type) => {
2541+ TableDataType :: Nullable ( Box :: new ( resolve_type_name ( inner_type) ?) )
2542+ }
2543+ TypeName :: Variant => TableDataType :: Variant ,
2544+ } ;
25302545
2531- Ok ( data_type)
2532- }
2546+ Ok ( data_type)
25332547}
25342548
25352549pub fn validate_function_arg (
0 commit comments