@@ -229,16 +229,24 @@ def test_sql_comments(self):
229229-- Another SELECT statement.
230230SELECT 2;
231231-- Yet another SELECT statement with an inline comment.
232- -- Other than the regular comments, it gets passed through to the database server.
232+ -- Comments get passed through to the database server.
233233SELECT /* this is a comment */ 3;
234+ SELECT /* this is a multi-line
235+ comment */ 4;
234236"""
235237 cmd = CrateShell ()
236238 cmd ._exec_and_print = MagicMock ()
237239 cmd .process_iterable (sql .splitlines ())
238- cmd ._exec_and_print .assert_has_calls ([
239- call ("SELECT 1" ),
240- call ("SELECT 2" ),
241- call ("SELECT /* this is a comment */ 3" ),
240+ self .assertListEqual (cmd ._exec_and_print .mock_calls , [
241+ call ("-- Just a dummy SELECT statement.\n SELECT 1;" ),
242+ call ("-- Another SELECT statement.\n SELECT 2;" ),
243+ call ('\n ' .join ([
244+ "-- Yet another SELECT statement with an inline comment." ,
245+ "-- Comments get passed through to the database server." ,
246+ "SELECT /* this is a comment */ 3;"
247+ ])
248+ ),
249+ call ('SELECT /* this is a multi-line\n comment */ 4;' )
242250 ])
243251
244252 def test_js_comments (self ):
@@ -262,3 +270,112 @@ def test_js_comments(self):
262270 cmd .process (sql )
263271 self .assertEqual (1 , cmd ._exec_and_print .call_count )
264272 self .assertIn ("CREATE FUNCTION" , cmd ._exec_and_print .mock_calls [0 ].args [0 ])
273+
274+
275+ class MultipleStatementsTest (TestCase ):
276+
277+ def test_single_line_multiple_sql_statements (self ):
278+ cmd = CrateShell ()
279+ cmd ._exec_and_print = MagicMock ()
280+ cmd .process ("SELECT 1; SELECT 2; SELECT 3;" )
281+ self .assertListEqual (cmd ._exec_and_print .mock_calls , [
282+ call ("SELECT 1;" ),
283+ call ("SELECT 2;" ),
284+ call ("SELECT 3;" ),
285+ ])
286+
287+ def test_multiple_lines_multiple_sql_statements (self ):
288+ cmd = CrateShell ()
289+ cmd ._exec_and_print = MagicMock ()
290+ cmd .process ("SELECT 1;\n SELECT 2; SELECT 3;\n SELECT\n 4;" )
291+ self .assertListEqual (cmd ._exec_and_print .mock_calls , [
292+ call ("SELECT 1;" ),
293+ call ("SELECT 2;" ),
294+ call ("SELECT 3;" ),
295+ call ("SELECT\n 4;" ),
296+ ])
297+
298+ def test_single_sql_statement_multiple_lines (self ):
299+ """When processing single SQL statements, new lines are preserved."""
300+
301+ cmd = CrateShell ()
302+ cmd ._exec_and_print = MagicMock ()
303+ cmd .process ("\n SELECT\n 1\n WHERE\n 2\n =\n 3\n ;\n " )
304+ self .assertListEqual (cmd ._exec_and_print .mock_calls , [
305+ call ("SELECT\n 1\n WHERE\n 2\n =\n 3\n ;" ),
306+ ])
307+
308+ def test_multiple_commands_no_sql (self ):
309+ cmd = CrateShell ()
310+ cmd ._try_exec_cmd = MagicMock ()
311+ cmd ._exec_and_print = MagicMock ()
312+ cmd .process ("\\ ?\n \\ connect 127.0.0.1" )
313+ cmd ._try_exec_cmd .assert_has_calls ([
314+ call ("?" ),
315+ call ("connect 127.0.0.1" )
316+ ])
317+ cmd ._exec_and_print .assert_not_called ()
318+
319+ def test_commands_and_multiple_sql_statements_interleaved (self ):
320+ """Combine all test cases above to be sure everything integrates well."""
321+
322+ cmd = CrateShell ()
323+ mock_manager = MagicMock ()
324+
325+ cmd ._try_exec_cmd = mock_manager .cmd
326+ cmd ._exec_and_print = mock_manager .sql
327+
328+ cmd .process ("""
329+ \\ ?
330+ SELECT 1
331+ WHERE 2 = 3; SELECT 4;
332+ \\ connect 127.0.0.1
333+ SELECT 5
334+ WHERE 6 = 7;
335+ \\ check
336+ """ )
337+
338+ self .assertListEqual (mock_manager .mock_calls , [
339+ call .cmd ("?" ),
340+ call .sql ('SELECT 1\n WHERE 2 = 3;' ),
341+ call .sql ('SELECT 4;' ),
342+ call .cmd ("connect 127.0.0.1" ),
343+ call .sql ('SELECT 5\n WHERE 6 = 7;' ),
344+ call .cmd ("check" ),
345+ ])
346+
347+ def test_comments_along_multiple_statements (self ):
348+ """Test multiple types of comments along multi-statement input."""
349+
350+ cmd = CrateShell ()
351+ cmd ._exec_and_print = MagicMock ()
352+
353+ cmd .process ("""
354+ -- Multiple statements and comments on same line
355+
356+ SELECT /* inner comment */ 1; /* this is a single-line comment */ SELECT /* inner comment */ 2;
357+
358+ -- Multiple statements on multiple lines with multi-line comments between them
359+
360+ SELECT /* inner comment */ 3; /* this is a
361+ multi-line comment */ SELECT /* inner comment */ 4;
362+
363+ -- Multiple statements on multiple lines with multi-line comments between and inside them
364+
365+ SELECT /* inner multi-line
366+ comment */ 5 /* this is a multi-line
367+ comment before statement end */; /* this is another multi-line
368+ comment */ SELECT /* inner multi-line
369+ comment */ 6;
370+ """ )
371+
372+ self .assertListEqual (cmd ._exec_and_print .mock_calls , [
373+ call ('-- Multiple statements and comments on same line\n \n SELECT /* inner comment */ 1;' ),
374+ call ('/* this is a single-line comment */ SELECT /* inner comment */ 2;' ),
375+
376+ call ('-- Multiple statements on multiple lines with multi-line comments between them\n \n SELECT /* inner comment */ 3;' ),
377+ call ('/* this is a\n multi-line comment */ SELECT /* inner comment */ 4;' ),
378+
379+ call ('-- Multiple statements on multiple lines with multi-line comments between and inside them\n \n SELECT /* inner multi-line\n comment */ 5 /* this is a multi-line\n comment before statement end */;' ),
380+ call ('/* this is another multi-line\n comment */ SELECT /* inner multi-line\n comment */ 6;' )
381+ ])
0 commit comments