!87 [feature] support non standard package grammar

Merge pull request !87 from 周斌/nonstandard_package
This commit is contained in:
opengauss-bot
2022-07-27 02:15:39 +00:00
committed by Gitee
2 changed files with 61 additions and 1 deletions

View File

@ -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;
}
}

View File

@ -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());
}
}
}