agent_patch
runs/2026-02-28__18-27-22__gpt-5-3-codex/flux-pr-1534/flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/agent-logs/agent.patch
36676 bytes
diff --git a/tmp/agent-patch-flux-pr-1534.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 078bbc8..864ac2f 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/ast/query.rs
+++ b/app/src/ast/query.rs
@@ -968,6 +968,9 @@ pub enum TableFactor {
/// Optional version qualifier to facilitate table time-travel, as
/// supported by BigQuery and MSSQL.
version: Option<TableVersion>,
+ /// Optional PartiQL-style JSON path suffix applied to this table
+ /// reference (for example: `table_name[0].field`).
+ json_path: Option<JsonPath>,
// Optional table function modifier to generate the ordinality for column.
/// For example, `SELECT * FROM generate_series(1, 10) WITH ORDINALITY AS t(a, b);`
/// [WITH ORDINALITY](https://www.postgresql.org/docs/current/functions-srf.html), supported by Postgres.
@@ -1373,10 +1376,14 @@ impl fmt::Display for TableFactor {
args,
with_hints,
version,
+ json_path,
partitions,
with_ordinality,
} => {
write!(f, "{name}")?;
+ if let Some(path) = json_path {
+ write!(f, "{path}")?;
+ }
if !partitions.is_empty() {
write!(f, "PARTITION ({})", display_comma_separated(partitions))?;
}
diff --git a/tmp/agent-patch-flux-pr-1534.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 985cad7..dccf07d 100644
--- a/tmp/agent-patch-flux-pr-1534.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,14 @@ pub trait Dialect: Debug + Any {
false
}
+ /// Returns true if the dialect supports PartiQL-style path navigation.
+ ///
+ /// This enables parsing JSON-like bracket/dot path suffixes in places such
+ /// as expressions and table references.
+ fn supports_partiql_path(&self) -> bool {
+ false
+ }
+
/// Returns true if the dialect supports lambda functions, for example:
///
/// ```sql
diff --git a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/dialect/redshift.rs b/app/src/dialect/redshift.rs
index 4d07738..3659cd2 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/dialect/redshift.rs
+++ b/app/src/dialect/redshift.rs
@@ -69,6 +69,10 @@ impl Dialect for RedshiftSqlDialect {
true
}
+ fn supports_partiql_path(&self) -> bool {
+ true
+ }
+
/// Redshift expects the `TOP` option before the `ALL/DISTINCT` option:
/// <https://docs.aws.amazon.com/redshift/latest/dg/r_SELECT_list.html#r_SELECT_list-parameters>
fn supports_top_before_distinct(&self) -> bool {
diff --git a/tmp/agent-patch-flux-pr-1534.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 c835876..63628d0 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/parser/mod.rs
+++ b/app/src/parser/mod.rs
@@ -2936,7 +2936,9 @@ impl<'a> Parser<'a> {
} else if Token::LBracket == tok {
if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) {
self.parse_subscript(expr)
- } else if dialect_of!(self is SnowflakeDialect) {
+ } else if dialect_of!(self is SnowflakeDialect)
+ || self.dialect.supports_partiql_path()
+ {
self.prev_token();
self.parse_json_access(expr)
} else {
@@ -3101,6 +3103,31 @@ impl<'a> Parser<'a> {
})
}
+ /// Parse a PartiQL path suffix used in table references (e.g. `[0].x[1]`).
+ ///
+ /// Parser is positioned at the first path token.
+ fn parse_partiql_table_path(&mut self) -> Result<JsonPath, ParserError> {
+ let mut path = Vec::new();
+ loop {
+ match self.next_token().token {
+ Token::Period if !path.is_empty() => {
+ path.push(self.parse_json_path_object_key()?);
+ }
+ Token::LBracket => {
+ let key = self.parse_expr()?;
+ self.expect_token(&Token::RBracket)?;
+ path.push(JsonPathElem::Bracket { key });
+ }
+ _ => {
+ self.prev_token();
+ break;
+ }
+ }
+ }
+ debug_assert!(!path.is_empty());
+ Ok(JsonPath { path })
+ }
+
pub fn parse_map_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
let key = self.parse_expr()?;
self.expect_token(&Token::RBracket)?;
@@ -10337,6 +10364,13 @@ impl<'a> Parser<'a> {
self.parse_open_json_table_factor()
} else {
let name = self.parse_object_name(true)?;
+ let json_path = if self.dialect.supports_partiql_path()
+ && self.peek_token().token == Token::LBracket
+ {
+ Some(self.parse_partiql_table_path()?)
+ } else {
+ None
+ };
let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
&& self.parse_keyword(Keyword::PARTITION)
@@ -10378,6 +10412,7 @@ impl<'a> Parser<'a> {
args,
with_hints,
version,
+ json_path,
partitions,
with_ordinality,
};
diff --git a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/test_utils.rs b/app/src/test_utils.rs
index b35fc45..1c21f6e 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/src/test_utils.rs
+++ b/app/src/test_utils.rs
@@ -343,7 +343,8 @@ pub fn table(name: impl Into<String>) -> TableFactor {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
}
}
@@ -358,7 +359,8 @@ pub fn table_with_alias(name: impl Into<String>, alias: impl Into<String>) -> Ta
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
}
}
diff --git a/tmp/agent-patch-flux-pr-1534.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 2bf470f..8a94674 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_bigquery.rs
+++ b/app/tests/sqlparser_bigquery.rs
@@ -227,7 +227,8 @@ fn parse_delete_statement() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
from[0].relation
@@ -1371,7 +1372,8 @@ fn parse_table_identifiers() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![]
@@ -1544,7 +1546,8 @@ fn parse_table_time_travel() {
version: Some(TableVersion::ForSystemTimeAsOf(Expr::Value(
Value::SingleQuotedString(version)
))),
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![]
@@ -1642,6 +1645,7 @@ fn parse_merge() {
args: Default::default(),
with_hints: Default::default(),
version: Default::default(),
+ json_path: Default::default(),
partitions: Default::default(),
with_ordinality: false,
},
@@ -1657,6 +1661,7 @@ fn parse_merge() {
args: Default::default(),
with_hints: Default::default(),
version: Default::default(),
+ json_path: Default::default(),
partitions: Default::default(),
with_ordinality: false,
},
diff --git a/tmp/agent-patch-flux-pr-1534.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 a718711..5d69a80 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_clickhouse.rs
+++ b/app/tests/sqlparser_clickhouse.rs
@@ -65,7 +65,8 @@ fn parse_map_access_expr() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -170,6 +171,7 @@ fn parse_delimited_identifiers() {
args,
with_hints,
version,
+ json_path: _,
with_ordinality: _,
partitions: _,
} => {
diff --git a/tmp/agent-patch-flux-pr-1534.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 3d9ba5d..5504ed5 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_common.rs
+++ b/app/tests/sqlparser_common.rs
@@ -362,7 +362,8 @@ fn parse_update_set_from() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -392,7 +393,8 @@ fn parse_update_set_from() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -471,7 +473,8 @@ fn parse_update_with_table_alias() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -562,7 +565,8 @@ fn parse_select_with_table_alias() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -599,7 +603,8 @@ fn parse_delete_statement() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
from[0].relation
@@ -646,7 +651,8 @@ fn parse_delete_statement_for_multi_tables() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
from[0].relation
@@ -658,7 +664,8 @@ fn parse_delete_statement_for_multi_tables() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
from[0].joins[0].relation
@@ -684,7 +691,8 @@ fn parse_delete_statement_for_multi_tables_with_using() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
from[0].relation
@@ -696,7 +704,8 @@ fn parse_delete_statement_for_multi_tables_with_using() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
from[1].relation
@@ -708,7 +717,8 @@ fn parse_delete_statement_for_multi_tables_with_using() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
using[0].relation
@@ -720,7 +730,8 @@ fn parse_delete_statement_for_multi_tables_with_using() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
using[0].joins[0].relation
@@ -751,7 +762,8 @@ fn parse_where_delete_statement() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
from[0].relation,
@@ -796,7 +808,8 @@ fn parse_where_delete_with_alias_statement() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
from[0].relation,
@@ -812,7 +825,8 @@ fn parse_where_delete_with_alias_statement() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -4716,7 +4730,8 @@ fn test_parse_named_window() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -5299,7 +5314,8 @@ fn parse_interval_and_or_xor() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -5910,7 +5926,8 @@ fn parse_implicit_join() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -5922,7 +5939,8 @@ fn parse_implicit_join() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -5942,7 +5960,8 @@ fn parse_implicit_join() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![Join {
@@ -5952,7 +5971,8 @@ fn parse_implicit_join() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
global: false,
@@ -5966,7 +5986,8 @@ fn parse_implicit_join() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![Join {
@@ -5976,7 +5997,8 @@ fn parse_implicit_join() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
global: false,
@@ -6000,7 +6022,8 @@ fn parse_cross_join() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
global: false,
@@ -6025,7 +6048,8 @@ fn parse_joins_on() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
global,
@@ -6152,7 +6176,8 @@ fn parse_joins_using() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
global: false,
@@ -6225,7 +6250,8 @@ fn parse_natural_join() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
global: false,
@@ -6494,7 +6520,8 @@ fn parse_derived_tables() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
global: false,
@@ -7441,7 +7468,8 @@ fn lateral_function() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![Join {
@@ -8256,7 +8284,8 @@ fn parse_merge() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
}
);
@@ -8283,7 +8312,8 @@ fn parse_merge() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -9357,7 +9387,8 @@ fn parse_pivot_table() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
}),
aggregate_functions: vec![
@@ -9430,7 +9461,8 @@ fn parse_unpivot_table() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
}),
value: Ident {
@@ -9497,7 +9529,8 @@ fn parse_pivot_unpivot_table() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
}),
value: Ident {
@@ -9908,7 +9941,8 @@ fn parse_unload() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -10087,7 +10121,8 @@ fn parse_connect_by() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -10174,7 +10209,8 @@ fn parse_connect_by() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -10335,7 +10371,8 @@ fn test_match_recognize() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
};
diff --git a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_databricks.rs b/app/tests/sqlparser_databricks.rs
index 7b917bd..dc08237 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_databricks.rs
+++ b/app/tests/sqlparser_databricks.rs
@@ -191,6 +191,7 @@ fn test_values_clause() {
args: None,
with_hints: vec![],
version: None,
+ json_path: None,
partitions: vec![],
with_ordinality: false,
}),
diff --git a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_duckdb.rs b/app/tests/sqlparser_duckdb.rs
index a2db5c2..b0c567e 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_duckdb.rs
+++ b/app/tests/sqlparser_duckdb.rs
@@ -280,7 +280,8 @@ fn test_select_union_by_name() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -321,7 +322,8 @@ fn test_select_union_by_name() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
diff --git a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_hive.rs b/app/tests/sqlparser_hive.rs
index 10bd374..e3429c9 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_hive.rs
+++ b/app/tests/sqlparser_hive.rs
@@ -455,6 +455,7 @@ fn parse_delimited_identifiers() {
args,
with_hints,
version,
+ json_path: _,
with_ordinality: _,
partitions: _,
} => {
diff --git a/tmp/agent-patch-flux-pr-1534.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 73fd99c..035c9d4 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_mssql.rs
+++ b/app/tests/sqlparser_mssql.rs
@@ -68,7 +68,8 @@ fn parse_table_time_travel() {
version: Some(TableVersion::ForSystemTimeAsOf(Expr::Value(
Value::SingleQuotedString(version)
))),
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![]
@@ -217,6 +218,7 @@ fn parse_mssql_openjson() {
args: None,
with_hints: vec![],
version: None,
+ json_path: None,
with_ordinality: false,
partitions: vec![]
},
@@ -292,6 +294,7 @@ fn parse_mssql_openjson() {
args: None,
with_hints: vec![],
version: None,
+ json_path: None,
with_ordinality: false,
partitions: vec![]
},
@@ -367,6 +370,7 @@ fn parse_mssql_openjson() {
args: None,
with_hints: vec![],
version: None,
+ json_path: None,
with_ordinality: false,
partitions: vec![]
},
@@ -442,6 +446,7 @@ fn parse_mssql_openjson() {
args: None,
with_hints: vec![],
version: None,
+ json_path: None,
with_ordinality: false,
partitions: vec![]
},
@@ -495,6 +500,7 @@ fn parse_mssql_openjson() {
args: None,
with_hints: vec![],
version: None,
+ json_path: None,
with_ordinality: false,
partitions: vec![]
},
@@ -677,6 +683,7 @@ fn parse_delimited_identifiers() {
args,
with_hints,
version,
+ json_path: _,
with_ordinality: _,
partitions: _,
} => {
@@ -1312,7 +1319,8 @@ fn parse_substring_in_select() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![]
diff --git a/tmp/agent-patch-flux-pr-1534.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 ce32967..33ba4d2 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_mysql.rs
+++ b/app/tests/sqlparser_mysql.rs
@@ -1860,7 +1860,8 @@ fn parse_select_with_numeric_prefix_column_name() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![]
@@ -1916,7 +1917,8 @@ fn parse_select_with_concatenation_of_exp_number_and_numeric_prefix_column() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![]
@@ -1983,7 +1985,8 @@ fn parse_update_with_joins() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![Join {
@@ -1996,7 +1999,8 @@ fn parse_update_with_joins() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
global: false,
@@ -2426,7 +2430,8 @@ fn parse_substring_in_select() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![]
diff --git a/tmp/agent-patch-flux-pr-1534.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 2e2c440..c2b8704 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_postgres.rs
+++ b/app/tests/sqlparser_postgres.rs
@@ -3509,6 +3509,7 @@ fn parse_delimited_identifiers() {
args,
with_hints,
version,
+ json_path: _,
with_ordinality: _,
partitions: _,
} => {
diff --git a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_redshift.rs b/app/tests/sqlparser_redshift.rs
index a25d506..f864e99 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_redshift.rs
+++ b/app/tests/sqlparser_redshift.rs
@@ -52,7 +52,8 @@ fn test_square_brackets_over_db_schema_table_name() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -99,7 +100,8 @@ fn test_double_quotes_over_db_schema_table_name() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],
@@ -121,6 +123,7 @@ fn parse_delimited_identifiers() {
args,
with_hints,
version,
+ json_path: _,
with_ordinality: _,
partitions: _,
} => {
@@ -196,3 +199,62 @@ fn test_create_view_with_no_schema_binding() {
redshift_and_generic()
.verified_stmt("CREATE VIEW myevent AS SELECT eventname FROM event WITH NO SCHEMA BINDING");
}
+
+#[test]
+fn parse_partiql_path_in_expr() {
+ let select = redshift().verified_only_select(
+ "SELECT c.c_orders[0].o_orderkey FROM customer_orders_lineitem c",
+ );
+ assert_eq!(
+ select.projection[0],
+ SelectItem::UnnamedExpr(Expr::JsonAccess {
+ value: Box::new(Expr::CompoundIdentifier(vec![
+ Ident::new("c"),
+ Ident::new("c_orders")
+ ])),
+ path: JsonPath {
+ path: vec![
+ JsonPathElem::Bracket {
+ key: Expr::Value(number("0"))
+ },
+ JsonPathElem::Dot {
+ key: "o_orderkey".to_string(),
+ quoted: false
+ }
+ ]
+ }
+ }),
+ );
+}
+
+#[test]
+fn parse_partiql_path_in_table_factor() {
+ let select =
+ redshift().verified_only_select("SELECT * FROM customer_orders_lineitem[0].o_orderkey c");
+ assert_eq!(
+ select.from[0].relation,
+ TableFactor::Table {
+ name: ObjectName(vec![Ident::new("customer_orders_lineitem")]),
+ alias: Some(TableAlias {
+ name: Ident::new("c"),
+ columns: vec![],
+ }),
+ args: None,
+ with_hints: vec![],
+ version: None,
+ json_path: Some(JsonPath {
+ path: vec![
+ JsonPathElem::Bracket {
+ key: Expr::Value(number("0"))
+ },
+ JsonPathElem::Dot {
+ key: "o_orderkey".to_string(),
+ quoted: false
+ }
+ ]
+ }),
+ partitions: vec![],
+ with_ordinality: false,
+ }
+ );
+}
diff --git a/tmp/agent-patch-flux-pr-1534.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 1d053bb..4e144d6 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_snowflake.rs
+++ b/app/tests/sqlparser_snowflake.rs
@@ -1188,6 +1188,7 @@ fn parse_delimited_identifiers() {
args,
with_hints,
version,
+ json_path: _,
with_ordinality: _,
partitions: _,
} => {
diff --git a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_sqlite.rs b/app/tests/sqlparser_sqlite.rs
index 6f8e654..815058a 100644
--- a/tmp/agent-patch-flux-pr-1534.1-of-1.2026-02-28__18-27-22__gpt-5-3-codex/app/tests/sqlparser_sqlite.rs
+++ b/app/tests/sqlparser_sqlite.rs
@@ -484,7 +484,8 @@ fn parse_update_tuple_row_values() {
args: None,
with_hints: vec![],
version: None,
- partitions: vec![],
+ json_path: None,
+ partitions: vec![],
with_ordinality: false,
},
joins: vec![],