From 275e4b68b7e6d86a3f6e0c7acd5b270dee976ae1 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 30 Mar 2013 23:05:08 +0800 Subject: [PATCH] improve SQL Eval support --- .../druid/sql/ast/expr/SQLBinaryOperator.java | 5 +- .../dialect/mysql/parser/MySqlExprParser.java | 4 +- .../postgresql/parser/PGExprParser.java | 15 ++++ .../com/alibaba/druid/sql/parser/Lexer.java | 64 +++++++------- .../com/alibaba/druid/sql/parser/Token.java | 1 + .../sql/visitor/SQLEvalVisitorUtils.java | 25 +++++- .../druid/sql/visitor/SchemaStatVisitor.java | 4 + .../druid/sql/visitor/functions/Bin.java | 48 +++++++++++ .../sql/visitor/functions/BitLength.java | 46 ++++++++++ .../druid/sql/visitor/functions/Char.java | 54 ++++++++++++ .../druid/sql/visitor/functions/Elt.java | 53 ++++++++++++ .../druid/sql/visitor/functions/Hex.java | 3 +- .../druid/sql/visitor/functions/Insert.java | 83 +++++++++++++++++++ .../druid/sql/visitor/functions/Locate.java | 68 +++++++++++++++ .../druid/sql/visitor/functions/Lpad.java | 67 +++++++++++++++ .../druid/sql/visitor/functions/Ltrim.java | 57 +++++++++++++ .../sql/visitor/functions/Substring.java | 80 ++++++++++++++++++ .../druid/sql/visitor/functions/Unhex.java | 8 +- .../META-INF/druid/wall/mysql/deny-schema.txt | 3 +- .../druid/bvt/filter/wall/TAEWallTest.java | 42 ++++++++++ .../druid/bvt/sql/eval/EvalMethodBinTest.java | 15 ++++ .../bvt/sql/eval/EvalMethodBitLengthTest.java | 14 ++++ .../bvt/sql/eval/EvalMethodTest_Char.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_Char_1.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_Elt.java | 16 ++++ .../bvt/sql/eval/EvalMethodTest_Elt_1.java | 16 ++++ .../bvt/sql/eval/EvalMethodTest_insert.java | 16 ++++ .../bvt/sql/eval/EvalMethodTest_insert_1.java | 16 ++++ .../bvt/sql/eval/EvalMethodTest_insert_2.java | 16 ++++ .../bvt/sql/eval/EvalMethodTest_instr.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_instr_1.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_lcase.java | 16 ++++ .../bvt/sql/eval/EvalMethodTest_left.java | 16 ++++ .../bvt/sql/eval/EvalMethodTest_len.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_locate.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_locate_1.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_locate_2.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_lower.java | 16 ++++ .../bvt/sql/eval/EvalMethodTest_lpad.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_lpad_1.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_ltrim.java | 15 ++++ .../bvt/sql/eval/EvalMethodTest_mid.java | 15 ++++ .../sql/eval/EvalMethodTest_substring.java | 16 ++++ .../sql/eval/EvalMethodTest_substring_1.java | 16 ++++ .../sql/eval/EvalMethodTest_substring_2.java | 16 ++++ .../sql/eval/EvalMethodTest_substring_3.java | 16 ++++ .../sql/eval/EvalMethodTest_substring_4.java | 16 ++++ .../bvt/sql/mysql/StringFunctionsTest.java | 4 +- .../bvt/sql/postgresql/PGSelectTest10.java | 55 ++++++++++++ .../com/alibaba/druid/mysql/MySqlHexTest.java | 8 +- 50 files changed, 1163 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/Bin.java create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/BitLength.java create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/Char.java create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/Elt.java create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/Insert.java create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/Locate.java create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/Lpad.java create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/Ltrim.java create mode 100644 src/main/java/com/alibaba/druid/sql/visitor/functions/Substring.java create mode 100644 src/test/java/com/alibaba/druid/bvt/filter/wall/TAEWallTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodBinTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodBitLengthTest.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Char.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Char_1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Elt.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Elt_1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert_1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert_2.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_instr.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_instr_1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lcase.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_left.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_len.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate_1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate_2.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lower.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lpad.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lpad_1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_ltrim.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_mid.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_1.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_2.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_3.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_4.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest10.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOperator.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOperator.java index b3826aca2e..294f3ff4a3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOperator.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOperator.java @@ -70,12 +70,9 @@ public enum SQLBinaryOperator { BooleanOr("OR", 160), Assignment(":=", 169), + PostgresStyleTypeCast("::", 20), ; - - - - public static int getPriority(SQLBinaryOperator operator) { return 0; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index 2f6b512d78..ae37677ef0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -323,12 +323,12 @@ public class MySqlExprParser extends SQLExprParser { } else if (lexer.token() == Token.FROM) { lexer.nextToken(); SQLExpr from = expr(); - methodInvokeExpr.putAttribute("FROM", from); + methodInvokeExpr.getParameters().add(from); if (lexer.token() == Token.FOR) { lexer.nextToken(); SQLExpr forExpr = expr(); - methodInvokeExpr.putAttribute("FOR", forExpr); + methodInvokeExpr.getParameters().add(forExpr); } break; } else if (lexer.token() == Token.RPAREN) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index 82933ae544..0cb3c1266c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -15,6 +15,9 @@ */ package com.alibaba.druid.sql.dialect.postgresql.parser; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.dialect.postgresql.ast.PGOrderBy; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -68,4 +71,16 @@ public class PGExprParser extends SQLExprParser { return null; } + + public SQLExpr primaryRest(SQLExpr expr) { + if (lexer.token() == Token.COLONCOLON) { + lexer.nextToken(); + SQLExpr typeExpr = this.expr(); + SQLBinaryOpExpr castExpr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.PostgresStyleTypeCast, typeExpr); + + return primaryRest(castExpr); + } + + return super.primaryRest(expr); + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 06a2ad4674..d8129e9aef 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -20,6 +20,7 @@ import static com.alibaba.druid.sql.parser.CharTypes.isIdentifierChar; import static com.alibaba.druid.sql.parser.CharTypes.isWhitespace; import static com.alibaba.druid.sql.parser.LayoutCharacters.EOI; import static com.alibaba.druid.sql.parser.Token.COLONEQ; +import static com.alibaba.druid.sql.parser.Token.COLONCOLON; import static com.alibaba.druid.sql.parser.Token.COMMA; import static com.alibaba.druid.sql.parser.Token.EOF; import static com.alibaba.druid.sql.parser.Token.ERROR; @@ -41,31 +42,31 @@ import java.util.Arrays; */ public class Lexer { - protected final String text; - protected int pos; - protected int mark; + protected final String text; + protected int pos; + protected int mark; - protected char ch; + protected char ch; - protected char[] buf; - protected int bufPos; + protected char[] buf; + protected int bufPos; - protected Token token; + protected Token token; - protected Keywords keywods = Keywords.DEFAULT_KEYWORDS; + protected Keywords keywods = Keywords.DEFAULT_KEYWORDS; - protected String stringVal; + protected String stringVal; - protected boolean skipComment = true; + protected boolean skipComment = true; - private SavePoint savePoint = null; + private SavePoint savePoint = null; /* * anti sql injection */ - private boolean allowComment = true; + private boolean allowComment = true; - private int varIndex = -1; + private int varIndex = -1; public Lexer(String input){ this(input, true); @@ -78,7 +79,7 @@ public class Lexer { return text.charAt(index); } - + public final String addSymbol() { return subString(mark, bufPos); } @@ -86,7 +87,7 @@ public class Lexer { public final String subString(int offset, int count) { return text.substring(offset, offset + count); } - + protected void initBuff(int size) { if (buf == null) { if (size < 32) { @@ -94,7 +95,7 @@ public class Lexer { } else { buf = new char[size + 32]; } - } else if(buf.length < size) { + } else if (buf.length < size) { buf = Arrays.copyOf(buf, size); } } @@ -116,6 +117,7 @@ public class Lexer { } private static class SavePoint { + int bp; int sp; int np; @@ -187,32 +189,32 @@ public class Lexer { public String info() { return this.token + " " + this.stringVal(); } - + public final void nextTokenComma() { if (ch == ' ') { scanChar(); } - + if (ch == ',') { scanChar(); token = COMMA; return; } - + if (ch == ')') { scanChar(); token = RPAREN; return; } - + nextToken(); } - + public final void nextTokenLParen() { if (ch == ' ') { scanChar(); } - + if (ch == '(') { scanChar(); token = LPAREN; @@ -220,38 +222,38 @@ public class Lexer { } nextToken(); } - + public final void nextTokenValue() { if (ch == ' ') { scanChar(); } - + if (ch == '\'') { bufPos = 0; scanString(); return; } - + if (ch >= '0' && ch <= '9') { bufPos = 0; scanNumber(); return; } - + if (ch == '?') { scanChar(); token = Token.QUES; return; } - + if (isFirstIdentifierChar(ch) && ch != 'N') { scanIdentifier(); return; } - + nextToken(); } - + public final void nextToken() { bufPos = 0; @@ -334,6 +336,9 @@ public class Lexer { if (ch == '=') { scanChar(); token = COLONEQ; + } else if (ch == ':') { + scanChar(); + token = COLONCOLON; } else { if (isDigit(ch)) { unscan(); @@ -762,7 +767,6 @@ public class Lexer { break; } - bufPos++; continue; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 0b300197d2..2410cf69ee 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -207,6 +207,7 @@ public enum Token { TILDE("~"), QUES("?"), COLON(":"), + COLONCOLON(":"), COLONEQ(":="), EQEQ("=="), LTEQ("<="), 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 9596ff4159..0479024ef4 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -56,16 +56,25 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleEvalVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGEvalVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerEvalVisitor; import com.alibaba.druid.sql.visitor.functions.Ascii; +import com.alibaba.druid.sql.visitor.functions.Bin; +import com.alibaba.druid.sql.visitor.functions.BitLength; +import com.alibaba.druid.sql.visitor.functions.Char; import com.alibaba.druid.sql.visitor.functions.Concat; +import com.alibaba.druid.sql.visitor.functions.Elt; import com.alibaba.druid.sql.visitor.functions.Function; import com.alibaba.druid.sql.visitor.functions.Hex; +import com.alibaba.druid.sql.visitor.functions.Insert; import com.alibaba.druid.sql.visitor.functions.Instr; import com.alibaba.druid.sql.visitor.functions.Lcase; import com.alibaba.druid.sql.visitor.functions.Left; import com.alibaba.druid.sql.visitor.functions.Length; +import com.alibaba.druid.sql.visitor.functions.Locate; +import com.alibaba.druid.sql.visitor.functions.Lpad; +import com.alibaba.druid.sql.visitor.functions.Ltrim; import com.alibaba.druid.sql.visitor.functions.Now; import com.alibaba.druid.sql.visitor.functions.Reverse; import com.alibaba.druid.sql.visitor.functions.Right; +import com.alibaba.druid.sql.visitor.functions.Substring; import com.alibaba.druid.sql.visitor.functions.Trim; import com.alibaba.druid.sql.visitor.functions.Ucase; import com.alibaba.druid.sql.visitor.functions.Unhex; @@ -149,13 +158,26 @@ public class SQLEvalVisitorUtils { static void registerBaseFunctions() { functions.put("now", Now.instance); functions.put("concat", Concat.instance); + functions.put("concat_ws", Concat.instance); functions.put("ascii", Ascii.instance); + functions.put("bin", Bin.instance); + functions.put("bit_length", BitLength.instance); + functions.put("insert", Insert.instance); functions.put("instr", Instr.instance); + functions.put("char", Char.instance); + functions.put("elt", Elt.instance); functions.put("left", Left.instance); + functions.put("locate", Locate.instance); + functions.put("lpad", Lpad.instance); + functions.put("ltrim", Ltrim.instance); + functions.put("mid", Substring.instance); + functions.put("substring", Substring.instance); functions.put("right", Right.instance); functions.put("reverse", Reverse.instance); functions.put("len", Length.instance); functions.put("length", Length.instance); + functions.put("char_length", Length.instance); + functions.put("character_length", Length.instance); functions.put("trim", Trim.instance); functions.put("ucase", Ucase.instance); functions.put("upper", Ucase.instance); @@ -172,6 +194,7 @@ public class SQLEvalVisitorUtils { if (function != null) { Object result = function.eval(visitor, x); + if (result != SQLEvalVisitor.EVAL_ERROR) { x.getAttributes().put(EVAL_VALUE, result); } @@ -721,7 +744,7 @@ public class SQLEvalVisitorUtils { SQLExpr leftEvalExpr = (SQLExpr) left.getAttribute(EVAL_EXPR); SQLExpr rightEvalExpr = (SQLExpr) right.getAttribute(EVAL_EXPR); - if (leftEvalExpr.equals(rightEvalExpr)) { + if (leftEvalExpr != null && leftEvalExpr.equals(rightEvalExpr)) { switch (x.getOperator()) { case Like: case Equality: 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 d7731dc0ac..57a849da0c 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -562,6 +562,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLSelectQueryBlock x) { + if (x.getFrom() == null) { + return false; + } + setMode(x, Mode.Select); if (x.getFrom() instanceof SQLSubqueryTableSource) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Bin.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Bin.java new file mode 100644 index 0000000000..2de0d0f45c --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Bin.java @@ -0,0 +1,48 @@ +/* + * 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.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class Bin implements Function { + + public final static Bin instance = new Bin(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + if (x.getParameters().size() != 1) { + return SQLEvalVisitor.EVAL_ERROR; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + if (param0Value == null) { + return SQLEvalVisitor.EVAL_ERROR; + } + + if (param0Value instanceof Number) { + long longValue = ((Number) param0Value).longValue(); + String result = Long.toString(longValue, 2); + return result; + } + return SQLEvalVisitor.EVAL_ERROR; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/BitLength.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/BitLength.java new file mode 100644 index 0000000000..28f254a21d --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/BitLength.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.sql.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class BitLength implements Function { + + public final static BitLength instance = new BitLength(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + if (x.getParameters().size() != 1) { + return SQLEvalVisitor.EVAL_ERROR; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + if (param0Value == null) { + return SQLEvalVisitor.EVAL_ERROR; + } + + if (param0Value instanceof String) { + return ((String) param0Value).getBytes().length * 8; + } + return SQLEvalVisitor.EVAL_ERROR; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Char.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Char.java new file mode 100644 index 0000000000..27f9146982 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Char.java @@ -0,0 +1,54 @@ +/* + * 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.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import java.math.BigDecimal; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class Char implements Function { + + public final static Char instance = new Char(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + if (x.getParameters().size() == 0) { + return SQLEvalVisitor.EVAL_ERROR; + } + + StringBuffer buf = new StringBuffer(x.getParameters().size()); + for (SQLExpr param : x.getParameters()) { + param.accept(visitor); + + Object paramValue = param.getAttributes().get(EVAL_VALUE); + + if (paramValue instanceof Number) { + int charCode = ((Number) paramValue).intValue(); + buf.append((char) charCode); + } else if (paramValue instanceof String) { + int charCode = new BigDecimal((String)paramValue).intValue(); + buf.append((char) charCode); + } else { + return SQLEvalVisitor.EVAL_ERROR; + } + } + + return buf.toString(); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Elt.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Elt.java new file mode 100644 index 0000000000..3a354f497f --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Elt.java @@ -0,0 +1,53 @@ +/* + * 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.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class Elt implements Function { + + public final static Elt instance = new Elt(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + if (x.getParameters().size() <= 1) { + return SQLEvalVisitor.EVAL_ERROR; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + int param0IntValue; + if (!(param0Value instanceof Number)) { + return SQLEvalVisitor.EVAL_ERROR; + } + param0IntValue = ((Number) param0Value).intValue(); + + if (param0IntValue >= x.getParameters().size()) { + return null; + } + + SQLExpr item = x.getParameters().get(param0IntValue); + item.accept(visitor); + + Object itemValue = item.getAttributes().get(EVAL_VALUE); + return itemValue; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Hex.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Hex.java index 8f679c6d0f..4a2bfa9985 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/functions/Hex.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Hex.java @@ -17,12 +17,11 @@ package com.alibaba.druid.sql.visitor.functions; import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; -import org.apache.xerces.impl.dv.util.HexBin; - import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.visitor.SQLEvalVisitor; +import com.alibaba.druid.util.HexBin; public class Hex implements Function { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Insert.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Insert.java new file mode 100644 index 0000000000..c2e9321bb7 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Insert.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.sql.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class Insert implements Function { + + public final static Insert instance = new Insert(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + if (x.getParameters().size() != 4) { + return SQLEvalVisitor.EVAL_ERROR; + } + + SQLExpr param0 = x.getParameters().get(0); + SQLExpr param1 = x.getParameters().get(1); + SQLExpr param2 = x.getParameters().get(2); + SQLExpr param3 = x.getParameters().get(3); + param0.accept(visitor); + param1.accept(visitor); + param2.accept(visitor); + param3.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + Object param1Value = param1.getAttributes().get(EVAL_VALUE); + Object param2Value = param2.getAttributes().get(EVAL_VALUE); + Object param3Value = param3.getAttributes().get(EVAL_VALUE); + + if (!(param0Value instanceof String)) { + return SQLEvalVisitor.EVAL_ERROR; + } + if (!(param1Value instanceof Number)) { + return SQLEvalVisitor.EVAL_ERROR; + } + if (!(param2Value instanceof Number)) { + return SQLEvalVisitor.EVAL_ERROR; + } + if (!(param3Value instanceof String)) { + return SQLEvalVisitor.EVAL_ERROR; + } + + String str = (String) param0Value; + int pos = ((Number) param1Value).intValue(); + int len = ((Number) param2Value).intValue(); + String newstr = (String) param3Value; + + if (pos <= 0) { + return str; + } + + if (pos == 1) { + if (len > str.length()) { + return newstr; + } + return newstr + str.substring(len); + } + + String first = str.substring(0, pos - 1); + if (pos + len - 1 > str.length()) { + return first + newstr; + } + + return first + newstr + str.substring(pos + len - 1); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Locate.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Locate.java new file mode 100644 index 0000000000..605a1eb184 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Locate.java @@ -0,0 +1,68 @@ +/* + * 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.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class Locate implements Function { + + public final static Locate instance = new Locate(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + List params = x.getParameters(); + int paramSize = params.size(); + if (paramSize != 2 && paramSize != 3) { + return SQLEvalVisitor.EVAL_ERROR; + } + + SQLExpr param0 = params.get(0); + SQLExpr param1 = params.get(1); + SQLExpr param2 = null; + + param0.accept(visitor); + param1.accept(visitor); + if (paramSize == 3) { + param2 = params.get(2); + param2.accept(visitor); + } + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + Object param1Value = param1.getAttributes().get(EVAL_VALUE); + if (param0Value == null || param1Value == null) { + return SQLEvalVisitor.EVAL_ERROR; + } + + String strValue0 = param0Value.toString(); + String strValue1 = param1Value.toString(); + + if (paramSize == 2) { + int result = strValue1.indexOf(strValue0) + 1; + return result; + } + + Object param2Value = param2.getAttributes().get(EVAL_VALUE); + int start = ((Number) param2Value).intValue(); + + int result = strValue1.indexOf(strValue0, start + 1) + 1; + return result; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Lpad.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Lpad.java new file mode 100644 index 0000000000..d0e8d1372b --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Lpad.java @@ -0,0 +1,67 @@ +/* + * 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.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class Lpad implements Function { + + public final static Lpad instance = new Lpad(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + List params = x.getParameters(); + int paramSize = params.size(); + if (paramSize != 3) { + return SQLEvalVisitor.EVAL_ERROR; + } + + SQLExpr param0 = params.get(0); + SQLExpr param1 = params.get(1); + SQLExpr param2 = params.get(2); + + param0.accept(visitor); + param1.accept(visitor); + param2.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + Object param1Value = param1.getAttributes().get(EVAL_VALUE); + Object param2Value = param2.getAttributes().get(EVAL_VALUE); + if (param0Value == null || param1Value == null || param2Value == null) { + return SQLEvalVisitor.EVAL_ERROR; + } + + String strValue0 = param0Value.toString(); + int len = ((Number) param1Value).intValue(); + String strValue1 = param2Value.toString(); + + String result = strValue0; + if (result.length() > len) { + return result.substring(0, len); + } + + while (result.length() < len) { + result = strValue1 + result; + } + + return result; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Ltrim.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Ltrim.java new file mode 100644 index 0000000000..40502441fa --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Ltrim.java @@ -0,0 +1,57 @@ +/* + * 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.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class Ltrim implements Function { + + public final static Ltrim instance = new Ltrim(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + if (x.getParameters().size() != 1) { + return SQLEvalVisitor.EVAL_ERROR; + } + + SQLExpr param0 = x.getParameters().get(0); + param0.accept(visitor); + + Object param0Value = param0.getAttributes().get(EVAL_VALUE); + if (param0Value == null) { + return SQLEvalVisitor.EVAL_ERROR; + } + + String strValue = param0Value.toString(); + + int index = -1; + for (int i = 0; i < strValue.length(); ++i) { + if (!Character.isWhitespace(strValue.charAt(i))) { + index = i; + break; + } + } + + if (index <= 0) { + return strValue; + } else { + return strValue.substring(index); + } + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Substring.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Substring.java new file mode 100644 index 0000000000..4ade056894 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Substring.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.visitor.functions; + +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; + +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.visitor.SQLEvalVisitor; + +public class Substring implements Function { + + public final static Substring instance = new Substring(); + + public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { + List params = x.getParameters(); + int paramSize = params.size(); + if (paramSize != 2 && paramSize != 3) { + return SQLEvalVisitor.EVAL_ERROR; + } + + SQLExpr param0 = params.get(0); + SQLExpr param1 = params.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 SQLEvalVisitor.EVAL_ERROR; + } + + String str = param0Value.toString(); + int index = ((Number) param1Value).intValue(); + + if (paramSize == 2) { + + if (index < 0) { + int lastIndex = str.length() + index ; + return str.substring(lastIndex); + } + + return str.substring(index - 1); + } + + SQLExpr param2 = params.get(2); + param2.accept(visitor); + Object param2Value = param2.getAttributes().get(EVAL_VALUE); + if (param2Value == null) { + return SQLEvalVisitor.EVAL_ERROR; + } + + int len = ((Number) param2Value).intValue(); + + String result; + if (index < 0) { + int lastIndex = str.length() + index ; + result = str.substring(lastIndex); + } else { + result = str.substring(index - 1); + } + + return result.substring(0, len); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/functions/Unhex.java b/src/main/java/com/alibaba/druid/sql/visitor/functions/Unhex.java index de1771401c..1b634108de 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/functions/Unhex.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/functions/Unhex.java @@ -15,17 +15,15 @@ */ package com.alibaba.druid.sql.visitor.functions; -import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_EXPR; +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; import java.io.UnsupportedEncodingException; -import org.apache.xerces.impl.dv.util.HexBin; - import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.visitor.SQLEvalVisitor; +import com.alibaba.druid.util.HexBin; public class Unhex implements Function { @@ -33,7 +31,7 @@ public class Unhex implements Function { public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) { if (x.getParameters().size() != 1) { - throw new ParserException("argument's != 1, " + x.getParameters().size()); + return SQLEvalVisitor.EVAL_ERROR; } SQLExpr param0 = x.getParameters().get(0); diff --git a/src/main/resources/META-INF/druid/wall/mysql/deny-schema.txt b/src/main/resources/META-INF/druid/wall/mysql/deny-schema.txt index b0fb0a2d49..a45759cb32 100644 --- a/src/main/resources/META-INF/druid/wall/mysql/deny-schema.txt +++ b/src/main/resources/META-INF/druid/wall/mysql/deny-schema.txt @@ -1,2 +1,3 @@ information_schema -mysql \ No newline at end of file +mysql +performance_schema \ No newline at end of file diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/TAEWallTest.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/TAEWallTest.java new file mode 100644 index 0000000000..792a1ed4d2 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/TAEWallTest.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.WallUtils; + +/** + * SQLServerWallTest + * + * @author RaymondXiu + * @version 1.0, 2012-3-18 + * @see + */ +public class TAEWallTest extends TestCase { + + public void test_true() throws Exception { + Assert.assertTrue(WallUtils.isValidateMySql(// + "select * from t where 1=1 AND status = 1")); // + } + + public void test_false() throws Exception { + Assert.assertFalse(WallUtils.isValidateMySql(// + "select * from t where status = 1 AND 1=1")); // + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodBinTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodBinTest.java new file mode 100644 index 0000000000..1632b0b615 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodBinTest.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodBinTest extends TestCase { + public void test_reverse() throws Exception { + Assert.assertEquals(32, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "BIT_LENGTH('text')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodBitLengthTest.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodBitLengthTest.java new file mode 100644 index 0000000000..66640fd710 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodBitLengthTest.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 EvalMethodBitLengthTest extends TestCase { + public void test_reverse() throws Exception { + Assert.assertEquals("1100", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "BIN(12)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Char.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Char.java new file mode 100644 index 0000000000..a0bc929430 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Char.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodTest_Char extends TestCase { + public void test_reverse() throws Exception { + Assert.assertEquals("MySQL", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "CHAR(77,121,83,81,'76')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Char_1.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Char_1.java new file mode 100644 index 0000000000..6461b72c32 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Char_1.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + + +public class EvalMethodTest_Char_1 extends TestCase { + public void test_reverse() throws Exception { + Assert.assertEquals("MMM", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "CHAR(77,77.3,'77.3')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Elt.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Elt.java new file mode 100644 index 0000000000..147549e6be --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Elt.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_Elt extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("ej", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "ELT(1, 'ej', 'Heja', 'hej', 'foo')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Elt_1.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Elt_1.java new file mode 100644 index 0000000000..f4ac3fa399 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_Elt_1.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_Elt_1 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals(null, + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "ELT(11, 'ej', 'Heja', 'hej', 'foo')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert.java new file mode 100644 index 0000000000..c1642951c1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_insert extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("Quadratic", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "INSERT('Quadratic', -1, 4, 'What')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert_1.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert_1.java new file mode 100644 index 0000000000..9f0d65bd39 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert_1.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_insert_1 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("QuWhattic", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "INSERT('Quadratic', 3, 4, 'What')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert_2.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert_2.java new file mode 100644 index 0000000000..4d735f4fcd --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_insert_2.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_insert_2 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("QuWhat", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "INSERT('Quadratic', 3, 100, 'What')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_instr.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_instr.java new file mode 100644 index 0000000000..07bdaf9ecf --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_instr.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_instr extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals(4, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "INSTR('foobarbar', 'bar')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_instr_1.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_instr_1.java new file mode 100644 index 0000000000..28ae98dd62 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_instr_1.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_instr_1 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals(0, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "INSTR('xbar', 'foobar')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lcase.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lcase.java new file mode 100644 index 0000000000..47e9ce3b78 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lcase.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_lcase extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("quadratically", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LOWER('QUADRATICALLY')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_left.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_left.java new file mode 100644 index 0000000000..fec8f694ce --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_left.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_left extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("fooba", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LEFT('foobarbar', 5)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_len.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_len.java new file mode 100644 index 0000000000..96f8701e12 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_len.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_len extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals(4, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LENGTH('text')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate.java new file mode 100644 index 0000000000..0abe83a11b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_locate extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals(4, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LOCATE('bar', 'foobarbar')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate_1.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate_1.java new file mode 100644 index 0000000000..5d0631e6d6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate_1.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_locate_1 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals(0, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LOCATE('xbar', 'foobar')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate_2.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate_2.java new file mode 100644 index 0000000000..83058931fc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_locate_2.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_locate_2 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals(7, SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LOCATE('bar', 'foobarbar', 5)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lower.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lower.java new file mode 100644 index 0000000000..479c97e3ee --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lower.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_lower extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("quadratically", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LOWER('QUADRATICALLY')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lpad.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lpad.java new file mode 100644 index 0000000000..2d2ee9552d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lpad.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_lpad extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("??hi", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LPAD('hi',4,'??')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lpad_1.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lpad_1.java new file mode 100644 index 0000000000..eaae5c649b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_lpad_1.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_lpad_1 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("h", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LPAD('hi',1,'??')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_ltrim.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_ltrim.java new file mode 100644 index 0000000000..7a6147bf7e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_ltrim.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_ltrim extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("barbar", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "LTRIM(' barbar')")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_mid.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_mid.java new file mode 100644 index 0000000000..416622cfd5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_mid.java @@ -0,0 +1,15 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_mid extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("ratically", SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "mid('Quadratically',5)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring.java new file mode 100644 index 0000000000..c67465746d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_substring extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("barbar", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "SUBSTRING('foobarbar' FROM 4)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_1.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_1.java new file mode 100644 index 0000000000..2db890e7fb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_1.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_substring_1 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("ratica", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "SUBSTRING('Quadratically',5,6)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_2.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_2.java new file mode 100644 index 0000000000..7551658b8b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_2.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_substring_2 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("ila", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "SUBSTRING('Sakila', -3)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_3.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_3.java new file mode 100644 index 0000000000..1a5ed41894 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_3.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_substring_3 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("aki", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "SUBSTRING('Sakila', -5, 3)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_4.java b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_4.java new file mode 100644 index 0000000000..8a31e32ac3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/eval/EvalMethodTest_substring_4.java @@ -0,0 +1,16 @@ +package com.alibaba.druid.bvt.sql.eval; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class EvalMethodTest_substring_4 extends TestCase { + + public void test_method() throws Exception { + Assert.assertEquals("ki", + SQLEvalVisitorUtils.evalExpr(JdbcConstants.MYSQL, "SUBSTRING('Sakila' FROM -4 FOR 2)")); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringFunctionsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringFunctionsTest.java index 47ee627c55..d475d6c51e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringFunctionsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringFunctionsTest.java @@ -519,7 +519,7 @@ public class StringFunctionsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT SUBSTRING('Sakila' FROM -4 FOR 2);", text); + Assert.assertEquals("SELECT SUBSTRING('Sakila', -4, 2);", text); } public void test_45() throws Exception { @@ -530,7 +530,7 @@ public class StringFunctionsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT SUBSTRING('foobarbar' FROM 4);", text); + Assert.assertEquals("SELECT SUBSTRING('foobarbar', 4);", text); } public void test_46() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest10.java new file mode 100644 index 0000000000..6dbc0f60d5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest10.java @@ -0,0 +1,55 @@ +/* + * 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.postgresql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; + +public class PGSelectTest10 extends PGTest { + + public void test_0() throws Exception { + String sql = "SELECT nextval('passport_id_seq'::regclass) as id"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getTables().size()); + } +} + +// select categoryId , offerIds from cnres.function_select_get_spt_p4p_offer_list (' 1031918 , 1031919 , 1037004 ') as +// a(categoryId numeric,offerIds character varying(4000)) +// select memberId , offerIds from cnres.function_select_get_seller_hot_offer_list('\'gzyyd168\'') as a(memberId +// character varying(20),offerIds character varying(4000)) + diff --git a/src/test/java/com/alibaba/druid/mysql/MySqlHexTest.java b/src/test/java/com/alibaba/druid/mysql/MySqlHexTest.java index ace0aa96b6..bdb494bc28 100644 --- a/src/test/java/com/alibaba/druid/mysql/MySqlHexTest.java +++ b/src/test/java/com/alibaba/druid/mysql/MySqlHexTest.java @@ -35,9 +35,9 @@ public class MySqlHexTest extends TestCase { private DruidDataSource dataSource; protected void setUp() throws Exception { - jdbcUrl = "jdbc:mysql://10.20.149.16:3306/circe0_test"; - user = "circe"; - password = "circe"; + jdbcUrl = "jdbc:mysql://hbase-01:3306/sonar"; + user = "sonar"; + password = "sonar"; driverClass = "com.mysql.jdbc.Driver"; dataSource = new DruidDataSource(); @@ -54,7 +54,7 @@ public class MySqlHexTest extends TestCase { Connection conn = dataSource.getConnection(); - String sql = "select hex('123'),hex(123)"; + String sql = "SELECT INSERT('Quadratic', 1, 4, 'What')"; PreparedStatement stmt = conn.prepareStatement(sql);