From 1386a56a432ee6385450a2717c55c80fc3177317 Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Tue, 4 Sep 2018 11:31:54 +0800 Subject: [PATCH 1/2] server, mysql: return correct column name and column label name --- executor/adapter.go | 6 +++++- expression/column.go | 1 + plan/logical_plan_builder.go | 13 ++++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/executor/adapter.go b/executor/adapter.go index 7b9877a5778c2..b90fc8cf9ca40 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -65,6 +65,10 @@ func schema2ResultFields(schema *expression.Schema, defaultDB string) (rfs []*as if dbName == "" && col.TblName.L != "" { dbName = defaultDB } + origColName := col.OrigColName + if origColName.L == "" { + origColName = col.ColName + } rf := &ast.ResultField{ ColumnAsName: col.ColName, TableAsName: col.TblName, @@ -72,7 +76,7 @@ func schema2ResultFields(schema *expression.Schema, defaultDB string) (rfs []*as Table: &model.TableInfo{Name: col.OrigTblName}, Column: &model.ColumnInfo{ FieldType: *col.RetType, - Name: col.ColName, + Name: origColName, }, } rfs = append(rfs, rf) diff --git a/expression/column.go b/expression/column.go index 90d6b61811dfe..a48485b77f511 100644 --- a/expression/column.go +++ b/expression/column.go @@ -142,6 +142,7 @@ func (col *CorrelatedColumn) resolveIndices(_ *Schema) { // Column represents a column. type Column struct { + OrigColName model.CIStr ColName model.CIStr DBName model.CIStr OrigTblName model.CIStr diff --git a/plan/logical_plan_builder.go b/plan/logical_plan_builder.go index db807b5315e11..99bf2804404f6 100644 --- a/plan/logical_plan_builder.go +++ b/plan/logical_plan_builder.go @@ -472,12 +472,14 @@ func (b *planBuilder) buildSelection(p LogicalPlan, where ast.ExprNode, AggMappe } // buildProjectionFieldNameFromColumns builds the field name, table name and database name when field expression is a column reference. -func (b *planBuilder) buildProjectionFieldNameFromColumns(field *ast.SelectField, c *expression.Column) (colName, tblName, origTblName, dbName model.CIStr) { +func (b *planBuilder) buildProjectionFieldNameFromColumns(field *ast.SelectField, c *expression.Column) (colName, origColName, tblName, origTblName, dbName model.CIStr) { if astCol, ok := getInnerFromParentheses(field.Expr).(*ast.ColumnNameExpr); ok { - colName, tblName, dbName = astCol.Name.Name, astCol.Name.Table, astCol.Name.Schema + origColName, tblName, dbName = astCol.Name.Name, astCol.Name.Table, astCol.Name.Schema } if field.AsName.L != "" { colName = field.AsName + } else { + colName = origColName } if tblName.L == "" { tblName = c.TblName @@ -485,7 +487,7 @@ func (b *planBuilder) buildProjectionFieldNameFromColumns(field *ast.SelectField if dbName.L == "" { dbName = c.DBName } - return colName, tblName, c.OrigTblName, c.DBName + return colName, origColName, tblName, c.OrigTblName, c.DBName } // buildProjectionFieldNameFromExpressions builds the field name when field expression is a normal expression. @@ -531,10 +533,10 @@ func (b *planBuilder) buildProjectionFieldNameFromExpressions(field *ast.SelectF // buildProjectionField builds the field object according to SelectField in projection. func (b *planBuilder) buildProjectionField(id, position int, field *ast.SelectField, expr expression.Expression) *expression.Column { - var origTblName, tblName, colName, dbName model.CIStr + var origTblName, tblName, origColName, colName, dbName model.CIStr if c, ok := expr.(*expression.Column); ok && !c.IsAggOrSubq { // Field is a column reference. - colName, tblName, origTblName, dbName = b.buildProjectionFieldNameFromColumns(field, c) + colName, origColName, tblName, origTblName, dbName = b.buildProjectionFieldNameFromColumns(field, c) } else if field.AsName.L != "" { // Field has alias. colName = field.AsName @@ -547,6 +549,7 @@ func (b *planBuilder) buildProjectionField(id, position int, field *ast.SelectFi TblName: tblName, OrigTblName: origTblName, ColName: colName, + OrigColName: origColName, DBName: dbName, RetType: expr.GetType(), } From 7b23b261db4d8922361f9a85c1396d3e768d444a Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Tue, 4 Sep 2018 13:12:09 +0800 Subject: [PATCH 2/2] adjust unit test to cover the code change --- executor/executor_test.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/executor/executor_test.go b/executor/executor_test.go index 039bb2cdb53d0..b6b751431050b 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -1766,26 +1766,31 @@ func (s *testSuite) TestColumnName(c *C) { fields := rs.Fields() c.Check(len(fields), Equals, 2) c.Check(fields[0].Column.Name.L, Equals, "1 + c") + c.Check(fields[0].ColumnAsName.L, Equals, "1 + c") c.Check(fields[1].Column.Name.L, Equals, "count(*)") + c.Check(fields[1].ColumnAsName.L, Equals, "count(*)") rs, err = tk.Exec("select (c) > all (select c from t) from t") c.Check(err, IsNil) fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.L, Equals, "(c) > all (select c from t)") + c.Check(fields[0].ColumnAsName.L, Equals, "(c) > all (select c from t)") tk.MustExec("begin") tk.MustExec("insert t values(1,1)") rs, err = tk.Exec("select c d, d c from t") c.Check(err, IsNil) fields = rs.Fields() c.Check(len(fields), Equals, 2) - c.Check(fields[0].Column.Name.L, Equals, "d") - c.Check(fields[1].Column.Name.L, Equals, "c") + c.Check(fields[0].Column.Name.L, Equals, "c") + c.Check(fields[0].ColumnAsName.L, Equals, "d") + c.Check(fields[1].Column.Name.L, Equals, "d") + c.Check(fields[1].ColumnAsName.L, Equals, "c") // Test case for query a column of a table. // In this case, all attributes have values. rs, err = tk.Exec("select c as a from t as t2") c.Check(err, IsNil) fields = rs.Fields() - c.Check(fields[0].Column.Name.L, Equals, "a") + c.Check(fields[0].Column.Name.L, Equals, "c") c.Check(fields[0].ColumnAsName.L, Equals, "a") c.Check(fields[0].Table.Name.L, Equals, "t") c.Check(fields[0].TableAsName.L, Equals, "t2")