Skip to content

Index name collision on columns that share a name across tables #50

@broady

Description

@broady

sqlite-zstd version: v0.3.5
SQLite version: 3.47.1 (via bun:sqlite)
I'm using the pre-built .so from releases.

// zstd-minimal.ts

import { Database } from "bun:sqlite";
const db = new Database(":memory:");
db.loadExtension("./libsqlite_zstd.so");
db.run(`CREATE TABLE table1 (id INTEGER PRIMARY KEY, raw_json TEXT)`);
db.run(`CREATE TABLE table2 (id INTEGER PRIMARY KEY, raw_json TEXT)`);

db.run(`SELECT zstd_enable_transparent('{"table": "table1", "column": "raw_json", "compression_level": 19, "dict_chooser": "''a''"}')`);
// -> Success
db.run(`SELECT zstd_enable_transparent('{"table": "table2", "column": "raw_json", "compression_level": 19, "dict_chooser": "''a''"}')`);
// -> FAIL
❯ bun run zstd-minimal.ts
[2025-11-19T03:21:22Z INFO  sqlite_zstd::create_extension] [sqlite-zstd] initialized
[2025-11-19T03:21:22Z WARN  sqlite_zstd::transparent] Warning: It is recommended to set `pragma journal_mode=WAL;`
[2025-11-19T03:21:22Z WARN  sqlite_zstd::transparent] Warning: It is recommended to set `pragma auto_vacuum=full;`
[2025-11-19T03:21:22Z WARN  sqlite_zstd::transparent] Warning: It is recommended to set `pragma busy_timeout=2000;` or higher
[2025-11-19T03:21:22Z WARN  sqlite_zstd::transparent] Warning: It is recommended to set `pragma journal_mode=WAL;`
[2025-11-19T03:21:22Z WARN  sqlite_zstd::transparent] Warning: It is recommended to set `pragma auto_vacuum=full;`
[2025-11-19T03:21:22Z WARN  sqlite_zstd::transparent] Warning: It is recommended to set `pragma busy_timeout=2000;` or higher
2 | const db = new Database(":memory:");
3 | db.loadExtension("./libsqlite_zstd.so");
4 | db.run(`CREATE TABLE table1 (id INTEGER PRIMARY KEY, raw_json TEXT)`);
5 | db.run(`CREATE TABLE table2 (id INTEGER PRIMARY KEY, raw_json TEXT)`);
6 | db.run(`SELECT zstd_enable_transparent('{"table": "table1", "column": "raw_json", "compression_level": 19, "dict_chooser": "''a''"}')`);
7 | db.run(`SELECT zstd_enable_transparent('{"table": "table2", "column": "raw_json", "compression_level": 19, "dict_chooser": "''a''"}')`);
       ^
SQLiteError: Could not create index on dictid

Caused by:
    0: index _raw_json_dict_idx already exists
    1: Error code 1: SQL error or missing database
      errno: 1,
 byteOffset: -1,

      at run (bun:sqlite:322:21)
      at ..../zstd-minimal.ts:7:4
      at loadAndEvaluateModule (2:1)

Bun v1.3.1 (Linux x64)

The extension doesn't scope the index name with the table name.

I'll be renaming my column, but it'd be better to have the index name prefixed by the table name or some way to override the index name.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions