{"record":{"id":"8da333564458ea3f","repo":"beekeeper-studio/beekeeper-studio","slug":"reordercolumns-must-be-added-via-a-subclass","errorCode":null,"errorMessage":"reorderColumns must be added via a subclass","messagePattern":"reorderColumns must be added via a subclass","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"apps/studio/src/shared/lib/sql/change_builder/ChangeBuilderBase.ts","lineNumber":253,"sourceCode":"    const result = `\n      ALTER TABLE ${fromTable}\n      ADD CONSTRAINT ${fkName}\n      FOREIGN KEY (${fromColumn})\n      REFERENCES ${toTable} (${toColumn})\n      ${onUpdate}\n      ${onDelete}\n    `\n    return result\n  }\n\n  createRelations(specs: CreateRelationSpec[]): string | null {\n    if (!specs?.length) return null\n    return specs.map((spec) => this.singleRelation(spec)).join(\";\")\n  }\n\n  // shouldn't be abstract because not all clients support reordering a column\n  reorderColumns(_oldColumnOrder: ExtendedTableColumn[], _newColumnOrder: ExtendedTableColumn[]): string {\n    throw new Error('reorderColumns must be added via a subclass')\n  }\n\n  dropRelations(names: string[]): string | null {\n    if (!names?.length) return null\n\n    return names.map((name: string) => {\n      const t = this.tableName\n      const c = this.wrapIdentifier(name)\n      return `ALTER TABLE ${t} DROP CONSTRAINT ${c}`\n    }).join(\";\")\n  }\n}\n","sourceCodeStart":235,"sourceCodeEnd":266,"githubUrl":"https://github.com/beekeeper-studio/beekeeper-studio/blob/4e3e03e3223b2b71a1af8926d455f533b80af837/apps/studio/src/shared/lib/sql/change_builder/ChangeBuilderBase.ts#L235-L266","documentation":"reorderColumns on ChangeBuilderBase is intentionally a stub that throws — column reordering is not universally supported by SQL dialects, so only subclasses for dialects that support it (e.g. MySQL) implement it. Calling it on a base/dialect that lacks an override hits this error.","triggerScenarios":"Invoking table column reordering against a dialect whose ChangeBuilder doesn't override reorderColumns (e.g. SQLite, Cassandra); generic table-edit code assuming all dialects support reordering.","commonSituations":"Feature-flagged UI showing drag-to-reorder columns regardless of database type; switching a connection to a different DB type where reordering is unsupported.","solutions":["Check dialect support before calling: only call reorderColumns for dialects that implement it","Implement reorderColumns in a subclass for dialects that support it","Fall back to a full table rebuild/recreate flow for dialects without native support"],"exampleFix":"// before\nconst sql = builder.reorderColumns(oldOrder, newOrder); // throws on unsupported dialects\n// after\nconst sql = builder.supportsColumnReorder\n  ? builder.reorderColumns(oldOrder, newOrder)\n  : null;","handlingStrategy":"fallback","validationCode":"const supportsReorder = builder.constructor !== ChangeBuilderBase || builder.reorderColumns !== ChangeBuilderBase.prototype.reorderColumns;\nif (!supportsReorder) return null;","typeGuard":"function supportsReorder(builder) { return typeof builder.reorderColumns === 'function' && builder.reorderColumns !== ChangeBuilderBase.prototype.reorderColumns; }","tryCatchPattern":"try {\n  return builder.reorderColumns(oldOrder, newOrder);\n} catch (e) {\n  if (e.message.includes('reorderColumns must be added via a subclass')) {\n    return rebuildTableForReorder(builder, oldOrder, newOrder); // recreate-table fallback\n  }\n  throw e;\n}","preventionTips":["Gate column-reorder UI on dialect capability data","Feature-detect by comparing against the base prototype method","Document which dialects support in-place column reordering"],"tags":["unsupported-operation","change-builder","dialect","schema"],"backgroundTag":"unsupported-dialect-feature","analyzedSha":"4e3e03e3223b2b71a1af8926d455f533b80af837","analyzedAt":"2026-08-31T23:21:23.379Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}