@@ -39,6 +39,26 @@ def _build_approx_top_k(args: t.List) -> exp.ApproxTopK:
3939 return exp .ApproxTopK .from_arg_list (args )
4040
4141
42+ def _build_to_number (args : t .List , safe : bool = False ) -> exp .ToNumber :
43+ second_arg = seq_get (args , 1 )
44+ if second_arg and second_arg .is_number :
45+ fmt = None
46+ precision = second_arg
47+ scale = seq_get (args , 2 ) or exp .Literal .number (0 )
48+ else :
49+ fmt = second_arg
50+ precision = seq_get (args , 2 ) or exp .Literal .number (38 )
51+ scale = seq_get (args , 3 ) or exp .Literal .number (0 )
52+
53+ return exp .ToNumber (
54+ this = seq_get (args , 0 ),
55+ format = fmt ,
56+ precision = precision ,
57+ scale = scale ,
58+ safe = safe ,
59+ )
60+
61+
4262def _build_date_from_parts (args : t .List ) -> exp .DateFromParts :
4363 return exp .DateFromParts (
4464 year = seq_get (args , 0 ),
@@ -623,15 +643,7 @@ class SnowflakeParser(parser.Parser):
623643 "TRY_TO_DATE" : _build_datetime ("TRY_TO_DATE" , exp .DType .DATE , safe = True ),
624644 ** dict .fromkeys (
625645 ("TRY_TO_DECIMAL" , "TRY_TO_NUMBER" , "TRY_TO_NUMERIC" ),
626- lambda args : exp .ToNumber (
627- this = seq_get (args , 0 ),
628- format = seq_get (args , 1 ) if len (args ) in (2 , 4 ) else None ,
629- precision = (seq_get (args , 2 ) if len (args ) in (2 , 4 ) else seq_get (args , 1 ))
630- or exp .Literal .number (38 ),
631- scale = (seq_get (args , 3 ) if len (args ) in (2 , 4 ) else seq_get (args , 2 ))
632- or exp .Literal .number (0 ),
633- safe = True ,
634- ),
646+ lambda args : _build_to_number (args , safe = True ),
635647 ),
636648 "TRY_TO_DOUBLE" : lambda args : exp .ToDouble (
637649 this = seq_get (args , 0 ), format = seq_get (args , 1 ), safe = True
@@ -654,14 +666,7 @@ class SnowflakeParser(parser.Parser):
654666 "TO_DATE" : _build_datetime ("TO_DATE" , exp .DType .DATE ),
655667 ** dict .fromkeys (
656668 ("TO_DECIMAL" , "TO_NUMBER" , "TO_NUMERIC" ),
657- lambda args : exp .ToNumber (
658- this = seq_get (args , 0 ),
659- format = seq_get (args , 1 ) if len (args ) in (2 , 4 ) else None ,
660- precision = (seq_get (args , 2 ) if len (args ) in (2 , 4 ) else seq_get (args , 1 ))
661- or exp .Literal .number (38 ),
662- scale = (seq_get (args , 3 ) if len (args ) in (2 , 4 ) else seq_get (args , 2 ))
663- or exp .Literal .number (0 ),
664- ),
669+ lambda args : _build_to_number (args ),
665670 ),
666671 "TO_TIME" : _build_datetime ("TO_TIME" , exp .DType .TIME ),
667672 "TO_TIMESTAMP" : _build_datetime ("TO_TIMESTAMP" , exp .DType .TIMESTAMP ),
0 commit comments