improve sql parser, sql server support with

This commit is contained in:
wenshao
2013-01-07 07:46:41 +08:00
parent c7b30480c1
commit 9ad2d6ad13
6 changed files with 284 additions and 2 deletions
@@ -15,11 +15,14 @@
*/
package com.alibaba.druid.sql.dialect.sqlserver.parser;
import static com.alibaba.druid.sql.parser.LayoutCharacters.EOI;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.druid.sql.parser.Keywords;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.NotAllowCommentException;
import com.alibaba.druid.sql.parser.Token;
public class SQLServerLexer extends Lexer {
@@ -48,4 +51,95 @@ public class SQLServerLexer extends Lexer {
super(input);
super.keywods = DEFAULT_SQL_SERVER_KEYWORDS;
}
public void scanComment() {
if (ch != '/' && ch != '-') {
throw new IllegalStateException();
}
mark = pos;
bufPos = 0;
scanChar();
// /*+ */
if (ch == '*') {
scanChar();
bufPos++;
while (ch == ' ') {
scanChar();
bufPos++;
}
boolean isHint = false;
int startHintSp = bufPos + 1;
if (ch == '!') {
isHint = true;
scanChar();
bufPos++;
}
for (;;) {
if (ch == '*' && charAt(pos + 1) == '/') {
bufPos += 2;
scanChar();
scanChar();
break;
}
scanChar();
bufPos++;
}
if (isHint) {
stringVal = subString(mark + startHintSp, (bufPos - startHintSp) - 1);
token = Token.HINT;
} else {
stringVal = subString(mark, bufPos);
token = Token.MULTI_LINE_COMMENT;
}
if (token != Token.HINT && !isAllowComment()) {
throw new NotAllowCommentException();
}
return;
}
if (!isAllowComment()) {
throw new NotAllowCommentException();
}
if (ch == '/' || ch == '-') {
scanChar();
bufPos++;
for (;;) {
if (ch == '\r') {
if (charAt(pos + 1) == '\n') {
bufPos += 2;
scanChar();
break;
}
bufPos++;
break;
} else if (ch == EOI) {
break;
}
if (ch == '\n') {
scanChar();
bufPos++;
break;
}
scanChar();
bufPos++;
}
stringVal = subString(mark + 1, bufPos);
token = Token.LINE_COMMENT;
return;
}
}
}
@@ -37,6 +37,8 @@ public class SQLServerSelectParser extends SQLSelectParser {
public SQLSelect select() {
SQLServerSelect select = new SQLServerSelect();
withSubquery(select);
select.setQuery(query());
select.setOrderBy(parseOrderBy());
@@ -15,6 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.sqlserver.parser;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
@@ -40,6 +42,16 @@ public class SQLServerStatementParser extends SQLStatementParser {
super(new SQLServerExprParser(lexer));
}
public boolean parseStatementListDialect(List<SQLStatement> statementList) {
if (lexer.token() == Token.WITH) {
SQLStatement stmt = parseSelect();
statementList.add(stmt);
return true;
}
return false;
}
public SQLStatement parseInsert() {
SQLServerInsertStatement insertStatement = new SQLServerInsertStatement();
@@ -38,6 +38,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement;
import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
import com.alibaba.druid.sql.ast.statement.SQLSavePointStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
@@ -80,7 +81,7 @@ public class SQLStatementParser extends SQLParser {
continue;
}
if (lexer.token() == (Token.SELECT)) {
if (lexer.token() == Token.SELECT) {
statementList.add(parseSelect());
continue;
}
@@ -545,7 +546,9 @@ public class SQLStatementParser extends SQLParser {
}
public SQLSelectStatement parseSelect() {
return new SQLSelectStatement(createSQLSelectParser().select());
SQLSelectParser selectParser = createSQLSelectParser();
SQLSelect select = selectParser.select();
return new SQLSelectStatement(select);
}
public SQLSelectParser createSQLSelectParser() {