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 781e05f4ae..bb47e66528 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 @@ -692,12 +692,17 @@ public class MySqlExprParser extends SQLExprParser { if ("NAMES".equalsIgnoreCase(ident)) { String charset = lexer.stringVal(); + SQLExpr varExpr = null; boolean chars = false; + final Token token = lexer.token(); if (lexer.token() == Token.IDENTIFIER) { lexer.nextToken(); } else if (lexer.token() == Token.DEFAULT) { charset = "DEFAULT"; lexer.nextToken(); + } else if (lexer.token() == Token.QUES) { + varExpr = new SQLVariantRefExpr("?"); + lexer.nextToken(); } else { chars = true; accept(Token.LITERAL_CHARS); @@ -713,10 +718,14 @@ public class MySqlExprParser extends SQLExprParser { item.setValue(charsetExpr); } else { - item.setValue(chars - ? new SQLCharExpr(charset) - : new SQLIdentifierExpr(charset) - ); + if (varExpr != null) { + item.setValue(varExpr); + } else { + item.setValue(chars + ? new SQLCharExpr(charset) + : new SQLIdentifierExpr(charset) + ); + } } item.setTarget(var); diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_qianbi.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_qianbi.java index 08c9381397..7171bc5688 100644 --- a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_qianbi.java +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_qianbi.java @@ -16,11 +16,10 @@ public class Bug_for_qianbi extends TestCase { String sql = "insert into table lol select detail(sellerid,id) as count1,sum(sellerid) as sum1 from ctu_trade_paid_done.time('natural','1d','1h') " + "where match(auctionTitle,\"男鞋\\n中石化&加油卡\\n中石化&充值卡\\n中石化&冲值卡\\n中石化&代冲\\n中石化&代充\\n中国石化&加油卡\\n中国石化&充值卡\\n中国石化&冲值卡\\n中国石化&代冲\\n中国石化&代充\",\"\\n\")"; - String expected = "INSERT INTO TABLE lol" - + "\nSELECT detail(sellerid, id) AS count1" - + "\n\t, SUM(sellerid) AS sum1" - + "\nFROM ctu_trade_paid_done:time('natural', '1d', '1h')" - + "\nWHERE match(auctionTitle, '男鞋\\n中石化&加油卡\\n中石化&充值卡\\n中石化&冲值卡\\n中石化&代冲\\n中石化&代充\\n中国石化&加油卡\\n中国石化&充值卡\\n中国石化&冲值卡\\n中国石化&代冲\\n中国石化&代充', '\\n');\n"; + String expected = "INSERT INTO TABLE lol\n" + + "SELECT detail(sellerid, id) AS count1, SUM(sellerid) AS sum1\n" + + "FROM ctu_trade_paid_done:time('natural', '1d', '1h')\n" + + "WHERE match(auctionTitle, '男鞋\\n中石化&加油卡\\n中石化&充值卡\\n中石化&冲值卡\\n中石化&代冲\\n中石化&代充\\n中国石化&加油卡\\n中国石化&充值卡\\n中国石化&冲值卡\\n中国石化&代冲\\n中国石化&代充', '\\n');\n"; StringBuilder out = new StringBuilder(); OdpsOutputVisitor visitor = new OdpsOutputVisitor(out); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest20.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest20.java index a19b0540ef..c2857f5c6b 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest20.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest20.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.bvt.filter.wall.mysql; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; import junit.framework.TestCase; import org.junit.Assert; @@ -31,7 +33,7 @@ import com.alibaba.druid.wall.WallUtils; public class MySqlWallTest20 extends TestCase { public void test_true() throws Exception { - Assert.assertTrue(WallUtils.isValidateMySql(// + assertTrue(WallUtils.isValidateMySql(// "SET sql_mode=?,NAMES ?,CHARACTER SET utf8,CHARACTER_SET_RESULTS=utf8,COLLATION_CONNECTION=?")); // } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest69.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest69.java index 04db724715..66a82ebe24 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest69.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest69.java @@ -18,76 +18,54 @@ package com.alibaba.druid.bvt.sql.oracle.create; import com.alibaba.druid.sql.OracleTest; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.util.JdbcConstants; -import org.junit.Assert; import java.util.List; -public class OracleCreateTableTest68 extends OracleTest { +public class OracleCreateTableTest69 extends OracleTest { public void test_types() throws Exception { String sql = // - " CREATE TABLE \"JWGZPT\".\"A\" \n" + - " ( \"XM\" VARCHAR2(100), \n" + - " \"SFZH\" VARCHAR2(20), \n" + - " \"GZDW\" VARCHAR2(200)\n" + - " ) SEGMENT CREATION IMMEDIATE \n" + - " PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n" + - " NOCOMPRESS LOGGING\n" + - " STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n" + - " PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n" + - " BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n" + - " TABLESPACE \"TBS_JWGZPT\" "; + " CREATE TABLE HASH_TABLE\n" + + "(\n" + + "COL NUMBER(8),\n" + + "INF VARCHAR2(100)\n" + + ")\n" + + "PARTITION BY HASH (COL)\n" + + "(\n" + + "PARTITION PART01 TABLESPACE HASH_TS01,\n" + + "PARTITION PART02 TABLESPACE HASH_TS02,\n" + + "PARTITION PART03 TABLESPACE HASH_TS03\n" + + ") "; List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); SQLStatement stmt = statementList.get(0); print(statementList); assertEquals(1, statementList.size()); - - assertEquals("CREATE TABLE \"JWGZPT\".\"A\" (\n" + - "\t\"XM\" VARCHAR2(100),\n" + - "\t\"SFZH\" VARCHAR2(20),\n" + - "\t\"GZDW\" VARCHAR2(200)\n" + - ")\n" + - "PCTFREE 10\n" + - "PCTUSED 40\n" + - "INITRANS 1\n" + - "MAXTRANS 255\n" + - "NOCOMPRESS\n" + - "LOGGING\n" + - "TABLESPACE \"TBS_JWGZPT\"\n" + - "STORAGE (\n" + - "\tINITIAL 81920\n" + - "\tNEXT 1048576\n" + - "\tMINEXTENTS 1\n" + - "\tMAXEXTENTS 2147483645\n" + - "\tPCTINCREASE 0\n" + - "\tFREELISTS 1\n" + - "\tFREELIST GROUPS 1\n" + - "\tBUFFER_POOL DEFAULT\n" + - "\tFLASH_CACHE DEFAULT\n" + - "\tCELL_FLASH_CACHE DEFAULT\n" + - ")",// - SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); - - SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); - stmt.accept(visitor); - - System.out.println("Tables : " + visitor.getTables()); - System.out.println("fields : " + visitor.getColumns()); - System.out.println("coditions : " + visitor.getConditions()); - System.out.println("relationships : " + visitor.getRelationships()); - System.out.println("orderBy : " + visitor.getOrderByColumns()); - - assertEquals(1, visitor.getTables().size()); - - assertEquals(3, visitor.getColumns().size()); - - assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); +// +// assertEquals("CREATE TABLE HASH_TABLE (\n" + +// "\tCOL NUMBER(8),\n" + +// "\tINF VARCHAR2(100)\n" + +// ")\n" + +// "PARTITION BY HASH (COL)",// +// SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); +// +// SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); +// stmt.accept(visitor); +// +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("relationships : " + visitor.getRelationships()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); +// +// assertEquals(1, visitor.getTables().size()); +// +// assertEquals(3, visitor.getColumns().size()); +// +// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); } }