Search in sources :

Example 36 with SQLExprTableSource

use of com.alibaba.druid.sql.ast.statement.SQLExprTableSource in project dble by actiontech.

the class DruidDeleteParser method visitorParse.

@Override
public SchemaConfig visitorParse(SchemaConfig schema, RouteResultset rrs, SQLStatement stmt, ServerSchemaStatVisitor visitor, ServerConnection sc) throws SQLException {
    String schemaName = schema == null ? null : schema.getName();
    MySqlDeleteStatement delete = (MySqlDeleteStatement) stmt;
    SQLTableSource tableSource = delete.getTableSource();
    SQLTableSource fromSource = delete.getFrom();
    if (fromSource != null) {
        tableSource = fromSource;
    }
    if (tableSource instanceof SQLJoinTableSource) {
        StringPtr sqlSchema = new StringPtr(null);
        if (!SchemaUtil.isNoSharding(sc, (SQLJoinTableSource) tableSource, stmt, schemaName, sqlSchema)) {
            String msg = "DELETE query with multiple tables is not supported, sql:" + stmt;
            throw new SQLNonTransientException(msg);
        } else {
            if (delete.getWhere() != null && !SchemaUtil.isNoSharding(sc, delete.getWhere(), schemaName, sqlSchema)) {
                String msg = "DELETE query with sub-query is not supported, sql:" + stmt;
                throw new SQLNonTransientException(msg);
            }
            String realSchema = sqlSchema.get() == null ? schemaName : sqlSchema.get();
            SchemaConfig schemaConfig = DbleServer.getInstance().getConfig().getSchemas().get(realSchema);
            rrs.setStatement(RouterUtil.removeSchema(rrs.getStatement(), realSchema));
            RouterUtil.routeToSingleNode(rrs, schemaConfig.getDataNode());
            rrs.setFinishedRoute(true);
            return schema;
        }
    } else {
        SQLExprTableSource deleteTableSource = (SQLExprTableSource) tableSource;
        SchemaInfo schemaInfo = SchemaUtil.getSchemaInfo(sc.getUser(), schemaName, deleteTableSource);
        if (!ServerPrivileges.checkPrivilege(sc, schemaInfo.getSchema(), schemaInfo.getTable(), CheckType.DELETE)) {
            String msg = "The statement DML privilege check is not passed, sql:" + stmt;
            throw new SQLNonTransientException(msg);
        }
        schema = schemaInfo.getSchemaConfig();
        rrs.setStatement(RouterUtil.removeSchema(rrs.getStatement(), schemaInfo.getSchema()));
        if (RouterUtil.isNoSharding(schema, schemaInfo.getTable())) {
            if (delete.getWhere() != null && !SchemaUtil.isNoSharding(sc, delete.getWhere(), schemaName, new StringPtr(schemaInfo.getSchema()))) {
                String msg = "DELETE query with sub-query is not supported, sql:" + stmt;
                throw new SQLNonTransientException(msg);
            }
            RouterUtil.routeToSingleNode(rrs, schema.getDataNode());
            return schema;
        }
        super.visitorParse(schema, rrs, stmt, visitor, sc);
        if (visitor.isHasSubQuery()) {
            String msg = "DELETE query with sub-query  is not supported, sql:" + stmt;
            throw new SQLNonTransientException(msg);
        }
        TableConfig tc = schema.getTables().get(schemaInfo.getTable());
        if (tc != null && tc.isGlobalTable()) {
            RouterUtil.routeToMultiNode(false, rrs, tc.getDataNodes(), tc.isGlobalTable());
            rrs.setFinishedRoute(true);
            return schema;
        }
    }
    return schema;
}
Also used : MySqlDeleteStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement) SQLNonTransientException(java.sql.SQLNonTransientException) SchemaConfig(com.actiontech.dble.config.model.SchemaConfig) StringPtr(com.actiontech.dble.plan.common.ptr.StringPtr) TableConfig(com.actiontech.dble.config.model.TableConfig) SQLExprTableSource(com.alibaba.druid.sql.ast.statement.SQLExprTableSource) SQLJoinTableSource(com.alibaba.druid.sql.ast.statement.SQLJoinTableSource) SQLTableSource(com.alibaba.druid.sql.ast.statement.SQLTableSource) SchemaInfo(com.actiontech.dble.server.util.SchemaUtil.SchemaInfo)

