@@ -395,6 +395,16 @@ pub(super) fn extract_variable_argument(
395395 Some ( Expr :: Value ( Value :: Placeholder ( placeholder) ) ) => {
396396 Ok ( map_param ( std:: mem:: take ( placeholder) ) )
397397 }
398+ Some ( Expr :: Identifier ( ident) ) => {
399+ if let Some ( param) = extract_ident_param ( ident) {
400+ Ok ( param)
401+ } else {
402+ Err ( format ! (
403+ "{func_name}({}) is not a valid call. The argument must be a placeholder or a variable name." ,
404+ FormatArguments ( arguments)
405+ ) )
406+ }
407+ }
398408 Some ( Expr :: Function ( Function {
399409 name : ObjectName ( func_name_parts) ,
400410 args,
@@ -519,7 +529,7 @@ fn sqlpage_func_name(func_name_parts: &[Ident]) -> &str {
519529mod test {
520530 use super :: * ;
521531
522- fn parse_stmt < D : Dialect > ( sql : & str , dialect : & D ) -> Statement {
532+ fn parse_stmt ( sql : & str , dialect : & dyn Dialect ) -> Statement {
523533 let mut ast = Parser :: parse_sql ( dialect, sql) . unwrap ( ) ;
524534 assert_eq ! ( ast. len( ) , 1 ) ;
525535 ast. pop ( ) . unwrap ( )
@@ -567,6 +577,28 @@ mod test {
567577 ) ;
568578 }
569579
580+ const ALL_DIALECTS : & [ ( & dyn Dialect , AnyKind ) ] = & [
581+ ( & PostgreSqlDialect { } , AnyKind :: Postgres ) ,
582+ ( & MsSqlDialect { } , AnyKind :: Mssql ) ,
583+ ( & MySqlDialect { } , AnyKind :: MySql ) ,
584+ ( & SQLiteDialect { } , AnyKind :: Sqlite ) ,
585+ ] ;
586+
587+ #[ test]
588+ fn test_sqlpage_function_with_argument ( ) {
589+ for & ( dialect, kind) in ALL_DIALECTS {
590+ let mut ast = parse_stmt ( "select sqlpage.hash_password($x)" , dialect) ;
591+ let parameters = ParameterExtractor :: extract_parameters ( & mut ast, kind) ;
592+ assert_eq ! (
593+ parameters,
594+ [ StmtParam :: HashPassword ( Box :: new( StmtParam :: GetOrPost (
595+ "x" . to_string( )
596+ ) ) ) ] ,
597+ "Failed for dialect {dialect:?}"
598+ ) ;
599+ }
600+ }
601+
570602 #[ test]
571603 fn is_own_placeholder ( ) {
572604 assert ! ( ParameterExtractor {
0 commit comments