Skip to content

Commit 38efece

Browse files
authored
fix: migrations on CockroachDB v25+ (#3994)
I've added some output to the generated migrations files to make them easier to recreate, hence the big diff. These are important: ``` persistence/sql/migrations/20211004110001000000_change_client_primary_key.cockroach.down.sql persistence/sql/migrations/20211004110001000000_change_client_primary_key.cockroach.up.sql persistence/sql/migrations/20211004110003000000_change_client_primary_key.cockroach.down.sql persistence/sql/migrations/20211004110003000000_change_client_primary_key.cockroach.up.sql persistence/sql/migrations/20211011000001000000_change_jwk_primary_key.cockroach.down.sql persistence/sql/migrations/20211011000001000000_change_jwk_primary_key.cockroach.up.sql persistence/sql/migrations/20211011000003000000_change_jwk_primary_key.cockroach.down.sql persistence/sql/migrations/20211011000003000000_change_jwk_primary_key.cockroach.up.sql persistence/sql/src/20220210000001_nid/20220210000001000000_nid.cockroach.up.sql ``` Closes #3964 Supersedes #3993 (thanks @hperl)
1 parent aadb27c commit 38efece

File tree

417 files changed

+636
-624
lines changed

Some content is hidden

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

417 files changed

+636
-624
lines changed

.github/workflows/ci.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ jobs:
7070
steps:
7171
- run: |
7272
docker create --name cockroach -p 26257:26257 \
73-
cockroachdb/cockroach:latest-v24.1 start-single-node --insecure
73+
cockroachdb/cockroach:latest-v25.1 start-single-node --insecure
7474
docker start cockroach
7575
name: Start CockroachDB
7676
- uses: ory/ci/checkout@master
@@ -170,7 +170,7 @@ jobs:
170170
steps:
171171
- run: |
172172
docker create --name cockroach -p 26257:26257 \
173-
cockroachdb/cockroach:latest-v24.1 start-single-node --insecure
173+
cockroachdb/cockroach:latest-v25.1 start-single-node --insecure
174174
docker start cockroach
175175
name: Start CockroachDB
176176
- uses: ory/ci/checkout@master

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ test-resetdb: node_modules
4949
docker rm --force --volumes hydra_test_database_cockroach || true
5050
docker run --rm --name hydra_test_database_mysql -p 3444:3306 -e MYSQL_ROOT_PASSWORD=secret -d mysql:8.0
5151
docker run --rm --name hydra_test_database_postgres -p 3445:5432 -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=postgres -d postgres:16
52-
docker run --rm --name hydra_test_database_cockroach -p 3446:26257 -d cockroachdb/cockroach:latest-v24.1 start-single-node --insecure
52+
docker run --rm --name hydra_test_database_cockroach -p 3446:26257 -d cockroachdb/cockroach:latest-v25.1 start-single-node --insecure
5353

5454
# Build local docker images
5555
.PHONY: docker

cmd/cli/handler_migrate.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,13 @@ const (
4848
genericDialectKey = "any"
4949
)
5050

51-
var fragmentHeader = []byte(strings.TrimLeft(`
52-
-- Migration generated by the command below; DO NOT EDIT.
53-
-- hydra:generate hydra migrate gen
54-
`, "\n"))
51+
func fragmentHeader() []byte {
52+
return fmt.Appendf(nil, "-- Migration generated by the command below; DO NOT EDIT.\n-- %s\n", strings.Join(os.Args, " "))
53+
}
5554

56-
var blankFragment = []byte(strings.TrimLeft(`
57-
-- This blank migration was generated to meet ory/x/popx validation criteria, see https://github.com/ory/x/pull/509; DO NOT EDIT.
58-
-- hydra:generate hydra migrate gen
59-
`, "\n"))
55+
func blankFragment() []byte {
56+
return fmt.Appendf(nil, "-- This is a blank migration. It is generated to ensure that all dialects are represented in the migration files.\n-- %s\n", strings.Join(os.Args, " "))
57+
}
6058

6159
var mrx = regexp.MustCompile(`^(\d{14})000000_([^.]+)(\.[a-z0-9]+)?\.(up|down)\.sql$`)
6260

@@ -91,7 +89,7 @@ func (m migration) generateMigrationFragments(source []byte) ([][]byte, error) {
9189
return nil, errors.New("no migration chunks found")
9290
}
9391
for i := range chunks {
94-
chunks[i] = append(fragmentHeader, chunks[i]...)
92+
chunks[i] = append(fragmentHeader(), chunks[i]...)
9593
}
9694
return chunks, nil
9795
}
@@ -140,7 +138,7 @@ func (mg migrationGroup) generateSQL(sourceFS fs.FS, target string) error {
140138
for _, m := range ms {
141139
for i := dialectFragmentCounts[m.Dialect]; i < maxFragmentCount; i += 1 {
142140
dst := filepath.Join(target, mg.fragmentName(m, i))
143-
if err := os.WriteFile(dst, blankFragment, 0600); err != nil {
141+
if err := os.WriteFile(dst, blankFragment(), 0600); err != nil {
144142
return errors.WithStack(errors.Errorf("failed to write file %s", dst))
145143
}
146144
}

persistence/sql/migratest/migration_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func TestMigrations(t *testing.T) {
7676
for db, dsn := range map[string]string{
7777
"postgres": dockertest.RunTestPostgreSQL(t),
7878
"mysql": dockertest.RunTestMySQL(t),
79-
"cockroach": dockertest.RunTestCockroachDB(t),
79+
"cockroach": dockertest.RunTestCockroachDBWithVersion(t, "latest-v25.1"),
8080
} {
8181
wg.Add(1)
8282
go func() {
@@ -90,7 +90,7 @@ func TestMigrations(t *testing.T) {
9090
require.NoError(t, err)
9191
require.NoError(t, c.Open())
9292
require.NoError(t, c.RawQuery("CREATE DATABASE "+dbName).Exec())
93-
dsn = regexp.MustCompile("/[a-z0-9]+\\?").ReplaceAllString(dsn, "/"+dbName+"?")
93+
dsn = regexp.MustCompile(`/[a-z0-9]+\?`).ReplaceAllString(dsn, "/"+dbName+"?")
9494
require.NoError(t, c.Close())
9595

9696
c, err = pop.NewConnection(&pop.ConnectionDetails{URL: dsn})

persistence/sql/migratest/testdata/20241609000001_testdata.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ INSERT INTO hydra_oauth2_flow (login_challenge,
9090
device_handled_at,
9191
device_error)
9292
VALUES ('challenge-0018',
93-
(SELECT id FROM networks LIMIT 1), '["requested_scope-0018_1","requested_scope-0018_2"]', 'verifier-0018', 'csrf-0018', 'subject-0018', 'http://request/0018', true, 'client-21', '2025-05-16 12:24', '{"display": "display-0018"}', NULL, '["requested_audience-0018_1","requested_audience-0018_2"]', '2025-05-16 12:24', 128, true, 15, '{}', 'acr-0018', '2025-05-16 12:24', true, 'force_subject_id-0018', '{"context": "0018"}', '["amr-0018-1","amr-0018-2"]', 'challenge-0018', 'verifier-0018', true, 'csrf-0018', '["granted_scope-0018_1","granted_scope-0018_2"]', true, 15, '{}', '{"session_access_token-0018": "0018"}', '{"session_id_token-0018": "0018"}', true, '["granted_audience-0018_1","granted_audience-0018_2"]', '2025-05-16 12:24', true, 'device-challenge-0018', 'device-request-id-0018', 'device-verifier-0018', 'device-csrf-0018', true, '2025-05-16 12:24', '{}' );
93+
(SELECT id FROM networks LIMIT 1), '["requested_scope-0018_1","requested_scope-0018_2"]', 'verifier-0018', 'csrf-0018', 'subject-0018', 'http://request/0018', true, 'client-21', CURRENT_TIMESTAMP, '{"display": "display-0018"}', NULL, '["requested_audience-0018_1","requested_audience-0018_2"]', CURRENT_TIMESTAMP, 128, true, 15, '{}', 'acr-0018', CURRENT_TIMESTAMP, true, 'force_subject_id-0018', '{"context": "0018"}', '["amr-0018-1","amr-0018-2"]', 'challenge-0018', 'verifier-0018', true, 'csrf-0018', '["granted_scope-0018_1","granted_scope-0018_2"]', true, 15, '{}', '{"session_access_token-0018": "0018"}', '{"session_id_token-0018": "0018"}', true, '["granted_audience-0018_1","granted_audience-0018_2"]', '2025-05-16 12:24', true, 'device-challenge-0018', 'device-request-id-0018', 'device-verifier-0018', 'device-csrf-0018', true, '2025-05-16 12:24', '{}' );
9494

9595
INSERT INTO hydra_oauth2_device_auth_codes (device_code_signature, user_code_signature, request_id, requested_at,
9696
client_id, scope, granted_scope, form_data, session_data, subject,
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
ALTER TABLE hydra_client DROP CONSTRAINT "hydra_client_pkey", ADD CONSTRAINT "primary" PRIMARY KEY (pk_deprecated);
1+
ALTER TABLE hydra_client "hydra_client_pkey"
2+
DROP COLUMN pk,
3+
RENAME COLUMN pk_deprecated TO pk;
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
ALTER TABLE hydra_client RENAME pk TO pk_deprecated;
2-
ALTER TABLE hydra_client ADD pk UUID NOT NULL DEFAULT gen_random_uuid();
1+
ALTER TABLE hydra_client
2+
RENAME pk TO pk_deprecated,
3+
ADD COLUMN pk UUID NOT NULL DEFAULT gen_random_uuid();
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
ALTER TABLE hydra_client DROP pk;
2-
ALTER TABLE hydra_client RENAME pk_deprecated TO pk;
1+
ALTER TABLE hydra_client
2+
DROP CONSTRAINT "primary",
3+
ADD CONSTRAINT "hydra_client_pkey" PRIMARY KEY (pk_deprecated);
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
ALTER TABLE hydra_client DROP CONSTRAINT "primary";
2-
ALTER TABLE hydra_client ADD CONSTRAINT "hydra_client_pkey" PRIMARY KEY (pk);
1+
ALTER TABLE hydra_client
2+
DROP CONSTRAINT "primary",
3+
ADD CONSTRAINT "hydra_client_pkey" PRIMARY KEY (pk);
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
ALTER TABLE hydra_jwk DROP CONSTRAINT "hydra_jwk", ADD CONSTRAINT "primary" PRIMARY KEY (pk_deprecated);
1+
ALTER TABLE hydra_jwk
2+
DROP COLUMN pk,
3+
RENAME pk_deprecated TO pk;

0 commit comments

Comments
 (0)