{"record":{"id":"2d367829ff24cd97","repo":"immich-app/immich","slug":"unsupported-vector-extension-extension","errorCode":null,"errorMessage":"Unsupported vector extension: '${extension}'","messagePattern":"Unsupported vector extension: '(.+?)'","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/src/repositories/database.repository.ts","lineNumber":98,"sourceCode":"  async getExtensionVersions(extensions: readonly DatabaseExtension[]): Promise<ExtensionVersion[]> {\n    const { rows } = await sql<ExtensionVersion>`\n      SELECT name, default_version as \"availableVersion\", installed_version as \"installedVersion\"\n      FROM pg_available_extensions\n      WHERE name in (${sql.join(extensions)})\n    `.execute(this.db);\n    return rows;\n  }\n\n  getExtensionVersionRange(extension: VectorExtension): string {\n    switch (extension) {\n      case DatabaseExtension.VectorChord: {\n        return VECTORCHORD_VERSION_RANGE;\n      }\n      case DatabaseExtension.Vector: {\n        return VECTOR_VERSION_RANGE;\n      }\n      default: {\n        throw new Error(`Unsupported vector extension: '${extension}'`);\n      }\n    }\n  }\n\n  @GenerateSql()\n  async getPostgresVersion(): Promise<string> {\n    const { rows } = await sql<{ server_version: string }>`SHOW server_version`.execute(this.db);\n    return rows[0].server_version;\n  }\n\n  getPostgresVersionRange(): string {\n    return POSTGRES_VERSION_RANGE;\n  }\n\n  async createExtension(extension: DatabaseExtension): Promise<void> {\n    this.logger.log(`Creating ${EXTENSION_NAMES[extension]} extension`);\n    await sql`CREATE EXTENSION IF NOT EXISTS ${sql.raw(extension)} CASCADE`.execute(this.db);\n    if (extension === DatabaseExtension.VectorChord) {","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/immich-app/immich/blob/e55ac299a4ec7cb372e35dbf2c6c05ee9ce77f6c/server/src/repositories/database.repository.ts#L80-L116","documentation":"getExtensionVersionRange maps each known vector extension to the version range Immich supports. The default branch is reached only when a VectorExtension value outside the known set is passed, which should be impossible with valid input — it is a defensive invariant check that flags unsupported/unknown extension identifiers.","triggerScenarios":"Calling getExtensionVersionRange (or code paths that resolve version ranges, e.g. extension install/upgrade logic) with a DatabaseExtension value that is not pgvectors, VectorChord, or Vector — e.g. an unhandled enum member added to the extension type but not to this switch.","commonSituations":"A contributor adds a new DatabaseExtension enum member but forgets to add a case in the switch; internal code passing DatabaseExtension.Postgres or another non-vector enum member by mistake.","solutions":["Ensure only vector extension enum values are passed to getExtensionVersionRange","Add a case to the switch for the new extension returning its supported version range","Check immich release notes for dropped/renamed extensions and update your database/extension accordingly"],"exampleFix":"// before\nreturn this.getExtensionVersionRange(DatabaseExtension.Postgres);\n// after\nreturn this.getExtensionVersionRange(DatabaseExtension.Vector);","handlingStrategy":"type-guard","validationCode":"const VECTOR_EXTS = [DatabaseExtension.PgVectors, DatabaseExtension.VectorChord, DatabaseExtension.Vector] as const;\nif (!VECTOR_EXTS.includes(extension as any)) throw new Error(`pass a vector extension, got ${extension}`);","typeGuard":"function isVectorExtension(ext: DatabaseExtension): ext is DatabaseExtension.PgVectors | DatabaseExtension.VectorChord | DatabaseExtension.Vector {\n  return [DatabaseExtension.PgVectors, DatabaseExtension.VectorChord, DatabaseExtension.Vector].includes(ext as any);\n}","tryCatchPattern":"try {\n  range = await repo.getExtensionVersionRange(extension);\n} catch (e) {\n  if ((e as Error).message.startsWith('Unsupported vector extension')) range = null; // skip non-vector extensions\n  else throw e;\n}","preventionTips":["Keep the switch cases in sync with the DatabaseExtension enum (exhaustive switch or never-check)","Never pass non-vector DatabaseExtension members to extension-version APIs","Add a unit test iterating all enum members"],"tags":["database","postgres","enum","internal-error"],"backgroundTag":"unsupported-enum-value","analyzedSha":"e55ac299a4ec7cb372e35dbf2c6c05ee9ce77f6c","analyzedAt":"2026-09-15T07:20:19.675Z","contentChangedAt":"2026-09-15T07:20:19.675Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}