Repository: zeppelin Updated Branches: refs/heads/master 241fd0344 -> f9830a7d6
[ZEPPELIN-2279] excluded comments from SQL ### What is this PR for? Exclusion comments (single-, multiline) from queries before execution. Comments don't need to execute query and sometimes there are errors. ### What type of PR is it? Bug Fix | Improvement ### What is the Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-2279 ### How should this be tested? ``` /* ; */ select 1; -- text select 1 /* bla bla bla*/ select 1; -- text ``` ### Questions: * Does the licenses files need update? no * Is there breaking changes for older versions? no * Does this needs documentation? no Author: Tinkoff DWH <tinkoff....@gmail.com> Closes #2158 from tinkoff-dwh/ZEPPELIN-2279 and squashes the following commits: 3f7496e [Tinkoff DWH] [ZEPPELIN-2279] fix conditions, common format f48f7d6 [Tinkoff DWH] [ZEPPELIN-2279] improve test, revert precode execution 2cb94fa [Tinkoff DWH] Merge remote-tracking branch 'origin/master' into ZEPPELIN-2279 6db3c46 [Tinkoff DWH] [ZEPPELIN-2279] excluded comments from SQL Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/f9830a7d Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/f9830a7d Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/f9830a7d Branch: refs/heads/master Commit: f9830a7d64921c1f67aeb6ee179b574769e0a6f9 Parents: 241fd03 Author: Tinkoff DWH <tinkoff....@gmail.com> Authored: Wed Apr 5 12:32:44 2017 +0500 Committer: Lee moon soo <m...@apache.org> Committed: Sun Apr 9 07:50:09 2017 +0900 ---------------------------------------------------------------------- .../apache/zeppelin/jdbc/JDBCInterpreter.java | 46 +++++++++++++++++--- .../zeppelin/jdbc/JDBCInterpreterTest.java | 28 ++++++++++++ 2 files changed, 67 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f9830a7d/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java ---------------------------------------------------------------------- diff --git a/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java b/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java index 5bf4063..2e35e81 100644 --- a/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java +++ b/jdbc/src/main/java/org/apache/zeppelin/jdbc/JDBCInterpreter.java @@ -508,19 +508,36 @@ public class JDBCInterpreter extends Interpreter { protected ArrayList<String> splitSqlQueries(String sql) { ArrayList<String> queries = new ArrayList<>(); StringBuilder query = new StringBuilder(); - Character character; + char character; Boolean antiSlash = false; + Boolean multiLineComment = false; + Boolean singleLineComment = false; Boolean quoteString = false; Boolean doubleQuoteString = false; for (int item = 0; item < sql.length(); item++) { character = sql.charAt(item); - if (character.equals('\\')) { + if ((singleLineComment && (character == '\n' || item == sql.length() - 1)) + || (multiLineComment && character == '/' && sql.charAt(item - 1) == '*')) { + singleLineComment = false; + multiLineComment = false; + if (item == sql.length() - 1 && query.length() > 0) { + queries.add(StringUtils.trim(query.toString())); + } + continue; + } + + if (singleLineComment || multiLineComment) { + continue; + } + + if (character == '\\') { antiSlash = true; } - if (character.equals('\'')) { + + if (character == '\'') { if (antiSlash) { antiSlash = false; } else if (quoteString) { @@ -529,7 +546,8 @@ public class JDBCInterpreter extends Interpreter { quoteString = true; } } - if (character.equals('"')) { + + if (character == '"') { if (antiSlash) { antiSlash = false; } else if (doubleQuoteString) { @@ -539,16 +557,30 @@ public class JDBCInterpreter extends Interpreter { } } - if (character.equals(';') && !antiSlash && !quoteString && !doubleQuoteString) { - queries.add(query.toString()); + if (!quoteString && !doubleQuoteString && !multiLineComment && !singleLineComment + && sql.length() > item + 1) { + if (character == '-' && sql.charAt(item + 1) == '-') { + singleLineComment = true; + continue; + } + + if (character == '/' && sql.charAt(item + 1) == '*') { + multiLineComment = true; + continue; + } + } + + if (character == ';' && !antiSlash && !quoteString && !doubleQuoteString) { + queries.add(StringUtils.trim(query.toString())); query = new StringBuilder(); } else if (item == sql.length() - 1) { query.append(character); - queries.add(query.toString()); + queries.add(StringUtils.trim(query.toString())); } else { query.append(character); } } + return queries; } http://git-wip-us.apache.org/repos/asf/zeppelin/blob/f9830a7d/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java ---------------------------------------------------------------------- diff --git a/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java b/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java index dc0463a..04365cc 100644 --- a/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java +++ b/jdbc/src/test/java/org/apache/zeppelin/jdbc/JDBCInterpreterTest.java @@ -450,4 +450,32 @@ public class JDBCInterpreterTest extends BasicJDBCTestCaseAdapter { assertEquals(InterpreterResult.Type.TABLE, interpreterResult.message().get(0).getType()); assertEquals("@TESTVARIABLE\n2\n", interpreterResult.message().get(0).getData()); } + + @Test + public void testExcludingComments() throws SQLException, IOException { + Properties properties = new Properties(); + properties.setProperty("common.max_count", "1000"); + properties.setProperty("common.max_retry", "3"); + properties.setProperty("default.driver", "org.h2.Driver"); + properties.setProperty("default.url", getJdbcConnection()); + properties.setProperty("default.user", ""); + properties.setProperty("default.password", ""); + JDBCInterpreter t = new JDBCInterpreter(properties); + t.open(); + + String sqlQuery = "/* ; */\n" + + "-- /* comment\n" + + "--select * from test_table\n" + + "select * from test_table; /* some comment ; */\n" + + "/*\n" + + "select * from test_table;\n" + + "*/\n" + + "-- a ; b\n" + + "select * from test_table WHERE ID = ';--';\n" + + "select * from test_table WHERE ID = '/*' -- test"; + + InterpreterResult interpreterResult = t.interpret(sqlQuery, interpreterContext); + assertEquals(InterpreterResult.Code.SUCCESS, interpreterResult.code()); + assertEquals(3, interpreterResult.message().size()); + } }