Skip to content

Commit 5863c7c

Browse files
committed
修复explain insert 自增主键时执行的bug
1 parent df8ca5d commit 5863c7c

File tree

1 file changed

+42
-1
lines changed

1 file changed

+42
-1
lines changed

src/main/java/io/mycat/server/sqlhandler/ExplainHandler.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
*/
2424
package io.mycat.server.sqlhandler;
2525

26+
import com.alibaba.druid.sql.ast.SQLExpr;
27+
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
28+
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
29+
import com.alibaba.druid.sql.parser.SQLStatementParser;
2630
import io.mycat.MycatServer;
2731
import io.mycat.net.BufferArray;
2832
import io.mycat.net.NetSystem;
@@ -32,6 +36,7 @@
3236
import io.mycat.server.Fields;
3337
import io.mycat.server.MySQLFrontConnection;
3438
import io.mycat.server.config.node.SchemaConfig;
39+
import io.mycat.server.config.node.TableConfig;
3540
import io.mycat.server.packet.EOFPacket;
3641
import io.mycat.server.packet.FieldPacket;
3742
import io.mycat.server.packet.ResultSetHeaderPacket;
@@ -42,11 +47,14 @@
4247
import org.slf4j.Logger;
4348
import org.slf4j.LoggerFactory;
4449

50+
import java.util.List;
51+
import java.util.regex.Pattern;
52+
4553
/**
4654
* @author mycat
4755
*/
4856
public class ExplainHandler {
49-
57+
private final static Pattern pattern = Pattern.compile("(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+", Pattern.CASE_INSENSITIVE);
5058
private static final Logger logger = LoggerFactory.getLogger(ExplainHandler.class);
5159
private static final RouteResultsetNode[] EMPTY_ARRAY = new RouteResultsetNode[0];
5260
private static final int FIELD_COUNT = 2;
@@ -124,6 +132,11 @@ private static RouteResultset getRouteResultset(MySQLFrontConnection c,
124132
}
125133
try {
126134
int sqlType = ServerParse.parse(stmt) & 0xff;
135+
if(ServerParse.INSERT==sqlType&&isMycatSeq(stmt, schema))
136+
{
137+
c.writeErrMessage(ErrorCode.ER_PARSE_ERROR, "insert sql using mycat seq,you must provide primaryKey value for explain");
138+
return null;
139+
}
127140
return MycatServer
128141
.getInstance()
129142
.getRouterservice()
@@ -138,5 +151,33 @@ private static RouteResultset getRouteResultset(MySQLFrontConnection c,
138151
return null;
139152
}
140153
}
154+
private static boolean isMycatSeq(String stmt, SchemaConfig schema)
155+
{
156+
if(pattern.matcher(stmt).find()) return true;
157+
SQLStatementParser parser =new MySqlStatementParser(stmt);
158+
MySqlInsertStatement statement = (MySqlInsertStatement) parser.parseStatement();
159+
String tableName= statement.getTableName().getSimpleName();
160+
TableConfig tableConfig= schema.getTables().get(tableName.toUpperCase());
161+
if(tableConfig==null) return false;
162+
if(tableConfig.isAutoIncrement())
163+
{
164+
boolean isHasIdInSql=false;
165+
String primaryKey = tableConfig.getPrimaryKey();
166+
List<SQLExpr> columns = statement.getColumns();
167+
for (SQLExpr column : columns)
168+
{
169+
String columnName = column.toString();
170+
if(primaryKey.equalsIgnoreCase(columnName))
171+
{
172+
isHasIdInSql = true;
173+
break;
174+
}
175+
}
176+
if(!isHasIdInSql) return true;
177+
}
178+
179+
180+
return false;
181+
}
141182

142183
}

0 commit comments

Comments
 (0)