Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/workflows/gen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,35 @@ jobs:
- name: Fail if the committed dialect differs
run: git add -N internal/engine/postgresql && git diff --exit-code --stat -- internal/engine/postgresql

mysql:
name: generate mysql dialect
runs-on: ubuntu-24.04
services:
mysql:
image: mysql:26.7
env:
MYSQL_ROOT_PASSWORD: mysecretpassword
ports:
- 3306:3306
options: --health-cmd "mysqladmin ping -h 127.0.0.1 -pmysecretpassword" --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v7
with:
go-version-file: internal/goldeneye/go.mod
check-latest: true
- run: go run ./cmd/goldeneye generate mysql
working-directory: internal/goldeneye
env:
MYSQL_SERVER_URI: root:mysecretpassword@tcp(localhost:${{ job.services.mysql.ports['3306'] }})/mysql
- name: Save results
uses: actions/upload-artifact@v7
with:
name: dialect-mysql
path: internal/engine/dolphin/dialect
- name: Fail if the committed dialect differs
run: git add -N internal/engine/dolphin && git diff --exit-code --stat -- internal/engine/dolphin

clickhouse:
name: generate clickhouse dialect
runs-on: ubuntu-24.04
Expand Down
7 changes: 4 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,14 +150,15 @@ from a live database by `/internal/goldeneye`, a nested module, and its tests
verify the committed files against one byte for byte. The same module checks
the `analyze_*` cases under `/internal/endtoend/testdata/` against what the
database itself reports for them, so a `fixture.sql` next to a case's schema
gives the queries rows to run against. ClickHouse and SQLite have the check
today; engines whose database is not available skip.
gives the queries rows to run against. ClickHouse, MySQL and SQLite have the
check today; engines whose database is not available skip.

```bash
cd internal/goldeneye
go run ./cmd/goldeneye install clickhouse # download the pinned clickhouse binary once
go run ./cmd/goldeneye install sqlite # build the pinned sqlite3 shells once; needs a C compiler
POSTGRESQL_SERVER_URI="postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable" go test ./...
POSTGRESQL_SERVER_URI="postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable" \
MYSQL_SERVER_URI="root:mysecretpassword@tcp(127.0.0.1:3306)/mysql" go test ./...
go run ./cmd/goldeneye generate postgresql # rewrite the files after a change
```

