diff --git a/pom.xml b/pom.xml
index 47e8279073..07a6b82ee7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
4.11
true
- false
+ true
UTF-8
1.6
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java
index 1bcced37c9..df5b00b2c8 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java
@@ -83,6 +83,8 @@ import com.alibaba.druid.sql.parser.Token;
public class OracleExprParser extends SQLExprParser {
+
+
public boolean allowStringAdditive = false;
/**
@@ -480,12 +482,37 @@ public class OracleExprParser extends SQLExprParser {
protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) {
if (acceptLPAREN) {
accept(Token.LPAREN);
- if (lexer.token() == Token.PLUS) {
- lexer.nextToken();
+ }
+
+ if (lexer.token() == Token.PLUS) {
+ lexer.nextToken();
+ accept(Token.RPAREN);
+ return new OracleOuterExpr(expr);
+ }
+
+ if (expr instanceof SQLIdentifierExpr) {
+ String methodName = ((SQLIdentifierExpr) expr).getName();
+ SQLMethodInvokeExpr methodExpr = new SQLMethodInvokeExpr(methodName);
+ if ("trim".equalsIgnoreCase(methodName)) {
+ if (identifierEquals("LEADING") //
+ || identifierEquals("TRAILING") //
+ || identifierEquals("BOTH")
+ ) {
+ methodExpr.putAttribute("trim_option", lexer.stringVal());
+ lexer.nextToken();
+ }
+ SQLExpr trim_character = this.primary();
+ trim_character.setParent(methodExpr);
+ methodExpr.putAttribute("trim_character", trim_character);
+ accept(Token.FROM);
+ SQLExpr trim_source = this.expr();
+ methodExpr.addParameter(trim_source);
+
accept(Token.RPAREN);
- return new OracleOuterExpr(expr);
+ return primaryRest(methodExpr);
}
}
+
return super.methodRest(expr, false);
}
diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java
index 9137c0f10b..0e2c1c5731 100644
--- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java
@@ -3383,4 +3383,27 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
protected void printCascade() {
print(" CASCADE CONSTRAINTS");
}
+
+ @Override
+ public boolean visit(SQLMethodInvokeExpr x) {
+ if ("trim".equalsIgnoreCase(x.getMethodName())) {
+ SQLExpr trim_character = (SQLExpr) x.getAttribute("trim_character");
+ if (trim_character != null) {
+ print(x.getMethodName());
+ print("(");
+ String trim_option = (String) x.getAttribute("trim_option");
+ if (trim_option != null && trim_option.length() != 0) {
+ print(trim_option);
+ print(' ');
+ }
+ trim_character.accept(this);
+ print(" FROM ");
+ x.getParameters().get(0).accept(this);
+ print(")");
+ return false;
+ }
+ }
+
+ return super.visit(x);
+ }
}
diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
index c37ee63610..7b1c10df9f 100644
--- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
+++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java
@@ -365,7 +365,7 @@ public class SQLExprParser extends SQLParser {
return primaryRest(sqlExpr);
} else {
- SQLExpr restExpr = equality();
+ SQLExpr restExpr = relational();
sqlExpr = new SQLNotExpr(restExpr);
}
break;
diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java
index e78c55a795..3fd944310b 100644
--- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java
+++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java
@@ -1032,7 +1032,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
return false;
}
-
+
public boolean visit(SQLInListExpr x) {
if (x.isNot()) {
handleCondition(x.getExpr(), "NOT IN", x.getTargetList());
diff --git a/src/main/java/com/alibaba/druid/support/http/ResourceSerlvet.java b/src/main/java/com/alibaba/druid/support/http/ResourceSerlvet.java
index 64652d6837..dbe0c305b2 100644
--- a/src/main/java/com/alibaba/druid/support/http/ResourceSerlvet.java
+++ b/src/main/java/com/alibaba/druid/support/http/ResourceSerlvet.java
@@ -42,6 +42,7 @@ public abstract class ResourceSerlvet extends HttpServlet {
public static final String PARAM_NAME_PASSWORD = "loginPassword";
public static final String PARAM_NAME_ALLOW = "allow";
public static final String PARAM_NAME_DENY = "deny";
+ public static final String PARAM_REMOTE_ADDR = "remoteAddress";
protected String username = null;
protected String password = null;
@@ -51,6 +52,8 @@ public abstract class ResourceSerlvet extends HttpServlet {
protected final String resourcePath;
+ protected String remoteAddressHeader = null;
+
public ResourceSerlvet(String resourcePath){
this.resourcePath = resourcePath;
}
@@ -70,6 +73,11 @@ public abstract class ResourceSerlvet extends HttpServlet {
this.password = paramPassword;
}
+ String paramRemoteAddressHeader = getInitParameter(PARAM_REMOTE_ADDR);
+ if (!StringUtils.isEmpty(paramRemoteAddressHeader)) {
+ this.remoteAddressHeader = paramRemoteAddressHeader;
+ }
+
try {
String param = getInitParameter(PARAM_NAME_ALLOW);
if (param != null && param.trim().length() != 0) {
@@ -218,7 +226,11 @@ public abstract class ResourceSerlvet extends HttpServlet {
if (contextPath == null || contextPath.equals("") || contextPath.equals("/")) {
response.sendRedirect("/druid/login.html");
} else {
- response.sendRedirect("druid/login.html");
+ if ("".equals(path)) {
+ response.sendRedirect("druid/login.html");
+ } else {
+ response.sendRedirect("login.html");
+ }
}
return;
}
@@ -263,9 +275,23 @@ public abstract class ResourceSerlvet extends HttpServlet {
}
public boolean isPermittedRequest(HttpServletRequest request) {
- String remoteAddress = request.getRemoteAddr();
+ String remoteAddress = getRemoteAddress(request);
return isPermittedRequest(remoteAddress);
}
+ protected String getRemoteAddress(HttpServletRequest request) {
+ String remoteAddr = null;
+
+ if (remoteAddressHeader != null) {
+ remoteAddr = request.getHeader(remoteAddressHeader);
+ }
+
+ if (remoteAddr == null) {
+ remoteAddr = request.getRemoteAddr();
+ }
+
+ return remoteAddr;
+ }
+
protected abstract String process(String url);
}
diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java
index e417b7d0fd..87d840d5cb 100644
--- a/src/main/java/com/alibaba/druid/wall/WallConfig.java
+++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java
@@ -108,10 +108,20 @@ public class WallConfig implements WallConfigMBean {
private boolean conditionOpXorAllow = false;
private boolean conditionOpBitwseAllow = true;
+ private boolean caseConditionAllow = false;
+
public WallConfig(){
}
+ public boolean isCaseConditionAllow() {
+ return caseConditionAllow;
+ }
+
+ public void setCaseConditionAllow(boolean caseConditionAllow) {
+ this.caseConditionAllow = caseConditionAllow;
+ }
+
public boolean isConditionDoubleConstAllow() {
return conditionDoubleConstAllow;
}
diff --git a/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java
index 7731795ae8..f918f6455a 100644
--- a/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java
+++ b/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java
@@ -44,6 +44,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr;
+import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerExecStatement;
import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitorAdapter;
@@ -152,6 +153,10 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
return true;
}
+ @Override
+ public boolean visit(SQLServerExecStatement x) {
+ return false;
+ }
public boolean visit(SQLExprTableSource x) {
WallVisitorUtils.check(this, x);
diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java
index 9b58390d80..559e2f1c43 100644
--- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java
+++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java
@@ -257,7 +257,7 @@ public class WallVisitorUtils {
boolean isSimpleConstExpr = false;
SQLExpr first = getFirst(where);
- if (first == where) {
+ if (first == where || first instanceof SQLLiteralExpr) {
isSimpleConstExpr = true;
} else if (first instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) first;
@@ -278,7 +278,6 @@ public class WallVisitorUtils {
addViolation(visitor, ErrorCode.ALWAY_TRUE, "select alway true condition not allow", x);
}
}
-
}
checkConditionForMultiTenant(visitor, x.getWhere(), x);
} finally {
@@ -1046,9 +1045,18 @@ public class WallVisitorUtils {
return SQLEvalVisitorUtils.eval(dbType, x, Collections.emptyList(), false);
}
- if (x instanceof SQLCaseExpr) {
+ if (visitor != null && (!visitor.getConfig().isCaseConditionAllow()) && x instanceof SQLCaseExpr) {
SQLCaseExpr caseExpr = (SQLCaseExpr) x;
- if (caseExpr.getItems().size() > 0) {
+
+ boolean leftIsName = false;
+ if (caseExpr.getParent() instanceof SQLBinaryOpExpr) {
+ SQLExpr left = ((SQLBinaryOpExpr) caseExpr.getParent()).getLeft();
+ if (left instanceof SQLName) {
+ leftIsName = true;
+ }
+ }
+
+ if ((!leftIsName) && caseExpr.getItems().size() > 0) {
SQLCaseExpr.Item item = caseExpr.getItems().get(0);
Object conditionVal = getValue(visitor, item.getConditionExpr());
Object itemVal = getValue(visitor, item.getValueExpr());
diff --git a/src/main/resources/support/http/resources/datasource.html b/src/main/resources/support/http/resources/datasource.html
index 8c452c7c21..ea456a2461 100644
--- a/src/main/resources/support/http/resources/datasource.html
+++ b/src/main/resources/support/http/resources/datasource.html
@@ -28,13 +28,13 @@
{{~ it.Content :datasourceNow:i }}
- Basic Info For DataSource-{{=datasourceNow.Identity}}View JSON API
+ Basic Info For {{=datasourceNow.Name}}View JSON API
diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest142.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest142.java
new file mode 100644
index 0000000000..33eae0a13f
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest142.java
@@ -0,0 +1,33 @@
+/*
+ * 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.bvt.filter.wall;
+
+import junit.framework.TestCase;
+
+import org.junit.Assert;
+
+import com.alibaba.druid.wall.WallProvider;
+import com.alibaba.druid.wall.spi.MySqlWallProvider;
+
+public class MySqlWallTest142 extends TestCase {
+
+ public void test_false() throws Exception {
+ WallProvider provider = new MySqlWallProvider();
+
+ String sql = "SELECT * FROM `my_crons` WHERE 1 OR nextrun = '0' ";
+ Assert.assertTrue(provider.checkValid(sql));
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest143.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest143.java
new file mode 100644
index 0000000000..4e53956a64
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MySqlWallTest143.java
@@ -0,0 +1,46 @@
+/*
+ * 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.bvt.filter.wall;
+
+import junit.framework.TestCase;
+
+import org.junit.Assert;
+
+import com.alibaba.druid.wall.WallProvider;
+import com.alibaba.druid.wall.spi.MySqlWallProvider;
+
+public class MySqlWallTest143 extends TestCase {
+
+ public void test_false() throws Exception {
+ WallProvider provider = new MySqlWallProvider();
+
+ String sql = "SELECT" //
+ + " `Extent1`.`ID`, " //
+ + " `Extent1`.`State`, " //
+ + " `Extent1`.`CreateTime`, " //
+ + " `Extent1`.`UpdateTime`, " //
+ + " `Extent1`.`OpeningBank`, " //
+ + " `Extent1`.`BankAccount`, " //
+ + " `Extent1`.`BankAccountName`, " //
+ + " `Extent1`.`Zone`, " //
+ + " `Extent1`.`AccountantMobile`, " //
+ + " `Extent1`.`IsPublic`" //
+ + " FROM `paybank` AS `Extent1`" //
+ + " WHERE (`Extent1`.`State` > -1)" //
+ + " AND ((`Extent1`.`Zone`) = (CASE WHEN (1 IS NULL) THEN (1) ELSE (1) END))";
+ Assert.assertTrue(provider.checkValid(sql));
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_11.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_11.java
new file mode 100644
index 0000000000..bfd636ec67
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_11.java
@@ -0,0 +1,46 @@
+/*
+ * 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.bvt.filter.wall;
+
+import junit.framework.TestCase;
+
+import org.junit.Assert;
+
+import com.alibaba.druid.wall.WallProvider;
+import com.alibaba.druid.wall.spi.SQLServerWallProvider;
+
+/**
+ * SQLServerWallTest
+ *
+ * @see
+ */
+public class SQLServerWallTest_11 extends TestCase {
+
+ public void test_true() throws Exception {
+ WallProvider provider = new SQLServerWallProvider();
+ provider.getConfig().setCommentAllow(true);
+
+ String sql = "SELECT KL_ArticleContent,KL_ArticleTitle " //
+ + "FROM dbo.KL_Article " //
+ + "WHERE KL_ArticleId =-4731 "//
+ + "UNION ALL "//
+ + "SELECT (SELECT TOP 1 CHAR(58)+CHAR(108)+CHAR(107)+CHAR(103)+CHAR(58)+ISNULL(CAST(name AS NVARCHAR(4000)),CHAR(32))+CHAR(58)+CHAR(109)+CHAR(122)+CHAR(104)+CHAR(58) FROM sys.sql_logins WHERE ISNULL(name,CHAR(32)) NOT IN (SELECT TOP 0 ISNULL(name,CHAR(32)) FROM sys.sql_logins ORDER BY 1) ORDER BY 1),NULL-- ";
+
+ Assert.assertFalse(provider.checkValid(sql));
+
+ }
+
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_12.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_12.java
new file mode 100644
index 0000000000..5ccc061bdd
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/SQLServerWallTest_12.java
@@ -0,0 +1,42 @@
+/*
+ * 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.bvt.filter.wall;
+
+import junit.framework.TestCase;
+
+import org.junit.Assert;
+
+import com.alibaba.druid.wall.WallProvider;
+import com.alibaba.druid.wall.spi.SQLServerWallProvider;
+
+/**
+ * SQLServerWallTest
+ *
+ * @see
+ */
+public class SQLServerWallTest_12 extends TestCase {
+
+ public void test_true() throws Exception {
+ WallProvider provider = new SQLServerWallProvider();
+ provider.getConfig().setCommentAllow(true);
+
+ String sql = "EXEC master..xp_msver";
+
+ Assert.assertTrue(provider.checkValid(sql));
+
+ }
+
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_16.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_16.java
new file mode 100644
index 0000000000..dc7cbf8d08
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_16.java
@@ -0,0 +1,83 @@
+/*
+ * 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.bvt.sql.mysql;
+
+import java.util.List;
+
+import org.junit.Assert;
+
+import com.alibaba.druid.sql.MysqlTest;
+import com.alibaba.druid.sql.SQLUtils;
+import com.alibaba.druid.sql.ast.SQLExpr;
+import com.alibaba.druid.sql.ast.SQLStatement;
+import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
+import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
+import com.alibaba.druid.sql.ast.expr.SQLNotExpr;
+import com.alibaba.druid.sql.ast.statement.SQLSelect;
+import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
+import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
+import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
+import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
+import com.alibaba.druid.stat.TableStat;
+
+public class MySqlSelectTest_16 extends MysqlTest {
+
+ public void test_0() throws Exception {
+ String sql = "select a from t where not a>1 and not b<1";
+
+ MySqlStatementParser parser = new MySqlStatementParser(sql);
+ List statementList = parser.parseStatementList();
+ SQLStatement stmt = statementList.get(0);
+
+ SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
+
+ SQLSelect select = selectStmt.getSelect();
+ Assert.assertNotNull(select.getQuery());
+ MySqlSelectQueryBlock queryBlock = (MySqlSelectQueryBlock) select.getQuery();
+ Assert.assertNull(queryBlock.getOrderBy());
+
+ {
+ SQLExpr where = queryBlock.getWhere();
+ Assert.assertTrue(where instanceof SQLBinaryOpExpr);
+ SQLBinaryOpExpr binaryWhere = (SQLBinaryOpExpr) where;
+ Assert.assertEquals(binaryWhere.getOperator(), SQLBinaryOperator.BooleanAnd);
+
+ Assert.assertTrue(binaryWhere.getLeft() instanceof SQLNotExpr);
+ Assert.assertTrue(binaryWhere.getRight() instanceof SQLNotExpr);
+ }
+
+ print(statementList);
+
+ Assert.assertEquals(1, statementList.size());
+
+ MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
+ stmt.accept(visitor);
+
+ Assert.assertEquals(1, visitor.getTables().size());
+ Assert.assertEquals(2, visitor.getColumns().size());
+ Assert.assertEquals(2, visitor.getConditions().size());
+ Assert.assertEquals(0, visitor.getOrderByColumns().size());
+
+ Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t")));
+
+ String output = SQLUtils.toMySqlString(stmt);
+ Assert.assertEquals("SELECT a" //
+ + "\nFROM t"//
+ + "\nWHERE NOT a > 1"//
+ + "\n\tAND NOT b < 1", //
+ output);
+ }
+}
diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest51.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest51.java
new file mode 100644
index 0000000000..5ba24cca04
--- /dev/null
+++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest51.java
@@ -0,0 +1,64 @@
+/*
+ * 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.bvt.sql.oracle;
+
+import java.util.List;
+
+import org.junit.Assert;
+
+import com.alibaba.druid.sql.OracleTest;
+import com.alibaba.druid.sql.ast.SQLStatement;
+import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
+import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
+import com.alibaba.druid.sql.test.TestUtils;
+
+public class OracleSelectTest51 extends OracleTest {
+
+ public void test_0() throws Exception {
+ String sql = //
+ "select TRIM(TRAILING 'M' FROM RTRIM(' testM')) from dual;"; //
+
+ OracleStatementParser parser = new OracleStatementParser(sql);
+ List statementList = parser.parseStatementList();
+ SQLStatement stmt = statementList.get(0);
+ print(statementList);
+
+ Assert.assertEquals(1, statementList.size());
+
+ OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
+ stmt.accept(visitor);
+
+ System.out.println("Tables : " + visitor.getTables());
+ System.out.println("fields : " + visitor.getColumns());
+ System.out.println("coditions : " + visitor.getConditions());
+ System.out.println("relationships : " + visitor.getRelationships());
+ System.out.println("orderBy : " + visitor.getOrderByColumns());
+
+ Assert.assertEquals(0, visitor.getTables().size());
+
+ Assert.assertEquals(0, visitor.getColumns().size());
+
+ String text = TestUtils.outputOracle(stmt);
+
+ Assert.assertEquals("SELECT TRIM(TRAILING 'M' FROM RTRIM(' testM'))" //
+ + "\nFROM dual;"//
+ + "\n", text);
+
+ // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh")));
+
+ // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name")));
+ }
+}