Skip to content

Commit 976c65b

Browse files
committed
fix driver regex patterns for multiple start line comments.
1 parent f337e46 commit 976c65b

File tree

2 files changed

+183
-3
lines changed

2 files changed

+183
-3
lines changed

src/main/java/com/databricks/jdbc/core/DatabricksStatement.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.databricks.jdbc.commons.util.StringUtil;
1212
import com.databricks.jdbc.commons.util.ValidationUtil;
1313
import com.databricks.jdbc.commons.util.WarningUtil;
14+
import com.google.common.annotations.VisibleForTesting;
15+
1416
import java.io.InputStream;
1517
import java.sql.*;
1618
import java.util.HashMap;
@@ -525,13 +527,17 @@ public Statement getStatement() {
525527
return this;
526528
}
527529

530+
@VisibleForTesting
528531
protected static boolean shouldReturnResultSet(String query) {
529532
if (query == null || query.trim().isEmpty()) {
530533
throw new IllegalArgumentException("Query cannot be null or empty");
531534
}
532535

533-
// Trim and remove leading comments and whitespaces.
534-
String trimmedQuery = query.trim().replaceAll("^(--.*|/\\*.*?\\*/)*", "").trim();
536+
// Trim and remove comments and whitespaces.
537+
String trimmedQuery = query.trim().replaceAll("(?m)--.*$", "");
538+
trimmedQuery = trimmedQuery.replaceAll("/\\*.*?\\*/", "");
539+
trimmedQuery = trimmedQuery.replaceAll("\\s+", " ").trim();
540+
535541

536542
// Check if the query matches any of the patterns that return a ResultSet
537543
if (SELECT_PATTERN.matcher(trimmedQuery).find()

src/test/java/com/databricks/jdbc/core/DatabricksStatementTest.java

Lines changed: 175 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import java.util.Properties;
2121
import java.util.concurrent.CompletableFuture;
2222
import java.util.concurrent.TimeUnit;
23-
import org.junit.jupiter.api.Test;
23+
import org.junit.jupiter.api.Test;;
2424
import org.junit.jupiter.api.extension.ExtendWith;
2525
import org.mockito.Mock;
2626
import org.mockito.junit.jupiter.MockitoExtension;
@@ -287,4 +287,178 @@ public void testInputStreamForVolumeOperation() throws Exception {
287287
assertThrows(
288288
DatabricksSQLException.class, () -> statement.allowInputStreamForVolumeOperation(false));
289289
}
290+
291+
@Test
292+
public void testShouldReturnResultSet_SelectQuery() {
293+
String query = "-- comment\nSELECT * FROM table;";
294+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
295+
}
296+
297+
@Test
298+
public void testShouldReturnResultSet_ShowQuery() {
299+
String query = "SHOW TABLES;";
300+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
301+
}
302+
303+
@Test
304+
public void testShouldReturnResultSet_DescribeQuery() {
305+
String query = "DESCRIBE table;";
306+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
307+
}
308+
309+
@Test
310+
public void testShouldReturnResultSet_ExplainQuery() {
311+
String query = "EXPLAIN SELECT * FROM table;";
312+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
313+
}
314+
315+
@Test
316+
public void testShouldReturnResultSet_WithQuery() {
317+
String query = "WITH cte AS (SELECT * FROM table) SELECT * FROM cte;";
318+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
319+
}
320+
321+
@Test
322+
public void testShouldReturnResultSet_SetQuery() {
323+
String query = "SET @var = (SELECT COUNT(*) FROM table);";
324+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
325+
}
326+
327+
@Test
328+
public void testShouldReturnResultSet_MapQuery() {
329+
String query = "MAP table USING some_mapping;";
330+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
331+
}
332+
333+
@Test
334+
public void testShouldReturnResultSet_FromQuery() {
335+
String query = "SELECT * FROM table;";
336+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
337+
}
338+
339+
@Test
340+
public void testShouldReturnResultSet_ValuesQuery() {
341+
String query = "VALUES (1, 2, 3);";
342+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
343+
}
344+
345+
@Test
346+
public void testShouldReturnResultSet_UnionQuery() {
347+
String query = "SELECT * FROM table1 UNION SELECT * FROM table2;";
348+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
349+
}
350+
351+
@Test
352+
public void testShouldReturnResultSet_IntersectQuery() {
353+
String query = "SELECT * FROM table1 INTERSECT SELECT * FROM table2;";
354+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
355+
}
356+
357+
@Test
358+
public void testShouldReturnResultSet_ExceptQuery() {
359+
String query = "SELECT * FROM table1 EXCEPT SELECT * FROM table2;";
360+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
361+
}
362+
363+
@Test
364+
public void testShouldReturnResultSet_DeclareQuery() {
365+
String query = "DECLARE @var INT;";
366+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
367+
}
368+
369+
@Test
370+
public void testShouldReturnResultSet_PutQuery() {
371+
String query = "PUT some_data INTO table;";
372+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
373+
}
374+
375+
@Test
376+
public void testShouldReturnResultSet_GetQuery() {
377+
String query = "GET some_data FROM table;";
378+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
379+
}
380+
381+
@Test
382+
public void testShouldReturnResultSet_RemoveQuery() {
383+
String query = "REMOVE some_data FROM table;";
384+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
385+
}
386+
387+
@Test
388+
public void testShouldReturnResultSet_ListQuery() {
389+
String query = "LIST TABLES;";
390+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
391+
}
392+
393+
@Test
394+
public void testShouldReturnResultSet_UpdateQuery() {
395+
String query = "UPDATE table SET column = value;";
396+
assertFalse(DatabricksStatement.shouldReturnResultSet(query));
397+
}
398+
399+
@Test
400+
public void testShouldReturnResultSet_DeleteQuery() {
401+
String query = "DELETE FROM table WHERE condition;";
402+
assertFalse(DatabricksStatement.shouldReturnResultSet(query));
403+
}
404+
405+
@Test
406+
public void testShouldReturnResultSet_SingleLineCommentAtStart() {
407+
String query = "-- This is a comment\nSELECT * FROM table;";
408+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
409+
}
410+
411+
@Test
412+
public void testShouldReturnResultSet_SingleLineCommentAtEnd() {
413+
String query = "SELECT * FROM table; -- This is a comment";
414+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
415+
}
416+
417+
@Test
418+
public void testShouldReturnResultSet_SingleLineCommentInMiddle() {
419+
String query = "SELECT * FROM table -- This is a comment\nWHERE id = 1;";
420+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
421+
}
422+
423+
@Test
424+
public void testShouldReturnResultSet_MultiLineCommentAtStart() {
425+
String query = "/* This is a comment */ SELECT * FROM table;";
426+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
427+
}
428+
429+
@Test
430+
public void testShouldReturnResultSet_MultiLineCommentAtEnd() {
431+
String query = "SELECT * FROM table; /* This is a comment */";
432+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
433+
}
434+
435+
@Test
436+
public void testShouldReturnResultSet_MultiLineCommentInMiddle() {
437+
String query = "SELECT * FROM table /* This is a comment */ WHERE id = 1;";
438+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
439+
}
440+
441+
@Test
442+
public void testShouldReturnResultSet_MultipleSingleLineComments() {
443+
String query = "-- Comment 1\nSELECT * FROM table; -- Comment 2\n-- Comment 3";
444+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
445+
}
446+
447+
@Test
448+
public void testShouldReturnResultSet_MultipleMultiLineComments() {
449+
String query = "/* Comment 1 */ SELECT * FROM table; /* Comment 2 */ /* Comment 3 */";
450+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
451+
}
452+
453+
@Test
454+
public void testShouldReturnResultSet_SingleAndMultiLineComments() {
455+
String query = "-- Single-line comment\nSELECT * FROM table; /* Multi-line comment */";
456+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
457+
}
458+
459+
@Test
460+
public void testShouldReturnResultSet_CommentSurroundingQuery() {
461+
String query = "-- Single-line comment\n/* Multi-line comment */ SELECT * FROM table; /* Another comment */ -- End comment";
462+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
463+
}
290464
}

0 commit comments

Comments
 (0)