Skip to content

Commit ec19282

Browse files
committed
fix(database): run column migrations before index creation
- Reorder Migrate() to add columns to existing tables BEFORE creating indexes, since CREATE TABLE IF NOT EXISTS is a no-op on existing databases and some indexes (e.g. finding_hash) reference migrated columns that would otherwise be missing - Add explanatory comment in internal/database/database.go documenting why column migrations must precede index creation - Surface a helpful CLI hint in pkg/cli/root.go pointing users to 'osmedeus db migrate' when startup fails with 'failed to run migrations', so stale schemas are easier to recover from
1 parent 8ec1de4 commit ec19282

2 files changed

Lines changed: 50 additions & 39 deletions

File tree

internal/database/database.go

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -202,45 +202,10 @@ func Migrate(ctx context.Context) error {
202202
}
203203
}
204204

205-
// Create indexes for Run table
206-
if err := createRunIndexes(ctx); err != nil {
207-
return err
208-
}
209-
210-
// Create indexes for Asset table
211-
if err := createAssetIndexes(ctx); err != nil {
212-
return err
213-
}
214-
215-
// Create indexes for EventLog table
216-
if err := createEventLogIndexes(ctx); err != nil {
217-
return err
218-
}
219-
220-
// Create indexes for WorkflowMeta table
221-
if err := createWorkflowMetaIndexes(ctx); err != nil {
222-
return err
223-
}
224-
225-
// Create indexes for Vulnerability table
226-
if err := createVulnerabilityIndexes(ctx); err != nil {
227-
return err
228-
}
229-
230-
// Create indexes for Workspace table
231-
if err := createWorkspaceIndexes(ctx); err != nil {
232-
return err
233-
}
234-
235-
// Create indexes for AssetDiffSnapshot table
236-
if err := createAssetDiffIndexes(ctx); err != nil {
237-
return err
238-
}
239-
240-
// Create indexes for VulnDiffSnapshot table
241-
if err := createVulnDiffIndexes(ctx); err != nil {
242-
return err
243-
}
205+
// Add columns to existing tables BEFORE creating indexes. CREATE TABLE
206+
// IF NOT EXISTS is a no-op for existing databases, so their tables retain
207+
// the old schema. Some indexes below reference migrated columns (e.g.
208+
// finding_hash), so the columns must exist first or index creation fails.
244209

245210
// Add current_pid column to runs table if it doesn't exist (for existing databases)
246211
if err := addRunsPIDColumn(ctx); err != nil {
@@ -307,6 +272,46 @@ func Migrate(ctx context.Context) error {
307272
return err
308273
}
309274

275+
// Create indexes for Run table
276+
if err := createRunIndexes(ctx); err != nil {
277+
return err
278+
}
279+
280+
// Create indexes for Asset table
281+
if err := createAssetIndexes(ctx); err != nil {
282+
return err
283+
}
284+
285+
// Create indexes for EventLog table
286+
if err := createEventLogIndexes(ctx); err != nil {
287+
return err
288+
}
289+
290+
// Create indexes for WorkflowMeta table
291+
if err := createWorkflowMetaIndexes(ctx); err != nil {
292+
return err
293+
}
294+
295+
// Create indexes for Vulnerability table
296+
if err := createVulnerabilityIndexes(ctx); err != nil {
297+
return err
298+
}
299+
300+
// Create indexes for Workspace table
301+
if err := createWorkspaceIndexes(ctx); err != nil {
302+
return err
303+
}
304+
305+
// Create indexes for AssetDiffSnapshot table
306+
if err := createAssetDiffIndexes(ctx); err != nil {
307+
return err
308+
}
309+
310+
// Create indexes for VulnDiffSnapshot table
311+
if err := createVulnDiffIndexes(ctx); err != nil {
312+
return err
313+
}
314+
310315
return nil
311316
}
312317

pkg/cli/root.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,12 @@ func Execute() {
261261
if !errors.As(err, &ttmErr) {
262262
fmt.Fprintf(os.Stderr, "%s %s\n", terminal.Red("Error:"), err)
263263
}
264+
// Hint users toward the migration command when the DB schema is stale
265+
// (e.g. an existing database missing a column added in a newer version).
266+
if strings.Contains(err.Error(), "failed to run migrations") {
267+
fmt.Fprintf(os.Stderr, "%s your database schema may be out of date. Run %s to migrate it (rebuild/reinstall the binary first if you just updated).\n",
268+
terminal.Yellow("Hint:"), terminal.Cyan("osmedeus db migrate"))
269+
}
264270
os.Exit(1)
265271
}
266272
}

0 commit comments

Comments
 (0)