Handle parentheses around computed projections
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user