Skip to content

Commit 44b9d1e

Browse files
authored
Merge pull request #377 from databricks/driver-pattern
Fix driver pattern for executeQuery
2 parents b7594dd + d64d116 commit 44b9d1e

File tree

2 files changed

+181
-2
lines changed

2 files changed

+181
-2
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.databricks.jdbc.commons.ErrorTypes;
1010
import com.databricks.jdbc.commons.LogLevel;
1111
import com.databricks.jdbc.commons.util.*;
12+
import com.google.common.annotations.VisibleForTesting;
1213
import java.io.InputStream;
1314
import java.sql.*;
1415
import java.util.HashMap;
@@ -606,13 +607,16 @@ public Statement getStatement() {
606607
return this;
607608
}
608609

610+
@VisibleForTesting
609611
protected static boolean shouldReturnResultSet(String query) {
610612
if (query == null || query.trim().isEmpty()) {
611613
throw new IllegalArgumentException("Query cannot be null or empty");
612614
}
613615

614-
// Trim and remove leading comments and whitespaces.
615-
String trimmedQuery = query.trim().replaceAll("^(--.*|/\\*.*?\\*/)*", "").trim();
616+
// Trim and remove comments and whitespaces.
617+
String trimmedQuery = query.trim().replaceAll("(?m)--.*$", "");
618+
trimmedQuery = trimmedQuery.replaceAll("/\\*.*?\\*/", "");
619+
trimmedQuery = trimmedQuery.replaceAll("\\s+", " ").trim();
616620

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

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

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,179 @@ 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 =
462+
"-- Single-line comment\n/* Multi-line comment */ SELECT * FROM table; /* Another comment */ -- End comment";
463+
assertTrue(DatabricksStatement.shouldReturnResultSet(query));
464+
}
290465
}

0 commit comments

Comments
 (0)