From ecbca9efab8e7106aa552fd726477f1425aecda9 Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Wed, 22 Feb 2023 22:37:23 +0800 Subject: [PATCH] fix merge build error --- .../dialect/oracle/parser/OracleLexer.java | 1 + .../oracle/visitor/OracleOutputVisitor.java | 14 ++- .../alibaba/druid/sql/parser/Keywords.java | 1 - .../druid/sql/parser/SQLExprParser.java | 8 +- .../druid/sql/parser/SQLParserUtils.java | 109 ++++++++++++++++++ .../druid/sql/parser/SQLStatementParser.java | 4 +- 6 files changed, 130 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index 07619a47ad..4ce3f054a4 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -109,6 +109,7 @@ public class OracleLexer extends Lexer { map.put("PARTITION", Token.PARTITION); map.put("TRUE", Token.TRUE); map.put("FALSE", Token.FALSE); + map.put("CASCADE", Token.CASCADE); map.put(",", Token.COMMA); map.put("(", Token.LPAREN); diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 0becb7bc5b..bae6f11217 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -2910,9 +2910,17 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS String alias = x.getAlias(); List columns = x.getColumnsDirect(); if (alias != null) { - print(' '); - print0(ucase ? " AS " : " as "); - print0(alias); + SQLObject parent = x.getParent(); + if (parent instanceof SQLCreateIndexStatement + || parent instanceof SQLMergeStatement + || parent instanceof SQLDeleteStatement) { + print(' '); + print0(alias); + } else { + print(' '); + print0(ucase ? " AS " : " as "); + print0(alias); + } } if (columns != null && columns.size() > 0) { diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/Keywords.java b/core/src/main/java/com/alibaba/druid/sql/parser/Keywords.java index 78e0dda3d3..7a68455816 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/Keywords.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/Keywords.java @@ -160,7 +160,6 @@ public class Keywords { map.put("INOUT", Token.INOUT); map.put("LIMIT", Token.LIMIT); - map.put("CASCADE", Token.CASCADE); DEFAULT_KEYWORDS = new Keywords(map); diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index b28fdf74cf..7f3a053c5f 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -35,6 +35,8 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import static com.alibaba.druid.sql.parser.Token.CASCADE; + public class SQLExprParser extends SQLParser { public static final String[] AGGREGATE_FUNCTIONS; @@ -1029,6 +1031,10 @@ public class SQLExprParser extends SQLParser { sqlExpr = new SQLIdentifierExpr("DATABASE"); lexer.nextToken(); break; + case CASCADE: + sqlExpr = new SQLIdentifierExpr("CASCADE"); + lexer.nextToken(); + break; case LOCK: sqlExpr = new SQLIdentifierExpr("LOCK"); lexer.nextToken(); @@ -4946,7 +4952,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token() == Token.RESTRICT || lexer.identifierEquals(FnvHash.Constants.RESTRICT)) { option = SQLForeignKeyImpl.Option.RESTRICT; lexer.nextToken(); - } else if (lexer.identifierEquals(FnvHash.Constants.CASCADE)) { + } else if (lexer.identifierEquals(FnvHash.Constants.CASCADE) || lexer.token == CASCADE) { option = SQLForeignKeyImpl.Option.CASCADE; lexer.nextToken(); } else if (lexer.token() == Token.SET) { diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java index b117c2b5c4..d5a8aa23ef 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java @@ -500,6 +500,115 @@ public class SQLParserUtils { return buf.toString(); } + public static List split(String sql, DbType dbType) { + if (dbType == null) { + dbType = DbType.other; + } + + { + Lexer lexer = createLexer(sql, dbType); + lexer.nextToken(); + + boolean script = false; + if (dbType == DbType.odps && lexer.token == Token.VARIANT) { + script = true; + } + + if (script) { + return Collections.singletonList(sql); + } + } + + List list = new ArrayList(); + + Lexer lexer = createLexer(sql, dbType); + lexer.config(SQLParserFeature.SkipComments, false); + lexer.config(SQLParserFeature.KeepComments, true); + + boolean set = false, paiOrJar = false; + int start = 0; + Token token = lexer.token; + for (; lexer.token != Token.EOF; ) { + if (token == Token.SEMI) { + int len = lexer.startPos - start; + if (len > 0) { + String lineSql = sql.substring(start, lexer.startPos); + lineSql = lineSql.trim(); + if (!lineSql.isEmpty()) { + list.add(lineSql); + } + } + start = lexer.startPos + 1; + set = false; + } 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; + } + + if (lexer.identifierEquals("USING")) { + lexer.nextToken(); + if (lexer.identifierEquals("jar")) { + lexer.nextToken(); + } + } + + if (lexer.token == Token.SET) { + set = true; + } + + if (lexer.identifierEquals("ADD") && (dbType == DbType.hive || dbType == DbType.odps)) { + lexer.nextToken(); + if (lexer.identifierEquals("JAR")) { + lexer.nextPath(); + } + } else { + lexer.nextToken(); + } + token = lexer.token; + } + + 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; + } + public static List splitAndRemoveComment(String sql, DbType dbType) { if (dbType == null) { dbType = DbType.other; diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index dee2304ec3..8760462a16 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -2786,7 +2786,7 @@ public class SQLStatementParser extends SQLParser { continue; } - if (lexer.identifierEquals(FnvHash.Constants.CASCADE)) { + if (lexer.identifierEquals(FnvHash.Constants.CASCADE) || lexer.token == CASCADE) { lexer.nextToken(); stmt.setCascade(true); @@ -2880,7 +2880,7 @@ public class SQLStatementParser extends SQLParser { if (lexer.identifierEquals("RESTRICT")) { lexer.nextToken(); stmt.setRestrict(true); - } else if (lexer.identifierEquals("CASCADE")) { + } else if (lexer.identifierEquals(FnvHash.Constants.CASCADE) || lexer.token == CASCADE) { lexer.nextToken(); if (lexer.identifierEquals("CONSTRAINTS")) { // for oracle