Handle parentheses around computed projections

This commit is contained in:
Ophir LOJKINE
2026-07-15 18:03:14 +02:00
parent b60d834fd7
commit 614c6303f5
3 changed files with 31 additions and 0 deletions
+15
View File
@@ -433,6 +433,21 @@ mod tests {
assert!(!query.sql.contains("sqlpage."));
}
#[test]
fn parentheses_keep_nested_call_per_row() {
let FileStatement::Query(Query {
body: QueryBody::Database(query),
..
}) = one("select (sqlpage.url_encode(value)) as encoded from t")
else {
panic!("expected database query");
};
assert!(query.bindings.is_empty());
assert_eq!(query.row_input_json.len(), 1);
assert_eq!(query.computed_columns.len(), 1);
assert!(!query.sql.contains("sqlpage."));
}
#[test]
fn row_value_cannot_cross_database_only_parent() {
let FileStatement::Error(error) = one("select upper(sqlpage.url_encode(value)) from t")
+10
View File
@@ -476,6 +476,7 @@ fn can_build_standalone(expression: &SqlExpr) -> anyhow::Result<bool> {
op: BinaryOperator::StringConcat,
right,
} => Ok(can_build_standalone(left)? && can_build_standalone(right)?),
SqlExpr::Nested(expression) => can_build_standalone(expression),
_ => Ok(false),
}
}
@@ -522,6 +523,14 @@ impl QueryRewriter<'_> {
})),
}
}
SqlExpr::Nested(expression) => match self.rewrite_projection(*expression)? {
RewrittenProjection::Database(expression) => Ok(RewrittenProjection::Database(
SqlExpr::Nested(Box::new(expression)),
)),
RewrittenProjection::PerRow(expression) => {
Ok(RewrittenProjection::PerRow(expression))
}
},
mut expression => {
self.rewrite_database_expression(&mut expression)?;
Ok(RewrittenProjection::Database(expression))
@@ -814,6 +823,7 @@ fn build_sqlpage_expr<Environment: ExprEnvironment>(
.database_type
.concat_operator_null_behavior(),
}),
SqlExpr::Nested(expression) => build_sqlpage_expr::<Environment>(rewriter, *expression),
expression => Environment::use_database_expr(rewriter, expression),
}
}
@@ -0,0 +1,6 @@
select
(sqlpage.url_encode(subquery.space)) as actual,
'%20' as expected
from (
select ' ' as space
) AS subquery;