Search in sources :

Example 31 with MySqlInsertStatement

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);
    }
}
Also used : SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) MySqlInsertStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) TableConfig(io.mycat.config.model.TableConfig) SQLIntegerExpr(com.alibaba.druid.sql.ast.expr.SQLIntegerExpr) MySqlStatementParser(com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser) ValuesClause(com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause)

Example 32 with MySqlInsertStatement

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;
}
Also used : SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) MySqlInsertStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement) MySqlStatementParser(com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser) SQLExpr(com.alibaba.druid.sql.ast.SQLExpr)

Example 33 with MySqlInsertStatement

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();
}
Also used : SQLInListExpr(com.alibaba.druid.sql.ast.expr.SQLInListExpr) MySqlOutputVisitor(com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor) MySqlInsertStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement) MySqlStatementParser(com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement)

Example 34 with MySqlInsertStatement

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 };
}
Also used : ArrayList(java.util.ArrayList) List(java.util.List) MySqlInsertStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement) MySqlObject(com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject) MySqlSelectIntoStatement(com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement)

Example 35 with MySqlInsertStatement

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);
}
Also used : SQLStatementParser(com.alibaba.druid.sql.parser.SQLStatementParser) OracleASTParameterizedVisitor(com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTParameterizedVisitor) MySqlParameterizedVisitor(com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedVisitor) MySqlInsertStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) SQLParserFeature(com.alibaba.druid.sql.parser.SQLParserFeature) SQLSelectStatement(com.alibaba.druid.sql.ast.statement.SQLSelectStatement) SQLSelectQueryBlock(com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock)

Aggregations

MySqlInsertStatement (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement)47 MySqlStatementParser (com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser)39 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)33 MySqlSchemaStatVisitor (com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor)14 SQLStatementParser (com.alibaba.druid.sql.parser.SQLStatementParser)8 TableConfig (io.mycat.config.model.TableConfig)8 SQLExpr (com.alibaba.druid.sql.ast.SQLExpr)7 SQLIdentifierExpr (com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr)7 ArrayList (java.util.ArrayList)7 List (java.util.List)7 SQLNonTransientException (java.sql.SQLNonTransientException)6 RouteResultset (io.mycat.route.RouteResultset)5 SQLSyntaxErrorException (java.sql.SQLSyntaxErrorException)5 SQLIntegerExpr (com.alibaba.druid.sql.ast.expr.SQLIntegerExpr)4 ValuesClause (com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause)4 RuleConfig (io.mycat.config.model.rule.RuleConfig)3 RouteResultsetNode (io.mycat.route.RouteResultsetNode)3 SlotFunction (io.mycat.route.function.SlotFunction)3 MycatStatementParser (io.mycat.route.parser.druid.MycatStatementParser)3 RouteCalculateUnit (io.mycat.route.parser.druid.RouteCalculateUnit)3