Skip to content

Commit bdbe55d

Browse files
authored
Add SQL Server, Spanner and DuckDB to goldeneye: generate their dialects and check the analyze cases against live databases (#4619)
1 parent 0cd1040 commit bdbe55d

43 files changed

Lines changed: 6372 additions & 304 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/gen.yml

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,89 @@ jobs:
104104
path: internal/engine/sqlite/dialect
105105
- name: Fail if the committed dialect differs
106106
run: git add -N internal/engine/sqlite && git diff --exit-code --stat -- internal/engine/sqlite
107+
108+
mssql:
109+
name: generate mssql dialect
110+
runs-on: ubuntu-24.04
111+
services:
112+
mssql:
113+
image: mcr.microsoft.com/mssql/server:2025-latest
114+
env:
115+
ACCEPT_EULA: Y
116+
MSSQL_SA_PASSWORD: Mysecretpassword1!
117+
ports:
118+
- 1433:1433
119+
options: --health-cmd "/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P 'Mysecretpassword1!' -Q 'SELECT 1'" --health-interval 10s --health-timeout 5s --health-retries 10
120+
steps:
121+
- uses: actions/checkout@v7
122+
- uses: actions/setup-go@v7
123+
with:
124+
go-version-file: internal/goldeneye/go.mod
125+
check-latest: true
126+
- run: go run ./cmd/goldeneye generate mssql
127+
working-directory: internal/goldeneye
128+
env:
129+
MSSQL_SERVER_URI: sqlserver://sa:Mysecretpassword1!@localhost:${{ job.services.mssql.ports['1433'] }}?encrypt=disable
130+
- name: Save results
131+
uses: actions/upload-artifact@v7
132+
with:
133+
name: dialect-mssql
134+
path: internal/engine/mssql/dialect
135+
- name: Fail if the committed dialect differs
136+
run: git add -N internal/engine/mssql && git diff --exit-code --stat -- internal/engine/mssql
137+
138+
spanner:
139+
name: generate googlesql dialect
140+
runs-on: ubuntu-24.04
141+
steps:
142+
- uses: actions/checkout@v7
143+
- uses: actions/setup-go@v7
144+
with:
145+
go-version-file: internal/goldeneye/go.mod
146+
check-latest: true
147+
# Spanner Omni is run the way its quickstart runs it, on the host
148+
# network, since a service container cannot be given a command.
149+
- name: Start Spanner Omni
150+
run: |
151+
docker run -d --name spanneromni --network host us-docker.pkg.dev/spanner-omni/images/spanner-omni:2026.r2.1-beta start-single-server
152+
for i in $(seq 1 60); do
153+
if docker exec spanneromni /google/spanner/bin/spanner databases list >/dev/null 2>&1; then exit 0; fi
154+
sleep 5
155+
done
156+
docker logs spanneromni
157+
exit 1
158+
- run: go run ./cmd/goldeneye generate spanner
159+
working-directory: internal/goldeneye
160+
env:
161+
SPANNER_SERVER_URI: localhost:15000
162+
- name: Save results
163+
uses: actions/upload-artifact@v7
164+
with:
165+
name: dialect-googlesql
166+
path: internal/engine/googlesql/dialect
167+
- name: Fail if the committed dialect differs
168+
run: git add -N internal/engine/googlesql && git diff --exit-code --stat -- internal/engine/googlesql
169+
170+
duckdb:
171+
name: generate duckdb dialect
172+
runs-on: ubuntu-24.04
173+
steps:
174+
- uses: actions/checkout@v7
175+
- uses: actions/setup-go@v7
176+
with:
177+
go-version-file: internal/goldeneye/go.mod
178+
check-latest: true
179+
# The current build of DuckDB's v2.0 preview channel, until 2.0 is
180+
# released: a later build than the dialect was generated from shows up
181+
# as a difference.
182+
- run: go run ./cmd/goldeneye install duckdb
183+
working-directory: internal/goldeneye
184+
- run: go run ./cmd/goldeneye generate duckdb
185+
working-directory: internal/goldeneye
186+
- name: Save results
187+
uses: actions/upload-artifact@v7
188+
with:
189+
name: dialect-duckdb
190+
path: internal/engine/duckdb/dialect
191+
- name: Fail if the committed dialect differs
192+
run: git add -N internal/engine/duckdb && git diff --exit-code --stat -- internal/engine/duckdb

CLAUDE.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,15 +150,19 @@ from a live database by `/internal/goldeneye`, a nested module, and its tests
150150
verify the committed files against one byte for byte. The same module checks
151151
the `analyze_*` cases under `/internal/endtoend/testdata/` against what the
152152
database itself reports for them, so a `fixture.sql` next to a case's schema
153-
gives the queries rows to run against. ClickHouse, MySQL and SQLite have the
154-
check today; engines whose database is not available skip.
153+
gives the queries rows to run against. ClickHouse, DuckDB, MySQL, SQLite,
154+
SQL Server and Spanner have the check today; engines whose database is not
155+
available skip.
155156

156157
```bash
157158
cd internal/goldeneye
158159
go run ./cmd/goldeneye install clickhouse # download the pinned clickhouse binary once
160+
go run ./cmd/goldeneye install duckdb # download the current DuckDB 2.0 preview build once
159161
go run ./cmd/goldeneye install sqlite # build the pinned sqlite3 shells once; needs a C compiler
160162
POSTGRESQL_SERVER_URI="postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable" \
161-
MYSQL_SERVER_URI="root:mysecretpassword@tcp(127.0.0.1:3306)/mysql" go test ./...
163+
MYSQL_SERVER_URI="root:mysecretpassword@tcp(127.0.0.1:3306)/mysql" \
164+
MSSQL_SERVER_URI="sqlserver://sa:Mysecretpassword1!@127.0.0.1:1433?encrypt=disable" \
165+
SPANNER_SERVER_URI="localhost:15000" go test ./...
162166
go run ./cmd/goldeneye generate postgresql # rewrite the files after a change
163167
```
164168

docker-compose.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,21 @@ services:
1919
POSTGRES_DB: postgres
2020
POSTGRES_PASSWORD: mysecretpassword
2121
POSTGRES_USER: postgres
22+
23+
mssql:
24+
image: "mcr.microsoft.com/mssql/server:2025-latest"
25+
ports:
26+
- "1433:1433"
27+
restart: always
28+
environment:
29+
ACCEPT_EULA: "Y"
30+
MSSQL_SA_PASSWORD: "Mysecretpassword1!"
31+
32+
# Spanner Omni, the downloadable Spanner, serves plaintext gRPC on port
33+
# 15000 and its console on 15026; its quickstart runs it on the host
34+
# network.
35+
spanner:
36+
image: "us-docker.pkg.dev/spanner-omni/images/spanner-omni:2026.r2.1-beta"
37+
command: start-single-server
38+
network_mode: host
39+
restart: always
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
CREATE TABLE users (
22
id INT64 NOT NULL,
3-
name STRING NOT NULL,
4-
bio STRING,
3+
name STRING(MAX) NOT NULL,
4+
bio STRING(MAX),
55
) PRIMARY KEY (id);

internal/endtoend/testdata/analyze_basic/googlesql/stdout.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@
1313
{
1414
"name": "name",
1515
"type": {
16-
"name": "string"
16+
"name": "string",
17+
"args": [
18+
{
19+
"ident": "max"
20+
}
21+
]
1722
},
1823
"table": "users"
1924
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
CREATE TABLE users (
22
id INT64 NOT NULL,
3-
name STRING NOT NULL,
4-
bio STRING,
3+
name STRING(MAX) NOT NULL,
4+
bio STRING(MAX),
55
) PRIMARY KEY (id);

internal/endtoend/testdata/analyze_dml/googlesql/stdout.json

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@
1919
"column": {
2020
"name": "name",
2121
"type": {
22-
"name": "string"
22+
"name": "string",
23+
"args": [
24+
{
25+
"ident": "max"
26+
}
27+
]
2328
},
2429
"table": "users"
2530
}
@@ -30,7 +35,12 @@
3035
"name": "bio",
3136
"type": {
3237
"name": "string",
33-
"nullable": true
38+
"nullable": true,
39+
"args": [
40+
{
41+
"ident": "max"
42+
}
43+
]
3444
},
3545
"table": "users"
3646
}
@@ -51,7 +61,12 @@
5161
{
5262
"name": "name",
5363
"type": {
54-
"name": "string"
64+
"name": "string",
65+
"args": [
66+
{
67+
"ident": "max"
68+
}
69+
]
5570
},
5671
"table": "users"
5772
}
@@ -72,7 +87,12 @@
7287
"column": {
7388
"name": "name",
7489
"type": {
75-
"name": "string"
90+
"name": "string",
91+
"args": [
92+
{
93+
"ident": "max"
94+
}
95+
]
7696
},
7797
"table": "users"
7898
}
@@ -90,7 +110,12 @@
90110
"name": "bio",
91111
"type": {
92112
"name": "string",
93-
"nullable": true
113+
"nullable": true,
114+
"args": [
115+
{
116+
"ident": "max"
117+
}
118+
]
94119
},
95120
"table": "users"
96121
}
@@ -121,7 +146,12 @@
121146
{
122147
"name": "name",
123148
"type": {
124-
"name": "string"
149+
"name": "string",
150+
"args": [
151+
{
152+
"ident": "max"
153+
}
154+
]
125155
},
126156
"table": "users"
127157
}
@@ -132,7 +162,12 @@
132162
"column": {
133163
"name": "name",
134164
"type": {
135-
"name": "string"
165+
"name": "string",
166+
"args": [
167+
{
168+
"ident": "max"
169+
}
170+
]
136171
},
137172
"table": "users"
138173
}

