diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java index 35343122b6..78f3dacbfc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java @@ -27,6 +27,7 @@ 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.SQLVariantRefExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.visitor.SQLEvalVisitor; @@ -75,7 +76,7 @@ public class MySqlEvalVisitorImpl extends MySqlASTVisitorAdapter implements SQLE public boolean visit(SQLBinaryOpExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + public boolean visit(SQLIntegerExpr x) { return SQLEvalVisitorUtils.visit(this, x); } @@ -83,38 +84,43 @@ public class MySqlEvalVisitorImpl extends MySqlASTVisitorAdapter implements SQLE public boolean visit(SQLNumberExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + @Override public boolean visit(SQLCaseExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + @Override public boolean visit(SQLBetweenExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + @Override public boolean visit(SQLInListExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + @Override public boolean visit(SQLNullExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + @Override public boolean visit(SQLMethodInvokeExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + + @Override + public boolean visit(SQLQueryExpr x) { + return SQLEvalVisitorUtils.visit(this, x); + } + @Override public boolean visit(MySqlBooleanExpr x) { x.getAttributes().put(EVAL_VALUE, x.getValue()); return false; } - + public boolean isMarkVariantIndex() { return markVariantIndex; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleEvalVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleEvalVisitor.java index 2045a881d1..a7f62b49b5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleEvalVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleEvalVisitor.java @@ -26,6 +26,7 @@ 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.SQLVariantRefExpr; import com.alibaba.druid.sql.visitor.SQLEvalVisitor; import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; @@ -101,7 +102,12 @@ public class OracleEvalVisitor extends OracleASTVisitorAdapter implements SQLEva public boolean visit(SQLMethodInvokeExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + + @Override + public boolean visit(SQLQueryExpr x) { + return SQLEvalVisitorUtils.visit(this, x); + } + public boolean isMarkVariantIndex() { return markVariantIndex; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGEvalVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGEvalVisitor.java index f4d0d1fe60..6e590d4b84 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGEvalVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGEvalVisitor.java @@ -26,6 +26,7 @@ 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.SQLVariantRefExpr; import com.alibaba.druid.sql.visitor.SQLEvalVisitor; import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; @@ -81,7 +82,7 @@ public class PGEvalVisitor extends PGASTVisitorAdapter implements SQLEvalVisitor public boolean visit(SQLNumberExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + @Override public boolean visit(SQLCaseExpr x) { return SQLEvalVisitorUtils.visit(this, x); @@ -101,7 +102,12 @@ public class PGEvalVisitor extends PGASTVisitorAdapter implements SQLEvalVisitor public boolean visit(SQLMethodInvokeExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + + @Override + public boolean visit(SQLQueryExpr x) { + return SQLEvalVisitorUtils.visit(this, x); + } + public boolean isMarkVariantIndex() { return markVariantIndex; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java index efd250209a..576dbb1063 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java @@ -26,6 +26,7 @@ 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.SQLVariantRefExpr; public class SQLEvalVisitorImpl extends SQLASTVisitorAdapter implements SQLEvalVisitor { @@ -79,7 +80,7 @@ public class SQLEvalVisitorImpl extends SQLASTVisitorAdapter implements SQLEvalV public boolean visit(SQLNumberExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + @Override public boolean visit(SQLCaseExpr x) { return SQLEvalVisitorUtils.visit(this, x); @@ -99,7 +100,12 @@ public class SQLEvalVisitorImpl extends SQLASTVisitorAdapter implements SQLEvalV public boolean visit(SQLMethodInvokeExpr x) { return SQLEvalVisitorUtils.visit(this, x); } - + + @Override + public boolean visit(SQLQueryExpr x) { + return SQLEvalVisitorUtils.visit(this, x); + } + public boolean isMarkVariantIndex() { return markVariantIndex; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 8489a3b9ca..dea1525b64 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -21,10 +21,12 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; import com.alibaba.druid.DruidRuntimeException; import com.alibaba.druid.sql.SQLUtils; @@ -34,11 +36,16 @@ import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; 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.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; +import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLSelectItem; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlEvalVisitorImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleEvalVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGEvalVisitor; @@ -106,24 +113,202 @@ public class SQLEvalVisitorUtils { return new SQLEvalVisitorImpl(); } - + public static boolean visit(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { - if ("concat".equals(x.getMethodName())) { + if ("concat".equalsIgnoreCase(x.getMethodName())) { StringBuilder buf = new StringBuilder(); - + for (SQLExpr item : x.getParameters()) { item.accept(visitor); - + Object itemValue = item.getAttributes().get(EVAL_VALUE); if (itemValue == null) { continue; } buf.append(itemValue.toString()); } - + x.getAttributes().put(EVAL_VALUE, buf.toString()); - } else if ("now".equals(x.getMethodName())) { + } else if ("now".equalsIgnoreCase(x.getMethodName())) { x.getAttributes().put(EVAL_VALUE, new Date()); + } else if ("ascii".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() == 0) { + return false; + } + SQLExpr param = x.getParameters().get(0); + param.accept(visitor); + + Object paramValue = param.getAttributes().get(EVAL_VALUE); + if (paramValue == null) { + return false; + } + + String strValue = paramValue.toString(); + if (strValue.length() == 0) { + return false; + } + + int ascii = strValue.charAt(0); + x.getAttributes().put(EVAL_VALUE, ascii); + } else if ("instr".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() != 2) { + return false; + } + + SQLExpr param0 = x.getParameters().get(0); + SQLExpr param1 = x.getParameters().get(1); + param0.accept(visitor); + param1.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + Object param1Value = param1.getAttributes().get(EVAL_VALUE); + if (param0Value == null || param1Value == null) { + return false; + } + + String strValue0 = param0Value.toString(); + String strValue1 = param1Value.toString(); + + int result = strValue0.indexOf(strValue1) + 1; + + x.putAttribute(EVAL_VALUE, result); + } else if ("left".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() != 2) { + return false; + } + + SQLExpr param0 = x.getParameters().get(0); + SQLExpr param1 = x.getParameters().get(1); + param0.accept(visitor); + param1.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + Object param1Value = param1.getAttributes().get(EVAL_VALUE); + if (param0Value == null || param1Value == null) { + return false; + } + + String strValue = param0Value.toString(); + int intValue = _int(param1Value); + + String result = strValue.substring(0, intValue); + + x.putAttribute(EVAL_VALUE, result); + } else if ("right".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() != 2) { + return false; + } + + SQLExpr param0 = x.getParameters().get(0); + SQLExpr param1 = x.getParameters().get(1); + param0.accept(visitor); + param1.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + Object param1Value = param1.getAttributes().get(EVAL_VALUE); + if (param0Value == null || param1Value == null) { + return false; + } + + String strValue = param0Value.toString(); + int intValue = _int(param1Value); + + String result = strValue.substring(strValue.length() - intValue, strValue.length()); + + x.putAttribute(EVAL_VALUE, result); + } else if ("reverse".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() != 1) { + return false; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + if (param0Value == null) { + return false; + } + + String strValue = param0Value.toString(); + + StringBuilder buf = new StringBuilder(); + for (int i = strValue.length() - 1; i >= 0; --i) { + buf.append(strValue.charAt(i)); + } + String result = buf.toString(); + + x.putAttribute(EVAL_VALUE, result); + } else if ("trim".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() != 1) { + return false; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + if (param0Value == null) { + return false; + } + + String strValue = param0Value.toString(); + String result = strValue.trim(); + + x.putAttribute(EVAL_VALUE, result); + } else if ("length".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() != 1) { + return false; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + if (param0Value == null) { + return false; + } + + String strValue = param0Value.toString(); + + int result = strValue.length(); + + x.putAttribute(EVAL_VALUE, result); + } else if ("ucase".equalsIgnoreCase(x.getMethodName()) || "upper".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() != 1) { + return false; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + if (param0Value == null) { + return false; + } + + String strValue = param0Value.toString(); + + String result = strValue.toUpperCase(); + + x.putAttribute(EVAL_VALUE, result); + } else if ("lcase".equalsIgnoreCase(x.getMethodName()) || "lower".equalsIgnoreCase(x.getMethodName())) { + if (x.getParameters().size() != 1) { + return false; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + if (param0Value == null) { + return false; + } + + String strValue = param0Value.toString(); + + String result = strValue.toLowerCase(); + + x.putAttribute(EVAL_VALUE, result); } return false; } @@ -132,35 +317,35 @@ public class SQLEvalVisitorUtils { x.putAttribute(EVAL_VALUE, x.getText()); return true; } - + public static boolean visit(SQLEvalVisitor visitor, SQLBetweenExpr x) { x.getTestExpr().accept(visitor); - + if (!x.getTestExpr().getAttributes().containsKey(EVAL_VALUE)) { return false; } Object value = x.getTestExpr().getAttribute(EVAL_VALUE); - + x.getBeginExpr().accept(visitor); if (!x.getBeginExpr().getAttributes().containsKey(EVAL_VALUE)) { return false; } Object begin = x.getBeginExpr().getAttribute(EVAL_VALUE); - + if (lt(value, begin)) { x.getAttributes().put(EVAL_VALUE, x.isNot() ? true : false); return false; } - + x.getEndExpr().accept(visitor); if (!x.getEndExpr().getAttributes().containsKey(EVAL_VALUE)) { return false; } Object end = x.getEndExpr().getAttribute(EVAL_VALUE); - + if (gt(value, end)) { x.getAttributes().put(EVAL_VALUE, x.isNot() ? true : false); return false; @@ -169,7 +354,7 @@ public class SQLEvalVisitorUtils { x.getAttributes().put(EVAL_VALUE, x.isNot() ? false : true); return false; } - + public static boolean visit(SQLEvalVisitor visitor, SQLNullExpr x) { x.getAttributes().put(EVAL_VALUE, null); return false; @@ -214,7 +399,7 @@ public class SQLEvalVisitorUtils { return false; } - + public static boolean visit(SQLEvalVisitor visitor, SQLInListExpr x) { SQLExpr valueExpr = x.getExpr(); valueExpr.accept(visitor); @@ -222,7 +407,7 @@ public class SQLEvalVisitorUtils { return false; } Object value = valueExpr.getAttribute(EVAL_VALUE); - + for (SQLExpr item : x.getTargetList()) { item.accept(visitor); if (!item.getAttributes().containsKey(EVAL_VALUE)) { @@ -234,20 +419,62 @@ public class SQLEvalVisitorUtils { return false; } } - + x.getAttributes().put(EVAL_VALUE, x.isNot() ? true : false); return false; } - + + public static boolean visit(SQLEvalVisitor visitor, SQLQueryExpr x) { + if (x.getSubQuery().getQuery() instanceof SQLSelectQueryBlock) { + SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) x.getSubQuery().getQuery(); + + boolean nullFrom = false; + if (queryBlock.getFrom() == null) { + nullFrom = true; + } else if (queryBlock.getFrom() instanceof SQLExprTableSource) { + SQLExpr expr = ((SQLExprTableSource) queryBlock.getFrom()).getExpr(); + if (expr instanceof SQLIdentifierExpr) { + if ("dual".equalsIgnoreCase(((SQLIdentifierExpr) expr).getName())) { + nullFrom = true; + } + } + } + + if (nullFrom) { + Object[] row = new Object[queryBlock.getSelectList().size()]; + for (int i = 0; i < queryBlock.getSelectList().size(); ++i) { + SQLSelectItem item = queryBlock.getSelectList().get(i); + item.getExpr().accept(visitor); + Object cell = item.getExpr().getAttribute(EVAL_VALUE); + row[i] = cell; + } + Object result; + if (row.length == 1) { + result = row[0]; + } else { + result = row; + } + + queryBlock.putAttribute(EVAL_VALUE, result); + x.getSubQuery().putAttribute(EVAL_VALUE, result); + x.putAttribute(EVAL_VALUE, result); + + return false; + } + } + + return false; + } + public static boolean visit(SQLEvalVisitor visitor, SQLBinaryOpExpr x) { SQLExpr left = x.getLeft(); SQLExpr right = x.getRight(); - + left.accept(visitor); if (!left.getAttributes().containsKey(EVAL_VALUE)) { return false; } - + right.accept(visitor); if (!right.getAttributes().containsKey(EVAL_VALUE)) { return false; @@ -295,6 +522,22 @@ public class SQLEvalVisitorUtils { value = !eq(left.getAttribute(EVAL_VALUE), right.getAttributes().get(EVAL_VALUE)); x.putAttribute(EVAL_VALUE, value); break; + case RegExp: + case RLike: { + String pattern = _string(right.getAttributes().get(EVAL_VALUE)); + String input = _string(left.getAttributes().get(EVAL_VALUE)); + boolean matchResult = Pattern.matches(pattern, input); + x.putAttribute(EVAL_VALUE, matchResult); + } + break; + case NotRegExp: + case NotRLike: { + String pattern = _string(right.getAttributes().get(EVAL_VALUE)); + String input = _string(left.getAttributes().get(EVAL_VALUE)); + boolean matchResult = !Pattern.matches(pattern, input); + x.putAttribute(EVAL_VALUE, matchResult); + } + break; default: break; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAsciiTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAsciiTest.java new file mode 100644 index 0000000000..53402b40c3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodAsciiTest.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodAsciiTest extends TestCase { + public void test_ascii() throws Exception { + Assert.assertEquals(50, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "ascii('2')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodInstrTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodInstrTest.java new file mode 100644 index 0000000000..d9168d860d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodInstrTest.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodInstrTest extends TestCase { + public void test_length() throws Exception { + Assert.assertEquals(4, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "instr('foobarbar', 'bar')")); + Assert.assertEquals(0, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "instr('xbar', 'foobar')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLeftTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLeftTest.java new file mode 100644 index 0000000000..e38fca24a8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLeftTest.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodLeftTest extends TestCase { + public void test_ascii() throws Exception { + Assert.assertEquals("fooba", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LEFT('foobarbar', 5)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLengthTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLengthTest.java new file mode 100644 index 0000000000..74f44e2712 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodLengthTest.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodLengthTest extends TestCase { + public void test_length() throws Exception { + Assert.assertEquals(4, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "length('text')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodReverseTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodReverseTest.java new file mode 100644 index 0000000000..becb82adf1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodReverseTest.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodReverseTest extends TestCase { + public void test_reverse() throws Exception { + Assert.assertEquals("cba", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "REVERSE('abc')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodRightTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodRightTest.java new file mode 100644 index 0000000000..fe3df33dcb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodRightTest.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodRightTest extends TestCase { + public void test_ascii() throws Exception { + Assert.assertEquals("rbar", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "right('foobarbar', 4)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTrimTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTrimTest.java new file mode 100644 index 0000000000..90827af256 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTrimTest.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodTrimTest extends TestCase { + public void test_trim() throws Exception { + Assert.assertEquals("bar", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "TRIM(' bar ')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalRlikeTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalRlikeTest.java new file mode 100644 index 0000000000..e271f389b4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalRlikeTest.java @@ -0,0 +1,22 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalRlikeTest extends TestCase { + public void test_rlike() throws Exception { + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "'a' REGEXP '^[a-d]'")); + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "'a' RLIKE '^[a-d]'")); + Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "'1' RLIKE '^[a-d]'")); + } + + public void test_not_rlike() throws Exception { + Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "'a' NOT REGEXP '^[a-d]'")); + Assert.assertEquals(false, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "'a' NOT RLIKE '^[a-d]'")); + Assert.assertEquals(true, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "'1' NOT RLIKE '^[a-d]'")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalSelectTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalSelectTest.java new file mode 100644 index 0000000000..629f02a581 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalSelectTest.java @@ -0,0 +1,14 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalSelectTest extends TestCase { + public void test_select() throws Exception { + Assert.assertEquals(1, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "SELECT 1")); + } +}