@@ -225,7 +225,7 @@ fn parse_update_set_from() {
225225 subquery: Box :: new( Query {
226226 with: None ,
227227 body: Box :: new( SetExpr :: Select ( Box :: new( Select {
228- distinct: false ,
228+ distinct: None ,
229229 top: None ,
230230 projection: vec![
231231 SelectItem :: UnnamedExpr ( Expr :: Identifier ( Ident :: new( "name" ) ) ) ,
@@ -597,7 +597,7 @@ fn parse_top_level() {
597597fn parse_simple_select ( ) {
598598 let sql = "SELECT id, fname, lname FROM customer WHERE id = 1 LIMIT 5" ;
599599 let select = verified_only_select ( sql) ;
600- assert ! ( ! select. distinct) ;
600+ assert ! ( select. distinct. is_none ( ) ) ;
601601 assert_eq ! ( 3 , select. projection. len( ) ) ;
602602 let select = verified_query ( sql) ;
603603 assert_eq ! ( Some ( Expr :: Value ( number( "5" ) ) ) , select. limit) ;
@@ -622,7 +622,7 @@ fn parse_limit_is_not_an_alias() {
622622fn parse_select_distinct ( ) {
623623 let sql = "SELECT DISTINCT name FROM customer" ;
624624 let select = verified_only_select ( sql) ;
625- assert ! ( select. distinct) ;
625+ assert ! ( select. distinct. is_some ( ) ) ;
626626 assert_eq ! (
627627 & SelectItem :: UnnamedExpr ( Expr :: Identifier ( Ident :: new( "name" ) ) ) ,
628628 only( & select. projection)
@@ -633,7 +633,7 @@ fn parse_select_distinct() {
633633fn parse_select_distinct_two_fields ( ) {
634634 let sql = "SELECT DISTINCT name, id FROM customer" ;
635635 let select = verified_only_select ( sql) ;
636- assert ! ( select. distinct) ;
636+ assert ! ( select. distinct. is_some ( ) ) ;
637637 assert_eq ! (
638638 & SelectItem :: UnnamedExpr ( Expr :: Identifier ( Ident :: new( "name" ) ) ) ,
639639 & select. projection[ 0 ]
@@ -657,6 +657,30 @@ fn parse_select_distinct_tuple() {
657657 ) ;
658658}
659659
660+ #[ test]
661+ fn parse_select_distinct_on ( ) {
662+ let sql = "SELECT DISTINCT ON (album_id) name FROM track ORDER BY album_id, milliseconds" ;
663+ let select = verified_only_select ( sql) ;
664+ assert_eq ! (
665+ & Some ( Distinct :: On ( vec![ Expr :: Identifier ( Ident :: new( "album_id" ) ) ] ) ) ,
666+ & select. distinct
667+ ) ;
668+
669+ let sql = "SELECT DISTINCT ON () name FROM track ORDER BY milliseconds" ;
670+ let select = verified_only_select ( sql) ;
671+ assert_eq ! ( & Some ( Distinct :: On ( vec![ ] ) ) , & select. distinct) ;
672+
673+ let sql = "SELECT DISTINCT ON (album_id, milliseconds) name FROM track" ;
674+ let select = verified_only_select ( sql) ;
675+ assert_eq ! (
676+ & Some ( Distinct :: On ( vec![
677+ Expr :: Identifier ( Ident :: new( "album_id" ) ) ,
678+ Expr :: Identifier ( Ident :: new( "milliseconds" ) ) ,
679+ ] ) ) ,
680+ & select. distinct
681+ ) ;
682+ }
683+
660684#[ test]
661685fn parse_select_distinct_missing_paren ( ) {
662686 let result = parse_sql_statements ( "SELECT DISTINCT (name, id FROM customer" ) ;
@@ -3517,7 +3541,7 @@ fn parse_interval_and_or_xor() {
35173541 let expected_ast = vec ! [ Statement :: Query ( Box :: new( Query {
35183542 with: None ,
35193543 body: Box :: new( SetExpr :: Select ( Box :: new( Select {
3520- distinct: false ,
3544+ distinct: None ,
35213545 top: None ,
35223546 projection: vec![ UnnamedExpr ( Expr :: Identifier ( Ident {
35233547 value: "col" . to_string( ) ,
@@ -5834,7 +5858,7 @@ fn parse_merge() {
58345858 subquery: Box :: new( Query {
58355859 with: None ,
58365860 body: Box :: new( SetExpr :: Select ( Box :: new( Select {
5837- distinct: false ,
5861+ distinct: None ,
58385862 top: None ,
58395863 projection: vec![ SelectItem :: Wildcard (
58405864 WildcardAdditionalOptions :: default ( )
0 commit comments