agent_patch
runs/2026-02-21__03-36-16__gpt-5-1-codex-mini/flux-pr-1604/flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/agent-logs/agent.patch
7099 bytes
diff --git a/tmp/agent-patch-flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/src/ast/mod.rs b/app/src/ast/mod.rs
index 9fb2bb9..6c58cfa 100644
--- a/tmp/agent-patch-flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/src/ast/mod.rs
+++ b/app/src/ast/mod.rs
@@ -2474,6 +2474,8 @@ pub enum Statement {
assignments: Vec<Assignment>,
/// Table which provide value to be set
from: Option<TableWithJoins>,
+ /// Whether the `FROM` clause appeared before `SET` (Snowflake-style)
+ from_before_set: bool,
/// WHERE
selection: Option<Expr>,
/// RETURNING
@@ -3736,6 +3738,7 @@ impl fmt::Display for Statement {
table,
assignments,
from,
+ from_before_set,
selection,
returning,
or,
@@ -3745,11 +3748,18 @@ impl fmt::Display for Statement {
write!(f, "{or} ")?;
}
write!(f, "{table}")?;
+ if *from_before_set {
+ if let Some(from) = from {
+ write!(f, " FROM {from}")?;
+ }
+ }
if !assignments.is_empty() {
write!(f, " SET {}", display_comma_separated(assignments))?;
}
- if let Some(from) = from {
- write!(f, " FROM {from}")?;
+ if !*from_before_set {
+ if let Some(from) = from {
+ write!(f, " FROM {from}")?;
+ }
}
if let Some(selection) = selection {
write!(f, " WHERE {selection}")?;
diff --git a/tmp/agent-patch-flux-pr-1604.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 cc0a57e..d5d93af 100644
--- a/tmp/agent-patch-flux-pr-1604.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
@@ -11791,15 +11791,20 @@ impl<'a> Parser<'a> {
pub fn parse_update(&mut self) -> Result<Statement, ParserError> {
let or = self.parse_conflict_clause();
let table = self.parse_table_and_joins()?;
+ let mut from_before_set = false;
+ let mut from = None;
+ if dialect_of!(self is SnowflakeDialect) && self.parse_keyword(Keyword::FROM) {
+ from_before_set = true;
+ from = Some(self.parse_table_and_joins()?);
+ }
self.expect_keyword(Keyword::SET)?;
let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
- let from = if self.parse_keyword(Keyword::FROM)
+ if !from_before_set
+ && self.parse_keyword(Keyword::FROM)
&& dialect_of!(self is GenericDialect | PostgreSqlDialect | DuckDbDialect | BigQueryDialect | SnowflakeDialect | RedshiftSqlDialect | MsSqlDialect | SQLiteDialect )
{
- Some(self.parse_table_and_joins()?)
- } else {
- None
- };
+ from = Some(self.parse_table_and_joins()?);
+ }
let selection = if self.parse_keyword(Keyword::WHERE) {
Some(self.parse_expr()?)
} else {
@@ -11814,6 +11819,7 @@ impl<'a> Parser<'a> {
table,
assignments,
from,
+ from_before_set,
selection,
returning,
or,
diff --git a/tmp/agent-patch-flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/tests/sqlparser_common.rs b/app/tests/sqlparser_common.rs
index 79f5c8d..f6a3118 100644
--- a/tmp/agent-patch-flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/tests/sqlparser_common.rs
+++ b/app/tests/sqlparser_common.rs
@@ -419,19 +419,20 @@ fn parse_update_set_from() {
},
joins: vec![],
}),
- selection: Some(Expr::BinaryOp {
- left: Box::new(Expr::CompoundIdentifier(vec![
- Ident::new("t1"),
- Ident::new("id")
- ])),
- op: BinaryOperator::Eq,
- right: Box::new(Expr::CompoundIdentifier(vec![
- Ident::new("t2"),
- Ident::new("id")
- ])),
+ selection: Some(Expr::BinaryOp {
+ left: Box::new(Expr::CompoundIdentifier(vec![
+ Ident::new("t1"),
+ Ident::new("id")
+ ])),
+ op: BinaryOperator::Eq,
+ right: Box::new(Expr::CompoundIdentifier(vec![
+ Ident::new("t2"),
+ Ident::new("id")
+ ])),
}),
returning: None,
or: None,
+ from_before_set: false,
}
);
}
diff --git a/tmp/agent-patch-flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/tests/sqlparser_snowflake.rs b/app/tests/sqlparser_snowflake.rs
index 9fe1478..5bbe3e1 100644
--- a/tmp/agent-patch-flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/tests/sqlparser_snowflake.rs
+++ b/app/tests/sqlparser_snowflake.rs
@@ -1246,6 +1246,36 @@ fn parse_delimited_identifiers() {
//TODO verified_stmt(r#"UPDATE foo SET "bar" = 5"#);
}
+#[test]
+fn parse_update_from_before_set_in_snowflake() {
+ let sql = "UPDATE foo FROM bar SET foo.b = bar.b";
+ let stmt = snowflake().verified_stmt(sql);
+ assert_eq!(
+ stmt,
+ Statement::Update {
+ table: TableWithJoins {
+ relation: table_from_name(ObjectName(vec![Ident::new("foo")])),
+ joins: vec![],
+ },
+ assignments: vec![Assignment {
+ target: AssignmentTarget::ColumnName(ObjectName(vec![
+ Ident::new("foo"),
+ Ident::new("b"),
+ ])),
+ value: Expr::CompoundIdentifier(vec![Ident::new("bar"), Ident::new("b")]),
+ }],
+ from: Some(TableWithJoins {
+ relation: table_from_name(ObjectName(vec![Ident::new("bar")])),
+ joins: vec![],
+ }),
+ from_before_set: true,
+ selection: None,
+ returning: None,
+ or: None,
+ }
+ );
+}
+
#[test]
fn test_array_agg_func() {
for sql in [
diff --git a/tmp/agent-patch-flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/tests/sqlparser_sqlite.rs b/app/tests/sqlparser_sqlite.rs
index ff0b54e..8d96a1f 100644
--- a/tmp/agent-patch-flux-pr-1604.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/tests/sqlparser_sqlite.rs
+++ b/app/tests/sqlparser_sqlite.rs
@@ -483,7 +483,8 @@ fn parse_update_tuple_row_values() {
joins: vec![],
},
from: None,
- returning: None
+ returning: None,
+ from_before_set: false
}
);
}