@@ -395,6 +395,16 @@ pub(super) fn extract_variable_argument(
395
395
Some ( Expr :: Value ( Value :: Placeholder ( placeholder) ) ) => {
396
396
Ok ( map_param ( std:: mem:: take ( placeholder) ) )
397
397
}
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
+ }
398
408
Some ( Expr :: Function ( Function {
399
409
name : ObjectName ( func_name_parts) ,
400
410
args,
@@ -519,7 +529,7 @@ fn sqlpage_func_name(func_name_parts: &[Ident]) -> &str {
519
529
mod test {
520
530
use super :: * ;
521
531
522
- fn parse_stmt < D : Dialect > ( sql : & str , dialect : & D ) -> Statement {
532
+ fn parse_stmt ( sql : & str , dialect : & dyn Dialect ) -> Statement {
523
533
let mut ast = Parser :: parse_sql ( dialect, sql) . unwrap ( ) ;
524
534
assert_eq ! ( ast. len( ) , 1 ) ;
525
535
ast. pop ( ) . unwrap ( )
@@ -567,6 +577,28 @@ mod test {
567
577
) ;
568
578
}
569
579
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
+
570
602
#[ test]
571
603
fn is_own_placeholder ( ) {
572
604
assert ! ( ParameterExtractor {
0 commit comments