diff --git a/src/main/java/com/actiontech/dble/plan/common/item/function/ItemFuncKeyWord.java b/src/main/java/com/actiontech/dble/plan/common/item/function/ItemFuncKeyWord.java index c32cefc8b..3c1e4bd68 100644 --- a/src/main/java/com/actiontech/dble/plan/common/item/function/ItemFuncKeyWord.java +++ b/src/main/java/com/actiontech/dble/plan/common/item/function/ItemFuncKeyWord.java @@ -10,7 +10,6 @@ public final class ItemFuncKeyWord { } public static final String USING = "USING"; - public static final String FROM = "FROM"; public static final String ORDER_BY = "ORDER BY"; public static final String SEPARATOR = "SEPARATOR"; } diff --git a/src/main/java/com/actiontech/dble/plan/common/item/function/castfunc/ItemFuncConvCharset.java b/src/main/java/com/actiontech/dble/plan/common/item/function/castfunc/ItemFuncConvCharset.java index eddbb46b0..21e8093ec 100644 --- a/src/main/java/com/actiontech/dble/plan/common/item/function/castfunc/ItemFuncConvCharset.java +++ b/src/main/java/com/actiontech/dble/plan/common/item/function/castfunc/ItemFuncConvCharset.java @@ -11,6 +11,7 @@ import com.actiontech.dble.plan.common.item.Item; import com.actiontech.dble.plan.common.item.function.ItemFuncKeyWord; import com.actiontech.dble.plan.common.item.function.strfunc.ItemStrFunc; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import java.io.UnsupportedEncodingException; @@ -56,7 +57,7 @@ public class ItemFuncConvCharset extends ItemStrFunc { public SQLExpr toExpression() { SQLMethodInvokeExpr method = new SQLMethodInvokeExpr(funcName()); method.addParameter(args.get(0).toExpression()); - method.putAttribute(ItemFuncKeyWord.USING, mysqlCharset); + method.setUsing(new SQLIdentifierExpr(mysqlCharset)); return method; } diff --git a/src/main/java/com/actiontech/dble/plan/visitor/MySQLItemVisitor.java b/src/main/java/com/actiontech/dble/plan/visitor/MySQLItemVisitor.java index cad8af57b..5659813ca 100644 --- a/src/main/java/com/actiontech/dble/plan/visitor/MySQLItemVisitor.java +++ b/src/main/java/com/actiontech/dble/plan/visitor/MySQLItemVisitor.java @@ -567,10 +567,11 @@ public class MySQLItemVisitor extends MySqlASTVisitorAdapter { item = ItemCreate.getInstance().createFuncConvert(args.get(0), castType); } } else { - if (attributes == null || attributes.get(ItemFuncKeyWord.USING) == null) { - throw new MySQLOutPutException(ErrorCode.ER_OPTIMIZER, "", "CONVERT(... USING ...) is standard SQL syntax"); + SQLExpr using = x.getUsing(); + if (using == null || !(using instanceof SQLIdentifierExpr)) { + throw new MySQLOutPutException(ErrorCode.ER_OPTIMIZER, "", "CONVERT(... USING ...) is standard SQL syntax,You should set correct charset"); } - item = new ItemFuncConvCharset(args.get(0), (String) attributes.get(ItemFuncKeyWord.USING)); + item = new ItemFuncConvCharset(args.get(0), ((SQLIdentifierExpr) using).getSimpleName()); } break; case "CHAR": diff --git a/src/test/java/demo/test/Testparser.java b/src/test/java/demo/test/Testparser.java index d5ef96098..087337340 100644 --- a/src/test/java/demo/test/Testparser.java +++ b/src/test/java/demo/test/Testparser.java @@ -307,6 +307,8 @@ public class Testparser { // selectSQl = "SELECT 1 IS NULL,1 IS NOT UNKNOWN,1 IS TRUE, 0 IS FALSE,2 IN (0,3,5,7), 2 >= 2,1 = 0,2 BETWEEN 1 AND 3;"; // obj.test(selectSQl); // selectSQl = "select CAST(expr AS datetime(6) ), CAST(expr AS date ), CAST(expr AS time(6) ) from char_columns where id =1 and name = 'x';"; + selectSQl = "SELECT CHARSET(CHAR(X'65')), CHARSET(CHAR(X'65' USING utf8));"; + obj.test(selectSQl); selectSQl = "select CAST(expr AS nchar(2) CHARACTER SET utf8),CAST(expr AS char(2)), CAST(expr AS char(2) CHARACTER SET utf8 ),CAST(expr AS char(2) CHARACTER SET latin1 ) from char_columns where id =1 and name = 'x';"; obj.test(selectSQl); selectSQl = "select CAST(expr AS char(2) CHARACTER SET utf8 ),CAST(expr AS SIGNED ),CAST(expr AS unSIGNED ) from char_columns where id =1 and name = 'x';";