From a91b98f87a3f52c50171e2e2edf6e28019285138 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 12 Nov 2011 11:51:43 +0800 Subject: [PATCH] sql server support --- .../sqlserver/ast/SQLServerSelect.java | 9 +- .../sqlserver/parser/SQLServerLexer.java | 102 +++++++++++++++ .../parser/SQLServerStatementParser.java | 117 ++++++++++++++++++ 3 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java index b079668826..37fa2c8d21 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java @@ -1,6 +1,13 @@ package com.alibaba.druid.sql.dialect.sqlserver.ast; +import com.alibaba.druid.sql.ast.statement.SQLSelect; -public class SQLServerSelect { + +public class SQLServerSelect extends SQLSelect { + + /** + * + */ + private static final long serialVersionUID = 1L; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java new file mode 100644 index 0000000000..394a043919 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java @@ -0,0 +1,102 @@ +package com.alibaba.druid.sql.dialect.sqlserver.parser; + +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.Token; + + +public class SQLServerLexer extends Lexer { + + public final static Keywords DEFAULT_SQL_SERVER_KEYWORDS; + + static { + Map map = new HashMap(); + map.put("EXISTS", Token.EXISTS); + map.put("THEN", Token.THEN); + map.put("AS", Token.AS); + map.put("GROUP", Token.GROUP); + map.put("BY", Token.BY); + map.put("HAVING", Token.HAVING); + map.put("DELETE", Token.DELETE); + map.put("ORDER", Token.ORDER); + map.put("INDEX", Token.INDEX); + map.put("FOR", Token.FOR); + map.put("SCHEMA", Token.SCHEMA); + map.put("FOREIGN", Token.FOREIGN); + map.put("REFERENCE", Token.REFERENCE); + map.put("REFERENCES", Token.REFERENCES); + map.put("CHECK", Token.CHECK); + map.put("PRIMARY", Token.PRIMARY); + map.put("KEY", Token.KEY); + map.put("CONSTRAINT", Token.CONSTRAINT); + map.put("DEFAULT", Token.DEFAULT); + map.put("VIEW", Token.VIEW); + map.put("CREATE", Token.CREATE); + map.put("VALUES", Token.VALUES); + map.put("ALTER", Token.ALTER); + map.put("TABLE", Token.TABLE); + map.put("DROP", Token.DROP); + map.put("SET", Token.SET); + map.put("INTO", Token.INTO); + map.put("UPDATE", Token.UPDATE); + map.put("NULL", Token.NULL); + map.put("IS", Token.IS); + map.put("NOT", Token.NOT); + map.put("SELECT", Token.SELECT); + map.put("INSERT", Token.INSERT); + map.put("FROM", Token.FROM); + map.put("WHERE", Token.WHERE); + map.put("AND", Token.AND); + map.put("OR", Token.OR); + map.put("XOR", Token.XOR); + map.put("DISTINCT", Token.DISTINCT); + map.put("UNIQUE", Token.UNIQUE); + map.put("ALL", Token.ALL); + map.put("UNION", Token.UNION); + map.put("INTERSECT", Token.INTERSECT); + map.put("MINUS", Token.MINUS); + map.put("INNER", Token.INNER); + map.put("LEFT", Token.LEFT); + map.put("RIGHT", Token.RIGHT); + map.put("FULL", Token.FULL); + map.put("ON", Token.ON); + map.put("OUTER", Token.OUTER); + map.put("JOIN", Token.JOIN); + map.put("NEW", Token.NEW); + map.put("CASE", Token.CASE); + map.put("WHEN", Token.WHEN); + map.put("END", Token.END); + map.put("WHEN", Token.WHEN); + map.put("ELSE", Token.ELSE); + map.put("EXISTS", Token.EXISTS); + map.put("CAST", Token.CAST); + map.put("IN", Token.IN); + map.put("ASC", Token.ASC); + map.put("DESC", Token.DESC); + map.put("LIKE", Token.LIKE); + map.put("ESCAPE", Token.ESCAPE); + map.put("BETWEEN", Token.BETWEEN); + map.put("INTERVAL", Token.INTERVAL); + map.put("LOCK", Token.LOCK); + map.put("SOME", Token.SOME); + map.put("ANY", Token.ANY); + + map.put("WITH", Token.WITH); + map.put("CURSOR", Token.CURSOR); + + DEFAULT_SQL_SERVER_KEYWORDS = new Keywords(map); + } + + public SQLServerLexer(char[] input, int inputLength, boolean skipComment){ + super(input, inputLength, skipComment); + super.keywods = DEFAULT_SQL_SERVER_KEYWORDS; + } + + public SQLServerLexer(String input){ + super(input); + super.keywods = DEFAULT_SQL_SERVER_KEYWORDS; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java new file mode 100644 index 0000000000..48cb09c5bc --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java @@ -0,0 +1,117 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.dialect.sqlserver.parser; + +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleDeleteParser; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleInsertParser; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleSelectParser; +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.SQLSelectParser; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.parser.Token; + +public class SQLServerStatementParser extends SQLStatementParser { + + public SQLServerStatementParser(String sql){ + super(new SQLServerLexer(sql)); + this.lexer.nextToken(); + } + + public SQLServerStatementParser(Lexer lexer){ + super(lexer); + } + + @Override + public void parseStatementList(List statementList) throws ParserException { + for (;;) { + if (lexer.token() == Token.EOF) { + return; + } + + if (lexer.token() == (Token.SEMI)) { + lexer.nextToken(); + continue; + } + + if (lexer.token() == (Token.SELECT)) { + statementList.add(new SQLSelectStatement(new SQLSelectParser(this.lexer).select())); + continue; + } + + if (lexer.token() == (Token.UPDATE)) { + statementList.add(parseUpdateStatement()); + continue; + } + + if (lexer.token() == (Token.CREATE)) { + lexer.nextToken(); + + // if ((this.tokenList.lookup(1).equals(Token.ViewToken)) || + // (this.tokenList.lookup(3).equals(Token.ViewToken)) + // || (this.tokenList.lookup(4).equals(Token.ViewToken)) || + // (this.tokenList.lookup(5).equals(Token.ViewToken))) { + // statementList.add(parseCreateView()); + // } + // + // if ((this.tokenList.lookup(1).equals(Token.TableToken)) || + // (this.tokenList.lookup(3).equals(Token.TableToken))) { + // statementList.add(parseOracleCreateTable()); + // } + + throw new ParserException("TODO"); + } + + if (lexer.token() == Token.INSERT) { + statementList.add(new OracleInsertParser(this.lexer).parseInsert()); + continue; + } + + if (lexer.token() == (Token.DELETE)) { + statementList.add(new OracleDeleteParser(this.lexer).parseDelete()); + continue; + } + + if (lexer.token() == (Token.SLASH)) { + lexer.nextToken(); + statementList.add(new OraclePLSQLCommitStatement()); + continue; + } + + if (lexer.token() == Token.ALTER) { + throw new ParserException("TODO"); + } + + if (lexer.token() == Token.WITH) { + statementList.add(new SQLSelectStatement(new OracleSelectParser(this.lexer).select())); + continue; + } + + if (identifierEquals("CALL")) { + statementList.add(this.parseCall()); + continue; + } + + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + +}