@@ -212,13 +212,13 @@ fn parse_simple_select() {
212
212
}
213
213
214
214
#[ test]
215
- fn parse_select_with_limit_but_no_where ( ) {
216
- let sql = "SELECT id, fname, lname FROM customer LIMIT 5" ;
217
- let select = verified_only_select ( sql ) ;
218
- assert_eq ! ( false , select . distinct ) ;
219
- assert_eq ! ( 3 , select . projection . len ( ) ) ;
220
- let select = verified_query ( sql ) ;
221
- assert_eq ! ( Some ( ASTNode :: SQLValue ( Value :: Long ( 5 ) ) ) , select . limit) ;
215
+ fn parse_limit_is_not_an_alias ( ) {
216
+ // In dialects supporting LIMIT it shouldn't be parsed as a table alias
217
+ let ast = verified_query ( "SELECT id FROM customer LIMIT 1" ) ;
218
+ assert_eq ! ( Some ( ASTNode :: SQLValue ( Value :: Long ( 1 ) ) ) , ast . limit ) ;
219
+
220
+ let ast = verified_query ( "SELECT 1 LIMIT 5" ) ;
221
+ assert_eq ! ( Some ( ASTNode :: SQLValue ( Value :: Long ( 5 ) ) ) , ast . limit) ;
222
222
}
223
223
224
224
#[ test]
@@ -789,6 +789,29 @@ fn parse_select_group_by() {
789
789
) ;
790
790
}
791
791
792
+ #[ test]
793
+ fn parse_select_having ( ) {
794
+ let sql = "SELECT foo FROM bar GROUP BY foo HAVING COUNT(*) > 1" ;
795
+ let select = verified_only_select ( sql) ;
796
+ assert_eq ! (
797
+ Some ( ASTNode :: SQLBinaryOp {
798
+ left: Box :: new( ASTNode :: SQLFunction ( SQLFunction {
799
+ name: SQLObjectName ( vec![ "COUNT" . to_string( ) ] ) ,
800
+ args: vec![ ASTNode :: SQLWildcard ] ,
801
+ over: None ,
802
+ distinct: false
803
+ } ) ) ,
804
+ op: SQLBinaryOperator :: Gt ,
805
+ right: Box :: new( ASTNode :: SQLValue ( Value :: Long ( 1 ) ) )
806
+ } ) ,
807
+ select. having
808
+ ) ;
809
+
810
+ let sql = "SELECT 'foo' HAVING 1 = 1" ;
811
+ let select = verified_only_select ( sql) ;
812
+ assert ! ( select. having. is_some( ) ) ;
813
+ }
814
+
792
815
#[ test]
793
816
fn parse_limit_accepts_all ( ) {
794
817
one_statement_parses_to (
@@ -1791,14 +1814,10 @@ fn parse_ctes() {
1791
1814
fn assert_ctes_in_select ( expected : & [ & str ] , sel : & SQLQuery ) {
1792
1815
let mut i = 0 ;
1793
1816
for exp in expected {
1794
- let Cte {
1795
- query,
1796
- alias,
1797
- renamed_columns,
1798
- } = & sel. ctes [ i] ;
1817
+ let Cte { alias, query } = & sel. ctes [ i] ;
1799
1818
assert_eq ! ( * exp, query. to_string( ) ) ;
1800
- assert_eq ! ( if i == 0 { "a" } else { "b" } , alias) ;
1801
- assert ! ( renamed_columns . is_empty( ) ) ;
1819
+ assert_eq ! ( if i == 0 { "a" } else { "b" } , alias. name ) ;
1820
+ assert ! ( alias . columns . is_empty( ) ) ;
1802
1821
i += 1 ;
1803
1822
}
1804
1823
}
@@ -1841,7 +1860,7 @@ fn parse_cte_renamed_columns() {
1841
1860
let query = all_dialects ( ) . verified_query ( sql) ;
1842
1861
assert_eq ! (
1843
1862
vec![ "col1" , "col2" ] ,
1844
- query. ctes. first( ) . unwrap( ) . renamed_columns
1863
+ query. ctes. first( ) . unwrap( ) . alias . columns
1845
1864
) ;
1846
1865
}
1847
1866
@@ -2201,6 +2220,8 @@ fn parse_offset() {
2201
2220
} ,
2202
2221
_ => panic ! ( "Test broke" ) ,
2203
2222
}
2223
+ let ast = verified_query ( "SELECT 'foo' OFFSET 0 ROWS" ) ;
2224
+ assert_eq ! ( ast. offset, Some ( ASTNode :: SQLValue ( Value :: Long ( 0 ) ) ) ) ;
2204
2225
}
2205
2226
2206
2227
#[ test]
@@ -2213,15 +2234,15 @@ fn parse_singular_row_offset() {
2213
2234
2214
2235
#[ test]
2215
2236
fn parse_fetch ( ) {
2237
+ const FETCH_FIRST_TWO_ROWS_ONLY : Fetch = Fetch {
2238
+ with_ties : false ,
2239
+ percent : false ,
2240
+ quantity : Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2241
+ } ;
2216
2242
let ast = verified_query ( "SELECT foo FROM bar FETCH FIRST 2 ROWS ONLY" ) ;
2217
- assert_eq ! (
2218
- ast. fetch,
2219
- Some ( Fetch {
2220
- with_ties: false ,
2221
- percent: false ,
2222
- quantity: Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2223
- } )
2224
- ) ;
2243
+ assert_eq ! ( ast. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2244
+ let ast = verified_query ( "SELECT 'foo' FETCH FIRST 2 ROWS ONLY" ) ;
2245
+ assert_eq ! ( ast. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2225
2246
let ast = verified_query ( "SELECT foo FROM bar FETCH FIRST ROWS ONLY" ) ;
2226
2247
assert_eq ! (
2227
2248
ast. fetch,
@@ -2232,23 +2253,9 @@ fn parse_fetch() {
2232
2253
} )
2233
2254
) ;
2234
2255
let ast = verified_query ( "SELECT foo FROM bar WHERE foo = 4 FETCH FIRST 2 ROWS ONLY" ) ;
2235
- assert_eq ! (
2236
- ast. fetch,
2237
- Some ( Fetch {
2238
- with_ties: false ,
2239
- percent: false ,
2240
- quantity: Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2241
- } )
2242
- ) ;
2256
+ assert_eq ! ( ast. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2243
2257
let ast = verified_query ( "SELECT foo FROM bar ORDER BY baz FETCH FIRST 2 ROWS ONLY" ) ;
2244
- assert_eq ! (
2245
- ast. fetch,
2246
- Some ( Fetch {
2247
- with_ties: false ,
2248
- percent: false ,
2249
- quantity: Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2250
- } )
2251
- ) ;
2258
+ assert_eq ! ( ast. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2252
2259
let ast = verified_query (
2253
2260
"SELECT foo FROM bar WHERE foo = 4 ORDER BY baz FETCH FIRST 2 ROWS WITH TIES" ,
2254
2261
) ;
@@ -2273,63 +2280,28 @@ fn parse_fetch() {
2273
2280
"SELECT foo FROM bar WHERE foo = 4 ORDER BY baz OFFSET 2 ROWS FETCH FIRST 2 ROWS ONLY" ,
2274
2281
) ;
2275
2282
assert_eq ! ( ast. offset, Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ) ;
2276
- assert_eq ! (
2277
- ast. fetch,
2278
- Some ( Fetch {
2279
- with_ties: false ,
2280
- percent: false ,
2281
- quantity: Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2282
- } )
2283
- ) ;
2283
+ assert_eq ! ( ast. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2284
2284
let ast = verified_query (
2285
2285
"SELECT foo FROM (SELECT * FROM bar FETCH FIRST 2 ROWS ONLY) FETCH FIRST 2 ROWS ONLY" ,
2286
2286
) ;
2287
- assert_eq ! (
2288
- ast. fetch,
2289
- Some ( Fetch {
2290
- with_ties: false ,
2291
- percent: false ,
2292
- quantity: Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2293
- } )
2294
- ) ;
2287
+ assert_eq ! ( ast. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2295
2288
match ast. body {
2296
2289
SQLSetExpr :: Select ( s) => match only ( s. from ) . relation {
2297
2290
TableFactor :: Derived { subquery, .. } => {
2298
- assert_eq ! (
2299
- subquery. fetch,
2300
- Some ( Fetch {
2301
- with_ties: false ,
2302
- percent: false ,
2303
- quantity: Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2304
- } )
2305
- ) ;
2291
+ assert_eq ! ( subquery. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2306
2292
}
2307
2293
_ => panic ! ( "Test broke" ) ,
2308
2294
} ,
2309
2295
_ => panic ! ( "Test broke" ) ,
2310
2296
}
2311
2297
let ast = verified_query ( "SELECT foo FROM (SELECT * FROM bar OFFSET 2 ROWS FETCH FIRST 2 ROWS ONLY) OFFSET 2 ROWS FETCH FIRST 2 ROWS ONLY" ) ;
2312
2298
assert_eq ! ( ast. offset, Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ) ;
2313
- assert_eq ! (
2314
- ast. fetch,
2315
- Some ( Fetch {
2316
- with_ties: false ,
2317
- percent: false ,
2318
- quantity: Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2319
- } )
2320
- ) ;
2299
+ assert_eq ! ( ast. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2321
2300
match ast. body {
2322
2301
SQLSetExpr :: Select ( s) => match only ( s. from ) . relation {
2323
2302
TableFactor :: Derived { subquery, .. } => {
2324
2303
assert_eq ! ( subquery. offset, Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ) ;
2325
- assert_eq ! (
2326
- subquery. fetch,
2327
- Some ( Fetch {
2328
- with_ties: false ,
2329
- percent: false ,
2330
- quantity: Some ( ASTNode :: SQLValue ( Value :: Long ( 2 ) ) ) ,
2331
- } )
2332
- ) ;
2304
+ assert_eq ! ( subquery. fetch, Some ( FETCH_FIRST_TWO_ROWS_ONLY ) ) ;
2333
2305
}
2334
2306
_ => panic ! ( "Test broke" ) ,
2335
2307
} ,
0 commit comments