@@ -5006,8 +5006,37 @@ substring_funcs_clause
50065006 separator
50075007 }
50085008 }
5009+
5010+ make_interval_func_args_item
5011+ = n :('years' i / 'months' i / 'weeks' i / 'days' i / 'hours' i / 'mins' i ) __ '=>' __ v :(integer / expr ) {
5012+ // => { type: 'func_arg', value: { name: ident_name; symbol: '=>', value: literal_numeric; } }
5013+ return { type: ' func_arg' , value: { name: n, symbol: ' =>' , expr: v } };
5014+ }
5015+ / n :('secs' i ) __ '=>' __ v :(double_float / expr ) {
5016+ // => IGNORE
5017+ return { type: ' func_arg' , value: { name: n, symbol: ' =>' , expr: v } };
5018+ }
5019+
5020+ make_interval_func_args
5021+ = head :make_interval_func_args_item tail :(__ COMMA __ make_interval_func_args_item )* {
5022+ // => make_interval_func_args_item[]
5023+ return { type: ' expr_list' , value: createList (head, tail) };
5024+ }
5025+ / expr_list
5026+
5027+ make_interval_func_clause
5028+ = name :'make_interval' i __ LPAREN __ l :make_interval_func_args __ RPAREN {
5029+ // => { type: 'function'; name: proc_func_name; args: make_interval_func_args; }
5030+ return {
5031+ type: ' function' ,
5032+ name: { name: [{ type: ' origin' , value: name }] },
5033+ args: l,
5034+ ... getLocationObject (),
5035+ }
5036+ }
5037+
50095038func_call
5010- = trim_func_clause / tablefunc_clause / substring_funcs_clause
5039+ = trim_func_clause / tablefunc_clause / substring_funcs_clause / make_interval_func_clause
50115040 / name :'now' i __ LPAREN __ l :expr_list ? __ RPAREN __ 'at' i __ KW_TIME __ 'zone' i __ z :literal_string {
50125041 // => { type: 'function'; name: proc_func_name; args: expr_list; suffix: literal_string; }
50135042 z .prefix = ' at time zone'
@@ -5338,49 +5367,52 @@ line_terminator
53385367literal_numeric
53395368 = n :number {
53405369 // => number | { type: 'bigint'; value: string; }
5341- if (n && n . type === ' bigint ' ) return n
5370+ if (n && typeof n === ' object ' ) return n
53425371 return { type: ' number' , value: n };
53435372 }
53445373
5345- number
5346- = int_ :int ? frac :frac exp :exp {
5347- const numStr = (int_ || ' ' ) + frac + exp
5374+ integer
5375+ = int_ :int exp :exp {
5376+ // => IGNORE
5377+ const numStr = int_ + exp
53485378 return {
53495379 type: ' bigint' ,
53505380 value: numStr
53515381 }
53525382 }
5353- / int_ :int ? frac : frac {
5383+ / int_ :int {
53545384 // => IGNORE
5355- const numStr = (int_ || ' ' ) + frac
5356- if (int_ && isBigInt (int_)) return {
5385+ if (isBigInt (int_)) return {
53575386 type: ' bigint' ,
5358- value: numStr
5387+ value: int_
53595388 }
5360- return parseFloat (numStr) ;
5389+ return { type : ' number ' , value : parseFloat (int_) } ;
53615390 }
5362- / int_ : int exp : exp {
5363- // => IGNORE
5364- const numStr = int_ + exp
5391+ double_float
5392+ = int_ : int ? frac : frac exp : exp {
5393+ const numStr = ( int_ || ' ' ) + frac + exp
53655394 return {
53665395 type: ' bigint' ,
53675396 value: numStr
53685397 }
53695398 }
5370- / int_ :int {
5399+ / int_ :int ? frac : frac {
53715400 // => IGNORE
5372- if (isBigInt (int_)) return {
5401+ const numStr = (int_ || ' ' ) + frac
5402+ if (int_ && isBigInt (int_)) return {
53735403 type: ' bigint' ,
5374- value: int_
5404+ value: numStr
53755405 }
5376- return parseFloat (int_ );
5406+ return parseFloat (numStr );
53775407 }
5408+ number
5409+ = double_float / integer
53785410
53795411int
53805412 = digits
53815413 / digit :digit
53825414 / op :("-" / "+" ) digits :digits { return op + digits; }
5383- / op :("-" / "+" ) digit :digit { return op + digit; }
5415+ / op :("-" / "+" ) digit :digit { return op + digit; }
53845416
53855417frac
53865418 = "." digits :digits { return " ." + digits; }
0 commit comments