@@ -229,16 +229,24 @@ def test_sql_comments(self):
229
229
-- Another SELECT statement.
230
230
SELECT 2;
231
231
-- 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.
233
233
SELECT /* this is a comment */ 3;
234
+ SELECT /* this is a multi-line
235
+ comment */ 4;
234
236
"""
235
237
cmd = CrateShell ()
236
238
cmd ._exec_and_print = MagicMock ()
237
239
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;' )
242
250
])
243
251
244
252
def test_js_comments (self ):
@@ -262,3 +270,112 @@ def test_js_comments(self):
262
270
cmd .process (sql )
263
271
self .assertEqual (1 , cmd ._exec_and_print .call_count )
264
272
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