agent_patch
runs/2026-02-28__18-27-22__gpt-5-4/flux-pr-1441/flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-4/agent-logs/agent.patch
8632 bytes
diff --git a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/ast/ddl.rs b/app/src/ast/ddl.rs
index 4578ae8..7687f90 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-4/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 '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-4/app/src/ast/mod.rs b/app/src/ast/mod.rs
index 8c4bc25..aee18d4 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/ast/mod.rs
+++ b/app/src/ast/mod.rs
@@ -3930,13 +3930,6 @@ 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 matches!(options, CreateTableOptions::With(_)) {
write!(f, " {options}")?;
}
@@ -3949,6 +3942,13 @@ impl fmt::Display for Statement {
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-4/app/src/parser/mod.rs b/app/src/parser/mod.rs
index 88c3bd1..b0ae5d1 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/src/parser/mod.rs
+++ b/app/src/parser/mod.rs
@@ -8361,6 +8361,11 @@ impl<'a> Parser<'a> {
/// Parses a column definition within a view.
fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
let name = self.parse_identifier(false)?;
+ let data_type = if dialect_of!(self is ClickHouseDialect) {
+ Some(self.parse_data_type()?)
+ } else {
+ None
+ };
let options = if dialect_of!(self is BigQueryDialect | GenericDialect)
&& self.parse_keyword(Keyword::OPTIONS)
{
@@ -8369,8 +8374,14 @@ impl<'a> Parser<'a> {
} else {
None
};
- let data_type = if dialect_of!(self is ClickHouseDialect) {
- Some(self.parse_data_type()?)
+ let comment = if dialect_of!(self is SnowflakeDialect | GenericDialect)
+ && self.parse_keyword(Keyword::COMMENT)
+ {
+ let next_token = self.next_token();
+ match next_token.token {
+ Token::SingleQuotedString(str) => Some(str),
+ _ => self.expected("string literal", next_token)?,
+ }
} else {
None
};
@@ -8378,6 +8389,7 @@ impl<'a> Parser<'a> {
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-4/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-4/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-4/app/tests/sqlparser_clickhouse.rs b/app/tests/sqlparser_clickhouse.rs
index e30c336..76e255e 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-4/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-4/app/tests/sqlparser_common.rs b/app/tests/sqlparser_common.rs
index 5d5a17c..0d95563 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-4/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-4/app/tests/sqlparser_snowflake.rs b/app/tests/sqlparser_snowflake.rs
index 50c5f74..e668bfb 100644
--- a/tmp/agent-patch-flux-pr-1441.1-of-1.2026-02-28__18-27-22__gpt-5-4/app/tests/sqlparser_snowflake.rs
+++ b/app/tests/sqlparser_snowflake.rs
@@ -576,6 +576,40 @@ fn parse_sf_create_or_replace_with_comment_for_snowflake() {
}
}
+#[test]
+fn parse_sf_create_view_column_with_comment() {
+ let sql = "CREATE VIEW v (c COMMENT 'hello, world') AS SELECT 1";
+
+ match snowflake().verified_stmt(sql) {
+ Statement::CreateView { columns, .. } => {
+ assert_eq!(
+ columns,
+ vec![ViewColumnDef {
+ name: Ident::new("c"),
+ data_type: None,
+ options: None,
+ comment: Some("hello, world".to_string()),
+ }]
+ );
+ }
+ _ => unreachable!(),
+ }
+}
+
+#[test]
+fn parse_create_view_renders_columns_and_options_before_comment() {
+ let sql = "CREATE VIEW v (c OPTIONS(a = 'b') COMMENT 'hello') OPTIONS(x = 'y') COMMENT = 'view comment' AS SELECT 1";
+ let dialect = test_utils::TestedDialects {
+ dialects: vec![Box::new(GenericDialect {}) as Box<dyn Dialect>],
+ options: None,
+ };
+
+ dialect.one_statement_parses_to(
+ sql,
+ "CREATE VIEW v (c OPTIONS(a = 'b') COMMENT 'hello') OPTIONS(x = 'y') COMMENT = 'view comment' AS SELECT 1",
+ );
+}
+
#[test]
fn test_sf_derived_table_in_parenthesis() {
// Nesting a subquery in an extra set of parentheses is non-standard,