Expand Down
3 changes: 2 additions & 1 deletion internal/endtoend/testdata/analyze_select/mysql/stdout.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,8 @@
{
"name": "created",
"type": {
"name": "datetime"
"name": "datetime",
"nullable": true
}
}
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"command": "analyze",
"args": ["--dialect", "mysql", "--schema", "schema.sql", "query.sql"],
"contexts": ["base"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-- name: ListColumns :many
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = ?;

-- name: CountTables :one
SELECT count(*) AS total FROM information_schema.tables WHERE table_type = ?;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CREATE TABLE authors (
id BIGINT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
[
{
"name": "ListColumns",
"cmd": ":many",
"columns": [
{
"name": "table_name",
"type": {
"name": "varchar"
},
"table": "columns"
},
{
"name": "column_name",
"type": {
"name": "varchar",
"nullable": true
},
"table": "columns"
},
{
"name": "data_type",
"type": {
"name": "longtext",
"nullable": true
},
"table": "columns"
}
],
"params": [
{
"number": 1,
"column": {
"name": "table_schema",
"type": {
"name": "varchar"
},
"table": "columns"
}
}
]
},
{
"name": "CountTables",
"cmd": ":one",
"columns": [
{
"name": "total",
"type": {
"name": "bigint"
}
}
],
"params": [
{
"number": 1,
"column": {
"name": "table_type",
"type": {
"name": "enum"
},
"table": "tables"
}
}
]
}
]
26 changes: 13 additions & 13 deletions internal/engine/dolphin/dialect/functions.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
{"name":"ASIN","args":[{"type":"double precision"}],"returns":"double precision"}
{"name":"ATAN","args":[{"type":"double precision"}],"returns":"double precision"}
{"name":"ATAN2","args":[{"type":"double precision"}],"returns":"double precision"}
{"name":"AVG","args":[{"type":"any"}],"returns":"any"}
{"name":"AVG","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"BENCHMARK","args":[{"type":"int"},{"type":"any"}],"returns":"int"}
{"name":"BIN","args":[{"type":"int"}],"returns":"text"}
{"name":"BIN_TO_UUID","args":[{"type":"binary"}],"returns":"text"}
Expand Down Expand Up @@ -130,7 +130,7 @@
{"name":"IS_USED_LOCK","args":[{"type":"text"}],"returns":"bool"}
{"name":"IS_UUID","args":[{"type":"text"}],"returns":"bool"}
{"name":"JSON_ARRAY","args":[{"type":"any","mode":"v"}],"returns":"json"}
{"name":"JSON_ARRAYAGG","args":[{"type":"any"}],"returns":"json"}
{"name":"JSON_ARRAYAGG","args":[{"type":"any"}],"returns":"json","nullable":true}
{"name":"JSON_ARRAY_APPEND","args":[{"type":"text"},{"type":"text"},{"type":"any"},{"type":"any","mode":"v"}],"returns":"json"}
{"name":"JSON_ARRAY_INSERT","args":[{"type":"text"},{"type":"text"},{"type":"any"},{"type":"any","mode":"v"}],"returns":"json"}
{"name":"JSON_CONTAINS","args":[{"type":"text"},{"type":"text"}],"returns":"bool"}
Expand All @@ -147,7 +147,7 @@
{"name":"JSON_MERGE_PATCH","args":[{"type":"text"},{"type":"text"},{"type":"text","mode":"v"}],"returns":"json"}
{"name":"JSON_MERGE_PRESERVE","args":[{"type":"text"},{"type":"text"},{"type":"text","mode":"v"}],"returns":"json"}
{"name":"JSON_OBJECT","args":[{"type":"any","mode":"v"}],"returns":"json"}
{"name":"JSON_OBJECTAGG","args":[{"type":"any"},{"type":"any"}],"returns":"json"}
{"name":"JSON_OBJECTAGG","args":[{"type":"any"},{"type":"any"}],"returns":"json","nullable":true}
{"name":"JSON_OVERLAPS","args":[{"type":"text"},{"type":"text"}],"returns":"bool"}
{"name":"JSON_PRETTY","args":[{"type":"text"}],"returns":"any"}
{"name":"JSON_QUOTE","args":[{"type":"text"}],"returns":"text"}
Expand Down Expand Up @@ -196,7 +196,7 @@
{"name":"MASTER_POS_WAIT","args":[{"type":"text"},{"type":"int"}],"returns":"int"}
{"name":"MASTER_POS_WAIT","args":[{"type":"text"},{"type":"int"},{"type":"int"}],"returns":"int"}
{"name":"MASTER_POS_WAIT","args":[{"type":"text"},{"type":"int"},{"type":"int"},{"type":"text"}],"returns":"int"}
{"name":"MAX","args":[{"type":"any"}],"returns":"any"}
{"name":"MAX","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"MBRCONTAINS","args":[{"type":"any"},{"type":"any"}],"returns":"bool"}
{"name":"MBRCOVEREDBY","args":[{"type":"any"},{"type":"any"}],"returns":"bool"}
{"name":"MBRCOVERS","args":[{"type":"any"},{"type":"any"}],"returns":"bool"}
Expand All @@ -209,7 +209,7 @@
{"name":"MD5","args":[{"type":"text"}],"returns":"text"}
{"name":"MICROSECOND","args":[{"type":"time"}],"returns":"int"}
{"name":"MID","args":[{"type":"text"},{"type":"int"},{"type":"int"}],"returns":"text"}
{"name":"MIN","args":[{"type":"any"}],"returns":"any"}
{"name":"MIN","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"MINUTE","args":[{"type":"time"}],"returns":"int"}
{"name":"MOD","args":[{"type":"int"},{"type":"int"}],"returns":"int"}
{"name":"MONTH","args":[{"type":"date"}],"returns":"int"}
Expand Down Expand Up @@ -277,10 +277,10 @@
{"name":"SQRT","args":[{"type":"double precision"}],"returns":"double precision"}
{"name":"STATEMENT_DIGEST","args":[{"type":"text"}],"returns":"text"}
{"name":"STATEMENT_DIGEST_TEXT","args":[{"type":"text"}],"returns":"text"}
{"name":"STD","args":[{"type":"any"}],"returns":"any"}
{"name":"STDDEV","args":[{"type":"any"}],"returns":"any"}
{"name":"STDDEV_POP","args":[{"type":"any"}],"returns":"any"}
{"name":"STDDEV_SAMP","args":[{"type":"any"}],"returns":"any"}
{"name":"STD","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"STDDEV","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"STDDEV_POP","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"STDDEV_SAMP","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"STRCMP","args":[{"type":"text"},{"type":"text"}],"returns":"tinyint"}
{"name":"STR_TO_DATE","args":[{"type":"text"},{"type":"text"}],"returns":"datetime"}
{"name":"ST_AREA","args":[{"type":"any"}],"returns":"double precision"}
Expand Down Expand Up @@ -468,7 +468,7 @@
{"name":"SUBSTRING","args":[{"type":"text"},{"type":"int"},{"type":"int"}],"returns":"text"}
{"name":"SUBSTRING_INDEX","args":[{"type":"text"},{"type":"int"},{"type":"int"}],"returns":"text"}
{"name":"SUBTIME","args":[{"type":"time"},{"type":"time"}],"returns":"time"}
{"name":"SUM","args":[{"type":"any"}],"returns":"any"}
{"name":"SUM","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"SYSDATE","returns":"datetime"}
{"name":"SYSDATE","args":[{"type":"int"}],"returns":"datetime"}
{"name":"SYSTEM_USER","returns":"text"}
Expand Down Expand Up @@ -505,9 +505,9 @@
{"name":"UUID_TO_BIN","args":[{"type":"text"},{"type":"tinyint"}],"returns":"binary"}
{"name":"VALIDATE_PASSWORD_STRENGTH","args":[{"type":"text"}],"returns":"int"}
{"name":"VALUES","args":[{"type":"any"}],"returns":"any"}
{"name":"VARIANCE","args":[{"type":"any"}],"returns":"any"}
{"name":"VAR_POP","args":[{"type":"any"}],"returns":"any"}
{"name":"VAR_SAMP","args":[{"type":"any"}],"returns":"any"}
{"name":"VARIANCE","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"VAR_POP","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"VAR_SAMP","args":[{"type":"any"}],"returns":"any","nullable":true}
{"name":"VERSION","returns":"text"}
{"name":"WAIT_FOR_EXECUTED_GTID_SET","args":[{"type":"text"},{"type":"int","has_default":true}],"returns":"bool"}
{"name":"WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS","args":[{"type":"text"},{"type":"int","has_default":true},{"type":"text","has_default":true}],"returns":"bool"}
Expand Down
Loading
Loading