mirror of
https://github.com/apache/zeppelin
synced 2026-05-24 09:38:26 +00:00
ZEPPELIN-215: resolve delimiter bug
This commit is contained in:
parent
0a3910d673
commit
4dd2a36eec
3 changed files with 30 additions and 11 deletions
|
|
@ -223,9 +223,10 @@ public class PostgreSqlInterpreter extends Interpreter {
|
|||
int updateCount = currentStatement.getUpdateCount();
|
||||
msg.append(UPDATE_COUNT_HEADER).append(NEWLINE);
|
||||
msg.append(updateCount).append(NEWLINE);
|
||||
|
||||
// update the database metadata completions (beta)
|
||||
//sqlCompleter.updateMetaData(getJdbcConnection());
|
||||
|
||||
// In case of update event (e.g. isResultSetAvailable = false) update the completion
|
||||
// meta-data.
|
||||
// sqlCompleter.updateMetaData(getJdbcConnection());
|
||||
}
|
||||
} finally {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ package org.apache.zeppelin.postgresql;
|
|||
/*
|
||||
* This source file is based on code taken from SQLLine 1.0.2 See SQLLine notice in LICENSE
|
||||
*/
|
||||
import static java.lang.Character.isWhitespace;
|
||||
import static org.apache.commons.lang.StringUtils.isBlank;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
|
|
@ -32,6 +31,7 @@ import java.util.List;
|
|||
import java.util.Set;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeSet;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import jline.console.completer.ArgumentCompleter.ArgumentList;
|
||||
import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter;
|
||||
|
|
@ -53,14 +53,16 @@ public class SqlCompleter extends StringsCompleter {
|
|||
* Delimiter that can split SQL statement in keyword list
|
||||
*/
|
||||
private WhitespaceArgumentDelimiter sqlDelimiter = new WhitespaceArgumentDelimiter() {
|
||||
|
||||
private Pattern pattern = Pattern.compile("[\\.:;,]");
|
||||
|
||||
@Override
|
||||
public boolean isDelimiterChar(CharSequence buffer, int pos) {
|
||||
return super.isDelimiterChar(buffer, pos) || (buffer.charAt(pos) == '.')
|
||||
|| (buffer.charAt(pos) == ';') || (buffer.charAt(pos) == ':');
|
||||
return pattern.matcher("" + buffer.charAt(pos)).matches()
|
||||
|| super.isDelimiterChar(buffer, pos);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
public SqlCompleter(Set<String> completions) {
|
||||
super(completions);
|
||||
}
|
||||
|
|
@ -81,7 +83,7 @@ public class SqlCompleter extends StringsCompleter {
|
|||
|
||||
if (isBlank(argument)) {
|
||||
int argumentsCount = argumentList.getArguments().length;
|
||||
if (argumentsCount <= 0 || isWhitespace(buffer.charAt(buffer.length() - 1))) {
|
||||
if (argumentsCount <= 0 || sqlDelimiter.isDelimiterChar(buffer, buffer.length() - 1)) {
|
||||
return -1;
|
||||
}
|
||||
argument = argumentList.getArguments()[argumentsCount - 1];
|
||||
|
|
@ -228,4 +230,9 @@ public class SqlCompleter extends StringsCompleter {
|
|||
return new HashSet<String>();
|
||||
}
|
||||
}
|
||||
|
||||
// test purpose only
|
||||
WhitespaceArgumentDelimiter getSqlDelimiter() {
|
||||
return this.sqlDelimiter;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ package org.apache.zeppelin.postgresql;
|
|||
|
||||
import static com.google.common.collect.Sets.newHashSet;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
|
|
@ -41,9 +42,11 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
|
|||
|
||||
private CompleterTester tester;
|
||||
|
||||
private SqlCompleter sqlCompleter;
|
||||
|
||||
@Before
|
||||
public void beforeTest() throws IOException, SQLException {
|
||||
SqlCompleter sqlCompleter =
|
||||
sqlCompleter =
|
||||
new SqlCompleter(SqlCompleter.getSqlCompleterTokens(getJDBCMockObjectFactory()
|
||||
.getMockConnection(), false));
|
||||
tester = new CompleterTester(sqlCompleter);
|
||||
|
|
@ -91,13 +94,21 @@ public class SqlCompleterTest extends BasicJDBCTestCaseAdapter {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testCommaDelimiter() {
|
||||
public void testDotDelimiter() {
|
||||
String buffer = " order.select ";
|
||||
tester.buffer(buffer).from(0).to(7).expect(newHashSet("order ")).test();
|
||||
tester.buffer(buffer).from(4).to(7).expect(newHashSet("order ")).test();
|
||||
tester.buffer(buffer).from(8).to(14).expect(newHashSet("select ")).test();
|
||||
tester.buffer(buffer).from(15).to(17).expect(EMPTY).test();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSqlDelimiterCharacters() {
|
||||
assertTrue(sqlCompleter.getSqlDelimiter().isDelimiterChar("r.", 1));
|
||||
assertTrue(sqlCompleter.getSqlDelimiter().isDelimiterChar("SS;", 2));
|
||||
assertTrue(sqlCompleter.getSqlDelimiter().isDelimiterChar(":", 0));
|
||||
assertTrue(sqlCompleter.getSqlDelimiter().isDelimiterChar("ttt,", 3));
|
||||
}
|
||||
|
||||
public class CompleterTester {
|
||||
|
||||
private Completer completer;
|
||||
|
|
|
|||
Loading…
Reference in a new issue