@@ -1002,7 +1002,7 @@ fn parse_select_wildcard() {
1002
1002
let select = verified_only_select ( sql) ;
1003
1003
assert_eq ! (
1004
1004
& SelectItem :: QualifiedWildcard (
1005
- ObjectName :: from( vec![ Ident :: new( "foo" ) ] ) ,
1005
+ SelectItemQualifiedWildcardKind :: ObjectName ( ObjectName :: from( vec![ Ident :: new( "foo" ) ] ) ) ,
1006
1006
WildcardAdditionalOptions :: default ( )
1007
1007
) ,
1008
1008
only( & select. projection)
@@ -1012,7 +1012,10 @@ fn parse_select_wildcard() {
1012
1012
let select = verified_only_select ( sql) ;
1013
1013
assert_eq ! (
1014
1014
& 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
+ ] ) ) ,
1016
1019
WildcardAdditionalOptions :: default ( ) ,
1017
1020
) ,
1018
1021
only( & select. projection)
@@ -1057,6 +1060,84 @@ fn parse_column_aliases() {
1057
1060
one_statement_parses_to ( "SELECT a.col + 1 newname FROM foo AS a" , sql) ;
1058
1061
}
1059
1062
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
+
1060
1141
#[ test]
1061
1142
fn test_eof_after_as ( ) {
1062
1143
let res = parse_sql_statements ( "SELECT foo AS" ) ;
0 commit comments