agent_patch
runs/2026-02-28__18-27-22__gpt-5-3-codex/flux-pr-1441/flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/agent-logs/agent.patch
8431 bytes
diff --git a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/ddl.rs b/app/src/ast/ddl.rs
index 4578ae8..41bdc7b 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/ddl.rs
+++ b/app/src/ast/ddl.rs
@@ -1031,7 +1031,7 @@ impl fmt::Display for ColumnDef {
///
/// Syntax
/// ```markdown
-/// <name> [data_type][OPTIONS(option, ...)]
+/// <name> [data_type] [OPTIONS(option, ...)] [COMMENT '...']
///
/// option: <name> = <value>
/// ```
@@ -1049,6 +1049,7 @@ pub struct ViewColumnDef {
pub name: Ident,
pub data_type: Option<DataType>,
pub options: Option<Vec<SqlOption>>,
+ pub comment: Option<String>,
}
impl fmt::Display for ViewColumnDef {
@@ -1064,6 +1065,9 @@ impl fmt::Display for ViewColumnDef {
display_comma_separated(options.as_slice())
)?;
}
+ if let Some(comment) = self.comment.as_ref() {
+ write!(f, " COMMENT '{}'", escape_single_quote_string(comment))?;
+ }
Ok(())
}
}
diff --git a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/mod.rs b/app/src/ast/mod.rs
index 8c4bc25..0d0d3c1 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/mod.rs
+++ b/app/src/ast/mod.rs
@@ -3930,25 +3930,25 @@ impl fmt::Display for Statement {
.map(|to| format!(" TO {to}"))
.unwrap_or_default()
)?;
- if let Some(comment) = comment {
- write!(
- f,
- " COMMENT = '{}'",
- value::escape_single_quote_string(comment)
- )?;
+ if !columns.is_empty() {
+ write!(f, " ({})", display_comma_separated(columns))?;
}
if matches!(options, CreateTableOptions::With(_)) {
write!(f, " {options}")?;
}
- if !columns.is_empty() {
- write!(f, " ({})", display_comma_separated(columns))?;
- }
if !cluster_by.is_empty() {
write!(f, " CLUSTER BY ({})", display_comma_separated(cluster_by))?;
}
if matches!(options, CreateTableOptions::Options(_)) {
write!(f, " {options}")?;
}
+ if let Some(comment) = comment {
+ write!(
+ f,
+ " COMMENT = '{}'",
+ value::escape_single_quote_string(comment)
+ )?;
+ }
write!(f, " AS {query}")?;
if *with_no_schema_binding {
write!(f, " WITH NO SCHEMA BINDING")?;
diff --git a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/parser/mod.rs b/app/src/parser/mod.rs
index 88c3bd1..019f251 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/parser/mod.rs
+++ b/app/src/parser/mod.rs
@@ -8374,10 +8374,18 @@ impl<'a> Parser<'a> {
} else {
None
};
+ let comment = if dialect_of!(self is SnowflakeDialect | GenericDialect)
+ && self.parse_keyword(Keyword::COMMENT)
+ {
+ Some(self.parse_literal_string()?)
+ } else {
+ None
+ };
Ok(ViewColumnDef {
name,
data_type,
options,
+ comment,
})
}
diff --git a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_bigquery.rs b/app/tests/sqlparser_bigquery.rs
index 55afe47..873422f 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_bigquery.rs
+++ b/app/tests/sqlparser_bigquery.rs
@@ -268,6 +268,7 @@ fn parse_create_view_with_options() {
name: Ident::new("name"),
data_type: None,
options: None,
+ comment: None,
},
ViewColumnDef {
name: Ident::new("age"),
@@ -275,7 +276,8 @@ fn parse_create_view_with_options() {
options: Some(vec![SqlOption::KeyValue {
key: Ident::new("description"),
value: Expr::Value(Value::DoubleQuotedString("field age".to_string())),
- }])
+ }]),
+ comment: None,
},
],
columns
diff --git a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_clickhouse.rs b/app/tests/sqlparser_clickhouse.rs
index e30c336..6cc3091 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_clickhouse.rs
+++ b/app/tests/sqlparser_clickhouse.rs
@@ -904,7 +904,8 @@ fn parse_create_view_with_fields_data_types() {
}]),
vec![]
)),
- options: None
+ options: None,
+ comment: None,
},
ViewColumnDef {
name: "f".into(),
@@ -915,7 +916,8 @@ fn parse_create_view_with_fields_data_types() {
}]),
vec![]
)),
- options: None
+ options: None,
+ comment: None,
},
]
);
diff --git a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_common.rs b/app/tests/sqlparser_common.rs
index 5d5a17c..8761f9d 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_common.rs
+++ b/app/tests/sqlparser_common.rs
@@ -6867,7 +6867,8 @@ fn parse_create_view_with_columns() {
.map(|name| ViewColumnDef {
name,
data_type: None,
- options: None
+ options: None,
+ comment: None,
})
.collect::<Vec<_>>()
);
diff --git a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_snowflake.rs b/app/tests/sqlparser_snowflake.rs
index 50c5f74..be3f86d 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_snowflake.rs
+++ b/app/tests/sqlparser_snowflake.rs
@@ -576,6 +576,42 @@ fn parse_sf_create_or_replace_with_comment_for_snowflake() {
}
}
+#[test]
+fn parse_sf_create_or_replace_view_with_column_comments() {
+ let sql = "CREATE OR REPLACE VIEW v (c1 COMMENT 'first', c2 COMMENT 'it''s second') COMMENT = 'view level' AS SELECT 1, 2";
+ match snowflake_and_generic().verified_stmt(sql) {
+ Statement::CreateView {
+ columns, comment, ..
+ } => {
+ assert_eq!(
+ columns,
+ vec![
+ ViewColumnDef {
+ name: Ident::new("c1"),
+ data_type: None,
+ options: None,
+ comment: Some("first".to_string()),
+ },
+ ViewColumnDef {
+ name: Ident::new("c2"),
+ data_type: None,
+ options: None,
+ comment: Some("it's second".to_string()),
+ },
+ ]
+ );
+ assert_eq!(comment, Some("view level".to_string()));
+ }
+ _ => unreachable!(),
+ }
+}
+
+#[test]
+fn parse_sf_create_or_replace_view_comment_ordering() {
+ let sql = "CREATE OR REPLACE VIEW v (c) WITH (foo = 'bar') COMMENT = 'view level' AS SELECT 1";
+ assert_eq!(snowflake_and_generic().verified_stmt(sql).to_string(), sql);
+}
+
#[test]
fn test_sf_derived_table_in_parenthesis() {
// Nesting a subquery in an extra set of parentheses is non-standard,