in core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java [753:933]
public static List<String> splitAndRemoveComment(String sql, DbType dbType) {
if (dbType == null) {
dbType = DbType.other;
}
boolean containsCommentAndSemi = false;
{
Lexer lexer = createLexer(sql, dbType);
lexer.config(SQLParserFeature.SkipComments, false);
lexer.config(SQLParserFeature.KeepComments, true);
while (lexer.token != Token.EOF) {
if (lexer.token == Token.LINE_COMMENT
|| lexer.token == Token.MULTI_LINE_COMMENT
|| lexer.token == Token.SEMI) {
containsCommentAndSemi = true;
break;
}
lexer.nextToken();
}
if (!containsCommentAndSemi) {
return Collections.singletonList(sql);
}
}
{
Lexer lexer = createLexer(sql, dbType);
lexer.nextToken();
boolean script = false;
if (dbType == DbType.odps && lexer.token == Token.VARIANT) {
script = true;
}
if (script || lexer.identifierEquals("pai") || lexer.identifierEquals("jar") || lexer.identifierEquals("copy")) {
return Collections.singletonList(sql);
}
}
List list = new ArrayList();
Lexer lexer = createLexer(sql, dbType);
lexer.config(SQLParserFeature.SkipComments, false);
lexer.config(SQLParserFeature.KeepComments, true);
lexer.nextToken();
boolean set = false, paiOrJar = false;
int start = 0;
Token preToken = null;
int prePos = 0;
Token token = lexer.token;
Token startToken = lexer.token;
while (token == Token.LINE_COMMENT || token == Token.MULTI_LINE_COMMENT) {
lexer.nextToken();
token = lexer.token;
startToken = token;
start = lexer.startPos;
}
for (int tokens = 1; lexer.token != Token.EOF; ) {
if (token == Token.SEMI) {
int len = lexer.startPos - start;
if (len > 0) {
String lineSql = sql.substring(start, lexer.startPos);
String splitSql = set
? removeLeftComment(lineSql, dbType)
: removeComment(lineSql, dbType
).trim();
if (!splitSql.isEmpty()) {
list.add(splitSql);
}
}
lexer.nextToken();
token = lexer.token;
start = lexer.startPos;
startToken = token;
set = false;
tokens = token == Token.LINE_COMMENT || token == Token.MULTI_LINE_COMMENT ? 0 : 1;
continue;
} else if (token == Token.MULTI_LINE_COMMENT) {
int len = lexer.startPos - start;
if (len > 0) {
String splitSql = removeComment(
sql.substring(start, lexer.startPos),
dbType
).trim();
if (!splitSql.isEmpty()) {
list.add(splitSql);
}
}
lexer.nextToken();
token = lexer.token;
start = lexer.startPos;
startToken = token;
tokens = token == Token.LINE_COMMENT || token == Token.MULTI_LINE_COMMENT ? 0 : 1;
continue;
} else if (token == Token.CREATE) {
lexer.nextToken();
if (lexer.token == Token.FUNCTION || lexer.identifierEquals("FUNCTION")) {
lexer.nextToken();
lexer.nextToken();
if (lexer.token == Token.AS) {
lexer.nextToken();
if (lexer.token == Token.LITERAL_CHARS) {
lexer.nextToken();
token = lexer.token;
continue;
}
}
lexer.startPos = sql.length();
break;
}
token = lexer.token;
continue;
} else if (set && token == Token.EQ && dbType == DbType.odps) {
lexer.nextTokenForSet();
token = lexer.token;
continue;
} else if (dbType == DbType.odps
&& (preToken == null || preToken == Token.LINE_COMMENT || preToken == Token.SEMI)
&& (lexer.identifierEquals("pai") || lexer.identifierEquals("jar") || lexer.identifierEquals("copy"))) {
lexer.scanLineArgument();
paiOrJar = true;
}
if (lexer.identifierEquals("USING")) {
lexer.nextToken();
if (lexer.identifierEquals("jar")) {
lexer.nextToken();
}
}
if (lexer.token == Token.SET) {
set = true;
}
prePos = lexer.pos;
if (lexer.identifierEquals("ADD") && (dbType == DbType.hive || dbType == DbType.odps)) {
lexer.nextToken();
if (lexer.identifierEquals("JAR")) {
lexer.nextPath();
}
} else {
lexer.nextToken();
}
preToken = token;
token = lexer.token;
if (token == Token.LINE_COMMENT
&& tokens == 0) {
start = lexer.pos;
startToken = token;
}
if (token != Token.LINE_COMMENT && token != Token.MULTI_LINE_COMMENT && token != Token.SEMI) {
tokens++;
}
}
if (start != sql.length() && token != Token.SEMI) {
int end = lexer.startPos;
if (end > sql.length()) {
end = sql.length();
}
String splitSql = sql.substring(start, end).trim();
if (!paiOrJar) {
splitSql = removeComment(splitSql, dbType).trim();
} else {
if (splitSql.endsWith(";")) {
splitSql = splitSql.substring(0, splitSql.length() - 1).trim();
}
}
if (!splitSql.isEmpty()) {
list.add(splitSql);
}
}
return list;
}