agent_patch
runs/2026-02-21__03-36-16__gpt-5-1-codex-mini/flux-pr-1495/flux-pr-1495.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/agent-logs/agent.patch
4029 bytes
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/src/ast/query.rs b/app/src/ast/query.rs
index dc5966e..5fc9bd3 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/src/ast/query.rs
+++ b/app/src/ast/query.rs
@@ -327,11 +327,21 @@ 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}")?;
+ let print_top_first = self.top.as_ref().map(|top| top.before_distinct).unwrap_or(false);
+ if print_top_first {
+ if let Some(ref top) = self.top {
+ write!(f, " {top}")?;
+ }
+ if let Some(ref distinct) = self.distinct {
+ write!(f, " {distinct}")?;
+ }
+ } else {
+ if let Some(ref distinct) = self.distinct {
+ write!(f, " {distinct}")?;
+ }
+ if let Some(ref top) = self.top {
+ write!(f, " {top}")?;
+ }
}
write!(f, " {}", display_comma_separated(&self.projection))?;
@@ -1996,6 +2006,8 @@ pub struct Top {
/// MSSQL only.
pub percent: bool,
pub quantity: Option<TopQuantity>,
+ /// Whether this TOP clause appeared before DISTINCT/ALL in the original query.
+ pub before_distinct: bool,
}
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/src/parser/mod.rs b/app/src/parser/mod.rs
index fd7d1c5..db375f3 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/src/parser/mod.rs
+++ b/app/src/parser/mod.rs
@@ -9193,12 +9193,27 @@ impl<'a> Parser<'a> {
None
};
- let distinct = self.parse_all_or_distinct()?;
-
- let top = if self.parse_keyword(Keyword::TOP) {
- Some(self.parse_top()?)
- } else {
- None
+ let top_before_distinct = dialect_of!(self is RedshiftSqlDialect);
+ let (distinct, top) = if top_before_distinct {
+ let top = if self.parse_keyword(Keyword::TOP) {
+ let mut top = self.parse_top()?;
+ top.before_distinct = true;
+ Some(top)
+ } else {
+ None
+ };
+ let distinct = self.parse_all_or_distinct()?;
+ (distinct, top)
+ } else {
+ let distinct = self.parse_all_or_distinct()?;
+ let top = if self.parse_keyword(Keyword::TOP) {
+ let mut top = self.parse_top()?;
+ top.before_distinct = false;
+ Some(top)
+ } else {
+ None
+ };
+ (distinct, top)
};
let projection = self.parse_projection()?;
@@ -11574,6 +11589,7 @@ impl<'a> Parser<'a> {
with_ties,
percent,
quantity,
+ before_distinct: false,
})
}
diff --git a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/tests/sqlparser_redshift.rs b/app/tests/sqlparser_redshift.rs
index a25d506..fd9f125 100644
--- a/tmp/agent-patch-flux-pr-1495.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/tests/sqlparser_redshift.rs
+++ b/app/tests/sqlparser_redshift.rs
@@ -196,3 +196,12 @@ 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_redshift_top_distinct_round_trip() {
+ let sql = "SELECT TOP 5 DISTINCT foo FROM bar";
+ let select = redshift().verified_only_select(sql);
+ let top = select.top.unwrap();
+ assert!(top.before_distinct);
+ assert_eq!(select.distinct, Some(Distinct::Distinct));
+}