@@ -22,11 +22,8 @@ use std::borrow::Cow;
2222
2323use crate :: highlighter:: { NoSyntaxHighlighter , SyntaxHighlighter } ;
2424
25- use datafusion:: common:: sql_datafusion_err;
26- use datafusion:: error:: DataFusionError ;
2725use datafusion:: sql:: parser:: { DFParser , Statement } ;
2826use datafusion:: sql:: sqlparser:: dialect:: dialect_from_str;
29- use datafusion:: sql:: sqlparser:: parser:: ParserError ;
3027
3128use rustyline:: completion:: { Completer , FilenameCompleter , Pair } ;
3229use rustyline:: error:: ReadlineError ;
@@ -63,15 +60,6 @@ impl CliHelper {
6360
6461 fn validate_input ( & self , input : & str ) -> Result < ValidationResult > {
6562 if let Some ( sql) = input. strip_suffix ( ';' ) {
66- let sql = match unescape_input ( sql) {
67- Ok ( sql) => sql,
68- Err ( err) => {
69- return Ok ( ValidationResult :: Invalid ( Some ( format ! (
70- " 🤔 Invalid statement: {err}" ,
71- ) ) ) )
72- }
73- } ;
74-
7563 let dialect = match dialect_from_str ( & self . dialect ) {
7664 Some ( dialect) => dialect,
7765 None => {
@@ -166,40 +154,8 @@ impl Validator for CliHelper {
166154
167155impl Helper for CliHelper { }
168156
169- /// Unescape input string from readline.
170- ///
171- /// The data read from stdio will be escaped, so we need to unescape the input before executing the input
172- pub fn unescape_input ( input : & str ) -> datafusion:: error:: Result < String > {
173- let mut chars = input. chars ( ) ;
174-
175- let mut result = String :: with_capacity ( input. len ( ) ) ;
176- while let Some ( char) = chars. next ( ) {
177- if char == '\\' {
178- if let Some ( next_char) = chars. next ( ) {
179- // https://static.rust-lang.org/doc/master/reference.html#literals
180- result. push ( match next_char {
181- '0' => '\0' ,
182- 'n' => '\n' ,
183- 'r' => '\r' ,
184- 't' => '\t' ,
185- '\\' => '\\' ,
186- _ => {
187- return Err ( sql_datafusion_err ! ( ParserError :: TokenizerError (
188- format!( "unsupported escape char: '\\ {}'" , next_char)
189- ) ) )
190- }
191- } ) ;
192- }
193- } else {
194- result. push ( char) ;
195- }
196- }
197-
198- Ok ( result)
199- }
200-
201157/// Splits a string which consists of multiple queries.
202- pub ( crate ) fn split_from_semicolon ( sql : String ) -> Vec < String > {
158+ pub ( crate ) fn split_from_semicolon ( sql : & str ) -> Vec < String > {
203159 let mut commands = Vec :: new ( ) ;
204160 let mut current_command = String :: new ( ) ;
205161 let mut in_single_quote = false ;
@@ -310,14 +266,13 @@ mod tests {
310266 ) ?;
311267 assert ! ( matches!( result, ValidationResult :: Valid ( None ) ) ) ;
312268
313- // should be invalid
314269 let result = readline_direct (
315- Cursor :: new (
316- r"create external table test stored as csv location 'data.csv' options ('format.delimiter' '\u{07}');"
317- . as_bytes ( ) ) ,
318- & validator,
319- ) ?;
320- assert ! ( matches!( result, ValidationResult :: Invalid ( Some ( _ ) ) ) ) ;
270+ Cursor :: new (
271+ r"select '\', '\\', '\\\\\', 'dsdsds\\\\', '\t', '\0', '\n';" . as_bytes ( ) ,
272+ ) ,
273+ & validator,
274+ ) ?;
275+ assert ! ( matches!( result, ValidationResult :: Valid ( None ) ) ) ;
321276
322277 Ok ( ( ) )
323278 }
@@ -346,34 +301,34 @@ mod tests {
346301 fn test_split_from_semicolon ( ) {
347302 let sql = "SELECT 1; SELECT 2;" ;
348303 let expected = vec ! [ "SELECT 1;" , "SELECT 2;" ] ;
349- assert_eq ! ( split_from_semicolon( sql. to_string ( ) ) , expected) ;
304+ assert_eq ! ( split_from_semicolon( sql) , expected) ;
350305
351306 let sql = r#"SELECT ";";"# ;
352307 let expected = vec ! [ r#"SELECT ";";"# ] ;
353- assert_eq ! ( split_from_semicolon( sql. to_string ( ) ) , expected) ;
308+ assert_eq ! ( split_from_semicolon( sql) , expected) ;
354309
355310 let sql = "SELECT ';';" ;
356311 let expected = vec ! [ "SELECT ';';" ] ;
357- assert_eq ! ( split_from_semicolon( sql. to_string ( ) ) , expected) ;
312+ assert_eq ! ( split_from_semicolon( sql) , expected) ;
358313
359314 let sql = r#"SELECT 1; SELECT 'value;value'; SELECT 1 as "text;text";"# ;
360315 let expected = vec ! [
361316 "SELECT 1;" ,
362317 "SELECT 'value;value';" ,
363318 r#"SELECT 1 as "text;text";"# ,
364319 ] ;
365- assert_eq ! ( split_from_semicolon( sql. to_string ( ) ) , expected) ;
320+ assert_eq ! ( split_from_semicolon( sql) , expected) ;
366321
367322 let sql = "" ;
368323 let expected: Vec < String > = Vec :: new ( ) ;
369- assert_eq ! ( split_from_semicolon( sql. to_string ( ) ) , expected) ;
324+ assert_eq ! ( split_from_semicolon( sql) , expected) ;
370325
371326 let sql = "SELECT 1" ;
372327 let expected = vec ! [ "SELECT 1;" ] ;
373- assert_eq ! ( split_from_semicolon( sql. to_string ( ) ) , expected) ;
328+ assert_eq ! ( split_from_semicolon( sql) , expected) ;
374329
375330 let sql = "SELECT 1; " ;
376331 let expected = vec ! [ "SELECT 1;" ] ;
377- assert_eq ! ( split_from_semicolon( sql. to_string ( ) ) , expected) ;
332+ assert_eq ! ( split_from_semicolon( sql) , expected) ;
378333 }
379334}
0 commit comments