From 29f0e7b13ed1825bd9f6e20a2eae5c0e3d5747da Mon Sep 17 00:00:00 2001 From: Kyle Gray Date: Tue, 3 Dec 2024 13:35:08 -0800 Subject: [PATCH 1/6] feat(mysql): Add a test for VECTOR column type --- .../testdata/mysql_vector/mysql/go/db.go | 31 ++++++++++++ .../testdata/mysql_vector/mysql/go/models.go | 10 ++++ .../mysql_vector/mysql/go/query.sql.go | 48 +++++++++++++++++++ .../testdata/mysql_vector/mysql/query.sql | 7 +++ .../testdata/mysql_vector/mysql/schema.sql | 4 ++ .../testdata/mysql_vector/mysql/sqlc.json | 14 ++++++ 6 files changed, 114 insertions(+) create mode 100644 internal/endtoend/testdata/mysql_vector/mysql/go/db.go create mode 100644 internal/endtoend/testdata/mysql_vector/mysql/go/models.go create mode 100644 internal/endtoend/testdata/mysql_vector/mysql/go/query.sql.go create mode 100644 internal/endtoend/testdata/mysql_vector/mysql/query.sql create mode 100644 internal/endtoend/testdata/mysql_vector/mysql/schema.sql create mode 100644 internal/endtoend/testdata/mysql_vector/mysql/sqlc.json diff --git a/internal/endtoend/testdata/mysql_vector/mysql/go/db.go b/internal/endtoend/testdata/mysql_vector/mysql/go/db.go new file mode 100644 index 0000000000..0ea90b328a --- /dev/null +++ b/internal/endtoend/testdata/mysql_vector/mysql/go/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +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/mysql_vector/mysql/go/models.go b/internal/endtoend/testdata/mysql_vector/mysql/go/models.go new file mode 100644 index 0000000000..09d13e859b --- /dev/null +++ b/internal/endtoend/testdata/mysql_vector/mysql/go/models.go @@ -0,0 +1,10 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package querytest + +type Foo struct { + ID int32 + Embedding +} diff --git a/internal/endtoend/testdata/mysql_vector/mysql/go/query.sql.go b/internal/endtoend/testdata/mysql_vector/mysql/go/query.sql.go new file mode 100644 index 0000000000..428d1cc0fe --- /dev/null +++ b/internal/endtoend/testdata/mysql_vector/mysql/go/query.sql.go @@ -0,0 +1,48 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const insertVector = `-- name: InsertVector :exec +INSERT INTO foo(embedding) VALUES (STRING_TO_VECTOR('[0.1, 0.2, 0.3, 0.4]')) +` + +func (q *Queries) InsertVector(ctx context.Context) error { + _, err := q.db.ExecContext(ctx, insertVector) + return err +} + +const selectVector = `-- name: SelectVector :many +SELECT id FROM foo +ORDER BY DISTANCE(STRING_TO_VECTOR('[1.2, 3.4, 5.6]'), embedding, 'L2_squared') +LIMIT 10 +` + +func (q *Queries) SelectVector(ctx context.Context) ([]int32, error) { + rows, err := q.db.QueryContext(ctx, selectVector) + if err != nil { + return nil, err + } + defer rows.Close() + var items []int32 + for rows.Next() { + var id int32 + if err := rows.Scan(&id); err != nil { + return nil, err + } + items = append(items, id) + } + 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/mysql_vector/mysql/query.sql b/internal/endtoend/testdata/mysql_vector/mysql/query.sql new file mode 100644 index 0000000000..358d69129f --- /dev/null +++ b/internal/endtoend/testdata/mysql_vector/mysql/query.sql @@ -0,0 +1,7 @@ +-- name: InsertVector :exec +INSERT INTO foo(embedding) VALUES (STRING_TO_VECTOR('[0.1, 0.2, 0.3, 0.4]')); + +-- name: SelectVector :many +SELECT id FROM foo +ORDER BY DISTANCE(STRING_TO_VECTOR('[1.2, 3.4, 5.6]'), embedding, 'L2_squared') +LIMIT 10; diff --git a/internal/endtoend/testdata/mysql_vector/mysql/schema.sql b/internal/endtoend/testdata/mysql_vector/mysql/schema.sql new file mode 100644 index 0000000000..da61ac5682 --- /dev/null +++ b/internal/endtoend/testdata/mysql_vector/mysql/schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE foo( + id INT PRIMARY KEY auto_increment, + embedding VECTOR(4) +); diff --git a/internal/endtoend/testdata/mysql_vector/mysql/sqlc.json b/internal/endtoend/testdata/mysql_vector/mysql/sqlc.json new file mode 100644 index 0000000000..7dabfeef72 --- /dev/null +++ b/internal/endtoend/testdata/mysql_vector/mysql/sqlc.json @@ -0,0 +1,14 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "sql_package": "database/sql", + "sql_driver": "github.com/go-sql-driver/mysql", + "engine": "mysql", + "name": "querytest", + "schema": "schema.sql", + "queries": "query.sql" + } + ] +} From 9cbc6f9b547611dd2c2b8f4e96df813b65db6cbc Mon Sep 17 00:00:00 2001 From: Kyle Gray Date: Tue, 3 Dec 2024 13:42:18 -0800 Subject: [PATCH 2/6] Fix invalid Go file --- internal/endtoend/testdata/mysql_vector/mysql/go/models.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/endtoend/testdata/mysql_vector/mysql/go/models.go b/internal/endtoend/testdata/mysql_vector/mysql/go/models.go index 09d13e859b..8c8f7ad863 100644 --- a/internal/endtoend/testdata/mysql_vector/mysql/go/models.go +++ b/internal/endtoend/testdata/mysql_vector/mysql/go/models.go @@ -5,6 +5,6 @@ package querytest type Foo struct { - ID int32 - Embedding + ID int32 + Embedding interface{} } From b1d89cc11d4248f5171d52b586d1d4244d09fc59 Mon Sep 17 00:00:00 2001 From: Kyle Gray Date: Wed, 11 Dec 2024 15:17:20 -0800 Subject: [PATCH 3/6] Use MySQL 9.0 for tests --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b4b87de10..149cb9a23f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,7 +58,7 @@ jobs: # Start a MySQL server - uses: shogo82148/actions-setup-mysql@v1 with: - mysql-version: "8.1" + mysql-version: "9.0" - name: test ./... run: gotestsum --junitfile junit.xml -- --tags=examples -timeout 20m ./... From 663694b864fa2bb104b6b8b178f55c13a4984cb3 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Tue, 24 Dec 2024 11:31:55 -0800 Subject: [PATCH 4/6] Fix reference issue --- examples/ondeck/mysql/schema/0002_venue.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ondeck/mysql/schema/0002_venue.sql b/examples/ondeck/mysql/schema/0002_venue.sql index 4fc842cee0..dcab205c96 100644 --- a/examples/ondeck/mysql/schema/0002_venue.sql +++ b/examples/ondeck/mysql/schema/0002_venue.sql @@ -5,7 +5,7 @@ CREATE TABLE venues ( statuses text, -- status[], slug text not null COMMENT 'This value appears in public URLs', name varchar(255) not null, - city text not null references city(slug), + city varchar(255) not null references city(slug), spotify_playlist varchar(255) not null, songkick_id text, tags text -- text[] From e23198929cd34680308e45f289a089f33207df8a Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Tue, 24 Dec 2024 11:38:13 -0800 Subject: [PATCH 5/6] Fix last two test failures --- internal/endtoend/testdata/join_right/mysql/go/models.go | 4 ++-- .../endtoend/testdata/join_right/mysql/go/query.sql.go | 6 +++--- internal/endtoend/testdata/join_right/mysql/schema.sql | 4 ++-- .../endtoend/testdata/join_table_name/mysql/go/models.go | 4 ++-- .../testdata/join_table_name/mysql/go/query.sql.go | 8 ++++---- .../endtoend/testdata/join_table_name/mysql/schema.sql | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/internal/endtoend/testdata/join_right/mysql/go/models.go b/internal/endtoend/testdata/join_right/mysql/go/models.go index e7bd635461..e148a9e720 100644 --- a/internal/endtoend/testdata/join_right/mysql/go/models.go +++ b/internal/endtoend/testdata/join_right/mysql/go/models.go @@ -9,10 +9,10 @@ import ( ) type Bar struct { - ID uint64 + ID int32 } type Foo struct { - ID uint64 + ID int32 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 70504249d3..90f982a1c6 100644 --- a/internal/endtoend/testdata/join_right/mysql/go/query.sql.go +++ b/internal/endtoend/testdata/join_right/mysql/go/query.sql.go @@ -18,12 +18,12 @@ WHERE f.id = ? ` type RightJoinRow struct { - ID sql.NullInt64 + ID sql.NullInt32 BarID sql.NullInt32 - ID_2 uint64 + ID_2 int32 } -func (q *Queries) RightJoin(ctx context.Context, id uint64) ([]RightJoinRow, error) { +func (q *Queries) RightJoin(ctx context.Context, id int32) ([]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/schema.sql b/internal/endtoend/testdata/join_right/mysql/schema.sql index 0559fc8ab8..e517b6e7cd 100644 --- a/internal/endtoend/testdata/join_right/mysql/schema.sql +++ b/internal/endtoend/testdata/join_right/mysql/schema.sql @@ -1,3 +1,3 @@ -CREATE TABLE foo (id serial not null, bar_id int references bar(id)); -CREATE TABLE bar (id serial not null); +CREATE TABLE foo (id integer not null, bar_id integer references bar(id)); +CREATE TABLE bar (id integer not null); diff --git a/internal/endtoend/testdata/join_table_name/mysql/go/models.go b/internal/endtoend/testdata/join_table_name/mysql/go/models.go index d02124b551..a3154c1c61 100644 --- a/internal/endtoend/testdata/join_table_name/mysql/go/models.go +++ b/internal/endtoend/testdata/join_table_name/mysql/go/models.go @@ -9,10 +9,10 @@ import ( ) type Bar struct { - ID uint64 + ID int32 } type Foo struct { - ID uint64 + ID int32 Bar sql.NullInt32 } diff --git a/internal/endtoend/testdata/join_table_name/mysql/go/query.sql.go b/internal/endtoend/testdata/join_table_name/mysql/go/query.sql.go index d5f2cc1f99..6704be9680 100644 --- a/internal/endtoend/testdata/join_table_name/mysql/go/query.sql.go +++ b/internal/endtoend/testdata/join_table_name/mysql/go/query.sql.go @@ -17,13 +17,13 @@ WHERE bar.id = ? AND foo.id = ? ` type TableNameParams struct { - ID uint64 - ID_2 uint64 + ID int32 + ID_2 int32 } -func (q *Queries) TableName(ctx context.Context, arg TableNameParams) (uint64, error) { +func (q *Queries) TableName(ctx context.Context, arg TableNameParams) (int32, error) { row := q.db.QueryRowContext(ctx, tableName, arg.ID, arg.ID_2) - var id uint64 + var id int32 err := row.Scan(&id) return id, err } diff --git a/internal/endtoend/testdata/join_table_name/mysql/schema.sql b/internal/endtoend/testdata/join_table_name/mysql/schema.sql index c6254b343e..fe600c9ec6 100644 --- a/internal/endtoend/testdata/join_table_name/mysql/schema.sql +++ b/internal/endtoend/testdata/join_table_name/mysql/schema.sql @@ -1,3 +1,3 @@ -CREATE TABLE bar (id serial not null); -CREATE TABLE foo (id serial not null, bar integer references bar(id)); +CREATE TABLE bar (id integer not null); +CREATE TABLE foo (id integer not null, bar integer references bar(id)); From 88b00e5c5178751415f52a5e7e773030868d9dc3 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Tue, 24 Dec 2024 11:53:30 -0800 Subject: [PATCH 6/6] Add UNIQUE --- internal/endtoend/testdata/join_right/mysql/schema.sql | 7 ++++++- .../endtoend/testdata/join_table_name/mysql/schema.sql | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/internal/endtoend/testdata/join_right/mysql/schema.sql b/internal/endtoend/testdata/join_right/mysql/schema.sql index e517b6e7cd..f0f2cb1685 100644 --- a/internal/endtoend/testdata/join_right/mysql/schema.sql +++ b/internal/endtoend/testdata/join_right/mysql/schema.sql @@ -1,3 +1,8 @@ +CREATE TABLE bar ( + id integer not null, + UNIQUE(id) +); + CREATE TABLE foo (id integer not null, bar_id integer references bar(id)); -CREATE TABLE bar (id integer not null); + diff --git a/internal/endtoend/testdata/join_table_name/mysql/schema.sql b/internal/endtoend/testdata/join_table_name/mysql/schema.sql index fe600c9ec6..f54c3b485d 100644 --- a/internal/endtoend/testdata/join_table_name/mysql/schema.sql +++ b/internal/endtoend/testdata/join_table_name/mysql/schema.sql @@ -1,3 +1,7 @@ -CREATE TABLE bar (id integer not null); +CREATE TABLE bar ( + id integer not null, + UNIQUE (id) +); + CREATE TABLE foo (id integer not null, bar integer references bar(id));