Skip to content

Commit 127ff1a

Browse files
authored
Add support for SHOW WARNINGS and SELECTs without a FROM (#2227)
Like SELECT 1, 'a';
1 parent 432e676 commit 127ff1a

File tree

14 files changed

+267
-5
lines changed

14 files changed

+267
-5
lines changed

internal/compiler/output_columns.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,24 @@ func outputColumns(qc *QueryCatalog, node ast.Node) ([]*Column, error) {
102102
}
103103
switch n := res.Val.(type) {
104104

105+
case *ast.A_Const:
106+
name := ""
107+
if res.Name != nil {
108+
name = *res.Name
109+
}
110+
switch n.Val.(type) {
111+
case *ast.String:
112+
cols = append(cols, &Column{Name: name, DataType: "text", NotNull: true})
113+
case *ast.Integer:
114+
cols = append(cols, &Column{Name: name, DataType: "int", NotNull: true})
115+
case *ast.Float:
116+
cols = append(cols, &Column{Name: name, DataType: "float", NotNull: true})
117+
case *ast.Boolean:
118+
cols = append(cols, &Column{Name: name, DataType: "bool", NotNull: true})
119+
default:
120+
cols = append(cols, &Column{Name: name, DataType: "any", NotNull: false})
121+
}
122+
105123
case *ast.A_Expr:
106124
name := ""
107125
if res.Name != nil {

internal/endtoend/testdata/diff_no_output/go/query.sql.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/diff_output/stderr.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@
4646
+SELECT 1
4747
+`
4848
+
49-
+func (q *Queries) SelectOne(ctx context.Context) (interface{}, error) {
49+
+func (q *Queries) SelectOne(ctx context.Context) (int32, error) {
5050
+ row := q.db.QueryRowContext(ctx, selectOne)
51-
+ var column_1 interface{}
51+
+ var column_1 int32
5252
+ err := row.Scan(&column_1)
5353
+ return column_1, err
5454
+}

internal/endtoend/testdata/selectstatic/mysql/go/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/selectstatic/mysql/go/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/selectstatic/mysql/go/query.sql.go

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- name: SelectStatic :one
2+
SELECT 'a', 'b' AS b, 1 AS num, true AS truefield, 1.0 AS floater
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"sql_package": "database/sql",
7+
"engine": "mysql",
8+
"name": "querytest",
9+
"schema": "query.sql",
10+
"queries": "query.sql"
11+
}
12+
]
13+
}

internal/endtoend/testdata/show_warnings/mysql/go/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/show_warnings/mysql/go/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/show_warnings/mysql/go/query.sql.go

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- name: ShowWarnings :many
2+
SHOW WARNINGS;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "mysql",
7+
"name": "querytest",
8+
"schema": "query.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

internal/engine/dolphin/convert.go

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"strings"
77

88
pcast "github.com/pingcap/tidb/parser/ast"
9+
"github.com/pingcap/tidb/parser/mysql"
910
"github.com/pingcap/tidb/parser/opcode"
1011
driver "github.com/pingcap/tidb/parser/test_driver"
1112
"github.com/pingcap/tidb/parser/types"
@@ -580,6 +581,41 @@ func (c *cc) convertUpdateStmt(n *pcast.UpdateStmt) *ast.UpdateStmt {
580581
}
581582

582583
func (c *cc) convertValueExpr(n *driver.ValueExpr) *ast.A_Const {
584+
switch n.TexprNode.Type.GetType() {
585+
case mysql.TypeBit:
586+
case mysql.TypeDate:
587+
case mysql.TypeDatetime:
588+
case mysql.TypeGeometry:
589+
case mysql.TypeJSON:
590+
case mysql.TypeNull:
591+
case mysql.TypeSet:
592+
case mysql.TypeShort:
593+
case mysql.TypeDuration:
594+
case mysql.TypeTimestamp:
595+
// TODO: Create an AST type for these?
596+
597+
case mysql.TypeTiny,
598+
mysql.TypeInt24,
599+
mysql.TypeYear,
600+
mysql.TypeLong,
601+
mysql.TypeLonglong:
602+
return &ast.A_Const{
603+
Val: &ast.Integer{
604+
Ival: n.Datum.GetInt64(),
605+
},
606+
}
607+
608+
case mysql.TypeDouble,
609+
mysql.TypeFloat,
610+
mysql.TypeNewDecimal:
611+
return &ast.A_Const{
612+
Val: &ast.Float{
613+
// TODO: Extract the value from n.TexprNode
614+
},
615+
}
616+
617+
case mysql.TypeBlob, mysql.TypeString, mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeLongBlob, mysql.TypeMediumBlob, mysql.TypeTinyBlob, mysql.TypeEnum:
618+
}
583619
return &ast.A_Const{
584620
Val: &ast.String{
585621
Str: n.Datum.GetString(),
@@ -1219,7 +1255,32 @@ func (c *cc) convertSetStmt(n *pcast.SetStmt) ast.Node {
12191255
}
12201256

12211257
func (c *cc) convertShowStmt(n *pcast.ShowStmt) ast.Node {
1222-
return todo(n)
1258+
if n.Tp != pcast.ShowWarnings {
1259+
return todo(n)
1260+
}
1261+
level := "level"
1262+
code := "code"
1263+
message := "message"
1264+
stmt := &ast.SelectStmt{
1265+
FromClause: &ast.List{},
1266+
TargetList: &ast.List{
1267+
Items: []ast.Node{
1268+
&ast.ResTarget{
1269+
Name: &level,
1270+
Val: &ast.A_Const{Val: &ast.String{}},
1271+
},
1272+
&ast.ResTarget{
1273+
Name: &code,
1274+
Val: &ast.A_Const{Val: &ast.Integer{}},
1275+
},
1276+
&ast.ResTarget{
1277+
Name: &message,
1278+
Val: &ast.A_Const{Val: &ast.String{}},
1279+
},
1280+
},
1281+
},
1282+
}
1283+
return stmt
12231284
}
12241285

12251286
func (c *cc) convertShutdownStmt(n *pcast.ShutdownStmt) ast.Node {

0 commit comments

Comments
 (0)