@@ -355,7 +355,7 @@ private void parseOrderAggGroupMysql(ShardingService service, SchemaConfig schem
355
355
parseAggGroupCommon (service , schema , stmt , rrs , mysqlSelectQuery , tc );
356
356
}
357
357
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 {
359
359
List <SQLSelectItem > selectList = mysqlSelectQuery .getSelectList ();
360
360
boolean hasPartitionColumn = false ;
361
361
for (SQLSelectItem selectItem : selectList ) {
@@ -382,7 +382,7 @@ private void parseAggExprCommon(SchemaConfig schema, RouteResultset rrs, MySqlSe
382
382
} else {
383
383
addToAliaColumn (selectColumns , aliaColumns , selectItem );
384
384
}
385
- } else if (itemExpr instanceof SQLAllColumnExpr ) {
385
+ } else if (itemExpr instanceof SQLAllColumnExpr || ( itemExpr instanceof SQLPropertyExpr && (( SQLPropertyExpr ) itemExpr ). getName (). equals ( "*" )) ) {
386
386
TableMeta tbMeta = ProxyMeta .getInstance ().getTmManager ().getSyncTableMeta (schema .getName (), tc .getName ());
387
387
if (tbMeta == null ) {
388
388
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
392
392
for (ColumnMeta column : tbMeta .getColumns ()) {
393
393
aliaColumns .put (column .getName (), column .getName ());
394
394
395
- Pair <String , String > selectCol = new Pair <>(column .getName (), column .getName ());
396
- selectColumns .add (selectCol );
395
+ selectColumns .add (new SQLSelectItem (new SQLIdentifierExpr (column .getName ())));
397
396
}
398
397
} else {
399
398
if (isDistinct && !isNeedOptimizer (itemExpr )) {
@@ -456,7 +455,7 @@ private void parseGroupCommon(RouteResultset rrs, MySqlSelectQueryBlock mysqlSel
456
455
}
457
456
}
458
457
459
- private Set <SQLSelectItem > groupColumnPushSelectList (List <SQLExpr > groupByItemList , List <Pair < String , String > > selectColumns ) {
458
+ private Set <SQLSelectItem > groupColumnPushSelectList (List <SQLExpr > groupByItemList , List <SQLSelectItem > selectColumns ) {
460
459
Set <SQLSelectItem > pushItem = new HashSet <>();
461
460
462
461
for (SQLExpr groupByItem : groupByItemList ) {
@@ -475,8 +474,8 @@ private Set<SQLSelectItem> groupColumnPushSelectList(List<SQLExpr> groupByItemLi
475
474
return pushItem ;
476
475
}
477
476
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 ));
480
479
}
481
480
482
481
private boolean hasShardingColumn (BaseTableConfig tc , String columnName ) {
@@ -527,16 +526,14 @@ private boolean isNeedOptimizer(SQLExpr expr) {
527
526
return !(expr instanceof SQLPropertyExpr ) && !(expr instanceof SQLIdentifierExpr );
528
527
}
529
528
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 ) {
531
530
String alia = item .getAlias ();
532
531
String field = getFieldName (item );
533
532
if (alia == null ) {
534
533
alia = field ;
535
534
}
536
535
aliaColumns .put (field , alia );
537
-
538
- Pair <String , String > selectCol = new Pair <String , String >(alia , field );
539
- selectColumns .add (selectCol );
536
+ selectColumns .add (item );
540
537
}
541
538
542
539
private String getFieldName (SQLSelectItem item ) {
@@ -551,7 +548,7 @@ private String getFieldName(SQLSelectItem item) {
551
548
private void parseAggGroupCommon (ShardingService service , SchemaConfig schema , SQLStatement stmt , RouteResultset rrs ,
552
549
MySqlSelectQueryBlock mysqlSelectQuery , BaseTableConfig tc ) throws SQLException {
553
550
Map <String , String > aliaColumns = new HashMap <>();
554
- List <Pair < String , String > > selectColumns = new LinkedList <>();
551
+ List <SQLSelectItem > selectColumns = new LinkedList <>();
555
552
boolean isDistinct = (mysqlSelectQuery .getDistionOption () == SQLSetQuantifier .DISTINCT ) || (mysqlSelectQuery .getDistionOption () == SQLSetQuantifier .DISTINCTROW );
556
553
parseAggExprCommon (schema , rrs , mysqlSelectQuery , selectColumns , aliaColumns , tc , isDistinct );
557
554
if (rrs .isNeedOptimizer ()) {
@@ -583,7 +580,7 @@ private void parseAggGroupCommon(ShardingService service, SchemaConfig schema, S
583
580
/**
584
581
* when fakeMysqlVersion is 8.0, in 'group by' no longer has the semantics of 'order by'
585
582
*/
586
- private boolean tryGroupColumnPushSelectList (Map <String , String > aliaColumns , List <Pair < String , String > > selectColumns ,
583
+ private boolean tryGroupColumnPushSelectList (Map <String , String > aliaColumns , List <SQLSelectItem > selectColumns ,
587
584
MySqlSelectQueryBlock mysqlSelectQuery , RouteResultset rrs , int charsetIndex ) {
588
585
boolean isGroupByColPushSelectList = false ;
589
586
if (!VersionUtil .isMysql8 (SystemConfig .getInstance ().getFakeMySQLVersion ()) &&
@@ -610,11 +607,27 @@ private boolean tryGroupColumnPushSelectList(Map<String, String> aliaColumns, Li
610
607
return isGroupByColPushSelectList ;
611
608
}
612
609
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 ) {
614
611
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 ()));
618
631
selItem .setCharsetIndex (charsetIndex );
619
632
selectItems .add (selItem );
620
633
}
0 commit comments