STET

agent_patch

runs/2026-02-28__18-27-22__gpt-5-3-codex/flux-pr-1759/flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/agent-logs/agent.patch

27300 bytes

Back to adjudication
diff --git a/tmp/agent-patch-flux-pr-1759.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 d658898..bf421a2 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/mod.rs
+++ b/app/src/ast/mod.rs
@@ -72,7 +72,8 @@ pub use self::query::{
     JsonTableColumn, JsonTableColumnErrorHandling, JsonTableNamedColumn, JsonTableNestedColumn,
     LateralView, LimitClause, LockClause, LockType, MatchRecognizePattern, MatchRecognizeSymbol,
     Measure, NamedWindowDefinition, NamedWindowExpr, NonBlock, Offset, OffsetRows,
-    OpenJsonTableColumn, OrderBy, OrderByExpr, OrderByKind, OrderByOptions, PivotValueSource,
+    OpenJsonTableColumn, OrderBy, OrderByExpr, OrderByKind, OrderByOptions, PipeOperator,
+    PivotValueSource,
     ProjectionSelect, Query, RenameSelectItem, RepetitionQuantifier, ReplaceSelectElement,
     ReplaceSelectItem, RowsPerMatch, Select, SelectFlavor, SelectInto, SelectItem,
     SelectItemQualifiedWildcardKind, SetExpr, SetOperator, SetQuantifier, Setting,
diff --git a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/query.rs b/app/src/ast/query.rs
index 982985e..c57ae86 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/query.rs
+++ b/app/src/ast/query.rs
@@ -41,6 +41,8 @@ pub struct Query {
     pub with: Option<With>,
     /// SELECT or UNION / EXCEPT / INTERSECT
     pub body: Box<SetExpr>,
+    /// BigQuery pipe operators (`|>`).
+    pub pipe_operators: Vec<PipeOperator>,
     /// ORDER BY
     pub order_by: Option<OrderBy>,
     /// `LIMIT ... OFFSET ... | LIMIT <offset>, <limit>`
@@ -70,6 +72,9 @@ impl fmt::Display for Query {
             write!(f, "{with} ")?;
         }
         write!(f, "{}", self.body)?;
+        for pipe_operator in &self.pipe_operators {
+            write!(f, " |> {pipe_operator}")?;
+        }
         if let Some(ref order_by) = self.order_by {
             write!(f, " {order_by}")?;
         }
@@ -96,6 +101,54 @@ impl fmt::Display for Query {
     }
 }
 
+/// BigQuery pipe operators.
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum PipeOperator {
+    Where(Expr),
+    Select(Vec<SelectItem>),
+    Extend(Vec<SelectItem>),
+    Set(Vec<Assignment>),
+    Drop(Vec<Expr>),
+    As(Ident),
+    Limit(Expr),
+    OrderBy(Vec<OrderByExpr>),
+    Aggregate {
+        aggregate: Vec<ExprWithAlias>,
+        group_by: GroupByExpr,
+    },
+    Rename(Vec<IdentWithAlias>),
+}
+
+impl fmt::Display for PipeOperator {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            Self::Where(expr) => write!(f, "WHERE {expr}"),
+            Self::Select(items) => write!(f, "SELECT {}", display_comma_separated(items)),
+            Self::Extend(items) => write!(f, "EXTEND {}", display_comma_separated(items)),
+            Self::Set(assignments) => write!(f, "SET {}", display_comma_separated(assignments)),
+            Self::Drop(items) => write!(f, "DROP {}", display_comma_separated(items)),
+            Self::As(alias) => write!(f, "AS {alias}"),
+            Self::Limit(limit) => write!(f, "LIMIT {limit}"),
+            Self::OrderBy(order_by) => write!(f, "ORDER BY {}", display_comma_separated(order_by)),
+            Self::Aggregate {
+                aggregate,
+                group_by,
+            } => {
+                write!(f, "AGGREGATE {}", display_comma_separated(aggregate))?;
+                match group_by {
+                    GroupByExpr::Expressions(exprs, modifiers)
+                        if exprs.is_empty() && modifiers.is_empty() => {}
+                    _ => write!(f, " {group_by}")?,
+                }
+                Ok(())
+            }
+            Self::Rename(items) => write!(f, "RENAME {}", display_comma_separated(items)),
+        }
+    }
+}
+
 /// Query syntax for ClickHouse ADD PROJECTION statement.
 /// Its syntax is similar to SELECT statement, but it is used to add a new projection to a table.
 /// Syntax is `SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY]`
