提交 1c074d4c 编写于 作者: T terrymanu

support SHOW CREATE TABLE

上级 da5a67c9
......@@ -35,6 +35,7 @@ import io.shardingjdbc.core.merger.SelectMergeEngine;
import io.shardingjdbc.core.parsing.parser.context.GeneratedKey;
import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement;
import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.DQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement;
import io.shardingjdbc.core.routing.PreparedStatementRoutingEngine;
import io.shardingjdbc.core.routing.SQLExecutionUnit;
......@@ -274,7 +275,7 @@ public final class ShardingPreparedStatement extends AbstractShardingPreparedSta
if (null != currentResultSet) {
return currentResultSet;
}
if (1 == routedStatements.size()) {
if (1 == routedStatements.size() && routeResult.getSqlStatement() instanceof DQLStatement) {
currentResultSet = routedStatements.iterator().next().getResultSet();
return currentResultSet;
}
......
......@@ -31,6 +31,7 @@ import io.shardingjdbc.core.merger.SelectMergeEngine;
import io.shardingjdbc.core.parsing.parser.context.GeneratedKey;
import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement;
import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.DQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement;
import io.shardingjdbc.core.routing.SQLExecutionUnit;
import io.shardingjdbc.core.routing.SQLRouteResult;
......@@ -249,7 +250,7 @@ public class ShardingStatement extends AbstractStatementAdapter {
if (null != currentResultSet) {
return currentResultSet;
}
if (1 == routedStatements.size()) {
if (1 == routedStatements.size() && routeResult.getSqlStatement() instanceof DQLStatement) {
currentResultSet = routedStatements.iterator().next().getResultSet();
return currentResultSet;
}
......
......@@ -17,9 +17,11 @@
package io.shardingjdbc.core.merger;
import io.shardingjdbc.core.merger.show.ShowCreateTableResultSetMerger;
import io.shardingjdbc.core.merger.show.ShowDatabasesResultSetMerger;
import io.shardingjdbc.core.merger.show.ShowOtherResultSetMerger;
import io.shardingjdbc.core.merger.show.ShowTablesResultSetMerger;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowCreateTableStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowDatabasesStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowTablesStatement;
import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement;
......@@ -52,6 +54,9 @@ public final class DALMergeEngine implements MergeEngine {
if (dalStatement instanceof ShowTablesStatement) {
return new ShowTablesResultSetMerger(shardingRule, resultSets);
}
if (dalStatement instanceof ShowCreateTableStatement) {
return new ShowCreateTableResultSetMerger(shardingRule, resultSets);
}
return new ShowOtherResultSetMerger(resultSets.get(0));
}
}
package io.shardingjdbc.core.merger.show;
import com.google.common.base.Optional;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.merger.common.AbstractMemoryResultSetMerger;
import io.shardingjdbc.core.merger.common.MemoryResultSetRow;
import io.shardingjdbc.core.parsing.SQLParsingEngine;
import io.shardingjdbc.core.rule.ShardingRule;
import io.shardingjdbc.core.rule.TableRule;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* Show create table result set merger.
*
* @author zhangliang
*/
public final class ShowCreateTableResultSetMerger extends AbstractMemoryResultSetMerger {
private static final Map<String, Integer> LABEL_AND_INDEX_MAP = new HashMap<>(2, 1);
private final ShardingRule shardingRule;
private final Iterator<MemoryResultSetRow> memoryResultSetRows;
static {
LABEL_AND_INDEX_MAP.put("Table", 1);
LABEL_AND_INDEX_MAP.put("Create Table", 2);
}
public ShowCreateTableResultSetMerger(final ShardingRule shardingRule, final List<ResultSet> resultSets) throws SQLException {
super(LABEL_AND_INDEX_MAP);
this.shardingRule = shardingRule;
memoryResultSetRows = init(resultSets);
}
private Iterator<MemoryResultSetRow> init(final List<ResultSet> resultSets) throws SQLException {
List<MemoryResultSetRow> result = new LinkedList<>();
for (ResultSet each : resultSets) {
while (each.next()) {
MemoryResultSetRow memoryResultSetRow = new MemoryResultSetRow(each);
String tableName = memoryResultSetRow.getCell(1).toString();
Optional<TableRule> tableRule = shardingRule.tryFindTableRuleByActualTable(tableName);
if (tableRule.isPresent()) {
String logicTableName = tableRule.get().getLogicTable();
memoryResultSetRow.setCell(1, logicTableName);
String createTableDDL = memoryResultSetRow.getCell(2).toString();
SQLParsingEngine sqlParsingEngine = new SQLParsingEngine(DatabaseType.MySQL, createTableDDL, shardingRule);
String actualTableName = sqlParsingEngine.parse().getTables().getSingleTableName();
if (actualTableName.startsWith("`")) {
logicTableName = "`" + logicTableName + "`";
}
memoryResultSetRow.setCell(2, createTableDDL.replaceFirst(actualTableName, logicTableName));
result.add(memoryResultSetRow);
}
}
}
if (!result.isEmpty()) {
setCurrentResultSetRow(result.get(0));
}
return result.iterator();
}
@Override
public boolean next() throws SQLException {
if (memoryResultSetRows.hasNext()) {
setCurrentResultSetRow(memoryResultSetRows.next());
return true;
}
return false;
}
}
......@@ -5,6 +5,7 @@ import io.shardingjdbc.core.parsing.lexer.dialect.mysql.MySQLKeyword;
import io.shardingjdbc.core.parsing.lexer.token.DefaultKeyword;
import io.shardingjdbc.core.parsing.parser.clause.TableReferencesClauseParser;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowColumnsStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowCreateTableStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowDatabasesStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowOtherStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowTablesStatement;
......@@ -45,9 +46,15 @@ public final class MySQLShowParser extends AbstractShowParser {
DALStatement result = new ShowColumnsStatement();
lexerEngine.skipIfEqual(DefaultKeyword.FROM, DefaultKeyword.IN);
tableReferencesClauseParser.parseSingleTableWithoutAlias(result);
lexerEngine.skipIfEqual(DefaultKeyword.FROM, DefaultKeyword.IN);
int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length();
result.getSqlTokens().add(new SchemaToken(beginPosition, lexerEngine.getCurrentToken().getLiterals(), result.getTables().getSingleTableName()));
if (lexerEngine.skipIfEqual(DefaultKeyword.FROM, DefaultKeyword.IN)) {
int beginPosition = lexerEngine.getCurrentToken().getEndPosition() - lexerEngine.getCurrentToken().getLiterals().length();
result.getSqlTokens().add(new SchemaToken(beginPosition, lexerEngine.getCurrentToken().getLiterals(), result.getTables().getSingleTableName()));
}
return result;
}
if (lexerEngine.skipIfEqual(DefaultKeyword.CREATE) && lexerEngine.skipIfEqual(DefaultKeyword.TABLE)) {
DALStatement result = new ShowCreateTableStatement();
tableReferencesClauseParser.parseSingleTableWithoutAlias(result);
return result;
}
return new ShowOtherStatement();
......
package io.shardingjdbc.core.parsing.parser.dialect.mysql.statement;
import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement;
/**
* Show create table statement.
*
* @author zhangliang
*/
public final class ShowCreateTableStatement extends DALStatement {
}
......@@ -21,13 +21,11 @@ import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.core.jdbc.core.ShardingContext;
import io.shardingjdbc.core.parsing.SQLParsingEngine;
import io.shardingjdbc.core.parsing.parser.context.GeneratedKey;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.DescribeStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowColumnsStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowDatabasesStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowOtherStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.ShowTablesStatement;
import io.shardingjdbc.core.parsing.parser.dialect.mysql.statement.UseStatement;
import io.shardingjdbc.core.parsing.parser.sql.SQLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dal.DALStatement;
import io.shardingjdbc.core.parsing.parser.sql.ddl.DDLStatement;
import io.shardingjdbc.core.parsing.parser.sql.dml.insert.InsertStatement;
import io.shardingjdbc.core.parsing.parser.sql.dql.select.SelectStatement;
......@@ -125,7 +123,7 @@ public final class ParsingSQLRouter implements SQLRouter {
routingEngine = new TableBroadcastRoutingEngine(shardingRule, sqlStatement);
} else if (sqlStatement instanceof ShowDatabasesStatement || sqlStatement instanceof ShowTablesStatement) {
routingEngine = new DatabaseBroadcastRoutingEngine(shardingRule);
} else if (sqlStatement instanceof ShowColumnsStatement || sqlStatement instanceof ShowOtherStatement || sqlStatement instanceof DescribeStatement) {
} else if (sqlStatement instanceof DALStatement) {
routingEngine = new UnicastRoutingEngine(shardingRule, sqlStatement);
} else if (tableNames.isEmpty() && sqlStatement instanceof SelectStatement) {
routingEngine = new UnicastRoutingEngine(shardingRule, sqlStatement);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册