diff --git a/examples/booktest/mysql/db_test.go b/examples/booktest/mysql/db_test.go index 8ce5101d9d..6b9b841bf2 100644 --- a/examples/booktest/mysql/db_test.go +++ b/examples/booktest/mysql/db_test.go @@ -1,3 +1,4 @@ +//go:build examples // +build examples package booktest @@ -150,7 +151,7 @@ func TestBooks(t *testing.T) { t.Fatal(err) } for _, ab := range res { - t.Logf("Book %d: '%s', Author: '%s', ISBN: '%s' Tags: '%v'\n", ab.BookID, ab.Title, ab.Name, ab.Isbn, ab.Tags) + t.Logf("Book %d: '%s', Author: '%s', ISBN: '%s' Tags: '%v'\n", ab.BookID, ab.Title, ab.Name.String, ab.Isbn, ab.Tags) } // TODO: call say_hello(varchar) diff --git a/examples/booktest/mysql/query.sql.go b/examples/booktest/mysql/query.sql.go index 8c59971412..a8d3412f97 100644 --- a/examples/booktest/mysql/query.sql.go +++ b/examples/booktest/mysql/query.sql.go @@ -24,7 +24,7 @@ WHERE tags = ? type BooksByTagsRow struct { BookID int32 Title string - Name string + Name sql.NullString Isbn string Tags string } diff --git a/examples/kotlin/src/main/kotlin/com/example/booktest/mysql/QueriesImpl.kt b/examples/kotlin/src/main/kotlin/com/example/booktest/mysql/QueriesImpl.kt index e1012d8c42..d922d07ac8 100644 --- a/examples/kotlin/src/main/kotlin/com/example/booktest/mysql/QueriesImpl.kt +++ b/examples/kotlin/src/main/kotlin/com/example/booktest/mysql/QueriesImpl.kt @@ -22,7 +22,7 @@ WHERE tags = ? data class BooksByTagsRow ( val bookId: Int, val title: String, - val name: String, + val name: String?, val isbn: String, val tags: String ) diff --git a/internal/compiler/output_columns.go b/internal/compiler/output_columns.go index 2a38b90db9..0dbb084549 100644 --- a/internal/compiler/output_columns.go +++ b/internal/compiler/output_columns.go @@ -302,7 +302,14 @@ func isTableRequired(n ast.Node, tableName string, prior int) int { case ast.JoinTypeFull: return helper(tableOptional, tableOptional) } + case *ast.List: + for _, item := range n.Items { + if res := isTableRequired(item, tableName, prior); res != tableNotFound { + return res + } + } } + return tableNotFound } diff --git a/internal/endtoend/testdata/join_full/mysql/go/db.go b/internal/endtoend/testdata/join_full/mysql/go/db.go deleted file mode 100644 index 6a99519302..0000000000 --- a/internal/endtoend/testdata/join_full/mysql/go/db.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. - -package querytest - -import ( - "context" - "database/sql" -) - -type DBTX interface { - ExecContext(context.Context, string, ...interface{}) (sql.Result, error) - PrepareContext(context.Context, string) (*sql.Stmt, error) - QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) - QueryRowContext(context.Context, string, ...interface{}) *sql.Row -} - -func New(db DBTX) *Queries { - return &Queries{db: db} -} - -type Queries struct { - db DBTX -} - -func (q *Queries) WithTx(tx *sql.Tx) *Queries { - return &Queries{ - db: tx, - } -} diff --git a/internal/endtoend/testdata/join_full/mysql/go/models.go b/internal/endtoend/testdata/join_full/mysql/go/models.go deleted file mode 100644 index d7b3dd5a30..0000000000 --- a/internal/endtoend/testdata/join_full/mysql/go/models.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. - -package querytest - -import ( - "database/sql" -) - -type Bar struct { - ID int32 -} - -type Foo struct { - ID int32 - BarID sql.NullInt32 -} diff --git a/internal/endtoend/testdata/join_full/mysql/go/query.sql.go b/internal/endtoend/testdata/join_full/mysql/go/query.sql.go deleted file mode 100644 index fbc977ad37..0000000000 --- a/internal/endtoend/testdata/join_full/mysql/go/query.sql.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// source: query.sql - -package querytest - -import ( - "context" - "database/sql" -) - -const fullJoin = `-- name: FullJoin :many -SELECT f.id, f.bar_id, b.id -FROM foo f -FULL OUTER JOIN bar b ON b.id = f.bar_id -WHERE f.id = $1 -` - -type FullJoinRow struct { - ID sql.NullInt32 - BarID sql.NullInt32 - ID_2 sql.NullInt32 -} - -func (q *Queries) FullJoin(ctx context.Context, id int32) ([]FullJoinRow, error) { - rows, err := q.db.QueryContext(ctx, fullJoin, id) - if err != nil { - return nil, err - } - defer rows.Close() - var items []FullJoinRow - for rows.Next() { - var i FullJoinRow - if err := rows.Scan(&i.ID, &i.BarID, &i.ID_2); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} diff --git a/internal/endtoend/testdata/join_full/mysql/query.sql b/internal/endtoend/testdata/join_full/mysql/query.sql deleted file mode 100644 index 76abe8a07c..0000000000 --- a/internal/endtoend/testdata/join_full/mysql/query.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE foo (id serial not null, bar_id int references bar(id)); -CREATE TABLE bar (id serial not null); - --- name: FullJoin :many -SELECT f.id, f.bar_id, b.id -FROM foo f -FULL OUTER JOIN bar b ON b.id = f.bar_id -WHERE f.id = $1; \ No newline at end of file diff --git a/internal/endtoend/testdata/join_full/mysql/sqlc.json b/internal/endtoend/testdata/join_full/mysql/sqlc.json deleted file mode 100644 index c72b6132d5..0000000000 --- a/internal/endtoend/testdata/join_full/mysql/sqlc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": "1", - "packages": [ - { - "path": "go", - "engine": "postgresql", - "name": "querytest", - "schema": "query.sql", - "queries": "query.sql" - } - ] -} diff --git a/internal/endtoend/testdata/join_left/mysql/go/query.sql.go b/internal/endtoend/testdata/join_left/mysql/go/query.sql.go index c89a48750c..269aa0f4c7 100644 --- a/internal/endtoend/testdata/join_left/mysql/go/query.sql.go +++ b/internal/endtoend/testdata/join_left/mysql/go/query.sql.go @@ -48,6 +48,7 @@ func (q *Queries) GetMayors(ctx context.Context) ([]GetMayorsRow, error) { const getMayorsOptional = `-- name: GetMayorsOptional :many SELECT user_id, + cities.city_id, mayors.full_name FROM users LEFT JOIN cities USING (city_id) @@ -56,6 +57,7 @@ LEFT JOIN mayors USING (mayor_id) type GetMayorsOptionalRow struct { UserID int32 + CityID sql.NullInt32 FullName sql.NullString } @@ -68,7 +70,7 @@ func (q *Queries) GetMayorsOptional(ctx context.Context) ([]GetMayorsOptionalRow var items []GetMayorsOptionalRow for rows.Next() { var i GetMayorsOptionalRow - if err := rows.Scan(&i.UserID, &i.FullName); err != nil { + if err := rows.Scan(&i.UserID, &i.CityID, &i.FullName); err != nil { return nil, err } items = append(items, i) diff --git a/internal/endtoend/testdata/join_left/mysql/query.sql b/internal/endtoend/testdata/join_left/mysql/query.sql index 421f078884..1d3b828949 100644 --- a/internal/endtoend/testdata/join_left/mysql/query.sql +++ b/internal/endtoend/testdata/join_left/mysql/query.sql @@ -1,4 +1,4 @@ ---- https://github.com/kyleconroy/sqlc/issues/604 +-- https://github.com/kyleconroy/sqlc/issues/604 CREATE TABLE users ( user_id INT PRIMARY KEY, city_id INT -- nullable @@ -23,7 +23,8 @@ INNER JOIN mayors USING (mayor_id); -- name: GetMayorsOptional :many SELECT user_id, + cities.city_id, mayors.full_name FROM users LEFT JOIN cities USING (city_id) -LEFT JOIN mayors USING (mayor_id); \ No newline at end of file +LEFT JOIN mayors USING (mayor_id); diff --git a/internal/endtoend/testdata/join_left/mysql/sqlc.json b/internal/endtoend/testdata/join_left/mysql/sqlc.json index c72b6132d5..445bbd1589 100644 --- a/internal/endtoend/testdata/join_left/mysql/sqlc.json +++ b/internal/endtoend/testdata/join_left/mysql/sqlc.json @@ -3,7 +3,7 @@ "packages": [ { "path": "go", - "engine": "postgresql", + "engine": "mysql", "name": "querytest", "schema": "query.sql", "queries": "query.sql" diff --git a/internal/endtoend/testdata/join_right/mysql/go/models.go b/internal/endtoend/testdata/join_right/mysql/go/models.go index d7b3dd5a30..b96d09f916 100644 --- a/internal/endtoend/testdata/join_right/mysql/go/models.go +++ b/internal/endtoend/testdata/join_right/mysql/go/models.go @@ -7,10 +7,10 @@ import ( ) type Bar struct { - ID int32 + ID int64 } type Foo struct { - ID int32 + ID int64 BarID sql.NullInt32 } diff --git a/internal/endtoend/testdata/join_right/mysql/go/query.sql.go b/internal/endtoend/testdata/join_right/mysql/go/query.sql.go index 90c3d09a02..f8792ad3fc 100644 --- a/internal/endtoend/testdata/join_right/mysql/go/query.sql.go +++ b/internal/endtoend/testdata/join_right/mysql/go/query.sql.go @@ -12,16 +12,16 @@ const rightJoin = `-- name: RightJoin :many SELECT f.id, f.bar_id, b.id FROM foo f RIGHT JOIN bar b ON b.id = f.bar_id -WHERE f.id = $1 +WHERE f.id = ? ` type RightJoinRow struct { - ID sql.NullInt32 + ID sql.NullInt64 BarID sql.NullInt32 - ID_2 int32 + ID_2 int64 } -func (q *Queries) RightJoin(ctx context.Context, id int32) ([]RightJoinRow, error) { +func (q *Queries) RightJoin(ctx context.Context, id int64) ([]RightJoinRow, error) { rows, err := q.db.QueryContext(ctx, rightJoin, id) if err != nil { return nil, err diff --git a/internal/endtoend/testdata/join_right/mysql/query.sql b/internal/endtoend/testdata/join_right/mysql/query.sql index f70c29dd05..7512513dfe 100644 --- a/internal/endtoend/testdata/join_right/mysql/query.sql +++ b/internal/endtoend/testdata/join_right/mysql/query.sql @@ -5,4 +5,4 @@ CREATE TABLE bar (id serial not null); SELECT f.id, f.bar_id, b.id FROM foo f RIGHT JOIN bar b ON b.id = f.bar_id -WHERE f.id = $1; \ No newline at end of file +WHERE f.id = ?; diff --git a/internal/endtoend/testdata/join_right/mysql/sqlc.json b/internal/endtoend/testdata/join_right/mysql/sqlc.json index c72b6132d5..445bbd1589 100644 --- a/internal/endtoend/testdata/join_right/mysql/sqlc.json +++ b/internal/endtoend/testdata/join_right/mysql/sqlc.json @@ -3,7 +3,7 @@ "packages": [ { "path": "go", - "engine": "postgresql", + "engine": "mysql", "name": "querytest", "schema": "query.sql", "queries": "query.sql" diff --git a/internal/endtoend/testdata/params_location/mysql/go/query.sql.go b/internal/endtoend/testdata/params_location/mysql/go/query.sql.go index 215ea4eb51..6fd58729d5 100644 --- a/internal/endtoend/testdata/params_location/mysql/go/query.sql.go +++ b/internal/endtoend/testdata/params_location/mysql/go/query.sql.go @@ -83,8 +83,8 @@ WHERE orders.price > ? ` type ListUserOrdersRow struct { - ID int32 - FirstName string + ID sql.NullInt32 + FirstName sql.NullString Price string } diff --git a/internal/engine/dolphin/convert.go b/internal/engine/dolphin/convert.go index f6e5853969..cfea5a7baa 100644 --- a/internal/engine/dolphin/convert.go +++ b/internal/engine/dolphin/convert.go @@ -849,11 +849,18 @@ func (c *cc) convertJoin(n *pcast.Join) *ast.List { return &ast.List{} } if n.Right != nil && n.Left != nil { + // MySQL doesn't have a FULL join type + joinType := ast.JoinType(n.Tp) + if joinType >= ast.JoinTypeFull { + joinType++ + } + return &ast.List{ Items: []ast.Node{&ast.JoinExpr{ - Larg: c.convert(n.Left), - Rarg: c.convert(n.Right), - Quals: c.convert(n.On), + Jointype: joinType, + Larg: c.convert(n.Left), + Rarg: c.convert(n.Right), + Quals: c.convert(n.On), }}, } }