Example 37 with SQLExprTableSource

use of com.alibaba.druid.sql.ast.statement.SQLExprTableSource in project canal by alibaba.

the class DruidDdlParser method parse.

public static List<DdlResult> parse(String queryString, String schmeaName) {
    List<SQLStatement> stmtList = null;
    try {
        stmtList = SQLUtils.parseStatements(queryString, JdbcConstants.MYSQL, false);
    } catch (ParserException e) {
        // 可能存在一些SQL是不支持的,比如存储过程
        DdlResult ddlResult = new DdlResult();
        ddlResult.setType(EventType.QUERY);
        return Arrays.asList(ddlResult);
    }
    List<DdlResult> ddlResults = new ArrayList<>();
    for (SQLStatement statement : stmtList) {
        if (statement instanceof SQLCreateTableStatement) {
            DdlResult ddlResult = new DdlResult();
            SQLCreateTableStatement createTable = (SQLCreateTableStatement) statement;
            processName(ddlResult, schmeaName, createTable.getName(), false);
            ddlResult.setType(EventType.CREATE);
            ddlResults.add(ddlResult);
        } else if (statement instanceof SQLAlterTableStatement) {
            SQLAlterTableStatement alterTable = (SQLAlterTableStatement) statement;
            if (alterTable.getTableOptions().size() > 0) {
                DdlResult ddlResult = new DdlResult();
                processName(ddlResult, schmeaName, alterTable.getName(), false);
                ddlResult.setType(EventType.ALTER);
                ddlResults.add(ddlResult);
            }
            for (SQLAlterTableItem item : alterTable.getItems()) {
                if (item instanceof SQLAlterTableRename) {
                    DdlResult ddlResult = new DdlResult();
                    processName(ddlResult, schmeaName, alterTable.getName(), true);
                    processName(ddlResult, schmeaName, ((SQLAlterTableRename) item).getToName(), false);
                    ddlResult.setType(EventType.RENAME);
                    ddlResults.add(ddlResult);
                } else if (item instanceof SQLAlterTableAddIndex) {
                    DdlResult ddlResult = new DdlResult();
                    processName(ddlResult, schmeaName, alterTable.getName(), false);
                    ddlResult.setType(EventType.CINDEX);
                    ddlResults.add(ddlResult);
                } else if (item instanceof SQLAlterTableDropIndex || item instanceof SQLAlterTableDropKey) {
                    DdlResult ddlResult = new DdlResult();
                    processName(ddlResult, schmeaName, alterTable.getName(), false);
                    ddlResult.setType(EventType.DINDEX);
                    ddlResults.add(ddlResult);
                } else if (item instanceof SQLAlterTableAddConstraint) {
                    DdlResult ddlResult = new DdlResult();
                    processName(ddlResult, schmeaName, alterTable.getName(), false);
                    SQLConstraint constraint = ((SQLAlterTableAddConstraint) item).getConstraint();
                    if (constraint instanceof SQLUnique) {
                        ddlResult.setType(EventType.CINDEX);
                        ddlResults.add(ddlResult);
                    }
                } else if (item instanceof SQLAlterTableDropConstraint) {
                    DdlResult ddlResult = new DdlResult();
                    processName(ddlResult, schmeaName, alterTable.getName(), false);
                    ddlResult.setType(EventType.DINDEX);
                    ddlResults.add(ddlResult);
                } else {
                    DdlResult ddlResult = new DdlResult();
                    processName(ddlResult, schmeaName, alterTable.getName(), false);
                    ddlResult.setType(EventType.ALTER);
                    ddlResults.add(ddlResult);
                }
            }
        } else if (statement instanceof SQLDropTableStatement) {
            SQLDropTableStatement dropTable = (SQLDropTableStatement) statement;
            for (SQLExprTableSource tableSource : dropTable.getTableSources()) {
                DdlResult ddlResult = new DdlResult();
                processName(ddlResult, schmeaName, tableSource.getExpr(), false);
                ddlResult.setType(EventType.ERASE);
                ddlResults.add(ddlResult);
            }
        } else if (statement instanceof SQLCreateIndexStatement) {
            SQLCreateIndexStatement createIndex = (SQLCreateIndexStatement) statement;
            SQLTableSource tableSource = createIndex.getTable();
            DdlResult ddlResult = new DdlResult();
            processName(ddlResult, schmeaName, ((SQLExprTableSource) tableSource).getExpr(), false);
            ddlResult.setType(EventType.CINDEX);
            ddlResults.add(ddlResult);
        } else if (statement instanceof SQLDropIndexStatement) {
            SQLDropIndexStatement dropIndex = (SQLDropIndexStatement) statement;
            SQLExprTableSource tableSource = dropIndex.getTableName();
            DdlResult ddlResult = new DdlResult();
            processName(ddlResult, schmeaName, tableSource.getExpr(), false);
            ddlResult.setType(EventType.DINDEX);
            ddlResults.add(ddlResult);
        } else if (statement instanceof SQLTruncateStatement) {
            SQLTruncateStatement truncate = (SQLTruncateStatement) statement;
            for (SQLExprTableSource tableSource : truncate.getTableSources()) {
                DdlResult ddlResult = new DdlResult();
                processName(ddlResult, schmeaName, tableSource.getExpr(), false);
                ddlResult.setType(EventType.TRUNCATE);
                ddlResults.add(ddlResult);
            }
        } else if (statement instanceof MySqlRenameTableStatement) {
            MySqlRenameTableStatement rename = (MySqlRenameTableStatement) statement;
            for (Item item : rename.getItems()) {
                DdlResult ddlResult = new DdlResult();
                processName(ddlResult, schmeaName, item.getName(), true);
                processName(ddlResult, schmeaName, item.getTo(), false);
                ddlResult.setType(EventType.RENAME);
                ddlResults.add(ddlResult);
            }
        } else if (statement instanceof SQLInsertStatement) {
            DdlResult ddlResult = new DdlResult();
            SQLInsertStatement insert = (SQLInsertStatement) statement;
            processName(ddlResult, schmeaName, insert.getTableName(), false);
            ddlResult.setType(EventType.INSERT);
            ddlResults.add(ddlResult);
        } else if (statement instanceof SQLUpdateStatement) {
            DdlResult ddlResult = new DdlResult();
            SQLUpdateStatement update = (SQLUpdateStatement) statement;
            // 拿到的表名可能为null,比如update a,b set a.id=x
            processName(ddlResult, schmeaName, update.getTableName(), false);
            ddlResult.setType(EventType.UPDATE);
            ddlResults.add(ddlResult);
        } else if (statement instanceof SQLDeleteStatement) {
            DdlResult ddlResult = new DdlResult();
            SQLDeleteStatement delete = (SQLDeleteStatement) statement;
            // 拿到的表名可能为null,比如delete a,b from a where a.id = b.id
            processName(ddlResult, schmeaName, delete.getTableName(), false);
            ddlResult.setType(EventType.DELETE);
            ddlResults.add(ddlResult);
        } else if (statement instanceof SQLCreateDatabaseStatement) {
            SQLCreateDatabaseStatement create = (SQLCreateDatabaseStatement) statement;
            DdlResult ddlResult = new DdlResult();
            ddlResult.setType(EventType.QUERY);
            processName(ddlResult, create.getDatabaseName(), null, false);
            ddlResults.add(ddlResult);
        } else if (statement instanceof SQLDropDatabaseStatement) {
            SQLDropDatabaseStatement drop = (SQLDropDatabaseStatement) statement;
            DdlResult ddlResult = new DdlResult();
            ddlResult.setType(EventType.QUERY);
            processName(ddlResult, drop.getDatabaseName(), null, false);
            ddlResults.add(ddlResult);
        }
    }
    return ddlResults;
}
Also used : SQLCreateTableStatement(com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement) SQLAlterTableAddConstraint(com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint) ArrayList(java.util.ArrayList) SQLAlterTableDropIndex(com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex) SQLAlterTableStatement(com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement) SQLDropDatabaseStatement(com.alibaba.druid.sql.ast.statement.SQLDropDatabaseStatement) SQLUnique(com.alibaba.druid.sql.ast.statement.SQLUnique) SQLAlterTableDropKey(com.alibaba.druid.sql.ast.statement.SQLAlterTableDropKey) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) SQLTableSource(com.alibaba.druid.sql.ast.statement.SQLTableSource) SQLAlterTableItem(com.alibaba.druid.sql.ast.statement.SQLAlterTableItem) SQLDropTableStatement(com.alibaba.druid.sql.ast.statement.SQLDropTableStatement) Item(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement.Item) SQLAlterTableItem(com.alibaba.druid.sql.ast.statement.SQLAlterTableItem) SQLCreateDatabaseStatement(com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement) SQLAlterTableRename(com.alibaba.druid.sql.ast.statement.SQLAlterTableRename) SQLInsertStatement(com.alibaba.druid.sql.ast.statement.SQLInsertStatement) MySqlRenameTableStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement) SQLDropIndexStatement(com.alibaba.druid.sql.ast.statement.SQLDropIndexStatement) ParserException(com.alibaba.druid.sql.parser.ParserException) SQLConstraint(com.alibaba.druid.sql.ast.statement.SQLConstraint) SQLAlterTableDropConstraint(com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint) SQLUpdateStatement(com.alibaba.druid.sql.ast.statement.SQLUpdateStatement) SQLAlterTableAddIndex(com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex) SQLTruncateStatement(com.alibaba.druid.sql.ast.statement.SQLTruncateStatement) SQLDeleteStatement(com.alibaba.druid.sql.ast.statement.SQLDeleteStatement) SQLExprTableSource(com.alibaba.druid.sql.ast.statement.SQLExprTableSource) SQLCreateIndexStatement(com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement)

