STET

agent_patch

runs/2026-02-28__18-27-22__gpt-5-4/flux-pr-1495/flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/agent-logs/agent.patch

6343 bytes

Back to adjudication
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/ast/query.rs b/app/src/ast/query.rs
index dc5966e..2d64b7b 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/ast/query.rs
+++ b/app/src/ast/query.rs
@@ -327,11 +327,22 @@ impl fmt::Display for Select {
             write!(f, " {value_table_mode}")?;
         }
 
-        if let Some(ref distinct) = self.distinct {
-            write!(f, " {distinct}")?;
-        }
-        if let Some(ref top) = self.top {
-            write!(f, " {top}")?;
+        match (&self.top, &self.distinct) {
+            (Some(top), Some(distinct)) if top.before_distinct => {
+                write!(f, " {top}")?;
+                write!(f, " {distinct}")?;
+            }
+            (Some(top), Some(distinct)) => {
+                write!(f, " {distinct}")?;
+                write!(f, " {top}")?;
+            }
+            (Some(top), None) => {
+                write!(f, " {top}")?;
+            }
+            (None, Some(distinct)) => {
+                write!(f, " {distinct}")?;
+            }
+            (None, None) => {}
         }
         write!(f, " {}", display_comma_separated(&self.projection))?;
 
@@ -1995,6 +2006,8 @@ pub struct Top {
     pub with_ties: bool,
     /// MSSQL only.
     pub percent: bool,
+    /// Whether this `TOP` clause should be rendered before `ALL`/`DISTINCT`.
+    pub before_distinct: bool,
     pub quantity: Option<TopQuantity>,
 }
 
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/dialect/mod.rs b/app/src/dialect/mod.rs
index 5abddba..aa95215 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/dialect/mod.rs
+++ b/app/src/dialect/mod.rs
@@ -300,6 +300,12 @@ pub trait Dialect: Debug + Any {
         false
     }
 
+    /// Returns true if the dialect requires `TOP` to appear before `ALL` or
+    /// `DISTINCT` in a `SELECT` list prefix.
+    fn supports_top_before_distinct(&self) -> bool {
+        false
+    }
+
     /// Returns true if the dialect has a CONVERT function which accepts a type first
     /// and an expression second, e.g. `CONVERT(varchar, 1)`
     fn convert_type_before_value(&self) -> bool {
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/dialect/redshift.rs b/app/src/dialect/redshift.rs
index 3bfdec3..a61a898 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/dialect/redshift.rs
+++ b/app/src/dialect/redshift.rs
@@ -65,6 +65,10 @@ impl Dialect for RedshiftSqlDialect {
         true
     }
 
+    fn supports_top_before_distinct(&self) -> bool {
+        true
+    }
+
     fn supports_connect_by(&self) -> bool {
         true
     }
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/parser/mod.rs b/app/src/parser/mod.rs
index fd7d1c5..cd84620 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/parser/mod.rs
+++ b/app/src/parser/mod.rs
@@ -9193,10 +9193,19 @@ impl<'a> Parser<'a> {
                 None
             };
 
+        let top_before_distinct = self.dialect.supports_top_before_distinct();
+        let top = if top_before_distinct && self.parse_keyword(Keyword::TOP) {
+            Some(self.parse_top(true)?)
+        } else {
+            None
+        };
+
         let distinct = self.parse_all_or_distinct()?;
 
-        let top = if self.parse_keyword(Keyword::TOP) {
-            Some(self.parse_top()?)
+        let top = if top.is_some() {
+            top
+        } else if self.parse_keyword(Keyword::TOP) {
+            Some(self.parse_top(false)?)
         } else {
             None
         };
@@ -11550,9 +11559,8 @@ impl<'a> Parser<'a> {
         Ok(InterpolateExpr { column, expr })
     }
 
-    /// Parse a TOP clause, MSSQL equivalent of LIMIT,
-    /// that follows after `SELECT [DISTINCT]`.
-    pub fn parse_top(&mut self) -> Result<Top, ParserError> {
+    /// Parse a TOP clause, MSSQL equivalent of LIMIT.
+    pub fn parse_top(&mut self, before_distinct: bool) -> Result<Top, ParserError> {
         let quantity = if self.consume_token(&Token::LParen) {
             let quantity = self.parse_expr()?;
             self.expect_token(&Token::RParen)?;
@@ -11573,6 +11581,7 @@ impl<'a> Parser<'a> {
         Ok(Top {
             with_ties,
             percent,
+            before_distinct,
             quantity,
         })
     }
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/tests/sqlparser_mssql.rs b/app/tests/sqlparser_mssql.rs
index 0223e29..898de73 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/tests/sqlparser_mssql.rs
+++ b/app/tests/sqlparser_mssql.rs
@@ -246,6 +246,14 @@ fn parse_mssql_top() {
     let _ = ms_and_generic().one_statement_parses_to(sql, "SELECT TOP 5 bar, baz FROM foo");
 }
 
+#[test]
+fn parse_mssql_distinct_before_top() {
+    let sql = "SELECT DISTINCT TOP 5 bar FROM foo";
+    let select = ms_and_generic().verified_only_select(sql);
+    assert_eq!(select.distinct, Some(Distinct::Distinct));
+    assert!(!select.top.expect("expected TOP clause").before_distinct);
+}
+
 #[test]
 fn parse_mssql_bin_literal() {
     let _ = ms_and_generic().one_statement_parses_to("SELECT 0xdeadBEEF", "SELECT X'deadBEEF'");
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/tests/sqlparser_redshift.rs b/app/tests/sqlparser_redshift.rs
index a25d506..d931076 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/tests/sqlparser_redshift.rs
+++ b/app/tests/sqlparser_redshift.rs
@@ -196,3 +196,16 @@ fn test_create_view_with_no_schema_binding() {
     redshift_and_generic()
         .verified_stmt("CREATE VIEW myevent AS SELECT eventname FROM event WITH NO SCHEMA BINDING");
 }
+
+#[test]
+fn parse_top_before_distinct() {
+    let select = redshift().verified_only_select("SELECT TOP 5 DISTINCT col FROM tbl");
+    let top = select.top.expect("expected TOP clause");
+    assert!(top.before_distinct);
+    assert_eq!(select.distinct, Some(Distinct::Distinct));
+}
+
+#[test]
+fn parse_top_before_all() {
+    redshift().one_statement_parses_to("SELECT TOP 5 ALL col FROM tbl", "SELECT TOP 5 col FROM tbl");
+}