internal/endtoend/testdata/analyze_select/googlesql/schema.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CREATE TABLE users (
22
id INT64 NOT NULL,
3-
name STRING NOT NULL,
4-
bio STRING,
3+
name STRING(MAX) NOT NULL,
4+
bio STRING(MAX),
55
) PRIMARY KEY (id);
66

77
CREATE TABLE posts (

internal/endtoend/testdata/analyze_select/googlesql/stdout.json

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,25 @@
1313
{
1414
"name": "name",
1515
"type": {
16-
"name": "string"
16+
"name": "string",
17+
"args": [
18+
{
19+
"ident": "max"
20+
}
21+
]
1722
},
1823
"table": "users"
1924
},
2025
{
2126
"name": "bio",
2227
"type": {
2328
"name": "string",
24-
"nullable": true
29+
"nullable": true,
30+
"args": [
31+
{
32+
"ident": "max"
33+
}
34+
]
2535
},
2636
"table": "users"
2737
}
@@ -48,7 +58,12 @@
4858
{
4959
"name": "name",
5060
"type": {
51-
"name": "string"
61+
"name": "string",
62+
"args": [
63+
{
64+
"ident": "max"
65+
}
66+
]
5267
},
5368
"table": "users"
5469
},
@@ -93,7 +108,12 @@
93108
"column": {
94109
"name": "name",
95110
"type": {
96-
"name": "string"
111+
"name": "string",
112+
"args": [
113+
{
114+
"ident": "max"
115+
}
116+
]
97117
},
98118
"table": "users"
99119
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"command": "analyze",
3+
"args": ["--dialect", "googlesql", "--schema", "schema.sql", "query.sql"],
4+
"contexts": ["base"]
5+
}

0 commit comments

Comments
 (0)