diff --git a/tmp/agent-patch-flux-pr-1759.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 28d479f..1aa0a1f 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/spans.rs
+++ b/app/src/ast/spans.rs
@@ -95,6 +95,7 @@ impl Spanned for Query {
         let Query {
             with,
             body,
+            pipe_operators: _, // todo, bigquery specific
             order_by,
             limit_clause,
             fetch,
diff --git a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/dialect/bigquery.rs b/app/src/dialect/bigquery.rs
index 49fb24f..05d132f 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/dialect/bigquery.rs
+++ b/app/src/dialect/bigquery.rs
@@ -123,6 +123,11 @@ impl Dialect for BigQueryDialect {
         true
     }
 
+    /// See <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax>
+    fn supports_pipe_operators(&self) -> bool {
+        true
+    }
+
     // See <https://cloud.google.com/bigquery/docs/access-historical-data>
     fn supports_timestamp_versioning(&self) -> bool {
         true
diff --git a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/dialect/mod.rs b/app/src/dialect/mod.rs
index b2dff06..9747039 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/dialect/mod.rs
+++ b/app/src/dialect/mod.rs
@@ -293,6 +293,11 @@ pub trait Dialect: Debug + Any {
         false
     }
 
+    /// Returns true if the dialect supports BigQuery-style pipe operators (`|>`).
+    fn supports_pipe_operators(&self) -> bool {
+        false
+    }
+
     /// Returns true if the dialect supports the MATCH_RECOGNIZE operation.
     fn supports_match_recognize(&self) -> bool {
         false
diff --git a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/keywords.rs b/app/src/keywords.rs
index 15a6f91..5d7aca9 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/keywords.rs
+++ b/app/src/keywords.rs
@@ -83,6 +83,7 @@ define_keywords!(
     ADMIN,
     AFTER,
     AGAINST,
+    AGGREGATE,
     AGGREGATION,
     ALERT,
     ALGORITHM,
@@ -338,6 +339,7 @@ define_keywords!(
     EXPLAIN,
     EXPLICIT,
     EXPORT,
+    EXTEND,
     EXTENDED,
     EXTENSION,
     EXTERNAL,
@@ -1008,6 +1010,8 @@ pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
     Keyword::EXPLAIN,
     Keyword::ANALYZE,
     Keyword::SELECT,
+    Keyword::AGGREGATE,
+    Keyword::EXTEND,
     Keyword::WHERE,
     Keyword::GROUP,
     Keyword::SORT,
@@ -1075,6 +1079,8 @@ pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
     Keyword::EXPLAIN,
     Keyword::ANALYZE,
     Keyword::SELECT,
+    Keyword::AGGREGATE,
+    Keyword::EXTEND,
     Keyword::WHERE,
     Keyword::GROUP,
     Keyword::SORT,
diff --git a/tmp/agent-patch-flux-pr-1759.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 03ea91f..219deb9 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/parser/mod.rs
+++ b/app/src/parser/mod.rs
@@ -10564,6 +10564,7 @@ impl<'a> Parser<'a> {
             Ok(Query {
                 with,
                 body: self.parse_insert_setexpr_boxed()?,
+                pipe_operators: vec![],
                 order_by: None,
                 limit_clause: None,
                 fetch: None,
@@ -10577,6 +10578,7 @@ impl<'a> Parser<'a> {
             Ok(Query {
                 with,
                 body: self.parse_update_setexpr_boxed()?,
+                pipe_operators: vec![],
                 order_by: None,
                 limit_clause: None,
                 fetch: None,
@@ -10590,6 +10592,7 @@ impl<'a> Parser<'a> {
             Ok(Query {
                 with,
                 body: self.parse_delete_setexpr_boxed()?,
+                pipe_operators: vec![],
                 limit_clause: None,
                 order_by: None,
                 fetch: None,
@@ -10601,6 +10604,11 @@ impl<'a> Parser<'a> {
             .into())
         } else {
             let body = self.parse_query_body(self.dialect.prec_unknown())?;
+            let pipe_operators = if self.dialect.supports_pipe_operators() {
+                self.parse_pipe_operators()?
+            } else {
+                vec![]
+            };
 
             let order_by = self.parse_optional_order_by()?;
 
@@ -10640,6 +10648,7 @@ impl<'a> Parser<'a> {
             Ok(Query {
                 with,
                 body,
+                pipe_operators,
                 order_by,
                 limit_clause,
                 fetch,
@@ -10652,6 +10661,59 @@ impl<'a> Parser<'a> {
         }
     }
 
+    fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
+        let mut operators = vec![];
+        while self.consume_token(&Token::PipeRight) {
+            operators.push(self.parse_pipe_operator()?);
+        }
+        Ok(operators)
+    }
+
+    fn parse_pipe_operator(&mut self) -> Result<PipeOperator, ParserError> {
+        if self.parse_keyword(Keyword::WHERE) {
+            Ok(PipeOperator::Where(self.parse_expr()?))
+        } else if self.parse_keyword(Keyword::SELECT) {
+            Ok(PipeOperator::Select(self.parse_projection()?))
+        } else if self.parse_keyword(Keyword::EXTEND) {
+            Ok(PipeOperator::Extend(self.parse_projection()?))
+        } else if self.parse_keyword(Keyword::SET) {
+            Ok(PipeOperator::Set(
+                self.parse_comma_separated(Self::parse_assignment)?,
+            ))
+        } else if self.parse_keyword(Keyword::DROP) {
+            Ok(PipeOperator::Drop(self.parse_comma_separated(Self::parse_expr)?))
+        } else if self.parse_keyword(Keyword::AS) {
+            Ok(PipeOperator::As(self.parse_identifier()?))
+        } else if self.parse_keyword(Keyword::LIMIT) {
+            let Some(limit) = self.parse_limit()? else {
+                return self.expected("a LIMIT value", self.peek_token());
+            };
+            Ok(PipeOperator::Limit(limit))
+        } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
+            Ok(PipeOperator::OrderBy(
+                self.parse_comma_separated(Self::parse_order_by_expr)?,
+            ))
+        } else if self.parse_keyword(Keyword::AGGREGATE) {
+            let aggregate = self.parse_comma_separated(Self::parse_expr_with_alias)?;
+            let group_by = self
+                .parse_optional_group_by()?
+                .unwrap_or_else(|| GroupByExpr::Expressions(vec![], vec![]));
+            Ok(PipeOperator::Aggregate {
+                aggregate,
+                group_by,
+            })
+        } else if self.parse_keyword(Keyword::RENAME) {
+            Ok(PipeOperator::Rename(
+                self.parse_comma_separated(Self::parse_identifier_with_alias)?,
+            ))
+        } else {
+            self.expected(
+                "a BigQuery pipe operator after |>",
+                self.peek_token().clone(),
+            )
+        }
+    }
+
     fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
         let settings = if dialect_of!(self is ClickHouseDialect|GenericDialect)
             && self.parse_keyword(Keyword::SETTINGS)
@@ -12115,6 +12177,7 @@ impl<'a> Parser<'a> {
                 subquery: Box::new(Query {
                     with: None,
                     body: Box::new(values),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
diff --git a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/tokenizer.rs b/app/src/tokenizer.rs
index 13bce0c..b96835a 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/tokenizer.rs
+++ b/app/src/tokenizer.rs
@@ -162,6 +162,8 @@ pub enum Token {
     Ampersand,
     /// Pipe `|`
     Pipe,
+    /// Pipe right `|>` used by BigQuery pipe syntax.
+    PipeRight,
     /// Caret `^`
     Caret,
     /// Left brace `{`
@@ -331,6 +333,7 @@ impl fmt::Display for Token {
             Token::Ampersand => f.write_str("&"),
             Token::Caret => f.write_str("^"),
             Token::Pipe => f.write_str("|"),
+            Token::PipeRight => f.write_str("|>"),
             Token::LBrace => f.write_str("{"),
             Token::RBrace => f.write_str("}"),
             Token::RArrow => f.write_str("=>"),
@@ -1371,6 +1374,9 @@ impl<'a> Tokenizer<'a> {
                 '|' => {
                     chars.next(); // consume the '|'
                     match chars.peek() {
+                        Some('>') if self.dialect.supports_pipe_operators() => {
+                            self.consume_for_binop(chars, "|>", Token::PipeRight)
+                        }
                         Some('/') => self.consume_for_binop(chars, "|/", Token::PGSquareRoot),
                         Some('|') => {
                             chars.next(); // consume the second '|'
@@ -2593,6 +2599,30 @@ mod tests {
         compare(expected, tokens);
     }
 
+    #[test]
+    fn tokenize_bigquery_pipe_operator() {
+        let sql = String::from("FROM t |> WHERE x > 0");
+        let dialect = BigQueryDialect {};
+        let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
+
+        let expected = vec![
+            Token::make_keyword("FROM"),
+            Token::Whitespace(Whitespace::Space),
+            Token::make_word("t", None),
+            Token::Whitespace(Whitespace::Space),
+            Token::PipeRight,
+            Token::Whitespace(Whitespace::Space),
+            Token::make_keyword("WHERE"),
+            Token::Whitespace(Whitespace::Space),
+            Token::make_word("x", None),
+            Token::Whitespace(Whitespace::Space),
+            Token::Gt,
+            Token::Whitespace(Whitespace::Space),
+            Token::Number(String::from("0"), false),
+        ];
+        compare(expected, tokens);
+    }
+
     #[test]
     fn tokenize_logical_xor() {
         let sql =
diff --git a/tmp/agent-patch-flux-pr-1759.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 416d2e4..b1cddb5 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_bigquery.rs
+++ b/app/tests/sqlparser_bigquery.rs
@@ -2311,6 +2311,34 @@ fn bigquery_select_expr_star() {
     bigquery().verified_only_select("SELECT myfunc()[0].* FROM T");
 }
 
+#[test]
+fn parse_bigquery_pipe_operators_basic() {
+    let sql = "FROM t |> WHERE x > 0 |> SELECT x |> LIMIT 10";
+    let query = bigquery().verified_query(sql);
+    assert_eq!(query.pipe_operators.len(), 3);
+    assert!(matches!(query.pipe_operators[0], PipeOperator::Where(_)));
+    assert!(matches!(query.pipe_operators[1], PipeOperator::Select(_)));
+    assert!(matches!(query.pipe_operators[2], PipeOperator::Limit(_)));
+}
+
+#[test]
+fn parse_bigquery_pipe_operator_aggregate() {
+    let sql = "FROM t |> AGGREGATE SUM(y) AS total GROUP BY z |> ORDER BY total DESC";
+    let query = bigquery().verified_query(sql);
+    assert_eq!(query.pipe_operators.len(), 2);
+    match &query.pipe_operators[0] {
+        PipeOperator::Aggregate {
+            aggregate,
+            group_by,
+        } => {
+            assert_eq!(aggregate.len(), 1);
+            assert!(matches!(group_by, GroupByExpr::Expressions(exprs, _) if exprs.len() == 1));
+        }
+        other => panic!("Expected AGGREGATE pipe operator, found {other:?}"),
+    }
+    assert!(matches!(query.pipe_operators[1], PipeOperator::OrderBy(_)));
+}
+
 #[test]
 fn test_select_as_struct() {
     bigquery().verified_only_select("SELECT * FROM (SELECT AS VALUE STRUCT(123 AS a, false AS b))");
diff --git a/tmp/agent-patch-flux-pr-1759.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 fa2346c..59cb35e 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_common.rs
+++ b/app/tests/sqlparser_common.rs
@@ -482,6 +482,7 @@ fn parse_update_set_from() {
                             connect_by: None,
                             flavor: SelectFlavor::Standard,
                         }))),
+                        pipe_operators: vec![],
                         order_by: None,
                         limit_clause: None,
                         fetch: None,
@@ -4303,6 +4304,7 @@ fn parse_create_table_as_table() {
             table_name: Some("old_table".to_string()),
             schema_name: None,
         }))),
+        pipe_operators: vec![],
         order_by: None,
         limit_clause: None,
         fetch: None,
@@ -4328,6 +4330,7 @@ fn parse_create_table_as_table() {
             table_name: Some("old_table".to_string()),
             schema_name: Some("schema_name".to_string()),
         }))),
+        pipe_operators: vec![],
         order_by: None,
         limit_clause: None,
         fetch: None,
@@ -6325,6 +6328,7 @@ fn parse_interval_and_or_xor() {
             connect_by: None,
             flavor: SelectFlavor::Standard,
         }))),
+        pipe_operators: vec![],
         order_by: None,
         limit_clause: None,
         fetch: None,
@@ -9460,6 +9464,7 @@ fn parse_merge() {
                             connect_by: None,
                             flavor: SelectFlavor::Standard,
                         }))),
+                        pipe_operators: vec![],
                         order_by: None,
                         limit_clause: None,
                         fetch: None,
@@ -11341,6 +11346,7 @@ fn parse_unload() {
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
+                pipe_operators: vec![],
                 order_by: None,
                 settings: None,
                 format_clause: None,
@@ -12557,6 +12563,7 @@ fn test_extract_seconds_ok() {
             connect_by: None,
             flavor: SelectFlavor::Standard,
         }))),
+        pipe_operators: vec![],
         order_by: None,
         limit_clause: None,
         fetch: None,
@@ -14634,6 +14641,7 @@ fn test_select_from_first() {
                 connect_by: None,
                 flavor,
             }))),
+            pipe_operators: vec![],
             order_by: None,
             limit_clause: None,
             fetch: None,
diff --git a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_mssql.rs b/app/tests/sqlparser_mssql.rs
index ef61034..fb4ef46 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_mssql.rs
+++ b/app/tests/sqlparser_mssql.rs
@@ -111,6 +111,7 @@ fn parse_create_procedure() {
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
+                pipe_operators: vec![],
                 order_by: None,
                 settings: None,
                 format_clause: None,
@@ -1245,6 +1246,7 @@ fn parse_substring_in_select() {
                         connect_by: None,
                         flavor: SelectFlavor::Standard,
                     }))),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1351,6 +1353,7 @@ fn parse_mssql_declare() {
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
+                pipe_operators: vec![],
                 order_by: None,
                 settings: None,
                 format_clause: None,
@@ -1679,6 +1682,7 @@ fn parse_create_table_with_valid_options() {
                 on_commit: None,
                 on_cluster: None,
                 primary_key: None,
+                pipe_operators: vec![],
                 order_by: None,
                 partition_by: None,
                 cluster_by: None,
diff --git a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_mysql.rs b/app/tests/sqlparser_mysql.rs
index f74248b..0d5bf99 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_mysql.rs
+++ b/app/tests/sqlparser_mysql.rs
@@ -1106,6 +1106,7 @@ fn parse_escaped_quote_identifiers_with_escape() {
                 connect_by: None,
                 flavor: SelectFlavor::Standard,
             }))),
+            pipe_operators: vec![],
             order_by: None,
             limit_clause: None,
             fetch: None,
@@ -1158,6 +1159,7 @@ fn parse_escaped_quote_identifiers_with_no_escape() {
                 connect_by: None,
                 flavor: SelectFlavor::Standard,
             }))),
