2323 */
2424package 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 ;
2630import io .mycat .MycatServer ;
2731import io .mycat .net .BufferArray ;
2832import io .mycat .net .NetSystem ;
3236import io .mycat .server .Fields ;
3337import io .mycat .server .MySQLFrontConnection ;
3438import io .mycat .server .config .node .SchemaConfig ;
39+ import io .mycat .server .config .node .TableConfig ;
3540import io .mycat .server .packet .EOFPacket ;
3641import io .mycat .server .packet .FieldPacket ;
3742import io .mycat .server .packet .ResultSetHeaderPacket ;
4247import org .slf4j .Logger ;
4348import org .slf4j .LoggerFactory ;
4449
50+ import java .util .List ;
51+ import java .util .regex .Pattern ;
52+
4553/**
4654 * @author mycat
4755 */
4856public 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