Skip to content

Commit 14b86ac

Browse files
committed
remove unneeded generated sql casts
1 parent ec5875e commit 14b86ac

File tree

2 files changed

+6
-16
lines changed

2 files changed

+6
-16
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
- New [`sqlpage.variables`](https://sql.ophir.dev/functions.sql?function=variables#function) function for easy handling of complex forms
99
- `sqlpage.variables('get')` returns a json object containing all url parameters. Inside `/my_page.sql?x=1&y=2`, it returns the string `'{"x":"1","y":"2"}'`
1010
- `sqlpage.variables('post')` returns a json object containg all variables passed through a form. This makes it much easier to handle a form with a variable number of fields.
11-
11+
- Remove systematic casting in SQL of all parameters to `TEXT`. The supported databases understand the type of the parameters natively.
1212

1313
## 0.14.0 (2023-10-19)
1414

src/webserver/database/sql.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{AppState, Database};
66
use anyhow::Context;
77
use async_trait::async_trait;
88
use sqlparser::ast::{
9-
BinaryOperator, DataType, Expr, Function, FunctionArg, FunctionArgExpr, Ident, ObjectName,
9+
BinaryOperator, Expr, Function, FunctionArg, FunctionArgExpr, Ident, ObjectName,
1010
Statement, Value, VisitMut, VisitorMut,
1111
};
1212
use sqlparser::dialect::{Dialect, MsSqlDialect, MySqlDialect, PostgreSqlDialect, SQLiteDialect};
@@ -318,17 +318,7 @@ impl ParameterExtractor {
318318

319319
fn make_placeholder(&self) -> Expr {
320320
let name = make_placeholder(self.db_kind, self.parameters.len() + 1);
321-
let data_type = match self.db_kind {
322-
// MySQL requires CAST(? AS CHAR) and does not understand CAST(? AS TEXT)
323-
AnyKind::MySql => DataType::Char(None),
324-
AnyKind::Postgres => DataType::Text,
325-
_ => DataType::Varchar(None),
326-
};
327-
let value = Expr::Value(Value::Placeholder(name));
328-
Expr::Cast {
329-
expr: Box::new(value),
330-
data_type,
331-
}
321+
Expr::Value(Value::Placeholder(name))
332322
}
333323

334324
fn handle_builtin_function(
@@ -586,7 +576,7 @@ mod test {
586576
let parameters = ParameterExtractor::extract_parameters(&mut ast, AnyKind::Postgres);
587577
assert_eq!(
588578
ast.to_string(),
589-
"SELECT CAST($1 AS TEXT) FROM t WHERE CAST($2 AS TEXT) > CAST($3 AS TEXT) OR CAST($4 AS TEXT) = CAST($5 AS TEXT)"
579+
"SELECT $1 FROM t WHERE $2 > $3 OR $4 = $5"
590580
);
591581
assert_eq!(
592582
parameters,
@@ -606,7 +596,7 @@ mod test {
606596
let parameters = ParameterExtractor::extract_parameters(&mut ast, AnyKind::Sqlite);
607597
assert_eq!(
608598
ast.to_string(),
609-
"SELECT CAST(? AS VARCHAR), CAST(? AS VARCHAR) FROM t"
599+
"SELECT ?, ? FROM t"
610600
);
611601
assert_eq!(
612602
parameters,
@@ -705,7 +695,7 @@ mod test {
705695
let parameters = ParameterExtractor::extract_parameters(&mut ast, AnyKind::Mssql);
706696
assert_eq!(
707697
ast.to_string(),
708-
"SELECT CONCAT('', CAST(@p1 AS VARCHAR)) FROM [a schema].[a table]"
698+
"SELECT CONCAT('', @p1) FROM [a schema].[a table]"
709699
);
710700
assert_eq!(parameters, [StmtParam::GetOrPost("1".to_string()),]);
711701
}

0 commit comments

Comments
 (0)