Skip to content

Commit

Permalink
Add support for SHOW WARNINGS and SELECTs without a FROM (#2227)
Browse files Browse the repository at this point in the history
Like SELECT 1, 'a';
  • Loading branch information
Jille committed Apr 27, 2023
1 parent 432e676 commit 127ff1a
Show file tree
Hide file tree
Showing 14 changed files with 267 additions and 5 deletions.
18 changes: 18 additions & 0 deletions internal/compiler/output_columns.go
Expand Up @@ -102,6 +102,24 @@ func outputColumns(qc *QueryCatalog, node ast.Node) ([]*Column, error) {
}
switch n := res.Val.(type) {

case *ast.A_Const:
name := ""
if res.Name != nil {
name = *res.Name
}
switch n.Val.(type) {
case *ast.String:
cols = append(cols, &Column{Name: name, DataType: "text", NotNull: true})
case *ast.Integer:
cols = append(cols, &Column{Name: name, DataType: "int", NotNull: true})
case *ast.Float:
cols = append(cols, &Column{Name: name, DataType: "float", NotNull: true})
case *ast.Boolean:
cols = append(cols, &Column{Name: name, DataType: "bool", NotNull: true})
default:
cols = append(cols, &Column{Name: name, DataType: "any", NotNull: false})
}

case *ast.A_Expr:
name := ""
if res.Name != nil {
Expand Down
4 changes: 2 additions & 2 deletions internal/endtoend/testdata/diff_no_output/go/query.sql.go

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

4 changes: 2 additions & 2 deletions internal/endtoend/testdata/diff_output/stderr.txt
Expand Up @@ -46,9 +46,9 @@
+SELECT 1
+`
+
+func (q *Queries) SelectOne(ctx context.Context) (interface{}, error) {
+func (q *Queries) SelectOne(ctx context.Context) (int32, error) {
+ row := q.db.QueryRowContext(ctx, selectOne)
+ var column_1 interface{}
+ var column_1 int32
+ err := row.Scan(&column_1)
+ return column_1, err
+}
31 changes: 31 additions & 0 deletions internal/endtoend/testdata/selectstatic/mysql/go/db.go

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

7 changes: 7 additions & 0 deletions internal/endtoend/testdata/selectstatic/mysql/go/models.go

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

35 changes: 35 additions & 0 deletions internal/endtoend/testdata/selectstatic/mysql/go/query.sql.go

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

2 changes: 2 additions & 0 deletions internal/endtoend/testdata/selectstatic/mysql/query.sql
@@ -0,0 +1,2 @@
-- name: SelectStatic :one
SELECT 'a', 'b' AS b, 1 AS num, true AS truefield, 1.0 AS floater
13 changes: 13 additions & 0 deletions internal/endtoend/testdata/selectstatic/mysql/sqlc.json
@@ -0,0 +1,13 @@
{
"version": "1",
"packages": [
{
"path": "go",
"sql_package": "database/sql",
"engine": "mysql",
"name": "querytest",
"schema": "query.sql",
"queries": "query.sql"
}
]
}
31 changes: 31 additions & 0 deletions internal/endtoend/testdata/show_warnings/mysql/go/db.go

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

7 changes: 7 additions & 0 deletions internal/endtoend/testdata/show_warnings/mysql/go/models.go

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

43 changes: 43 additions & 0 deletions internal/endtoend/testdata/show_warnings/mysql/go/query.sql.go

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

2 changes: 2 additions & 0 deletions internal/endtoend/testdata/show_warnings/mysql/query.sql
@@ -0,0 +1,2 @@
-- name: ShowWarnings :many
SHOW WARNINGS;
12 changes: 12 additions & 0 deletions internal/endtoend/testdata/show_warnings/mysql/sqlc.json
@@ -0,0 +1,12 @@
{
"version": "1",
"packages": [
{
"path": "go",
"engine": "mysql",
"name": "querytest",
"schema": "query.sql",
"queries": "query.sql"
}
]
}
63 changes: 62 additions & 1 deletion internal/engine/dolphin/convert.go
Expand Up @@ -6,6 +6,7 @@ import (
"strings"

pcast "github.com/pingcap/tidb/parser/ast"
"github.com/pingcap/tidb/parser/mysql"
"github.com/pingcap/tidb/parser/opcode"
driver "github.com/pingcap/tidb/parser/test_driver"
"github.com/pingcap/tidb/parser/types"
Expand Down Expand Up @@ -580,6 +581,41 @@ func (c *cc) convertUpdateStmt(n *pcast.UpdateStmt) *ast.UpdateStmt {
}

func (c *cc) convertValueExpr(n *driver.ValueExpr) *ast.A_Const {
switch n.TexprNode.Type.GetType() {
case mysql.TypeBit:
case mysql.TypeDate:
case mysql.TypeDatetime:
case mysql.TypeGeometry:
case mysql.TypeJSON:
case mysql.TypeNull:
case mysql.TypeSet:
case mysql.TypeShort:
case mysql.TypeDuration:
case mysql.TypeTimestamp:
// TODO: Create an AST type for these?

case mysql.TypeTiny,
mysql.TypeInt24,
mysql.TypeYear,
mysql.TypeLong,
mysql.TypeLonglong:
return &ast.A_Const{
Val: &ast.Integer{
Ival: n.Datum.GetInt64(),
},
}

case mysql.TypeDouble,
mysql.TypeFloat,
mysql.TypeNewDecimal:
return &ast.A_Const{
Val: &ast.Float{
// TODO: Extract the value from n.TexprNode
},
}

case mysql.TypeBlob, mysql.TypeString, mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeLongBlob, mysql.TypeMediumBlob, mysql.TypeTinyBlob, mysql.TypeEnum:
}
return &ast.A_Const{
Val: &ast.String{
Str: n.Datum.GetString(),
Expand Down Expand Up @@ -1219,7 +1255,32 @@ func (c *cc) convertSetStmt(n *pcast.SetStmt) ast.Node {
}

func (c *cc) convertShowStmt(n *pcast.ShowStmt) ast.Node {
return todo(n)
if n.Tp != pcast.ShowWarnings {
return todo(n)
}
level := "level"
code := "code"
message := "message"
stmt := &ast.SelectStmt{
FromClause: &ast.List{},
TargetList: &ast.List{
Items: []ast.Node{
&ast.ResTarget{
Name: &level,
Val: &ast.A_Const{Val: &ast.String{}},
},
&ast.ResTarget{
Name: &code,
Val: &ast.A_Const{Val: &ast.Integer{}},
},
&ast.ResTarget{
Name: &message,
Val: &ast.A_Const{Val: &ast.String{}},
},
},
},
}
return stmt
}

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

0 comments on commit 127ff1a

Please sign in to comment.