Example 38 with SQLExprTableSource

use of com.alibaba.druid.sql.ast.statement.SQLExprTableSource in project druid by alibaba.

the class Demo3 method convert.

private String convert(String sql, List<Object> parameters) {
    SQLStatementParser parser = new MySqlStatementParser(sql);
    // 
    List<SQLStatement> stmtList = parser.parseStatementList();
    SQLStatement first = (SQLStatement) stmtList.get(0);
    MyVisitor visitor = new MyVisitor();
    first.accept(visitor);
    if (visitor.getVariantList().size() > 0) {
        SQLExpr firstVar = visitor.getVariantList().get(0);
        int userId;
        if (firstVar instanceof SQLVariantRefExpr) {
            int varIndex = (Integer) firstVar.getAttribute("varIndex");
            userId = (Integer) parameters.get(varIndex);
        } else {
            userId = ((SQLNumericLiteralExpr) firstVar).getNumber().intValue();
        }
        String tableName;
        if (userId == 1) {
            tableName = "user_1";
        } else {
            tableName = "user_x";
        }
        for (SQLExprTableSource tableSource : visitor.getTableSourceList()) {
            SQLExpr expr = tableSource.getExpr();
            if (expr instanceof SQLIdentifierExpr) {
                SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr;
                String ident = identExpr.getName();
                if (ident.equals("user")) {
                    tableSource.setExpr(new SQLIdentifierExpr(tableName));
                }
            } else if (expr instanceof SQLPropertyExpr) {
                SQLPropertyExpr proExpr = (SQLPropertyExpr) expr;
                String ident = proExpr.getName();
                if (ident.equals("user")) {
                    proExpr.setName(tableName);
                }
            }
        }
    }
    String realSql = SQLUtils.toOracleString(first);
    return realSql;
}
Also used : SQLStatementParser(com.alibaba.druid.sql.parser.SQLStatementParser) SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) SQLPropertyExpr(com.alibaba.druid.sql.ast.expr.SQLPropertyExpr) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) SQLExpr(com.alibaba.druid.sql.ast.SQLExpr) SQLNumericLiteralExpr(com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr) SQLVariantRefExpr(com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr) SQLExprTableSource(com.alibaba.druid.sql.ast.statement.SQLExprTableSource) MySqlStatementParser(com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser)

