Skip to content

Commit

Permalink
*: support show full columns radondb#533
Browse files Browse the repository at this point in the history
  • Loading branch information
Tesla authored and Tesla committed Dec 30, 2019
1 parent cc73743 commit a7adf2e
Show file tree
Hide file tree
Showing 6 changed files with 1,866 additions and 1,776 deletions.
2 changes: 1 addition & 1 deletion src/proxy/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ func (spanner *Spanner) ComQuery(session *driver.Session, query string, bindVari
log.Error("proxy.show.create.table[%s].from.session[%v].error:%+v", query, session.ID(), err)
status = 1
}
case sqlparser.ShowColumnsStr:
case sqlparser.ShowColumnsStr, sqlparser.ShowFullColumnsStr:
if qr, err = spanner.handleShowColumns(session, query, node); err != nil {
log.Error("proxy.show.colomns[%s].from.session[%v].error:%+v", query, session.ID(), err)
status = 1
Expand Down
12 changes: 7 additions & 5 deletions src/proxy/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -333,10 +333,10 @@ func (spanner *Spanner) handleShowColumns(session *driver.Session, query string,
ast := node

table := ast.Table.Name.String()
database := session.Schema()
if !ast.Table.Qualifier.IsEmpty() {
database = ast.Table.Qualifier.String()
if ast.Table.Qualifier.IsEmpty() {
ast.Table.Qualifier = sqlparser.NewTableIdent(session.Schema())
}
database := ast.Table.Qualifier.String()
if database == "" {
return nil, sqldb.NewSQLError(sqldb.ER_NO_DB_ERROR)
}
Expand All @@ -352,8 +352,10 @@ func (spanner *Spanner) handleShowColumns(session *driver.Session, query string,
}
partTable := parts[0].Table
backend := parts[0].Backend
rewritten := fmt.Sprintf("SHOW COLUMNS FROM %s.%s", database, partTable)
qr, err := spanner.ExecuteOnThisBackend(backend, rewritten)
ast.Table.Name = sqlparser.NewTableIdent(partTable)
buf := sqlparser.NewTrackedBuffer(nil)
ast.Format(buf)
qr, err := spanner.ExecuteOnThisBackend(backend, buf.String())
if err != nil {
return nil, err
}
Expand Down
64 changes: 63 additions & 1 deletion src/proxy/show_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,6 @@ func TestProxyShowCreateTable(t *testing.T) {
},
}


r2 := &sqltypes.Result{
Fields: []*querypb.Field{
{
Expand Down Expand Up @@ -744,6 +743,55 @@ func TestProxyShowColumns(t *testing.T) {
},
}

r3 := &sqltypes.Result{
Fields: []*querypb.Field{
{
Name: "Field",
Type: querypb.Type_VARCHAR,
},
{
Name: "Type",
Type: querypb.Type_VARCHAR,
},
{
Name: "Null",
Type: querypb.Type_VARCHAR,
},
{
Name: "Key",
Type: querypb.Type_VARCHAR,
},
{
Name: "Default",
Type: querypb.Type_VARCHAR,
},
{
Name: "Extra",
Type: querypb.Type_VARCHAR,
},
{
Name: "Privileges",
Type: querypb.Type_VARCHAR,
},
{
Name: "Comment",
Type: querypb.Type_VARCHAR,
},
},
Rows: [][]sqltypes.Value{
{
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte("col_a")),
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte("int(11)")),
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte("YES")),
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte("PRI")),
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte("NULL")),
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte("NULL")),
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte("select,insert,update,references")),
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte("NULL")),
},
},
}

log := xlog.NewStdLog(xlog.Level(xlog.PANIC))
fakedbs, proxy, cleanup := MockProxy(log)
defer cleanup()
Expand All @@ -755,6 +803,7 @@ func TestProxyShowColumns(t *testing.T) {
fakedbs.AddQueryPattern("create .*", &sqltypes.Result{})
fakedbs.AddQueryPattern("show create .*", r1)
fakedbs.AddQueryPattern("show columns .*", r2)
fakedbs.AddQueryPattern("show full columns .*", r3)
}

// create database.
Expand Down Expand Up @@ -802,6 +851,19 @@ func TestProxyShowColumns(t *testing.T) {
assert.Equal(t, want, got)
}

// show full columns from table
{
client, err := driver.NewConn("mock", "mock", address, "", "utf8")
assert.Nil(t, err)
defer client.Close()
query := "show full columns from test.t1 where `Key` = 'PRI'"
qr, err := client.FetchAll(query, -1)
assert.Nil(t, err)
want := "[col_a int(11) YES PRI NULL NULL select,insert,update,references NULL]"
got := fmt.Sprintf("%+v", qr.Rows[0])
assert.Equal(t, want, got)
}

// show columns from table err(database is empty)
{
client, err := driver.NewConn("mock", "mock", address, "", "utf8")
Expand Down
10 changes: 7 additions & 3 deletions src/vendor/github.com/xelabs/go-mysqlstack/sqlparser/ast.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit a7adf2e

Please sign in to comment.