Skip to content

Commit 03d5048

Browse files
committed
cast parameters to VARCHAR(8000) on mssql
1 parent bba4f00 commit 03d5048

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

src/webserver/database/sql.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ 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,
10-
Statement, Value, VisitMut, VisitorMut,
9+
BinaryOperator, CharacterLength, DataType, Expr, Function, FunctionArg, FunctionArgExpr, Ident,
10+
ObjectName, Statement, Value, VisitMut, VisitorMut,
1111
};
1212
use sqlparser::dialect::{Dialect, MsSqlDialect, MySqlDialect, PostgreSqlDialect, SQLiteDialect};
1313
use sqlparser::parser::{Parser, ParserError};
@@ -326,6 +326,10 @@ impl ParameterExtractor {
326326
let data_type = match self.db_kind {
327327
// MySQL requires CAST(? AS CHAR) and does not understand CAST(? AS TEXT)
328328
AnyKind::MySql => DataType::Char(None),
329+
AnyKind::Mssql => DataType::Varchar(Some(CharacterLength {
330+
length: 8000,
331+
unit: None,
332+
})),
329333
_ => DataType::Text,
330334
};
331335
let value = Expr::Value(Value::Placeholder(name));
@@ -712,7 +716,7 @@ mod test {
712716
let parameters = ParameterExtractor::extract_parameters(&mut ast, AnyKind::Mssql);
713717
assert_eq!(
714718
ast.to_string(),
715-
"SELECT CONCAT('', CAST(@p1 AS TEXT)) FROM [a schema].[a table]"
719+
"SELECT CONCAT('', CAST(@p1 AS VARCHAR(8000))) FROM [a schema].[a table]"
716720
);
717721
assert_eq!(parameters, [StmtParam::GetOrPost("1".to_string()),]);
718722
}

0 commit comments

Comments
 (0)