+            pipe_operators: vec![],
             order_by: None,
             limit_clause: None,
             fetch: None,
@@ -1204,6 +1206,7 @@ fn parse_escaped_backticks_with_escape() {
                 connect_by: None,
                 flavor: SelectFlavor::Standard,
             }))),
+            pipe_operators: vec![],
             order_by: None,
             limit_clause: None,
             fetch: None,
@@ -1254,6 +1257,7 @@ fn parse_escaped_backticks_with_no_escape() {
                 connect_by: None,
                 flavor: SelectFlavor::Standard,
             }))),
+            pipe_operators: vec![],
             order_by: None,
             limit_clause: None,
             fetch: None,
@@ -1429,6 +1433,7 @@ fn parse_simple_insert() {
                             ]
                         ]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1477,6 +1482,7 @@ fn parse_ignore_insert() {
                             Expr::value(number("1"))
                         ]]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1525,6 +1531,7 @@ fn parse_priority_insert() {
                             Expr::value(number("1"))
                         ]]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1570,6 +1577,7 @@ fn parse_priority_insert() {
                             Expr::value(number("1"))
                         ]]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1617,6 +1625,7 @@ fn parse_insert_as() {
                             (Value::SingleQuotedString("2024-01-01".to_string())).with_empty_span()
                         )]]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1679,6 +1688,7 @@ fn parse_insert_as() {
                             )
                         ]]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1728,6 +1738,7 @@ fn parse_replace_insert() {
                             Expr::value(number("1"))
                         ]]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1768,6 +1779,7 @@ fn parse_empty_row_insert() {
                         explicit_row: false,
                         rows: vec![vec![], vec![]]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -1832,6 +1844,7 @@ fn parse_insert_with_on_duplicate_update() {
                             Expr::Value((Value::Boolean(true)).with_empty_span()),
                         ]]
                     })),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -2738,6 +2751,7 @@ fn parse_substring_in_select() {
                         connect_by: None,
                         flavor: SelectFlavor::Standard,
                     }))),