Example 39 with SQLExprTableSource

use of com.alibaba.druid.sql.ast.statement.SQLExprTableSource in project druid by alibaba.

the class SQLDeleteBuilderImpl method from.

@Override
public SQLDeleteBuilder from(String table, String alias) {
    SQLDeleteStatement delete = getSQLDeleteStatement();
    SQLExprTableSource from = new SQLExprTableSource(new SQLIdentifierExpr(table), alias);
    delete.setTableSource(from);
    return this;
}
Also used : SQLDeleteStatement(com.alibaba.druid.sql.ast.statement.SQLDeleteStatement) SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) SQLExprTableSource(com.alibaba.druid.sql.ast.statement.SQLExprTableSource)

Example 40 with SQLExprTableSource

use of com.alibaba.druid.sql.ast.statement.SQLExprTableSource in project druid by alibaba.

the class SQLUpdateBuilderImpl method from.

@Override
public SQLUpdateBuilderImpl from(String table, String alias) {
    SQLUpdateStatement update = getSQLUpdateStatement();
    SQLExprTableSource from = new SQLExprTableSource(new SQLIdentifierExpr(table), alias);
    update.setTableSource(from);
    return this;
}
Also used : SQLUpdateStatement(com.alibaba.druid.sql.ast.statement.SQLUpdateStatement) SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) SQLExprTableSource(com.alibaba.druid.sql.ast.statement.SQLExprTableSource)

