Skip to content

Commit 0f4d5fd

Browse files
authored
fix chinese in column and row (#2216)
* charset for atk-1406 (#2200) * charset for atk-1409, missing for atk-1408 (#2202) * charset for atk-1400 (#2198)
1 parent 11ea9e2 commit 0f4d5fd

File tree

7 files changed

+49
-15
lines changed

7 files changed

+49
-15
lines changed

src/main/java/com/actiontech/dble/backend/mysql/nio/handler/util/HandlerTool.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ private static ItemFunc createFunctionItem(ItemFunc f, List<Field> fields, int s
221221
args.add(newArg);
222222
}
223223
ItemFunc ret = (ItemFunc) f.reStruct(args, allPushDown, fields);
224+
ret.setCharsetIndex(f.getCharsetIndex());
224225
ret.setItemName(f.getPushDownName() == null ? f.getItemName() : f.getPushDownName());
225226
return ret;
226227
}
@@ -265,7 +266,7 @@ static ItemField createFieldItem(Item col, List<Field> fields, int startIndex) {
265266
int index = findField(col, fields, startIndex);
266267
if (index < 0)
267268
throw new MySQLOutPutException(ErrorCode.ER_QUERYHANDLER, "", "field not found:" + col);
268-
ItemField ret = new ItemField(fields.get(index));
269+
ItemField ret = new ItemField(fields.get(index), col.getCharsetIndex());
269270
ret.setItemName(col.getPushDownName() == null ? col.getItemName() : col.getPushDownName());
270271
return ret;
271272
}

src/main/java/com/actiontech/dble/plan/NamedField.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class NamedField {
1616
private final int hashCode;
1717
// which node of the field belong
1818
public final PlanNode planNode;
19+
private int charsetIndex;
1920

2021
public NamedField(String inputSchema, String inputTable, String name, PlanNode planNode) {
2122
String tempTableSchmea;
@@ -57,6 +58,14 @@ public String getName() {
5758
return name;
5859
}
5960

61+
public int getCharsetIndex() {
62+
return charsetIndex;
63+
}
64+
65+
public void setCharsetIndex(int charsetIndex) {
66+
this.charsetIndex = charsetIndex;
67+
}
68+
6069
@Override
6170
public boolean equals(Object obj) {
6271
if (obj == null)

src/main/java/com/actiontech/dble/plan/common/item/ItemField.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public class ItemField extends ItemIdent {
3535
/* if index!=-1, means the index of Item_field,need setField before val */
3636
private int index = -1;
3737

38+
public ItemField(String dbName, String tableName, String fieldName, int charsetIndex) {
39+
super(dbName, tableName, fieldName);
40+
this.charsetIndex = charsetIndex;
41+
}
42+
3843
public ItemField(String dbName, String tableName, String fieldName) {
3944
super(dbName, tableName, fieldName);
4045
}
@@ -44,6 +49,11 @@ public ItemField(Field field) {
4449
setField(field);
4550
}
4651

52+
public ItemField(Field field, int charsetIndex) {
53+
this(field);
54+
this.charsetIndex = charsetIndex;
55+
}
56+
4757
/**
4858
* save index
4959
*
@@ -337,7 +347,7 @@ public SQLExpr toExpression() {
337347

338348
@Override
339349
protected Item cloneStruct(boolean forCalculate, List<Item> calArgs, boolean isPushDown, List<Field> fields) {
340-
return new ItemField(dbName, tableName, itemName);
350+
return new ItemField(dbName, tableName, itemName, charsetIndex);
341351
}
342352

343353
public Field getField() {

src/main/java/com/actiontech/dble/plan/node/PlanNode.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ protected final void copySelfTo(PlanNode to) {
257257
for (Item selected : this.getColumnsSelected()) {
258258
Item copySel = selected.cloneItem();
259259
copySel.setItemName(selected.getItemName());
260+
copySel.setCharsetIndex(selected.getCharsetIndex());
260261
to.columnsSelected.add(copySel);
261262
}
262263
for (Order groupBy : this.getGroupBys()) {
@@ -399,7 +400,7 @@ private void setUpOrderBy() {
399400

400401
protected void dealSingleStarColumn(List<Item> newSels) {
401402
for (NamedField field : innerFields.keySet()) {
402-
ItemField col = new ItemField(field.getSchema(), field.getTable(), field.getName());
403+
ItemField col = new ItemField(field.getSchema(), field.getTable(), field.getName(), field.getCharsetIndex());
403404
newSels.add(col);
404405
}
405406
}
@@ -416,7 +417,7 @@ protected void dealStarColumn() {
416417
boolean found = false;
417418
for (NamedField field : innerFields.keySet()) {
418419
if (selTable.equals(field.getTable())) {
419-
ItemField col = new ItemField(field.getSchema(), field.getTable(), field.getName());
420+
ItemField col = new ItemField(field.getSchema(), field.getTable(), field.getName(), field.getCharsetIndex());
420421
newSels.add(col);
421422
found = true;
422423
} else if (found) {

src/main/java/com/actiontech/dble/plan/node/TableNode.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public class TableNode extends PlanNode {
3131
private StructureMeta.TableMeta tableMeta;
3232
private List<String> columns;
3333
private List<SQLHint> hintList;
34+
private int charsetIndex;
35+
3436
private TableNode() {
3537
}
3638

@@ -55,9 +57,10 @@ public TableNode(String schema, String viewName, List<String> columns) {
5557
this.keepFieldSchema = true;
5658
}
5759

58-
public TableNode(String catalog, String tableName, ProxyMetaManager metaManager) throws SQLNonTransientException {
60+
public TableNode(String catalog, String tableName, ProxyMetaManager metaManager, int charsetIndex) throws SQLNonTransientException {
5961
if (catalog == null || tableName == null)
6062
throw new RuntimeException("Table db or name is null error!");
63+
this.charsetIndex = charsetIndex;
6164
this.schema = catalog;
6265
this.tableName = tableName;
6366
ServerConfig config = DbleServer.getInstance().getConfig();
@@ -115,11 +118,13 @@ protected void setUpInnerFields() {
115118
if (tableMeta != null) {
116119
for (StructureMeta.ColumnMeta cm : tableMeta.getColumnsList()) {
117120
NamedField tmpField = new NamedField(schema, tmpTable, cm.getName(), this);
121+
tmpField.setCharsetIndex(charsetIndex);
118122
innerFields.put(tmpField, tmpField);
119123
}
120124
} else {
121125
for (String col : columns) {
122126
NamedField tmpField = new NamedField(schema, tmpTable, col, this);
127+
tmpField.setCharsetIndex(charsetIndex);
123128
innerFields.put(tmpField, tmpField);
124129
}
125130
}
@@ -134,7 +139,7 @@ protected void dealStarColumn() {
134139
newSelects.add(sel);
135140
else {
136141
for (NamedField innerField : innerFields.keySet()) {
137-
ItemField col = new ItemField(null, sel.getTableName(), innerField.getName());
142+
ItemField col = new ItemField(null, sel.getTableName(), innerField.getName(), charsetIndex);
138143
newSelects.add(col);
139144
}
140145
}
@@ -148,6 +153,7 @@ public TableNode copy() {
148153
newTableNode.tableName = this.tableName;
149154
newTableNode.tableMeta = this.tableMeta == null ? null : this.tableMeta.toBuilder().build();
150155
newTableNode.columns = this.columns;
156+
newTableNode.charsetIndex = this.charsetIndex;
151157
newTableNode.referedTableNodes.add(newTableNode);
152158
newTableNode.setNoshardNode(this.getNoshardNode());
153159

@@ -207,4 +213,11 @@ public void setHintList(List<SQLHint> hintList) {
207213
this.hintList = hintList;
208214
}
209215

216+
public int getCharsetIndex() {
217+
return charsetIndex;
218+
}
219+
220+
public void setCharsetIndex(int charsetIndex) {
221+
this.charsetIndex = charsetIndex;
222+
}
210223
}

src/main/java/com/actiontech/dble/plan/visitor/MySQLItemVisitor.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public void endVisit(SQLNotExpr x) {
369369

370370
@Override
371371
public void endVisit(SQLAllColumnExpr x) {
372-
item = new ItemField(null, null, "*");
372+
item = new ItemField(null, null, "*", charsetIndex);
373373
initName(x);
374374
}
375375

@@ -441,7 +441,7 @@ public void endVisit(SQLCharExpr x) {
441441

442442
@Override
443443
public void endVisit(SQLIdentifierExpr x) {
444-
item = new ItemField(null, null, StringUtil.removeBackQuote(x.getSimpleName()));
444+
item = new ItemField(null, null, StringUtil.removeBackQuote(x.getSimpleName()), charsetIndex);
445445
}
446446

447447
@Override
@@ -506,10 +506,9 @@ public void endVisit(SQLVariantRefExpr x) {
506506
item = new ItemNull();
507507
initName(x);
508508
}
509-
} else {
510-
item = new ItemVariables(x.getName(), new ItemField(null, null, variable));
511-
initName(x);
512509
}
510+
item = new ItemVariables(x.getName(), new ItemField(null, null, variable, charsetIndex));
511+
initName(x);
513512
}
514513

515514
@Override
@@ -523,7 +522,7 @@ public void endVisit(SQLPropertyExpr x) {
523522
} else {
524523
tableName = ((SQLIdentifierExpr) x.getOwner()).getSimpleName();
525524
}
526-
item = new ItemField(dbName, StringUtil.removeBackQuote(tableName), StringUtil.removeBackQuote(x.getSimpleName()));
525+
item = new ItemField(dbName, StringUtil.removeBackQuote(tableName), StringUtil.removeBackQuote(x.getSimpleName()), charsetIndex);
527526
}
528527

529528
@Override

src/main/java/com/actiontech/dble/plan/visitor/MySQLPlanNodeVisitor.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public boolean visit(MySqlSelectQueryBlock sqlSelectQuery) {
167167
}
168168

169169
public boolean visit(SQLExprTableSource tableSource) {
170-
PlanNode table;
170+
TableNode table;
171171
String schema;
172172
String tableName;
173173
SQLExpr expr = tableSource.getExpr();
@@ -215,12 +215,12 @@ public boolean visit(SQLExprTableSource tableSource) {
215215
return true;
216216
} else {
217217
try {
218-
table = new TableNode(schema, tableName, this.metaManager);
218+
table = new TableNode(schema, tableName, this.metaManager, charsetIndex);
219219
} catch (SQLNonTransientException e) {
220220
throw new MySQLOutPutException(e.getErrorCode(), e.getSQLState(), e.getMessage());
221221
}
222222
}
223-
((TableNode) table).setHintList(tableSource.getHints());
223+
table.setHintList(tableSource.getHints());
224224
this.tableNode = table;
225225
return true;
226226
}
@@ -358,6 +358,7 @@ private List<Item> handleSelectItems(List<SQLSelectItem> items) {
358358
MySQLItemVisitor ev = new MySQLItemVisitor(currentDb, this.charsetIndex, this.metaManager, this.usrVariables);
359359
expr.accept(ev);
360360
Item selItem = ev.getItem();
361+
selItem.setCharsetIndex(charsetIndex);
361362
if (selItem.isWithSubQuery()) {
362363
setSubQueryNode(selItem);
363364
}

0 commit comments

Comments
 (0)