@@ -21,7 +21,7 @@ use crate::ast::{
2121} ;
2222use core:: iter;
2323
24- use crate :: tokenizer:: Span ;
24+ use crate :: tokenizer:: { Span } ;
2525
2626use super :: {
2727 dcl:: SecondaryRoles , value:: ValueWithSpan , AccessExpr , AlterColumnOperation ,
@@ -2636,4 +2636,36 @@ ALTER TABLE users
26362636 assert_eq ! ( stmt_span. start, ( 2 , 13 ) . into( ) ) ;
26372637 assert_eq ! ( stmt_span. end, ( 4 , 11 ) . into( ) ) ;
26382638 }
2639+
2640+ #[ test]
2641+ fn test_function_span ( ) {
2642+ let sql = "SELECT database(), left(user(),instr(concat(user(),'@'),'@')-1);" ;
2643+ let r = Parser :: parse_sql ( & crate :: dialect:: MySqlDialect { } , sql) . unwrap ( ) ;
2644+
2645+ let query = match & r[ 0 ] {
2646+ crate :: ast:: Statement :: Query ( q) => q,
2647+ _ => panic ! ( "Expected query" ) ,
2648+ } ;
2649+
2650+ let select = match query. body . as_ref ( ) {
2651+ crate :: ast:: SetExpr :: Select ( s) => s,
2652+ _ => panic ! ( "Expected select" ) ,
2653+ } ;
2654+
2655+ let database_func = match & select. projection [ 0 ] {
2656+ crate :: ast:: SelectItem :: UnnamedExpr ( crate :: ast:: Expr :: Function ( func) ) => func,
2657+ _ => panic ! ( "Expected function expression" ) ,
2658+ } ;
2659+ let span = database_func. span ( ) ;
2660+ assert_eq ! ( span. start, ( 1 , 8 ) . into( ) ) ;
2661+ assert_eq ! ( span. end, ( 1 , 17 ) . into( ) ) ;
2662+
2663+ let left_func = match & select. projection [ 1 ] {
2664+ crate :: ast:: SelectItem :: UnnamedExpr ( crate :: ast:: Expr :: Function ( func) ) => func,
2665+ _ => panic ! ( "Expected function expression" ) ,
2666+ } ;
2667+ let span = left_func. span ( ) ;
2668+ assert_eq ! ( span. start, ( 1 , 20 ) . into( ) ) ;
2669+ assert_eq ! ( span. end, ( 1 , 63 ) . into( ) ) ;
2670+ }
26392671}
0 commit comments