mirror of
https://github.com/actiontech/dble.git
synced 2026-01-03 11:20:12 -06:00
[inner-2026&2030] fix bug with table aliases or schema name
This commit is contained in:
@@ -344,7 +344,7 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
parseAggGroupCommon(sc, schema, stmt, rrs, mysqlSelectQuery, tc);
|
||||
}
|
||||
|
||||
private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, List<Pair<String, String>> selectColumns, Map<String, String> aliaColumns, TableConfig tc, boolean isDistinct) throws SQLException {
|
||||
private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, List<SQLSelectItem> selectColumns, Map<String, String> aliaColumns, TableConfig tc, boolean isDistinct) throws SQLException {
|
||||
List<SQLSelectItem> selectList = mysqlSelectQuery.getSelectList();
|
||||
boolean hasPartitionColumn = false;
|
||||
for (SQLSelectItem selectItem : selectList) {
|
||||
@@ -371,7 +371,7 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
} else {
|
||||
addToAliaColumn(selectColumns, aliaColumns, selectItem);
|
||||
}
|
||||
} else if (itemExpr instanceof SQLAllColumnExpr) {
|
||||
} else if (itemExpr instanceof SQLAllColumnExpr || (itemExpr instanceof SQLPropertyExpr && ((SQLPropertyExpr) itemExpr).getName().equals("*"))) {
|
||||
StructureMeta.TableMeta tbMeta = ProxyMeta.getInstance().getTmManager().getSyncTableMeta(schema.getName(), tc.getName());
|
||||
if (tbMeta == null) {
|
||||
String msg = "Meta data of table '" + schema.getName() + "." + tc.getName() + "' doesn't exist";
|
||||
@@ -381,8 +381,7 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
for (StructureMeta.ColumnMeta column : tbMeta.getColumnsList()) {
|
||||
aliaColumns.put(column.getName(), column.getName());
|
||||
|
||||
Pair<String, String> selectCol = new Pair<>(column.getName(), column.getName());
|
||||
selectColumns.add(selectCol);
|
||||
selectColumns.add(new SQLSelectItem(new SQLIdentifierExpr(column.getName())));
|
||||
}
|
||||
} else {
|
||||
if (isDistinct && !isNeedOptimizer(itemExpr)) {
|
||||
@@ -445,7 +444,7 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
}
|
||||
}
|
||||
|
||||
private Set<SQLSelectItem> groupColumnPushSelectList(List<SQLExpr> groupByItemList, List<Pair<String, String>> selectColumns) {
|
||||
private Set<SQLSelectItem> groupColumnPushSelectList(List<SQLExpr> groupByItemList, List<SQLSelectItem> selectColumns) {
|
||||
Set<SQLSelectItem> pushItem = new HashSet<>();
|
||||
|
||||
for (SQLExpr groupByItem : groupByItemList) {
|
||||
@@ -464,8 +463,10 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
return pushItem;
|
||||
}
|
||||
|
||||
private boolean hasColumnOrAlia(String columnName, List<Pair<String, String>> selectColumns) {
|
||||
return selectColumns.stream().anyMatch(s -> s.getKey().equalsIgnoreCase(columnName) || s.getValue().equalsIgnoreCase(columnName));
|
||||
private boolean hasColumnOrAlia(String columnName, List<SQLSelectItem> selectColumns) {
|
||||
return selectColumns.stream().anyMatch(s -> (s.getAlias() != null && StringUtil.removeBackQuote(s.getAlias()).equalsIgnoreCase(columnName)) ||
|
||||
((s.getExpr() instanceof SQLPropertyExpr) && StringUtil.removeBackQuote(((SQLPropertyExpr) s.getExpr()).getSimpleName()).equalsIgnoreCase(columnName)) ||
|
||||
StringUtil.removeBackQuote(s.getExpr().toString()).equalsIgnoreCase(columnName));
|
||||
}
|
||||
|
||||
private boolean hasShardingColumn(TableConfig tc, String columnName) {
|
||||
@@ -515,16 +516,14 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
return !(expr instanceof SQLPropertyExpr) && !(expr instanceof SQLIdentifierExpr);
|
||||
}
|
||||
|
||||
private void addToAliaColumn(List<Pair<String, String>> selectColumns, Map<String, String> aliaColumns, SQLSelectItem item) {
|
||||
private void addToAliaColumn(List<SQLSelectItem> selectColumns, Map<String, String> aliaColumns, SQLSelectItem item) {
|
||||
String alia = item.getAlias();
|
||||
String field = getFieldName(item);
|
||||
if (alia == null) {
|
||||
alia = field;
|
||||
}
|
||||
aliaColumns.put(field, alia);
|
||||
|
||||
Pair<String, String> selectCol = new Pair<String, String>(alia, field);
|
||||
selectColumns.add(selectCol);
|
||||
selectColumns.add(item);
|
||||
}
|
||||
|
||||
private String getFieldName(SQLSelectItem item) {
|
||||
@@ -539,7 +538,7 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
private void parseAggGroupCommon(ServerConnection sc, SchemaConfig schema, SQLStatement stmt, RouteResultset rrs,
|
||||
MySqlSelectQueryBlock mysqlSelectQuery, TableConfig tc) throws SQLException {
|
||||
Map<String, String> aliaColumns = new HashMap<>();
|
||||
List<Pair<String, String>> selectColumns = new LinkedList<>();
|
||||
List<SQLSelectItem> selectColumns = new LinkedList<>();
|
||||
boolean isDistinct = (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCT) || (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCTROW);
|
||||
parseAggExprCommon(schema, rrs, mysqlSelectQuery, selectColumns, aliaColumns, tc, isDistinct);
|
||||
if (rrs.isNeedOptimizer()) {
|
||||
@@ -562,16 +561,18 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
mysqlSelectQuery, rrs, sc.getCharset().getResultsIndex());
|
||||
|
||||
if (isDistinct) {
|
||||
rrs.changeNodeSqlAfterAddLimit(statementToString(stmt), 0, -1);
|
||||
String sql = RouterUtil.removeSchema(statementToString(stmt), schema.getName());
|
||||
rrs.changeNodeSqlAfterAddLimit(sql, 0, -1);
|
||||
} else if (isGroupByColPushSelectList) {
|
||||
rrs.changeNodeSqlAfterAddLimit(statementToString(stmt), rrs.getLimitStart(), rrs.getLimitSize());
|
||||
String sql = RouterUtil.removeSchema(statementToString(stmt), schema.getName());
|
||||
rrs.changeNodeSqlAfterAddLimit(sql, rrs.getLimitStart(), rrs.getLimitSize());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* when fakeMysqlVersion is 8.0, in 'group by' no longer has the semantics of 'order by'
|
||||
*/
|
||||
private boolean tryGroupColumnPushSelectList(Map<String, String> aliaColumns, List<Pair<String, String>> selectColumns,
|
||||
private boolean tryGroupColumnPushSelectList(Map<String, String> aliaColumns, List<SQLSelectItem> selectColumns,
|
||||
MySqlSelectQueryBlock mysqlSelectQuery, RouteResultset rrs, int charsetIndex) {
|
||||
boolean isGroupByColPushSelectList = false;
|
||||
if (!VersionUtil.isMysql8() &&
|
||||
@@ -598,11 +599,31 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
return isGroupByColPushSelectList;
|
||||
}
|
||||
|
||||
private LinkedList<Item> handleSelectItems(List<Pair<String, String>> selectList, RouteResultset rrs, int charsetIndex) {
|
||||
private LinkedList<Item> handleSelectItems(List<SQLSelectItem> selectList, RouteResultset rrs, int charsetIndex) {
|
||||
LinkedList<Item> selectItems = new LinkedList<>();
|
||||
for (Pair<String, String> sel : selectList) {
|
||||
ItemField selItem = new ItemField(rrs.getSchema(), rrs.getTable(), StringUtil.removeBackQuote(sel.getValue()), charsetIndex);
|
||||
selItem.setAlias(StringUtil.removeBackQuote(sel.getKey()));
|
||||
String tableName = rrs.getTableAlias() != null ? rrs.getTableAlias() : rrs.getTable();
|
||||
for (SQLSelectItem sel : selectList) {
|
||||
String tName;
|
||||
String cName;
|
||||
if (sel.getExpr() instanceof SQLPropertyExpr) {
|
||||
if (sel.getAlias() != null) {
|
||||
tName = tableName;
|
||||
cName = sel.getAlias();
|
||||
} else {
|
||||
SQLPropertyExpr seli = (SQLPropertyExpr) sel.getExpr();
|
||||
if (seli.getOwner() instanceof SQLPropertyExpr) {
|
||||
tName = ((SQLPropertyExpr) seli.getOwner()).getSimpleName();
|
||||
} else {
|
||||
tName = seli.getOwner().toString();
|
||||
}
|
||||
cName = seli.getSimpleName();
|
||||
}
|
||||
} else {
|
||||
tName = tableName;
|
||||
cName = sel.getAlias() != null ? sel.getAlias() : sel.getExpr().toString();
|
||||
}
|
||||
ItemField selItem = new ItemField(rrs.getSchema(), StringUtil.removeBackQuote(tName), StringUtil.removeBackQuote(cName), charsetIndex);
|
||||
selItem.setAlias(sel.getAlias() == null ? null : StringUtil.removeBackQuote(sel.getAlias()));
|
||||
selItem.setCharsetIndex(charsetIndex);
|
||||
selectItems.add(selItem);
|
||||
}
|
||||
@@ -655,7 +676,7 @@ public class DruidSelectParser extends DefaultDruidParser {
|
||||
* eg:select id from (select h.id from hotnews h union
|
||||
* select h.title from hotnews h ) as t1 group by t1.id;
|
||||
*/
|
||||
column = sqlExpr.toString();
|
||||
column = ((SQLPropertyExpr) sqlExpr).getSimpleName();
|
||||
}
|
||||
if (column == null) {
|
||||
column = sqlExpr.toString();
|
||||
|
||||
Reference in New Issue
Block a user