use of com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement in project Mycat-Server by MyCATApache.
the class BatchInsertSequence method route.
@Override
public void route(SystemConfig sysConfig, SchemaConfig schema, int sqlType, String realSQL, String charset, ServerConnection sc, LayerCachePool cachePool) {
int rs = ServerParse.parse(realSQL);
this.sqltype = rs & 0xff;
this.sysConfig = sysConfig;
this.schema = schema;
this.charset = charset;
this.sc = sc;
this.cachePool = cachePool;
try {
MySqlStatementParser parser = new MySqlStatementParser(realSQL);
SQLStatement statement = parser.parseStatement();
MySqlInsertStatement insert = (MySqlInsertStatement) statement;
if (insert.getValuesList() != null) {
String tableName = StringUtil.getTableName(realSQL).toUpperCase();
TableConfig tableConfig = schema.getTables().get(tableName);
// 获得表的主键字段
String primaryKey = tableConfig.getPrimaryKey();
SQLIdentifierExpr sqlIdentifierExpr = new SQLIdentifierExpr();
sqlIdentifierExpr.setName(primaryKey);
insert.getColumns().add(sqlIdentifierExpr);
if (sequenceHandler == null) {
int seqHandlerType = MycatServer.getInstance().getConfig().getSystem().getSequnceHandlerType();
switch(seqHandlerType) {
case SystemConfig.SEQUENCEHANDLER_MYSQLDB:
sequenceHandler = IncrSequenceMySQLHandler.getInstance();
break;
case SystemConfig.SEQUENCEHANDLER_LOCALFILE:
sequenceHandler = IncrSequencePropHandler.getInstance();
break;
case SystemConfig.SEQUENCEHANDLER_LOCAL_TIME:
sequenceHandler = IncrSequenceTimeHandler.getInstance();
break;
case SystemConfig.SEQUENCEHANDLER_ZK_DISTRIBUTED:
sequenceHandler = DistributedSequenceHandler.getInstance(MycatServer.getInstance().getConfig().getSystem());
break;
case SystemConfig.SEQUENCEHANDLER_ZK_GLOBAL_INCREMENT:
sequenceHandler = IncrSequenceZKHandler.getInstance();
break;
default:
throw new java.lang.IllegalArgumentException("Invalid sequnce handler type " + seqHandlerType);
}
}
for (ValuesClause vc : insert.getValuesList()) {
SQLIntegerExpr sqlIntegerExpr = new SQLIntegerExpr();
long value = sequenceHandler.nextId(tableName.toUpperCase());
// 插入生成的sequence值
sqlIntegerExpr.setNumber(value);
vc.addValue(sqlIntegerExpr);
}
String insertSql = insert.toString();
this.executeSql = insertSql;
}
} catch (Exception e) {
LOGGER.error("BatchInsertSequence.route(......)", e);
}
}
use of com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement in project dble by actiontech.
the class DruidMysqlCreateTableTest method isInsertHasSlot.
private boolean isInsertHasSlot(String sql) {
MySqlStatementParser parser = new MySqlStatementParser(sql);
MySqlInsertStatement insertStatement = (MySqlInsertStatement) parser.parseStatement();
List<SQLExpr> cc = insertStatement.getColumns();
for (SQLExpr sqlExpr : cc) {
SQLIdentifierExpr c = (SQLIdentifierExpr) sqlExpr;
if ("_slot".equalsIgnoreCase(c.getName()) && cc.size() == insertStatement.getValues().getValues().size())
return true;
}
return false;
}
use of com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement in project druid by alibaba.
the class SQLMergeTest method merge2.
private String merge2() {
String sql = "INSERT INTO T (F1, F2, F3, F4, F5) VALUES (?, ?, ?, ?, ?), (?, ?, ?, ?, ?), (?, ?, ?, ?, ?)";
StringBuilder out = new StringBuilder();
MySqlOutputVisitor visitor = new MySqlOutputVisitor(out) {
public boolean visit(SQLInListExpr x) {
x.getExpr().accept(this);
if (x.isNot()) {
print(" NOT IN (##)");
} else {
print(" IN (##)");
}
return false;
}
@Override
public boolean visit(MySqlInsertStatement x) {
print("INSERT ");
if (x.isLowPriority()) {
print("LOW_PRIORITY ");
}
if (x.isDelayed()) {
print("DELAYED ");
}
if (x.isHighPriority()) {
print("HIGH_PRIORITY ");
}
if (x.isIgnore()) {
print("IGNORE ");
}
print("INTO ");
x.getTableSource().accept(this);
if (x.getColumns().size() > 0) {
print(" (");
for (int i = 0, size = x.getColumns().size(); i < size; ++i) {
if (i != 0) {
print(", ");
}
x.getColumns().get(i).accept(this);
}
print(")");
}
if (x.getValuesList().size() != 0) {
print(" VALUES ");
int size = x.getValuesList().size();
if (size == 0) {
print("()");
} else {
for (int i = 0; i < 1; ++i) {
if (i != 0) {
print(", ");
}
x.getValuesList().get(i).accept(this);
}
}
}
if (x.getQuery() != null) {
print(" ");
x.getQuery().accept(this);
}
if (x.getDuplicateKeyUpdate().size() != 0) {
print(" ON DUPLICATE KEY UPDATE ");
printAndAccept(x.getDuplicateKeyUpdate(), ", ");
}
return false;
}
};
MySqlStatementParser parser = new MySqlStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
for (SQLStatement statement : statementList) {
statement.accept(visitor);
visitor.println();
}
return out.toString();
}
use of com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement in project druid by alibaba.
the class SQLUtils method clearLimit.
/**
* @param query
* @param dbType
* @return 0:sql.toString, 1:
*/
public static Object[] clearLimit(String query, DbType dbType) {
List stmtList = SQLUtils.parseStatements(query, dbType);
SQLLimit limit = null;
SQLStatement statement = (SQLStatement) stmtList.get(0);
if (statement instanceof SQLSelectStatement) {
SQLSelectStatement selectStatement = (SQLSelectStatement) statement;
if (selectStatement.getSelect().getQuery() instanceof SQLSelectQueryBlock) {
limit = clearLimit(selectStatement.getSelect().getQueryBlock());
}
}
if (statement instanceof SQLDumpStatement) {
SQLDumpStatement dumpStatement = (SQLDumpStatement) statement;
if (dumpStatement.getSelect().getQuery() instanceof SQLSelectQueryBlock) {
limit = clearLimit(dumpStatement.getSelect().getQueryBlock());
}
}
if (statement instanceof MySqlSelectIntoStatement) {
MySqlSelectIntoStatement sqlSelectIntoStatement = (MySqlSelectIntoStatement) statement;
limit = clearLimit(sqlSelectIntoStatement.getSelect().getQueryBlock());
}
if (statement instanceof MySqlInsertStatement) {
MySqlInsertStatement insertStatement = (MySqlInsertStatement) statement;
limit = clearLimit(insertStatement.getQuery().getQueryBlock());
}
String sql = SQLUtils.toSQLString(stmtList, dbType);
return new Object[] { sql, limit };
}
use of com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement in project druid by alibaba.
the class ParameterizedOutputVisitorUtils method parameterizeHash.
public static long parameterizeHash(String sql, DbType dbType, SQLSelectListCache selectListCache, List<Object> outParameters, VisitorFeature... visitorFeatures) {
final SQLParserFeature[] features = outParameters == null ? defaultFeatures2 : defaultFeatures;
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType, features);
if (selectListCache != null) {
parser.setSelectListCache(selectListCache);
}
List<SQLStatement> statementList = parser.parseStatementList();
final int stmtSize = statementList.size();
if (stmtSize == 0) {
return 0L;
}
StringBuilder out = new StringBuilder(sql.length());
ParameterizedVisitor visitor = createParameterizedOutputVisitor(out, dbType);
if (outParameters != null) {
visitor.setOutputParameters(outParameters);
}
configVisitorFeatures(visitor, visitorFeatures);
if (stmtSize == 1) {
SQLStatement stmt = statementList.get(0);
if (stmt.getClass() == SQLSelectStatement.class) {
SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
if (selectListCache != null) {
SQLSelectQueryBlock queryBlock = selectStmt.getSelect().getQueryBlock();
if (queryBlock != null) {
String cachedSelectList = queryBlock.getCachedSelectList();
long cachedSelectListHash = queryBlock.getCachedSelectListHash();
if (cachedSelectList != null) {
visitor.config(VisitorFeature.OutputSkipSelectListCacheString, true);
}
visitor.visit(selectStmt);
return FnvHash.fnv1a_64_lower(cachedSelectListHash, out);
}
}
visitor.visit(selectStmt);
} else if (stmt.getClass() == MySqlInsertStatement.class) {
MySqlInsertStatement insertStmt = (MySqlInsertStatement) stmt;
String columnsString = insertStmt.getColumnsString();
if (columnsString != null) {
long columnsStringHash = insertStmt.getColumnsStringHash();
visitor.config(VisitorFeature.OutputSkipInsertColumnsString, true);
((MySqlASTVisitor) visitor).visit(insertStmt);
return FnvHash.fnv1a_64_lower(columnsStringHash, out);
}
} else {
stmt.accept(visitor);
}
return FnvHash.fnv1a_64_lower(out);
}
for (int i = 0; i < statementList.size(); i++) {
if (i > 0) {
out.append(";\n");
}
SQLStatement stmt = statementList.get(i);
if (stmt.hasBeforeComment()) {
stmt.getBeforeCommentsDirect().clear();
}
Class<?> stmtClass = stmt.getClass();
if (stmtClass == SQLSelectStatement.class) {
// only for performance
SQLSelectStatement selectStatement = (SQLSelectStatement) stmt;
visitor.visit(selectStatement);
visitor.postVisit(selectStatement);
} else {
stmt.accept(visitor);
}
}
return FnvHash.fnv1a_64_lower(out);
}
Aggregations