diff --git a/src/main/java/com/actiontech/dble/route/parser/druid/impl/DruidSelectParser.java b/src/main/java/com/actiontech/dble/route/parser/druid/impl/DruidSelectParser.java index f07680ce7..c2d96d948 100644 --- a/src/main/java/com/actiontech/dble/route/parser/druid/impl/DruidSelectParser.java +++ b/src/main/java/com/actiontech/dble/route/parser/druid/impl/DruidSelectParser.java @@ -355,7 +355,7 @@ public class DruidSelectParser extends DefaultDruidParser { parseAggGroupCommon(service, schema, stmt, rrs, mysqlSelectQuery, tc); } - private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, List> selectColumns, Map aliaColumns, BaseTableConfig tc, boolean isDistinct) throws SQLException { + private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, List selectColumns, Map aliaColumns, BaseTableConfig tc, boolean isDistinct) throws SQLException { List selectList = mysqlSelectQuery.getSelectList(); boolean hasPartitionColumn = false; for (SQLSelectItem selectItem : selectList) { @@ -382,7 +382,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("*"))) { 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"; @@ -392,8 +392,7 @@ public class DruidSelectParser extends DefaultDruidParser { for (ColumnMeta column : tbMeta.getColumns()) { aliaColumns.put(column.getName(), column.getName()); - Pair selectCol = new Pair<>(column.getName(), column.getName()); - selectColumns.add(selectCol); + selectColumns.add(new SQLSelectItem(new SQLIdentifierExpr(column.getName()))); } } else { if (isDistinct && !isNeedOptimizer(itemExpr)) { @@ -456,7 +455,7 @@ public class DruidSelectParser extends DefaultDruidParser { } } - private Set groupColumnPushSelectList(List groupByItemList, List> selectColumns) { + private Set groupColumnPushSelectList(List groupByItemList, List selectColumns) { Set pushItem = new HashSet<>(); for (SQLExpr groupByItem : groupByItemList) { @@ -475,8 +474,8 @@ public class DruidSelectParser extends DefaultDruidParser { return pushItem; } - private boolean hasColumnOrAlia(String columnName, List> selectColumns) { - return selectColumns.stream().anyMatch(s -> s.getKey().equalsIgnoreCase(columnName) || s.getValue().equalsIgnoreCase(columnName)); + private boolean hasColumnOrAlia(String columnName, List selectColumns) { + return selectColumns.stream().anyMatch(s -> (s.getAlias() != null && StringUtil.removeBackQuote(s.getAlias()).equalsIgnoreCase(columnName)) || StringUtil.removeBackQuote(s.getExpr().toString()).equalsIgnoreCase(columnName)); } private boolean hasShardingColumn(BaseTableConfig tc, String columnName) { @@ -527,16 +526,14 @@ public class DruidSelectParser extends DefaultDruidParser { return !(expr instanceof SQLPropertyExpr) && !(expr instanceof SQLIdentifierExpr); } - private void addToAliaColumn(List> selectColumns, Map aliaColumns, SQLSelectItem item) { + private void addToAliaColumn(List selectColumns, Map aliaColumns, SQLSelectItem item) { String alia = item.getAlias(); String field = getFieldName(item); if (alia == null) { alia = field; } aliaColumns.put(field, alia); - - Pair selectCol = new Pair(alia, field); - selectColumns.add(selectCol); + selectColumns.add(item); } private String getFieldName(SQLSelectItem item) { @@ -551,7 +548,7 @@ public class DruidSelectParser extends DefaultDruidParser { private void parseAggGroupCommon(ShardingService service, SchemaConfig schema, SQLStatement stmt, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, BaseTableConfig tc) throws SQLException { Map aliaColumns = new HashMap<>(); - List> selectColumns = new LinkedList<>(); + List selectColumns = new LinkedList<>(); boolean isDistinct = (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCT) || (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCTROW); parseAggExprCommon(schema, rrs, mysqlSelectQuery, selectColumns, aliaColumns, tc, isDistinct); if (rrs.isNeedOptimizer()) { @@ -583,7 +580,7 @@ public class DruidSelectParser extends DefaultDruidParser { /** * when fakeMysqlVersion is 8.0, in 'group by' no longer has the semantics of 'order by' */ - private boolean tryGroupColumnPushSelectList(Map aliaColumns, List> selectColumns, + private boolean tryGroupColumnPushSelectList(Map aliaColumns, List selectColumns, MySqlSelectQueryBlock mysqlSelectQuery, RouteResultset rrs, int charsetIndex) { boolean isGroupByColPushSelectList = false; if (!VersionUtil.isMysql8(SystemConfig.getInstance().getFakeMySQLVersion()) && @@ -610,11 +607,27 @@ public class DruidSelectParser extends DefaultDruidParser { return isGroupByColPushSelectList; } - private LinkedList handleSelectItems(List> selectList, RouteResultset rrs, int charsetIndex) { + private LinkedList handleSelectItems(List selectList, RouteResultset rrs, int charsetIndex) { LinkedList selectItems = new LinkedList<>(); - for (Pair 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) { + SQLPropertyExpr seli = (SQLPropertyExpr) sel.getExpr(); + if (sel.getAlias() != null) { + tName = tableName; + cName = sel.getAlias(); + } else { + tName = seli.getOwner().toString(); + cName = seli.getName(); + } + } 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); }