STET

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

Back to adjudication
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
         }
     );
 }