@@ -1002,7 +1002,7 @@ fn parse_select_wildcard() {
10021002 let select = verified_only_select ( sql) ;
10031003 assert_eq ! (
10041004 & SelectItem :: QualifiedWildcard (
1005- ObjectName :: from( vec![ Ident :: new( "foo" ) ] ) ,
1005+ SelectItemQualifiedWildcardKind :: ObjectName ( ObjectName :: from( vec![ Ident :: new( "foo" ) ] ) ) ,
10061006 WildcardAdditionalOptions :: default ( )
10071007 ) ,
10081008 only( & select. projection)
@@ -1012,7 +1012,10 @@ fn parse_select_wildcard() {
10121012 let select = verified_only_select ( sql) ;
10131013 assert_eq ! (
10141014 & SelectItem :: QualifiedWildcard (
1015- ObjectName :: from( vec![ Ident :: new( "myschema" ) , Ident :: new( "mytable" ) , ] ) ,
1015+ SelectItemQualifiedWildcardKind :: ObjectName ( ObjectName :: from( vec![
1016+ Ident :: new( "myschema" ) ,
1017+ Ident :: new( "mytable" ) ,
1018+ ] ) ) ,
10161019 WildcardAdditionalOptions :: default ( ) ,
10171020 ) ,
10181021 only( & select. projection)
@@ -1057,6 +1060,84 @@ fn parse_column_aliases() {
10571060 one_statement_parses_to ( "SELECT a.col + 1 newname FROM foo AS a" , sql) ;
10581061}
10591062
1063+ #[ test]
1064+ fn parse_select_expr_star ( ) {
1065+ let dialects = all_dialects_where ( |d| d. supports_select_expr_star ( ) ) ;
1066+
1067+ // Identifier wildcard expansion.
1068+ let select = dialects. verified_only_select ( "SELECT foo.bar.* FROM T" ) ;
1069+ let SelectItem :: QualifiedWildcard ( SelectItemQualifiedWildcardKind :: ObjectName ( object_name) , _) =
1070+ only ( & select. projection )
1071+ else {
1072+ unreachable ! (
1073+ "expected wildcard select item: got {:?}" ,
1074+ & select. projection[ 0 ]
1075+ )
1076+ } ;
1077+ assert_eq ! (
1078+ & ObjectName :: from(
1079+ [ "foo" , "bar" ]
1080+ . into_iter( )
1081+ . map( Ident :: new)
1082+ . collect:: <Vec <_>>( )
1083+ ) ,
1084+ object_name
1085+ ) ;
1086+
1087+ // Arbitrary compound expression with wildcard expansion.
1088+ let select = dialects. verified_only_select ( "SELECT foo - bar.* FROM T" ) ;
1089+ let SelectItem :: QualifiedWildcard (
1090+ SelectItemQualifiedWildcardKind :: Expr ( Expr :: BinaryOp { left, op, right } ) ,
1091+ _,
1092+ ) = only ( & select. projection )
1093+ else {
1094+ unreachable ! (
1095+ "expected wildcard select item: got {:?}" ,
1096+ & select. projection[ 0 ]
1097+ )
1098+ } ;
1099+ let ( Expr :: Identifier ( left) , BinaryOperator :: Minus , Expr :: Identifier ( right) ) =
1100+ ( left. as_ref ( ) , op, right. as_ref ( ) )
1101+ else {
1102+ unreachable ! ( "expected binary op expr: got {:?}" , & select. projection[ 0 ] )
1103+ } ;
1104+ assert_eq ! ( & Ident :: new( "foo" ) , left) ;
1105+ assert_eq ! ( & Ident :: new( "bar" ) , right) ;
1106+
1107+ // Arbitrary expression wildcard expansion.
1108+ let select = dialects. verified_only_select ( "SELECT myfunc().foo.* FROM T" ) ;
1109+ let SelectItem :: QualifiedWildcard (
1110+ SelectItemQualifiedWildcardKind :: Expr ( Expr :: CompoundFieldAccess { root, access_chain } ) ,
1111+ _,
1112+ ) = only ( & select. projection )
1113+ else {
1114+ unreachable ! ( "expected wildcard expr: got {:?}" , & select. projection[ 0 ] )
1115+ } ;
1116+ assert ! ( matches!( root. as_ref( ) , Expr :: Function ( _) ) ) ;
1117+ assert_eq ! ( 1 , access_chain. len( ) ) ;
1118+ assert ! ( matches!(
1119+ & access_chain[ 0 ] ,
1120+ AccessExpr :: Dot ( Expr :: Identifier ( _) )
1121+ ) ) ;
1122+
1123+ dialects. one_statement_parses_to (
1124+ "SELECT 2. * 3 FROM T" ,
1125+ #[ cfg( feature = "bigdecimal" ) ]
1126+ "SELECT 2 * 3 FROM T" ,
1127+ #[ cfg( not( feature = "bigdecimal" ) ) ]
1128+ "SELECT 2. * 3 FROM T" ,
1129+ ) ;
1130+ dialects. verified_only_select ( "SELECT myfunc().* FROM T" ) ;
1131+ dialects. verified_only_select ( "SELECT myfunc().* EXCEPT (foo) FROM T" ) ;
1132+
1133+ // Invalid
1134+ let res = dialects. parse_sql_statements ( "SELECT foo.*.* FROM T" ) ;
1135+ assert_eq ! (
1136+ ParserError :: ParserError ( "Expected: end of statement, found: ." . to_string( ) ) ,
1137+ res. unwrap_err( )
1138+ ) ;
1139+ }
1140+
10601141#[ test]
10611142fn test_eof_after_as ( ) {
10621143 let res = parse_sql_statements ( "SELECT foo AS" ) ;
0 commit comments