From 0d87f944e3f58cd4e9e8dedf0943f5f15061b24d Mon Sep 17 00:00:00 2001 From: Tim Griesser Date: Sat, 8 Feb 2025 16:57:40 -0500 Subject: [PATCH] refactor: improve sqlite-introspector metadata query (#1349) Co-authored-by: Igal Klebanov --- src/dialect/sqlite/sqlite-introspector.ts | 58 +++++++++++------------ 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/src/dialect/sqlite/sqlite-introspector.ts b/src/dialect/sqlite/sqlite-introspector.ts index 859e6caff..b74f90592 100644 --- a/src/dialect/sqlite/sqlite-introspector.ts +++ b/src/dialect/sqlite/sqlite-introspector.ts @@ -11,6 +11,7 @@ import { DEFAULT_MIGRATION_TABLE, } from '../../migration/migrator.js' import { sql } from '../../raw-builder/sql.js' +import { QueryCreator } from '../../query-creator.js' interface SqliteSystemDatabase { // https://www.sqlite.org/schematab.html#alternative_names @@ -62,26 +63,11 @@ export class SqliteIntrospector implements DatabaseIntrospector { } } - #metaQuery(table: string) { - return this.#db - .selectFrom( - sql`pragma_table_info(${table})`.as('table_info'), - ) - .select([ - sql.val(table).as('table'), - 'cid', - 'name', - 'type', - 'notnull', - 'dflt_value', - 'pk', - ]) - } - - async #getTableMetadata( + #tablesQuery( + qb: QueryCreator | Kysely, options: DatabaseMetadataOptions, - ): Promise { - let tablesQuery = this.#db + ) { + let tablesQuery = qb .selectFrom('sqlite_master') .where('type', 'in', ['table', 'view']) .where('name', 'not like', 'sqlite_%') @@ -93,20 +79,30 @@ export class SqliteIntrospector implements DatabaseIntrospector { .where('name', '!=', DEFAULT_MIGRATION_TABLE) .where('name', '!=', DEFAULT_MIGRATION_LOCK_TABLE) } + return tablesQuery + } - const tablesResult = await tablesQuery.execute() - const [firstTable, ...otherTables] = tablesResult - - if (!firstTable) { - return [] - } + async #getTableMetadata( + options: DatabaseMetadataOptions, + ): Promise { + const tablesResult = await this.#tablesQuery(this.#db, options).execute() - let metadataQuery = this.#metaQuery(firstTable.name) - for (const otherTable of otherTables) { - metadataQuery = metadataQuery.unionAll(this.#metaQuery(otherTable.name)) - } - const tableMetadata = await metadataQuery - .orderBy(['table', 'cid']) + const tableMetadata = await this.#db + .with('table_list', (qb) => this.#tablesQuery(qb, options)) + .selectFrom([ + 'table_list as tl', + sql`pragma_table_info(tl.name)`.as('p'), + ]) + .select([ + 'tl.name as table', + 'p.cid', + 'p.name', + 'p.type', + 'p.notnull', + 'p.dflt_value', + 'p.pk', + ]) + .orderBy(['tl.name', 'p.cid']) .execute() const columnsByTable: Record = {}