Aggregations

SQLExprTableSource (com.alibaba.druid.sql.ast.statement.SQLExprTableSource)51 SQLIdentifierExpr (com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr)17 MySqlStatementParser (com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser)12 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)11 SQLTableSource (com.alibaba.druid.sql.ast.statement.SQLTableSource)10 SQLExpr (com.alibaba.druid.sql.ast.SQLExpr)9 TableStat (com.alibaba.druid.stat.TableStat)8 SQLNonTransientException (java.sql.SQLNonTransientException)8 SQLName (com.alibaba.druid.sql.ast.SQLName)7 SQLSelectQuery (com.alibaba.druid.sql.ast.statement.SQLSelectQuery)7 SQLStatementParser (com.alibaba.druid.sql.parser.SQLStatementParser)7 SQLSelectQueryBlock (com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock)5 MySqlSelectQueryBlock (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock)5 TableConfig (com.actiontech.dble.config.model.TableConfig)4 SQLObject (com.alibaba.druid.sql.ast.SQLObject)4 SQLVariantRefExpr (com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr)4 SQLCreateTableStatement (com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement)4 SQLDeleteStatement (com.alibaba.druid.sql.ast.statement.SQLDeleteStatement)4 SQLSelectStatement (com.alibaba.druid.sql.ast.statement.SQLSelectStatement)4 RouteResultsetNode (io.mycat.route.RouteResultsetNode)4