Skip to content

Commit efe7127

Browse files
committed
[inner-2026] fix bug with table aliases
(cherry picked from commit c1ca6ad)
1 parent ed3c34f commit efe7127

File tree

1 file changed

+30
-17
lines changed

1 file changed

+30
-17
lines changed

src/main/java/com/actiontech/dble/route/parser/druid/impl/DruidSelectParser.java

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ private void parseOrderAggGroupMysql(ShardingService service, SchemaConfig schem
355355
parseAggGroupCommon(service, schema, stmt, rrs, mysqlSelectQuery, tc);
356356
}
357357

358-
private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, List<Pair<String, String>> selectColumns, Map<String, String> aliaColumns, BaseTableConfig tc, boolean isDistinct) throws SQLException {
358+
private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, List<SQLSelectItem> selectColumns, Map<String, String> aliaColumns, BaseTableConfig tc, boolean isDistinct) throws SQLException {
359359
List<SQLSelectItem> selectList = mysqlSelectQuery.getSelectList();
360360
boolean hasPartitionColumn = false;
361361
for (SQLSelectItem selectItem : selectList) {
@@ -382,7 +382,7 @@ private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSe
382382
} else {
383383
addToAliaColumn(selectColumns, aliaColumns, selectItem);
384384
}
385-
} else if (itemExpr instanceof SQLAllColumnExpr) {
385+
} else if (itemExpr instanceof SQLAllColumnExpr || (itemExpr instanceof SQLPropertyExpr && ((SQLPropertyExpr) itemExpr).getName().equals("*"))) {
386386
TableMeta tbMeta = ProxyMeta.getInstance().getTmManager().getSyncTableMeta(schema.getName(), tc.getName());
387387
if (tbMeta == null) {
388388
String msg = "Meta data of table '" + schema.getName() + "." + tc.getName() + "' doesn't exist";
@@ -392,8 +392,7 @@ private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSe
392392
for (ColumnMeta column : tbMeta.getColumns()) {
393393
aliaColumns.put(column.getName(), column.getName());
394394

395-
Pair<String, String> selectCol = new Pair<>(column.getName(), column.getName());
396-
selectColumns.add(selectCol);
395+
selectColumns.add(new SQLSelectItem(new SQLIdentifierExpr(column.getName())));
397396
}
398397
} else {
399398
if (isDistinct && !isNeedOptimizer(itemExpr)) {
@@ -456,7 +455,7 @@ private void parseGroupCommon(RouteResultset rrs, MySqlSelectQueryBlock mysqlSel
456455
}
457456
}
458457

459-
private Set<SQLSelectItem> groupColumnPushSelectList(List<SQLExpr> groupByItemList, List<Pair<String, String>> selectColumns) {
458+
private Set<SQLSelectItem> groupColumnPushSelectList(List<SQLExpr> groupByItemList, List<SQLSelectItem> selectColumns) {
460459
Set<SQLSelectItem> pushItem = new HashSet<>();
461460

462461
for (SQLExpr groupByItem : groupByItemList) {
@@ -475,8 +474,8 @@ private Set<SQLSelectItem> groupColumnPushSelectList(List<SQLExpr> groupByItemLi
475474
return pushItem;
476475
}
477476

478-
private boolean hasColumnOrAlia(String columnName, List<Pair<String, String>> selectColumns) {
479-
return selectColumns.stream().anyMatch(s -> s.getKey().equalsIgnoreCase(columnName) || s.getValue().equalsIgnoreCase(columnName));
477+
private boolean hasColumnOrAlia(String columnName, List<SQLSelectItem> selectColumns) {
478+
return selectColumns.stream().anyMatch(s -> (s.getAlias() != null && StringUtil.removeBackQuote(s.getAlias()).equalsIgnoreCase(columnName)) || StringUtil.removeBackQuote(s.getExpr().toString()).equalsIgnoreCase(columnName));
480479
}
481480

482481
private boolean hasShardingColumn(BaseTableConfig tc, String columnName) {
@@ -527,16 +526,14 @@ private boolean isNeedOptimizer(SQLExpr expr) {
527526
return !(expr instanceof SQLPropertyExpr) && !(expr instanceof SQLIdentifierExpr);
528527
}
529528

530-
private void addToAliaColumn(List<Pair<String, String>> selectColumns, Map<String, String> aliaColumns, SQLSelectItem item) {
529+
private void addToAliaColumn(List<SQLSelectItem> selectColumns, Map<String, String> aliaColumns, SQLSelectItem item) {
531530
String alia = item.getAlias();
532531
String field = getFieldName(item);
533532
if (alia == null) {
534533
alia = field;
535534
}
536535
aliaColumns.put(field, alia);
537-
538-
Pair<String, String> selectCol = new Pair<String, String>(alia, field);
539-
selectColumns.add(selectCol);
536+
selectColumns.add(item);
540537
}
541538

542539
private String getFieldName(SQLSelectItem item) {
@@ -551,7 +548,7 @@ private String getFieldName(SQLSelectItem item) {
551548
private void parseAggGroupCommon(ShardingService service, SchemaConfig schema, SQLStatement stmt, RouteResultset rrs,
552549
MySqlSelectQueryBlock mysqlSelectQuery, BaseTableConfig tc) throws SQLException {
553550
Map<String, String> aliaColumns = new HashMap<>();
554-
List<Pair<String, String>> selectColumns = new LinkedList<>();
551+
List<SQLSelectItem> selectColumns = new LinkedList<>();
555552
boolean isDistinct = (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCT) || (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCTROW);
556553
parseAggExprCommon(schema, rrs, mysqlSelectQuery, selectColumns, aliaColumns, tc, isDistinct);
557554
if (rrs.isNeedOptimizer()) {
@@ -583,7 +580,7 @@ private void parseAggGroupCommon(ShardingService service, SchemaConfig schema, S
583580
/**
584581
* when fakeMysqlVersion is 8.0, in 'group by' no longer has the semantics of 'order by'
585582
*/
586-
private boolean tryGroupColumnPushSelectList(Map<String, String> aliaColumns, List<Pair<String, String>> selectColumns,
583+
private boolean tryGroupColumnPushSelectList(Map<String, String> aliaColumns, List<SQLSelectItem> selectColumns,
587584
MySqlSelectQueryBlock mysqlSelectQuery, RouteResultset rrs, int charsetIndex) {
588585
boolean isGroupByColPushSelectList = false;
589586
if (!VersionUtil.isMysql8(SystemConfig.getInstance().getFakeMySQLVersion()) &&
@@ -610,11 +607,27 @@ private boolean tryGroupColumnPushSelectList(Map<String, String> aliaColumns, Li
610607
return isGroupByColPushSelectList;
611608
}
612609

613-
private LinkedList<Item> handleSelectItems(List<Pair<String, String>> selectList, RouteResultset rrs, int charsetIndex) {
610+
private LinkedList<Item> handleSelectItems(List<SQLSelectItem> selectList, RouteResultset rrs, int charsetIndex) {
614611
LinkedList<Item> selectItems = new LinkedList<>();
615-
for (Pair<String, String> sel : selectList) {
616-
ItemField selItem = new ItemField(rrs.getSchema(), rrs.getTable(), StringUtil.removeBackQuote(sel.getValue()), charsetIndex);
617-
selItem.setAlias(StringUtil.removeBackQuote(sel.getKey()));
612+
String tableName = rrs.getTableAlias() != null ? rrs.getTableAlias() : rrs.getTable();
613+
for (SQLSelectItem sel : selectList) {
614+
String tName;
615+
String cName;
616+
if (sel.getExpr() instanceof SQLPropertyExpr) {
617+
SQLPropertyExpr seli = (SQLPropertyExpr) sel.getExpr();
618+
if (sel.getAlias() != null) {
619+
tName = tableName;
620+
cName = sel.getAlias();
621+
} else {
622+
tName = seli.getOwner().toString();
623+
cName = seli.getName();
624+
}
625+
} else {
626+
tName = tableName;
627+
cName = sel.getAlias() != null ? sel.getAlias() : sel.getExpr().toString();
628+
}
629+
ItemField selItem = new ItemField(rrs.getSchema(), StringUtil.removeBackQuote(tName), StringUtil.removeBackQuote(cName), charsetIndex);
630+
selItem.setAlias(sel.getAlias() == null ? null : StringUtil.removeBackQuote(sel.getAlias()));
618631
selItem.setCharsetIndex(charsetIndex);
619632
selectItems.add(selItem);
620633
}

0 commit comments

Comments
 (0)