Skip to content

Commit

Permalink
add db2 sql parser support
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Jul 25, 2013
1 parent 920d826 commit 89f1106
Show file tree
Hide file tree
Showing 26 changed files with 943 additions and 41 deletions.
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -529,9 +529,9 @@
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.33</version>
<groupId>com.yammer.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>2.2.0</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/alibaba/druid/sql/PagerUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
Expand Down Expand Up @@ -226,6 +227,10 @@ private static SQLSelectQueryBlock createQueryBlock(String dbType) {
if (JdbcConstants.SQL_SERVER.equals(dbType)) {
return new SQLServerSelectQueryBlock();
}

if (JdbcConstants.DB2.equals(dbType)) {
return new DB2SelectQueryBlock();
}

return new SQLSelectQueryBlock();
}
Expand Down
12 changes: 11 additions & 1 deletion src/main/java/com/alibaba/druid/sql/SQLUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2OutputVisitor;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2SchemaStatVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
Expand All @@ -38,8 +40,8 @@
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import com.alibaba.druid.util.JdbcUtils;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.druid.util.JdbcUtils;
import com.alibaba.druid.util.StringUtils;


Expand Down Expand Up @@ -201,6 +203,10 @@ public static SQLASTOutputVisitor createFormatOutputVisitor(Appendable out, List
if (JdbcUtils.JTDS.equals(dbType)) {
return new SQLServerOutputVisitor(out);
}

if (JdbcUtils.DB2.equals(dbType)) {
return new DB2OutputVisitor(out);
}

return new SQLASTOutputVisitor(out);
}
Expand Down Expand Up @@ -231,6 +237,10 @@ public static SchemaStatVisitor createSchemaStatVisitor(List<SQLStatement> state
if (JdbcUtils.JTDS.equals(dbType)) {
return new SQLServerSchemaStatVisitor();
}

if (JdbcUtils.DB2.equals(dbType)) {
return new DB2SchemaStatVisitor();
}

return new SchemaStatVisitor();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* 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.db2.ast.stmt;

import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;

public class DB2SelectQueryBlock extends SQLSelectQueryBlock {

private static final long serialVersionUID = 1L;


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.alibaba.druid.sql.dialect.db2.parser;

import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.SQLExprParser;

public class DB2ExprParser extends SQLExprParser {

public final static String[] AGGREGATE_FUNCTIONS = { "AVG", "COUNT", "MAX", "MIN", "STDDEV", "SUM", "ROW_NUMBER" };

public DB2ExprParser(String sql){
this(new DB2Lexer(sql));
this.lexer.nextToken();
}

public DB2ExprParser(Lexer lexer){
super(lexer);
this.aggregateFunctions = AGGREGATE_FUNCTIONS;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.alibaba.druid.sql.dialect.db2.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 DB2Lexer extends Lexer {

public final static Keywords DEFAULT_DB2_KEYWORDS;

static {
Map<String, Token> map = new HashMap<String, Token>();

map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords());

DEFAULT_DB2_KEYWORDS = new Keywords(map);
}

public DB2Lexer(String input){
super(input);
super.keywods = DEFAULT_DB2_KEYWORDS;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* 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.db2.parser;

import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.Token;

public class DB2SelectParser extends SQLSelectParser {

public DB2SelectParser(SQLExprParser exprParser){
super(exprParser);
}

public DB2SelectParser(String sql){
this(new DB2ExprParser(sql));
}

protected SQLExprParser createExprParser() {
return new DB2ExprParser(lexer);
}

@Override
public SQLSelectQuery query() {
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();

SQLSelectQuery select = query();
accept(Token.RPAREN);

return queryRest(select);
}

accept(Token.SELECT);

if (lexer.token() == Token.COMMENT) {
lexer.nextToken();
}

DB2SelectQueryBlock queryBlock = new DB2SelectQueryBlock();

if (lexer.token() == Token.DISTINCT) {
queryBlock.setDistionOption(SQLSetQuantifier.DISTINCT);
lexer.nextToken();
} else if (lexer.token() == Token.UNIQUE) {
queryBlock.setDistionOption(SQLSetQuantifier.UNIQUE);
lexer.nextToken();
} else if (lexer.token() == Token.ALL) {
queryBlock.setDistionOption(SQLSetQuantifier.ALL);
lexer.nextToken();
}

parseSelectList(queryBlock);

parseFrom(queryBlock);

parseWhere(queryBlock);

parseGroupBy(queryBlock);

return queryRest(queryBlock);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.alibaba.druid.sql.dialect.db2.parser;

import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.SQLStatementParser;


public class DB2StatementParser extends SQLStatementParser {
public DB2StatementParser(String sql) {
super (new DB2ExprParser(sql));
}

public DB2StatementParser(Lexer lexer){
super(new DB2ExprParser(lexer));
}

public DB2SelectParser createSQLSelectParser() {
return new DB2SelectParser(this.exprParser);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.alibaba.druid.sql.dialect.db2.visitor;

import com.alibaba.druid.sql.visitor.SQLASTVisitor;


public interface DB2ASTVisitor extends SQLASTVisitor {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.alibaba.druid.sql.dialect.db2.visitor;

import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter;

public class DB2ASTVisitorAdapter extends SQLASTVisitorAdapter implements DB2ASTVisitor {

}
Loading

0 comments on commit 89f1106

Please sign in to comment.