!87 [feature] support non standard package grammar
Merge pull request !87 from 周斌/nonstandard_package
This commit is contained in:
@ -607,6 +607,31 @@ public class Parser {
|
||||
|
||||
return query.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Judge if keyword contains END str. like END or END; or *;END;*
|
||||
* @param keyword upperCase string
|
||||
* @return true if contains END str.
|
||||
*/
|
||||
private static boolean isPackageEnd(String keyword) {
|
||||
final String search = "END";
|
||||
final char compareChar = ';';
|
||||
if (search.equals(keyword)) {
|
||||
return true;
|
||||
}
|
||||
int position = keyword.indexOf(search);
|
||||
if (position == -1) {
|
||||
return false;
|
||||
}
|
||||
if (position != 0 && keyword.charAt(position - 1) != compareChar) {
|
||||
return false;
|
||||
}
|
||||
int lastPos = position + search.length();
|
||||
if (lastPos != keyword.length() && keyword.charAt(lastPos) != compareChar) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Judge whether the statement contains the keywords procedure, function, create, package and declare
|
||||
@ -624,7 +649,8 @@ public class Parser {
|
||||
if (queryArr[i] == null) {
|
||||
continue;
|
||||
}
|
||||
switch (queryArr[i].toUpperCase(Locale.ENGLISH)) {
|
||||
String upperQuery = queryArr[i].toUpperCase(Locale.ENGLISH);
|
||||
switch (upperQuery) {
|
||||
case "PROCEDURE":
|
||||
case "FUNCTION":
|
||||
case "DECLARE":
|
||||
@ -644,6 +670,11 @@ public class Parser {
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (haveCreate && havePackage) {
|
||||
if (isPackageEnd(upperQuery)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -216,4 +216,33 @@ public class ParserTest {
|
||||
Assert.assertEquals(34, command.getBatchRewriteValuesBraceOpenPosition());
|
||||
Assert.assertEquals(56, command.getBatchRewriteValuesBraceClosePosition());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPackage() throws SQLException {
|
||||
String sql = "create or replace package test_pkg_end as\n" +
|
||||
"aa int:=1;\n" +
|
||||
"end;";
|
||||
String sql1 = "create or replace package test_pkg_end as\n" +
|
||||
"aa int:=1;\n" +
|
||||
"end ;";
|
||||
String sql2 = "create or replace package test_pkg_end as\n" +
|
||||
"aa int:=1;\n" +
|
||||
"end;\n/";
|
||||
String sql3 = "create or replace package test_pkg_end as\n" +
|
||||
"aa int:=1;" +
|
||||
"end;\n/";
|
||||
String sql4 = "create or replace package test_pkg_end as\n" +
|
||||
"aa int:=1;" +
|
||||
"end;";
|
||||
String sql5 = "create or replace package test_pkg_end as\n" +
|
||||
"aa int:=1;" +
|
||||
"end ;";
|
||||
String sqlTests[] = new String[] {sql, sql1, sql2, sql3, sql4, sql5};
|
||||
for (String mySql: sqlTests) {
|
||||
List<NativeQuery> queries = Parser.parseJdbcSql(mySql,
|
||||
false,false,
|
||||
true, false, new String[0]);
|
||||
assertEquals(1, queries.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user