diff --git a/pom.xml b/pom.xml
index d63a4a8d0b..6af37599b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -529,9 +529,9 @@
- com.alibaba
- fastjson
- 1.1.33
+ com.yammer.metrics
+ metrics-core
+ 2.2.0
test
diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java
index 71dbba0e37..8457e27ced 100644
--- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java
+++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java
@@ -33,6 +33,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
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;
@@ -226,6 +227,10 @@ public class PagerUtils {
if (JdbcConstants.SQL_SERVER.equals(dbType)) {
return new SQLServerSelectQueryBlock();
}
+
+ if (JdbcConstants.DB2.equals(dbType)) {
+ return new DB2SelectQueryBlock();
+ }
return new SQLSelectQueryBlock();
}
diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java
index ba01460e62..4cd4b91f0f 100644
--- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java
+++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java
@@ -21,6 +21,8 @@ import com.alibaba.druid.DruidRuntimeException;
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;
@@ -38,8 +40,8 @@ import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
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;
@@ -201,6 +203,10 @@ public class SQLUtils {
if (JdbcUtils.JTDS.equals(dbType)) {
return new SQLServerOutputVisitor(out);
}
+
+ if (JdbcUtils.DB2.equals(dbType)) {
+ return new DB2OutputVisitor(out);
+ }
return new SQLASTOutputVisitor(out);
}
@@ -231,6 +237,10 @@ public class SQLUtils {
if (JdbcUtils.JTDS.equals(dbType)) {
return new SQLServerSchemaStatVisitor();
}
+
+ if (JdbcUtils.DB2.equals(dbType)) {
+ return new DB2SchemaStatVisitor();
+ }
return new SchemaStatVisitor();
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/ast/stmt/DB2SelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/ast/stmt/DB2SelectQueryBlock.java
new file mode 100644
index 0000000000..24ead6662c
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/ast/stmt/DB2SelectQueryBlock.java
@@ -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;
+
+
+}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2ExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2ExprParser.java
new file mode 100644
index 0000000000..eaeadf00e9
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2ExprParser.java
@@ -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;
+ }
+
+}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2Lexer.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2Lexer.java
new file mode 100644
index 0000000000..66cfc0604d
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2Lexer.java
@@ -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 map = new HashMap();
+
+ map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords());
+
+ DEFAULT_DB2_KEYWORDS = new Keywords(map);
+ }
+
+ public DB2Lexer(String input){
+ super(input);
+ super.keywods = DEFAULT_DB2_KEYWORDS;
+ }
+}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2SelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2SelectParser.java
new file mode 100644
index 0000000000..f7c9ad9491
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2SelectParser.java
@@ -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);
+ }
+}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2StatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2StatementParser.java
new file mode 100644
index 0000000000..6f81d7ffc0
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2StatementParser.java
@@ -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);
+ }
+}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ASTVisitor.java
new file mode 100644
index 0000000000..b7ce9438bf
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ASTVisitor.java
@@ -0,0 +1,8 @@
+package com.alibaba.druid.sql.dialect.db2.visitor;
+
+import com.alibaba.druid.sql.visitor.SQLASTVisitor;
+
+
+public interface DB2ASTVisitor extends SQLASTVisitor {
+
+}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ASTVisitorAdapter.java
new file mode 100644
index 0000000000..0ad9ec85ed
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ASTVisitorAdapter.java
@@ -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 {
+
+}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2EvalVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2EvalVisitor.java
new file mode 100644
index 0000000000..112609f638
--- /dev/null
+++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2EvalVisitor.java
@@ -0,0 +1,142 @@
+/*
+ * 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.visitor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
+import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
+import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
+import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
+import com.alibaba.druid.sql.ast.expr.SQLInListExpr;
+import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
+import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
+import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
+import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
+import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
+import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr;
+import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
+import com.alibaba.druid.sql.visitor.SQLEvalVisitor;
+import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils;
+import com.alibaba.druid.sql.visitor.functions.Function;
+
+public class DB2EvalVisitor extends DB2ASTVisitorAdapter implements SQLEvalVisitor {
+
+ private Map functions = new HashMap();
+ private List