diff --git a/core/translate/expr.rs b/core/translate/expr.rs index e5e2b2822..c339538da 100644 --- a/core/translate/expr.rs +++ b/core/translate/expr.rs @@ -1854,7 +1854,7 @@ pub fn translate_expr( } ast::Literal::String(s) => { program.emit_insn(Insn::String8 { - value: s[1..s.len() - 1].to_string(), + value: sanitize_string(s), dest: target_register, }); Ok(target_register) @@ -2074,3 +2074,9 @@ pub fn get_name( _ => fallback(), } } + +/// Sanitaizes a string literal by removing single quote at front and back +/// and escaping double single quotes +pub fn sanitize_string(input: &str) -> String { + input[1..input.len() - 1].replace("''", "'").to_string() +} diff --git a/testing/select.test b/testing/select.test index ff730b44b..c6d403a6a 100755 --- a/testing/select.test +++ b/testing/select.test @@ -11,6 +11,10 @@ do_execsql_test select-const-2 { SELECT 2 } {2} +do_execsql_test select-text-escape-1 { + SELECT '''a' +} {'a} + do_execsql_test select-blob-empty { SELECT x''; } {}