fix: mysql backslash escaping (#373)

* fix: mysql backslash escaping

* fixes
This commit is contained in:
Alex Vasilev 2021-12-23 16:50:33 +03:00 committed by GitHub
parent 60ad78dafc
commit ea0eb1be61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 67 additions and 6 deletions

View file

@ -19,6 +19,8 @@ mod test_utils;
use test_utils::*;
use sqlparser::ast::Expr;
use sqlparser::ast::Value;
use sqlparser::ast::*;
use sqlparser::dialect::{GenericDialect, MySqlDialect};
use sqlparser::tokenizer::Token;
@ -176,6 +178,50 @@ fn parse_quote_identifiers() {
}
}
#[test]
fn parse_unterminated_escape() {
let sql = r#"SELECT 'I\'m not fine\'"#;
let result = std::panic::catch_unwind(|| mysql().one_statement_parses_to(sql, ""));
assert!(result.is_err());
let sql = r#"SELECT 'I\\'m not fine'"#;
let result = std::panic::catch_unwind(|| mysql().one_statement_parses_to(sql, ""));
assert!(result.is_err());
}
#[test]
fn parse_escaped_string() {
let sql = r#"SELECT 'I\'m fine'"#;
let stmt = mysql().one_statement_parses_to(sql, "");
match stmt {
Statement::Query(query) => match query.body {
SetExpr::Select(value) => {
let expr = expr_from_projection(only(&value.projection));
assert_eq!(
*expr,
Expr::Value(Value::SingleQuotedString("I'm fine".to_string()))
);
}
_ => unreachable!(),
},
_ => unreachable!(),
};
let sql = r#"SELECT 'I''m fine'"#;
let projection = mysql().verified_only_select(sql).projection;
let item = projection.get(0).unwrap();
match &item {
SelectItem::UnnamedExpr(Expr::Value(value)) => {
assert_eq!(*value, Value::SingleQuotedString("I'm fine".to_string()));
}
_ => unreachable!(),
}
}
#[test]
fn parse_create_table_with_minimum_display_width() {
let sql = "CREATE TABLE foo (bar_tinyint TINYINT(3), bar_smallint SMALLINT(5), bar_int INT(11), bar_bigint BIGINT(20))";