agent_patch
runs/2026-02-28__18-27-22__gpt-5-3-codex/flux-pr-1891/flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/agent-logs/agent.patch
11106 bytes
diff --git a/tmp/agent-patch-flux-pr-1891.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 f81c6fc..c097e66 100644
--- a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/ddl.rs
+++ b/app/src/ast/ddl.rs
@@ -1427,6 +1427,17 @@ pub struct ViewColumnDef {
pub name: Ident,
pub data_type: Option<DataType>,
pub options: Option<Vec<ColumnOption>>,
+ #[cfg_attr(feature = "serde", serde(default))]
+ pub option_style: ViewColumnOptionStyle,
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Copy, Default)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum ViewColumnOptionStyle {
+ #[default]
+ CommaSeparated,
+ SpaceSeparated,
}
impl fmt::Display for ViewColumnDef {
@@ -1436,7 +1447,11 @@ impl fmt::Display for ViewColumnDef {
write!(f, " {}", data_type)?;
}
if let Some(options) = self.options.as_ref() {
- write!(f, " {}", display_comma_separated(options.as_slice()))?;
+ let sep = match self.option_style {
+ ViewColumnOptionStyle::CommaSeparated => ", ",
+ ViewColumnOptionStyle::SpaceSeparated => " ",
+ };
+ write!(f, " {}", display_separated(options.as_slice(), sep))?;
}
Ok(())
}
diff --git a/tmp/agent-patch-flux-pr-1891.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 ef0c4dc..3728dca 100644
--- a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/mod.rs
+++ b/app/src/ast/mod.rs
@@ -68,6 +68,7 @@ pub use self::ddl::{
IndexOption, IndexType, KeyOrIndexDisplay, NullsDistinctOption, Owner, Partition,
ProcedureParam, ReferentialAction, ReplicaIdentity, TableConstraint, TagsColumnOption,
UserDefinedTypeCompositeAttributeDef, UserDefinedTypeRepresentation, ViewColumnDef,
+ ViewColumnOptionStyle,
};
pub use self::dml::{CreateIndex, CreateTable, Delete, IndexColumn, Insert};
pub use self::operator::{BinaryOperator, UnaryOperator};
diff --git a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/spans.rs b/app/src/ast/spans.rs
index ca321cc..02053fb 100644
--- a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/spans.rs
+++ b/app/src/ast/spans.rs
@@ -989,6 +989,7 @@ impl Spanned for ViewColumnDef {
name,
data_type: _, // todo, DataType
options,
+ option_style: _,
} = self;
union_spans(
diff --git a/tmp/agent-patch-flux-pr-1891.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 ca658d7..c7329a2 100644
--- a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/parser/mod.rs
+++ b/app/src/parser/mod.rs
@@ -10579,19 +10579,49 @@ 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()?;
- let options = if (dialect_of!(self is BigQueryDialect | GenericDialect)
- && self.parse_keyword(Keyword::OPTIONS))
- || (dialect_of!(self is SnowflakeDialect | GenericDialect)
- && self.parse_keyword(Keyword::COMMENT))
- {
- self.prev_token();
- self.parse_optional_column_option()?
- .map(|option| vec![option])
+ let mut option_style = ViewColumnOptionStyle::CommaSeparated;
+ let data_type = if dialect_of!(self is ClickHouseDialect) {
+ Some(self.parse_data_type()?)
} else {
None
};
- let data_type = if dialect_of!(self is ClickHouseDialect) {
- Some(self.parse_data_type()?)
+ let options = if dialect_of!(self is BigQueryDialect | SnowflakeDialect | GenericDialect) {
+ let Some(option) = self.parse_optional_column_option()? else {
+ return Ok(ViewColumnDef {
+ name,
+ data_type,
+ options: None,
+ option_style,
+ });
+ };
+ let mut options = vec![option];
+
+ if self.consume_token(&Token::Comma) {
+ if let Some(option) = self.parse_optional_column_option()? {
+ option_style = ViewColumnOptionStyle::CommaSeparated;
+ options.push(option);
+ while self.consume_token(&Token::Comma) {
+ let token = self.peek_token().cloned();
+ let Some(option) = self.parse_optional_column_option()? else {
+ return self.expected("column option", token);
+ };
+ options.push(option);
+ }
+ } else {
+ self.prev_token();
+ }
+ } else {
+ let mut parsed_space_separated = false;
+ while let Some(option) = self.parse_optional_column_option()? {
+ parsed_space_separated = true;
+ options.push(option);
+ }
+ if parsed_space_separated {
+ option_style = ViewColumnOptionStyle::SpaceSeparated;
+ }
+ }
+
+ Some(options)
} else {
None
};
@@ -10599,6 +10629,7 @@ impl<'a> Parser<'a> {
name,
data_type,
options,
+ option_style,
})
}
diff --git a/tmp/agent-patch-flux-pr-1891.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 0de0b12..2fdd068 100644
--- a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_bigquery.rs
+++ b/app/tests/sqlparser_bigquery.rs
@@ -351,6 +351,7 @@ fn parse_create_view_with_options() {
name: Ident::new("name"),
data_type: None,
options: None,
+ option_style: ViewColumnOptionStyle::CommaSeparated,
},
ViewColumnDef {
name: Ident::new("age"),
@@ -363,6 +364,7 @@ fn parse_create_view_with_options() {
)
),
}])]),
+ option_style: ViewColumnOptionStyle::CommaSeparated,
},
],
columns
diff --git a/tmp/agent-patch-flux-pr-1891.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 93b4c4f..cb1d486 100644
--- a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_clickhouse.rs
+++ b/app/tests/sqlparser_clickhouse.rs
@@ -914,7 +914,8 @@ fn parse_create_view_with_fields_data_types() {
}]),
vec![]
)),
- options: None
+ options: None,
+ option_style: ViewColumnOptionStyle::CommaSeparated
},
ViewColumnDef {
name: "f".into(),
@@ -926,7 +927,8 @@ fn parse_create_view_with_fields_data_types() {
}]),
vec![]
)),
- options: None
+ options: None,
+ option_style: ViewColumnOptionStyle::CommaSeparated
},
]
);
diff --git a/tmp/agent-patch-flux-pr-1891.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 d45da69..5ec730c 100644
--- a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_common.rs
+++ b/app/tests/sqlparser_common.rs
@@ -7990,7 +7990,8 @@ fn parse_create_view_with_columns() {
.map(|name| ViewColumnDef {
name,
data_type: None,
- options: None
+ options: None,
+ option_style: ViewColumnOptionStyle::CommaSeparated
})
.collect::<Vec<_>>()
);
diff --git a/tmp/agent-patch-flux-pr-1891.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 7dc00f9..2ccae06 100644
--- a/tmp/agent-patch-flux-pr-1891.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_snowflake.rs
+++ b/app/tests/sqlparser_snowflake.rs
@@ -3143,11 +3143,50 @@ fn parse_view_column_descriptions() {
name: Ident::new("a"),
data_type: None,
options: Some(vec![ColumnOption::Comment("Comment".to_string())]),
+ option_style: ViewColumnOptionStyle::CommaSeparated,
},
ViewColumnDef {
name: Ident::new("b"),
data_type: None,
options: None,
+ option_style: ViewColumnOptionStyle::CommaSeparated,
+ }
+ ]
+ );
+ }
+ _ => unreachable!(),
+ };
+}
+
+#[test]
+fn parse_view_column_multiple_options_space_separated() {
+ let sql = "CREATE OR REPLACE VIEW v (a COMMENT 'Comment' MASKING POLICY p, b) AS SELECT a, b FROM table1";
+
+ match snowflake_and_generic().verified_stmt(sql) {
+ Statement::CreateView { columns, .. } => {
+ assert_eq!(
+ columns,
+ vec![
+ ViewColumnDef {
+ name: Ident::new("a"),
+ data_type: None,
+ options: Some(vec![
+ ColumnOption::Comment("Comment".to_string()),
+ ColumnOption::Policy(ColumnPolicy::MaskingPolicy(
+ ColumnPolicyProperty {
+ with: false,
+ policy_name: Ident::new("p"),
+ using_columns: None,
+ }
+ )),
+ ]),
+ option_style: ViewColumnOptionStyle::SpaceSeparated,
+ },
+ ViewColumnDef {
+ name: Ident::new("b"),
+ data_type: None,
+ options: None,
+ option_style: ViewColumnOptionStyle::CommaSeparated,
}
]
);