diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command.ts index d1be0516d07..5e0b698dbc9 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command.ts @@ -62,6 +62,12 @@ export class RenameIndexNameCommand extends ActiveOrSuspendedWorkspacesMigration 'flatFieldMetadataMaps', ]); + const indexMetadataByName = new Map( + Object.values(flatIndexMaps.byId) + .filter(isDefined) + .map((index) => [index.name, index]), + ); + let hasIndexNameChanges = false; let hasRemovedIndexMetadata = false; @@ -87,6 +93,38 @@ export class RenameIndexNameCommand extends ActiveOrSuspendedWorkspacesMigration continue; } + // Check if another metadata entry already has the v2 name + const existingV2Metadata = indexMetadataByName.get(indexNameV2); + + if (isDefined(existingV2Metadata) && existingV2Metadata.id !== index.id) { + // V2 metadata already exists, this v1 metadata is stale + this.logger.log( + `Index metadata with v2 name ${indexNameV2} already exists, removing stale v1 metadata and index ${index.name}`, + ); + + if (!isDryRun) { + const queryRunner = this.coreDataSource.createQueryRunner(); + + await queryRunner.connect(); + await queryRunner.startTransaction(); + + try { + await queryRunner.manager.delete(IndexMetadataEntity, index.id); + await queryRunner.query( + `DROP INDEX IF EXISTS "${schemaName}"."${index.name}"`, + ); + await queryRunner.commitTransaction(); + hasRemovedIndexMetadata = true; + } catch (error) { + await queryRunner.rollbackTransaction(); + throw error; + } finally { + await queryRunner.release(); + } + } + continue; + } + this.logger.log(`Renaming index ${index.name} to ${indexNameV2}`); if (isDryRun) { @@ -124,6 +162,23 @@ export class RenameIndexNameCommand extends ActiveOrSuspendedWorkspacesMigration IndexMetadataEntity, index.id, ); + hasRemovedIndexMetadata = true; + } else if (error.code === '42P07') { + // PostgreSQL error code 42P07: duplicate_table (v2 index already exists) + // The v2 index already exists, remove stale v1 metadata and index + this.logger.log( + `Index ${indexNameV2} already exists at PG level, removing stale v1 metadata and index ${index.name}`, + ); + + await this.coreDataSource.manager.delete( + IndexMetadataEntity, + index.id, + ); + + await this.coreDataSource.query( + `DROP INDEX IF EXISTS "${schemaName}"."${index.name}"`, + ); + hasRemovedIndexMetadata = true; } else { this.logger.error(