diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java index 1dd1fc4aa7a2453e3c716d92e1120f2cb60f40bb..ed13790993af621a43cde99f881586dc416813a2 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/ShardingPreparedStatement.java @@ -124,7 +124,9 @@ public final class ShardingPreparedStatement extends AbstractPreparedStatementAd int[] result = new int[batchParameters.size()]; int i = 0; for (List each : batchParameters) { - result[i++] = new PreparedStatementExecutor(getShardingConnection().getContext().getExecutorEngine(), routeSQL(each)).executeUpdate(); + List routePreparedStatements = routeSQL(each); + cachedRoutedPreparedStatements.addAll(routePreparedStatements); + result[i++] = new PreparedStatementExecutor(getShardingConnection().getContext().getExecutorEngine(), routePreparedStatements).executeUpdate(); } return result; } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/visitor/basic/mysql/MySQLInsertVisitor.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/visitor/basic/mysql/MySQLInsertVisitor.java index 84d98c01efc665614468eda340f41ace1b51fb8a..e35cf8f97aa45c2db03b3411e7462f6fded19108 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/visitor/basic/mysql/MySQLInsertVisitor.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/parser/visitor/basic/mysql/MySQLInsertVisitor.java @@ -18,6 +18,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.visitor.basic.mysql; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; +import com.dangdang.ddframe.rdb.sharding.exception.SQLParserException; import com.dangdang.ddframe.rdb.sharding.parser.result.router.Condition.BinaryOperator; import com.google.common.base.Optional; @@ -34,6 +35,15 @@ public class MySQLInsertVisitor extends AbstractMySQLVisitor { for (int i = 0; i < x.getColumns().size(); i++) { getParseContext().addCondition(x.getColumns().get(i).toString(), x.getTableName().toString(), BinaryOperator.EQUAL, x.getValues().getValues().get(i), getDatabaseType(), getParameters()); } + if (getParseContext().getCurrentConditionContext().isEmpty()) { + String errMsg; + if (x.getColumns().size() < 1) { + errMsg = "Insert statement DOES NOT contains column name.The syntax is : INSERT INTO tbl_name (col_name,...) VALUES (expr,...)"; + } else { + errMsg = "Sharding columns DO NOT exist in insert column names"; + } + throw new SQLParserException(errMsg); + } return super.visit(x); } } diff --git a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/UnsupportedParseTest.java b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/UnsupportedParseTest.java index 0e2e6428c5fd3af8f65a6b544b38542ae55513cc..6f7031033f4742b95e55c113520f8e9f1f9b973e 100644 --- a/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/UnsupportedParseTest.java +++ b/sharding-jdbc-core/src/test/java/com/dangdang/ddframe/rdb/sharding/parser/UnsupportedParseTest.java @@ -17,15 +17,21 @@ package com.dangdang.ddframe.rdb.sharding.parser; +import java.util.Arrays; import java.util.Collections; -import org.junit.Test; - import com.dangdang.ddframe.rdb.sharding.api.DatabaseType; import com.dangdang.ddframe.rdb.sharding.exception.SQLParserException; +import com.google.common.collect.Lists; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; public final class UnsupportedParseTest { + @Rule + public ExpectedException expectedException = ExpectedException.none(); + @Test(expected = SQLParserException.class) public void assertCreate() throws SQLParserException { SQLParserFactory.create(DatabaseType.MySQL, "CREATE TABLE `order` (id BIGINT(10))", Collections.emptyList(), Collections.emptyList()); @@ -45,4 +51,18 @@ public final class UnsupportedParseTest { public void assertAlter() throws SQLParserException { SQLParserFactory.create(DatabaseType.MySQL, "ALTER TABLE `order` ADD COLUMN `other` VARCHAR(45)", Collections.emptyList(), Collections.emptyList()); } + + @Test + public void testWithoutColumnNames() { + expectedException.expect(SQLParserException.class); + expectedException.expectMessage("Insert statement DOES NOT contains column name.The syntax is : INSERT INTO tbl_name (col_name,...) VALUES (expr,...)"); + SQLParserFactory.create(DatabaseType.MySQL, "insert into `t_order` values(1,2,'INSERT')", Lists.newArrayList(), Arrays.asList("order_id", "user_id")).parse(); + } + + @Test + public void testWithoutMissShardingKey() { + expectedException.expect(SQLParserException.class); + expectedException.expectMessage("Sharding columns DO NOT exist in insert column names"); + SQLParserFactory.create(DatabaseType.MySQL, "insert into `t_order`(ORDER_ID, USER_ID) values(1,2,'INSERT')", Lists.newArrayList(), Arrays.asList("order_id", "user_id")).parse(); + } }