+                    pipe_operators: vec![],
                     order_by: None,
                     limit_clause: None,
                     fetch: None,
@@ -3044,6 +3058,7 @@ fn parse_hex_string_introducer() {
                 connect_by: None,
                 flavor: SelectFlavor::Standard,
             }))),
+            pipe_operators: vec![],
             order_by: None,
             limit_clause: None,
             fetch: None,
diff --git a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_postgres.rs b/app/tests/sqlparser_postgres.rs
index 27fc7fa..fa6b8bb 100644
--- a/tmp/agent-patch-flux-pr-1759.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_postgres.rs
+++ b/app/tests/sqlparser_postgres.rs
@@ -1319,6 +1319,7 @@ fn parse_copy_to() {
                     connect_by: None,
                     flavor: SelectFlavor::Standard,
                 }))),
+                pipe_operators: vec![],
                 order_by: None,
                 limit_clause: None,
                 fetch: None,
@@ -2987,6 +2988,7 @@ fn parse_array_subquery_expr() {
                         flavor: SelectFlavor::Standard,
                     }))),
                 }),
+                pipe_operators: vec![],
                 order_by: None,
                 limit_clause: None,
                 fetch: None,
@@ -4778,6 +4780,7 @@ fn test_simple_postgres_insert_with_alias() {
                         Expr::Value((Value::Number("123".to_string(), false)).with_empty_span())
                     ]]
                 })),
+                pipe_operators: vec![],
                 order_by: None,
                 limit_clause: None,
                 fetch: None,
@@ -4849,6 +4852,7 @@ fn test_simple_postgres_insert_with_alias() {
                         )
                     ]]
                 })),
+                pipe_operators: vec![],
                 order_by: None,
                 limit_clause: None,
                 fetch: None,
@@ -4918,6 +4922,7 @@ fn test_simple_insert_with_quoted_alias() {
                         )
                     ]]
                 })),
+                pipe_operators: vec![],
                 order_by: None,
                 limit_clause: None,
                 fetch: None,