@sqlrooms/duckdb 0.29.0-rc.1 → 0.29.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"DuckDbSlice.js","sourceRoot":"","sources":["../src/DuckDbSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createDbSchemaTrees,\n DataTable,\n DbSchemaNode,\n DuckDbConnector,\n escapeVal,\n getColValAsNumber,\n isQualifiedTableName,\n joinStatements,\n makeQualifiedTableName,\n QualifiedTableName,\n QueryHandle,\n separateLastStatement,\n TableColumn,\n} from '@sqlrooms/duckdb-core';\nimport {\n BaseRoomStoreState,\n createSlice,\n registerCommandsForOwner,\n RoomCommand,\n unregisterCommandsForOwner,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport * as arrow from 'apache-arrow';\nimport deepEquals from 'fast-deep-equal';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {StateCreator} from 'zustand';\nimport {createWasmDuckDbConnector} from './connectors/createDuckDbConnector';\n\nconst DUCKDB_COMMAND_OWNER = '@sqlrooms/duckdb';\nconst DropTableCommandInput = z.object({\n tableName: z.string().describe('Name of the table to drop.'),\n});\ntype DropTableCommandInput = z.infer<typeof DropTableCommandInput>;\n\nconst CreateTableFromQueryCommandInput = z.object({\n tableName: z.string().describe('Name of the table or view to create.'),\n query: z.string().describe('SQL query used to populate the table/view.'),\n replace: z\n .boolean()\n .optional()\n .default(true)\n .describe('Whether to replace existing table/view with the same name.'),\n view: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create a view instead of a table.'),\n temp: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create a temporary object.'),\n allowMultipleStatements: z\n .boolean()\n .optional()\n .default(false)\n .describe('Allow multiple SQL statements where the final one is SELECT.'),\n});\ntype CreateTableFromQueryCommandInput = z.infer<\n typeof CreateTableFromQueryCommandInput\n>;\n\nfunction isDuckDbPlaceholderViewColumn(\n columnName: string,\n columnType: string,\n): boolean {\n return columnName === '__' && columnType.toUpperCase() === 'UNKNOWN';\n}\n\nexport type SchemaAndDatabase = {\n schema?: string;\n database?: string;\n};\n\n/**\n * State and actions for the DuckDB slice\n */\nexport type DuckDbSliceState = {\n db: {\n /**\n * The DuckDB connector instance\n */\n connector: DuckDbConnector;\n /**\n * @deprecated We shouldn't limit the schema to a single one.\n */\n schema: string;\n\n currentSchema: string | undefined;\n currentDatabase: string | undefined;\n\n /**\n * Cache of refreshed table schemas\n */\n tables: DataTable[];\n /**\n * Cache of row counts for tables\n */\n tableRowCounts: {[tableName: string]: number};\n /**\n * Cache of schema trees for tables\n */\n schemaTrees?: DbSchemaNode[];\n /**\n * Cache of currently running query handles.\n * This is only used for running queries to deduplicate them (especially for useSql),\n * the cache is cleared when the query is completed.\n */\n queryCache: {[key: string]: QueryHandle};\n /**\n * Whether the table schemas are being refreshed\n */\n isRefreshingTableSchemas: boolean;\n\n /**\n * Set a new DuckDB connector\n */\n setConnector: (connector: DuckDbConnector) => void;\n\n /**\n * Initialize the connector (creates a WasmDuckDbConnector if none exists)\n */\n initialize: () => Promise<void>;\n\n /**\n * Close and clean up the connector\n */\n destroy: () => Promise<void>;\n\n /**\n * Add a table to the room.\n * @param tableName - The name of the table to add.\n * @param data - The data to add to the table: an arrow table or an array of records.\n * @returns A promise that resolves to the table that was added.\n */\n addTable(\n tableName: string | QualifiedTableName,\n data: arrow.Table | Record<string, unknown>[],\n ): Promise<DataTable>;\n\n /**\n * Load the schemas of the tables in the database.\n */\n loadTableSchemas(\n filter?: SchemaAndDatabase & {table?: string},\n ): Promise<DataTable[]>;\n\n /**\n * @deprecated Use findTableByName instead\n */\n getTable(tableName: string): DataTable | undefined;\n\n /**\n * @internal Avoid using this directly, it's for internal use.\n */\n setTableRowCount(\n tableName: string | QualifiedTableName,\n rowCount: number,\n ): void;\n\n /**\n * Find a table by name in the last refreshed table schemas.\n * If no schema or database is provided, the table will be found in the current schema\n * and database (from last table schemas refresh).\n * @param tableName - The name of the table to find or a qualified table name.\n * @returns The table or undefined if not found.\n */\n findTableByName(\n tableName: string | QualifiedTableName,\n ): DataTable | undefined;\n\n /**\n * Refresh table schemas from the database.\n * @returns A promise that resolves to the updated tables.\n */\n refreshTableSchemas(): Promise<DataTable[]>;\n /**\n * Get the connector. If it's not initialized, it will be initialized.\n */\n getConnector: () => Promise<DuckDbConnector>;\n\n /**\n * @deprecated Use .loadTableRowCount() instead\n */\n getTableRowCount: (table: string, schema?: string) => Promise<number>;\n\n /**\n * Load the row count of a table\n */\n loadTableRowCount: (\n tableName: string | QualifiedTableName,\n ) => Promise<number>;\n\n /**\n * Execute a query with query handle (not result) caching and deduplication\n * @param query - The SQL query to execute\n * @returns The QueryHandle for the query or null if disabled\n */\n executeSql: (\n query: string,\n version?: number,\n ) => Promise<QueryHandle | null>;\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n getTables: (schema?: string) => Promise<string[]>;\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n getTableSchema: (\n tableName: string,\n schema?: string,\n ) => Promise<DataTable | undefined>;\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n getTableSchemas: (schema?: string) => Promise<DataTable[]>;\n\n /**\n * Check if a table exists\n */\n checkTableExists: (\n tableName: string | QualifiedTableName,\n ) => Promise<boolean>;\n\n /**\n * Delete a table with optional schema and database\n * @param tableName - The name of the table to delete (qualified or plain)\n */\n dropTable: (tableName: string | QualifiedTableName) => Promise<void>;\n\n /**\n * Create a table or view from a query.\n * @param tableName - The name of the table/view to create.\n * @param query - The query to create the table/view from.\n * @param options - Creation options.\n * @returns The table/view name and rowCount (undefined for views).\n */\n createTableFromQuery: (\n tableName: string | QualifiedTableName,\n query: string,\n options?: {\n replace?: boolean;\n temp?: boolean;\n view?: boolean;\n allowMultipleStatements?: boolean;\n abortSignal?: AbortSignal;\n },\n ) => Promise<{\n tableName: string | QualifiedTableName;\n rowCount: number | undefined;\n }>;\n\n /**\n * Parse a SQL SELECT statement to JSON\n * @param sql - The SQL SELECT statement to parse.\n * @returns A promise that resolves to the parsed JSON.\n */\n sqlSelectToJson: (sql: string) => Promise<\n | {\n error: true;\n error_type: string;\n error_message: string;\n error_subtype: string;\n position: string;\n }\n | {\n error: false;\n statements: {\n node: {\n from_table: {\n alias: string;\n show_type: string;\n table_name: string;\n };\n select_list: Record<string, unknown>[];\n type: string;\n };\n }[];\n }\n >;\n };\n};\n\nexport type CreateDuckDbSliceProps = {\n connector?: DuckDbConnector;\n};\n\n/**\n * Create a DuckDB slice for managing the connector\n */\nexport function createDuckDbSlice({\n connector = createWasmDuckDbConnector(),\n}: CreateDuckDbSliceProps = {}): StateCreator<DuckDbSliceState> {\n return createSlice<DuckDbSliceState, BaseRoomStoreState & DuckDbSliceState>(\n (set, get, store) => {\n return {\n db: {\n connector, // Will be initialized during init\n schema: 'main', // TODO: remove schema, we should not limit the schema to a single one.\n currentSchema: undefined,\n currentDatabase: undefined,\n isRefreshingTableSchemas: false,\n tables: [],\n tableRowCounts: {},\n schemaTrees: undefined,\n queryCache: {},\n\n setConnector: (connector: DuckDbConnector) => {\n set(\n produce((state) => {\n state.config.dataSources = [];\n state.db.connector = connector;\n }),\n );\n },\n\n initialize: async () => {\n await get().db.connector.initialize();\n await get().db.refreshTableSchemas();\n registerCommandsForOwner(\n store,\n DUCKDB_COMMAND_OWNER,\n createDuckDbCommands(),\n );\n },\n\n getConnector: async () => {\n await get().db.connector.initialize();\n return get().db.connector;\n },\n\n destroy: async () => {\n unregisterCommandsForOwner(store, DUCKDB_COMMAND_OWNER);\n try {\n if (get().db.connector) {\n await get().db.connector.destroy();\n }\n } catch (err) {\n console.error('Error during DuckDB shutdown:', err);\n }\n },\n\n /**\n * Creates a table or view from a SQL query.\n * @param tableName - Name of the table/view to create\n * @param query - SQL query (must be a SELECT statement, or multiple statements ending with a SELECT when allowMultipleStatements is true)\n * @param options - Creation options\n * @param options.replace - If true, uses CREATE OR REPLACE (default: true)\n * @param options.temp - If true, creates a temporary table/view (default: false)\n * @param options.view - If true, creates a view instead of a table (default: false)\n * @param options.allowMultipleStatements - If true, allows multiple statements where preceding statements are executed first and the final SELECT is wrapped in CREATE TABLE/VIEW (default: false)\n * @returns Object with tableName and rowCount (rowCount is undefined for views)\n */\n async createTableFromQuery(\n tableName: string | QualifiedTableName,\n query: string,\n options?: {\n replace?: boolean;\n temp?: boolean;\n view?: boolean;\n allowMultipleStatements?: boolean;\n abortSignal?: AbortSignal;\n },\n ) {\n const {\n replace = true,\n temp = false,\n view = false,\n allowMultipleStatements = false,\n abortSignal,\n } = options || {};\n\n // For temp tables/views, DuckDB requires the \"temp\" database\n const baseQualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n\n const qualifiedName = temp\n ? makeQualifiedTableName({\n table: baseQualifiedName.table,\n schema: baseQualifiedName.schema,\n database: 'temp',\n })\n : baseQualifiedName;\n\n const connector = await get().db.getConnector();\n\n const {precedingStatements, lastStatement} =\n separateLastStatement(query);\n\n if (!allowMultipleStatements && precedingStatements.length > 0) {\n throw new Error(\n 'Query must contain exactly one statement (set allowMultipleStatements: true to execute multiple statements)',\n );\n }\n\n // The last statement must be a SELECT\n const parsedQuery = await get().db.sqlSelectToJson(lastStatement);\n if (parsedQuery.error) {\n throw new Error(\n 'Final statement must be a valid SELECT statement',\n );\n }\n\n // Build CREATE statement with options\n const createKeyword = [\n 'CREATE',\n replace ? 'OR REPLACE' : '',\n temp ? 'TEMP' : '',\n view ? 'VIEW' : 'TABLE',\n ]\n .filter(Boolean)\n .join(' ');\n\n const createStatement = `${createKeyword} ${qualifiedName} AS (\n ${lastStatement}\n )`;\n\n const fullQuery = joinStatements(\n precedingStatements,\n createStatement,\n );\n const result = await connector.query(fullQuery, {\n signal: abortSignal,\n });\n // Views don't have a row count, only tables do\n const rowCount = view ? undefined : getColValAsNumber(result);\n return {tableName, rowCount};\n },\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n async getTables(schema) {\n const tableSchemas = await get().db.loadTableSchemas({schema});\n return tableSchemas.map((t) => t.table.table);\n },\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n async getTableSchema(tableName: string, schema = 'main') {\n const newLocal = await get().db.loadTableSchemas({\n schema,\n table: tableName,\n });\n return newLocal[0];\n },\n\n /**\n * @deprecated Use .loadTableRowCount() instead\n */\n async getTableRowCount(table, schema = 'main') {\n return get().db.loadTableRowCount({table, schema});\n },\n\n async loadTableRowCount(tableName: string | QualifiedTableName) {\n const {schema, database, table} =\n typeof tableName === 'string'\n ? {table: tableName}\n : tableName || {};\n const connector = await get().db.getConnector();\n const result = await connector.query(\n `SELECT COUNT(*) FROM ${makeQualifiedTableName({\n schema,\n database,\n table,\n })}`,\n );\n return getColValAsNumber(result);\n },\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n async getTableSchemas(schema) {\n return await get().db.loadTableSchemas({schema});\n },\n\n async loadTableSchemas(\n filter?: SchemaAndDatabase & {table?: string},\n ): Promise<DataTable[]> {\n const {schema, database, table} = filter || {};\n const sql = `WITH tables_and_views AS (\n FROM duckdb_tables() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n sql,\n comment,\n estimated_size,\n FALSE AS isView\n UNION\n FROM duckdb_views() SELECT\n database_name AS database,\n schema_name AS schema,\n view_name AS name,\n sql,\n comment,\n NULL estimated_size,\n TRUE AS isView\n )\n SELECT\n isView,\n database, schema,\n name, column_names, column_types,\n sql, comment,\n estimated_size\n FROM (DESCRIBE)\n LEFT OUTER JOIN tables_and_views USING (database, schema, name)\n ${\n schema || database || table\n ? `WHERE ${[\n schema ? `schema = ${escapeVal(schema)}` : '',\n database ? `database = ${escapeVal(database)}` : '',\n table ? `name = ${escapeVal(table)}` : '',\n ]\n .filter(Boolean)\n .join(' AND ')}`\n : ''\n }`;\n const describeResults = await connector.query(sql);\n\n const newTables: DataTable[] = [];\n for (let i = 0; i < describeResults.numRows; i++) {\n const isView = describeResults.getChild('isView')?.get(i);\n const database = describeResults.getChild('database')?.get(i);\n const schema = describeResults.getChild('schema')?.get(i);\n const table = describeResults.getChild('name')?.get(i);\n const sql = describeResults.getChild('sql')?.get(i);\n const comment = describeResults.getChild('comment')?.get(i);\n const estimatedSize = describeResults\n .getChild('estimated_size')\n ?.get(i);\n const columnNames = describeResults\n .getChild('column_names')\n ?.get(i);\n const columnTypes = describeResults\n .getChild('column_types')\n ?.get(i);\n const columns: TableColumn[] = [];\n for (let di = 0; di < (columnNames?.length ?? 0); di++) {\n const columnName = String(columnNames.get(di));\n const columnType = String(columnTypes?.get(di));\n if (isDuckDbPlaceholderViewColumn(columnName, columnType)) {\n continue;\n }\n columns.push({\n name: columnName,\n type: columnType,\n });\n }\n newTables.push({\n table: makeQualifiedTableName({database, schema, table}),\n database,\n schema,\n tableName: table,\n columns,\n sql,\n comment,\n isView: Boolean(isView),\n rowCount:\n typeof estimatedSize === 'bigint'\n ? Number(estimatedSize)\n : estimatedSize === null\n ? undefined\n : estimatedSize,\n });\n }\n return newTables;\n },\n\n async checkTableExists(tableName: string | QualifiedTableName) {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n const table = (await get().db.loadTableSchemas(qualifiedName))[0];\n if (!table) {\n return false;\n }\n return true;\n },\n\n async dropTable(tableName): Promise<void> {\n const connector = await get().db.getConnector();\n const qualifiedTable = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n await connector.query(`DROP TABLE IF EXISTS ${qualifiedTable};`);\n await get().db.refreshTableSchemas();\n },\n\n async addTable(tableName, data) {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n\n const {db} = get();\n if (data instanceof arrow.Table) {\n // TODO: make sure the table is replaced\n await db.connector.loadArrow(data, qualifiedName.toString());\n } else {\n await db.connector.loadObjects(data, qualifiedName.toString(), {\n replace: true,\n });\n }\n const newTable = (await db.loadTableSchemas(qualifiedName))[0];\n if (!newTable) {\n throw new Error('Failed to add table');\n }\n set((state) =>\n produce(state, (draft) => {\n draft.db.tables.push(newTable);\n }),\n );\n await get().db.refreshTableSchemas();\n return newTable;\n },\n\n async setTableRowCount(tableName, rowCount) {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n set((state) =>\n produce(state, (draft) => {\n draft.db.tableRowCounts[qualifiedName.toString()] = rowCount;\n }),\n );\n },\n\n getTable(tableName) {\n return get().db.findTableByName(tableName);\n },\n\n findTableByName(tableName: string | QualifiedTableName) {\n const {table, schema, database} = {\n schema: get().db.currentSchema,\n database: get().db.currentDatabase,\n ...(typeof tableName === 'string'\n ? {table: tableName}\n : tableName),\n };\n return get().db.tables.find(\n (t) =>\n t.table.table === table &&\n (!schema || t.table.schema === schema) &&\n (!database || t.table.database === database),\n );\n },\n\n async refreshTableSchemas(): Promise<DataTable[]> {\n set((state) =>\n produce(state, (draft) => {\n draft.db.isRefreshingTableSchemas = true;\n }),\n );\n try {\n const connector = await get().db.getConnector();\n const result = await connector.query(\n `SELECT current_schema() AS schema, current_database() AS database`,\n );\n set((state) =>\n produce(state, (draft) => {\n draft.db.currentSchema = result.getChild('schema')?.get(0);\n draft.db.currentDatabase = result\n .getChild('database')\n ?.get(0);\n }),\n );\n const newTables = await get().db.loadTableSchemas();\n // Only update if there's an actual change in the schemas\n if (!deepEquals(newTables, get().db.tables)) {\n set((state) =>\n produce(state, (draft) => {\n draft.db.tables = newTables;\n draft.db.schemaTrees = createDbSchemaTrees(newTables);\n }),\n );\n }\n return newTables;\n } catch (err) {\n get().room.captureException(err);\n return [];\n } finally {\n set((state) =>\n produce(state, (draft) => {\n draft.db.isRefreshingTableSchemas = false;\n }),\n );\n }\n },\n\n async sqlSelectToJson(sql: string) {\n const connector = await get().db.getConnector();\n const parsedQuery = (\n await connector.query(\n `SELECT json_serialize_sql(${escapeVal(sql)})`,\n )\n )\n .getChildAt(0)\n ?.get(0);\n return JSON.parse(parsedQuery);\n },\n\n async executeSql(query: string): Promise<QueryHandle | null> {\n // Create a unique key for this query\n const queryKey = `${query}`;\n const connector = await get().db.getConnector();\n\n // Check if we already have a cached query for this key\n const existingQuery = get().db.queryCache[queryKey];\n if (existingQuery) {\n return existingQuery;\n }\n\n const queryHandle = connector.query(query);\n // Cache the query handle immediately\n set((state) =>\n produce(state, (draft) => {\n draft.db.queryCache[queryKey] = queryHandle;\n }),\n );\n\n queryHandle.result.finally(() => {\n // remove from cache after completion\n set((state) =>\n produce(state, (draft) => {\n delete draft.db.queryCache[queryKey];\n }),\n );\n });\n\n return queryHandle;\n },\n },\n };\n },\n );\n}\n\ntype DuckDbCommandStoreState = BaseRoomStoreState & DuckDbSliceState;\n\nfunction createDuckDbCommands(): RoomCommand<DuckDbCommandStoreState>[] {\n return [\n {\n id: 'db.refresh-table-schemas',\n name: 'Refresh table schemas',\n description: 'Reload table and schema metadata from DuckDB',\n group: 'Database',\n keywords: ['duckdb', 'database', 'refresh', 'tables', 'schemas'],\n metadata: {\n readOnly: true,\n idempotent: true,\n riskLevel: 'low',\n },\n isEnabled: ({getState}) => !getState().db.isRefreshingTableSchemas,\n execute: async ({getState}) => {\n await getState().db.refreshTableSchemas();\n return {\n success: true,\n commandId: 'db.refresh-table-schemas',\n message: 'Table schemas refreshed.',\n };\n },\n },\n {\n id: 'db.drop-table',\n name: 'Drop table',\n description: 'Drop a table from DuckDB by name',\n group: 'Database',\n keywords: ['duckdb', 'database', 'drop', 'table', 'delete'],\n inputSchema: DropTableCommandInput,\n inputDescription: 'Provide a tableName to remove from DuckDB.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'high',\n requiresConfirmation: true,\n },\n validateInput: async (input, {getState}) => {\n const {tableName} = input as DropTableCommandInput;\n const exists = await getState().db.checkTableExists(tableName);\n if (!exists) {\n throw new Error(`Table \"${tableName}\" does not exist.`);\n }\n },\n execute: async ({getState}, input) => {\n const {tableName} = input as DropTableCommandInput;\n await getState().db.dropTable(tableName);\n return {\n success: true,\n commandId: 'db.drop-table',\n message: `Dropped table \"${tableName}\".`,\n };\n },\n },\n {\n id: 'db.create-table-from-query',\n name: 'Create table from query',\n description: 'Create a table or view from a SQL query',\n group: 'Database',\n keywords: ['duckdb', 'database', 'create', 'table', 'view', 'query'],\n inputSchema: CreateTableFromQueryCommandInput,\n inputDescription:\n 'Provide tableName and query, with optional replace/view/temp flags.',\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'medium',\n },\n validateInput: (input) => {\n const {query} = input as CreateTableFromQueryCommandInput;\n if (!query.trim()) {\n throw new Error('Query cannot be empty.');\n }\n },\n execute: async ({getState}, input) => {\n const {tableName, query, replace, view, temp, allowMultipleStatements} =\n input as CreateTableFromQueryCommandInput;\n const result = await getState().db.createTableFromQuery(\n tableName,\n query,\n {\n replace,\n view,\n temp,\n allowMultipleStatements,\n },\n );\n await getState().db.refreshTableSchemas();\n return {\n success: true,\n commandId: 'db.create-table-from-query',\n message: `Created ${view ? 'view' : 'table'} \"${tableName}\".`,\n data: result,\n };\n },\n },\n ];\n}\n\n/**\n * @internal\n * Select values from the room store that includes the DuckDB slice.\n *\n * This is a typed wrapper around `useBaseRoomStore` that narrows the\n * state to `RoomStateWithDuckDb` so selectors can access `db` safely.\n *\n * @typeParam T - The selected slice of state returned by the selector\n * @param selector - Function that selects a value from the store state\n * @returns The selected value of type `T`\n */\nexport function useStoreWithDuckDb<T>(\n selector: (state: BaseRoomStoreState & DuckDbSliceState) => T,\n): T {\n return useBaseRoomStore<DuckDbSliceState, T>((state) => selector(state));\n}\n"]}
1
+ {"version":3,"file":"DuckDbSlice.js","sourceRoot":"","sources":["../src/DuckDbSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createDbSchemaTrees,\n DataTable,\n DbSchemaNode,\n DuckDbConnector,\n escapeVal,\n getColValAsNumber,\n isQualifiedTableName,\n joinStatements,\n makeQualifiedTableName,\n QualifiedTableName,\n QueryHandle,\n separateLastStatement,\n} from '@sqlrooms/duckdb-core';\nimport {\n loadTableSchemas,\n LoadTableSchemasFilter,\n LoadTableSchemasFilterFunction,\n} from './loadTableSchemas';\nimport {\n BaseRoomStoreState,\n createSlice,\n registerCommandsForOwner,\n RoomCommand,\n unregisterCommandsForOwner,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport * as arrow from 'apache-arrow';\nimport deepEquals from 'fast-deep-equal';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {StateCreator} from 'zustand';\nimport {createWasmDuckDbConnector} from './connectors/createDuckDbConnector';\n\nconst DUCKDB_COMMAND_OWNER = '@sqlrooms/duckdb';\nconst INTERNAL_SQLROOMS_PREFIX = '__sqlrooms_';\n\n/**\n * Default filter to exclude internal SQLRooms tables, schemas, and databases\n */\nexport const createDefaultLoadTableSchemasFilter = (\n table: QualifiedTableName,\n): boolean => {\n return (\n !table.table?.startsWith(INTERNAL_SQLROOMS_PREFIX) &&\n !table.database?.startsWith(INTERNAL_SQLROOMS_PREFIX) &&\n !table.schema?.startsWith(INTERNAL_SQLROOMS_PREFIX)\n );\n};\n\nconst DropTableCommandInput = z.object({\n tableName: z.string().describe('Name of the table to drop.'),\n});\ntype DropTableCommandInput = z.infer<typeof DropTableCommandInput>;\n\nconst CreateTableFromQueryCommandInput = z.object({\n tableName: z.string().describe('Name of the table or view to create.'),\n query: z.string().describe('SQL query used to populate the table/view.'),\n replace: z\n .boolean()\n .optional()\n .default(true)\n .describe('Whether to replace existing table/view with the same name.'),\n view: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create a view instead of a table.'),\n temp: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create a temporary object.'),\n allowMultipleStatements: z\n .boolean()\n .optional()\n .default(false)\n .describe('Allow multiple SQL statements where the final one is SELECT.'),\n});\n\ntype CreateTableFromQueryCommandInput = z.infer<\n typeof CreateTableFromQueryCommandInput\n>;\n\n/**\n * State and actions for the DuckDB slice\n */\nexport type DuckDbSliceState = {\n db: {\n /**\n * The DuckDB connector instance\n */\n connector: DuckDbConnector;\n /**\n * @deprecated We shouldn't limit the schema to a single one.\n */\n schema: string;\n\n currentSchema: string | undefined;\n currentDatabase: string | undefined;\n\n /**\n * Cache of refreshed table schemas\n */\n tables: DataTable[];\n /**\n * Cache of row counts for tables\n */\n tableRowCounts: {[tableName: string]: number};\n /**\n * Cache of schema trees for tables\n */\n schemaTrees?: DbSchemaNode[];\n /**\n * Cache of currently running query handles.\n * This is only used for running queries to deduplicate them (especially for useSql),\n * the cache is cleared when the query is completed.\n */\n queryCache: {[key: string]: QueryHandle};\n /**\n * Whether the table schemas are being refreshed\n */\n isRefreshingTableSchemas: boolean;\n\n /**\n * Set a new DuckDB connector\n */\n setConnector: (connector: DuckDbConnector) => void;\n\n /**\n * Initialize the connector (creates a WasmDuckDbConnector if none exists)\n */\n initialize: () => Promise<void>;\n\n /**\n * Close and clean up the connector\n */\n destroy: () => Promise<void>;\n\n /**\n * Add a table to the room.\n * @param tableName - The name of the table to add.\n * @param data - The data to add to the table: an arrow table or an array of records.\n * @returns A promise that resolves to the table that was added.\n */\n addTable(\n tableName: string | QualifiedTableName,\n data: arrow.Table | Record<string, unknown>[],\n ): Promise<DataTable>;\n\n /**\n * Load the schemas of the tables in the database.\n */\n loadTableSchemas(filter?: LoadTableSchemasFilter): Promise<DataTable[]>;\n\n /**\n * @deprecated Use findTableByName instead\n */\n getTable(tableName: string): DataTable | undefined;\n\n /**\n * @internal Avoid using this directly, it's for internal use.\n */\n setTableRowCount(\n tableName: string | QualifiedTableName,\n rowCount: number,\n ): void;\n\n /**\n * Find a table by name in the last refreshed table schemas.\n * If no schema or database is provided, the table will be found in the current schema\n * and database (from last table schemas refresh).\n * @param tableName - The name of the table to find or a qualified table name.\n * @returns The table or undefined if not found.\n */\n findTableByName(\n tableName: string | QualifiedTableName,\n ): DataTable | undefined;\n\n /**\n * Refresh table schemas from the database.\n * @returns A promise that resolves to the updated tables.\n */\n refreshTableSchemas(): Promise<DataTable[]>;\n /**\n * Get the connector. If it's not initialized, it will be initialized.\n */\n getConnector: () => Promise<DuckDbConnector>;\n\n /**\n * @deprecated Use .loadTableRowCount() instead\n */\n getTableRowCount: (table: string, schema?: string) => Promise<number>;\n\n /**\n * Load the row count of a table\n */\n loadTableRowCount: (\n tableName: string | QualifiedTableName,\n ) => Promise<number>;\n\n /**\n * Execute a query with query handle (not result) caching and deduplication\n * @param query - The SQL query to execute\n * @returns The QueryHandle for the query or null if disabled\n */\n executeSql: (\n query: string,\n version?: number,\n ) => Promise<QueryHandle | null>;\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n getTables: (schema?: string) => Promise<string[]>;\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n getTableSchema: (\n tableName: string,\n schema?: string,\n ) => Promise<DataTable | undefined>;\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n getTableSchemas: (schema?: string) => Promise<DataTable[]>;\n\n /**\n * Check if a table exists\n */\n checkTableExists: (\n tableName: string | QualifiedTableName,\n ) => Promise<boolean>;\n\n /**\n * Delete a table or view with optional schema and database.\n * @param tableName - The name of the relation to delete (qualified or plain)\n */\n dropRelation: (tableName: string | QualifiedTableName) => Promise<void>;\n\n /**\n * Delete a table with optional schema and database.\n * @param tableName - The name of the table to delete (qualified or plain)\n */\n dropTable: (tableName: string | QualifiedTableName) => Promise<void>;\n\n /**\n * Create a table or view from a query.\n * @param tableName - The name of the table/view to create.\n * @param query - The query to create the table/view from.\n * @param options - Creation options.\n * @returns The table/view name and rowCount (undefined for views).\n */\n createTableFromQuery: (\n tableName: string | QualifiedTableName,\n query: string,\n options?: {\n replace?: boolean;\n temp?: boolean;\n view?: boolean;\n allowMultipleStatements?: boolean;\n abortSignal?: AbortSignal;\n },\n ) => Promise<{\n tableName: string | QualifiedTableName;\n rowCount: number | undefined;\n }>;\n\n /**\n * Parse a SQL SELECT statement to JSON\n * @param sql - The SQL SELECT statement to parse.\n * @returns A promise that resolves to the parsed JSON.\n */\n sqlSelectToJson: (sql: string) => Promise<\n | {\n error: true;\n error_type: string;\n error_message: string;\n error_subtype: string;\n position: string;\n }\n | {\n error: false;\n statements: {\n node: {\n from_table: {\n alias: string;\n show_type: string;\n table_name: string;\n };\n select_list: Record<string, unknown>[];\n type: string;\n };\n }[];\n }\n >;\n };\n};\n\nexport type CreateDuckDbSliceProps = {\n connector?: DuckDbConnector;\n /**\n * Optional filter function to control which tables are included when loading schemas.\n * By default, filters out tables/schemas/databases starting with '__sqlrooms_'.\n * @param table - The qualified table name to evaluate\n * @returns true to include the table, false to exclude it\n */\n loadTableSchemasFilter?: LoadTableSchemasFilterFunction | null;\n};\n\n/**\n * Create a DuckDB slice for managing the connector\n */\nexport function createDuckDbSlice({\n connector = createWasmDuckDbConnector(),\n loadTableSchemasFilter = createDefaultLoadTableSchemasFilter,\n}: CreateDuckDbSliceProps = {}): StateCreator<DuckDbSliceState> {\n let refreshPromise: Promise<DataTable[]> | null = null;\n let pendingSchemaRefresh = false;\n return createSlice<DuckDbSliceState, BaseRoomStoreState & DuckDbSliceState>(\n (set, get, store) => {\n /**\n * Internal helper to load a table schema by exact name, bypassing the visibility filter.\n * Used when performing exact lookups (e.g., checking if a specific table exists).\n */\n const loadTableSchemaByName = async (\n tableName: string | QualifiedTableName,\n ): Promise<DataTable | undefined> => {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n const connector = await get().db.getConnector();\n const [table] = await loadTableSchemas(connector, qualifiedName);\n return table;\n };\n\n return {\n db: {\n connector, // Will be initialized during init\n schema: 'main', // TODO: remove schema, we should not limit the schema to a single one.\n currentSchema: undefined,\n currentDatabase: undefined,\n isRefreshingTableSchemas: false,\n tables: [],\n tableRowCounts: {},\n schemaTrees: undefined,\n queryCache: {},\n\n setConnector: (connector: DuckDbConnector) => {\n set(\n produce((state) => {\n state.config.dataSources = [];\n state.db.connector = connector;\n }),\n );\n },\n\n initialize: async () => {\n await get().db.connector.initialize();\n // No await here, we want to continue initializing the room even\n // if the table schemas are not refreshed yet\n get().db.refreshTableSchemas();\n registerCommandsForOwner(\n store,\n DUCKDB_COMMAND_OWNER,\n createDuckDbCommands(),\n );\n },\n\n getConnector: async () => {\n await get().db.connector.initialize();\n return get().db.connector;\n },\n\n destroy: async () => {\n unregisterCommandsForOwner(store, DUCKDB_COMMAND_OWNER);\n // Wait for any in-flight refreshTableSchemas() to finish before\n // destroying the connector. initialize() fires it without await,\n // so it may still be querying the native DuckDB instance; tearing\n // that down mid-flight causes a use-after-free segfault.\n if (refreshPromise) {\n try {\n await refreshPromise;\n } catch {\n // ignore – we're shutting down\n }\n }\n try {\n if (get().db.connector) {\n await get().db.connector.destroy();\n }\n } catch (err) {\n console.error('Error during DuckDB shutdown:', err);\n }\n },\n\n /**\n * Creates a table or view from a SQL query.\n * @param tableName - Name of the table/view to create\n * @param query - SQL query (must be a SELECT statement, or multiple statements ending with a SELECT when allowMultipleStatements is true)\n * @param options - Creation options\n * @param options.replace - If true, uses CREATE OR REPLACE (default: true)\n * @param options.temp - If true, creates a temporary table/view (default: false)\n * @param options.view - If true, creates a view instead of a table (default: false)\n * @param options.allowMultipleStatements - If true, allows multiple statements where preceding statements are executed first and the final SELECT is wrapped in CREATE TABLE/VIEW (default: false)\n * @returns Object with tableName and rowCount (rowCount is undefined for views)\n */\n async createTableFromQuery(\n tableName: string | QualifiedTableName,\n query: string,\n options?: {\n replace?: boolean;\n temp?: boolean;\n view?: boolean;\n allowMultipleStatements?: boolean;\n abortSignal?: AbortSignal;\n },\n ) {\n const {\n replace = true,\n temp = false,\n view = false,\n allowMultipleStatements = false,\n abortSignal,\n } = options || {};\n\n // For temp tables/views, DuckDB requires the \"temp\" database\n const baseQualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n\n const qualifiedName = temp\n ? makeQualifiedTableName({\n table: baseQualifiedName.table,\n schema: baseQualifiedName.schema,\n database: 'temp',\n })\n : baseQualifiedName;\n\n const connector = await get().db.getConnector();\n\n const {precedingStatements, lastStatement} =\n separateLastStatement(query);\n\n if (!allowMultipleStatements && precedingStatements.length > 0) {\n throw new Error(\n 'Query must contain exactly one statement (set allowMultipleStatements: true to execute multiple statements)',\n );\n }\n\n // The last statement must be a SELECT\n const parsedQuery = await get().db.sqlSelectToJson(lastStatement);\n if (parsedQuery.error) {\n throw new Error(\n 'Final statement must be a valid SELECT statement',\n );\n }\n\n // Build CREATE statement with options\n const createKeyword = [\n 'CREATE',\n replace ? 'OR REPLACE' : '',\n temp ? 'TEMP' : '',\n view ? 'VIEW' : 'TABLE',\n ]\n .filter(Boolean)\n .join(' ');\n\n const createStatement = `${createKeyword} ${qualifiedName} AS (\n ${lastStatement}\n )`;\n\n const fullQuery = joinStatements(\n precedingStatements,\n createStatement,\n );\n const result = await connector.query(fullQuery, {\n signal: abortSignal,\n });\n // Views don't have a row count, only tables do\n const rowCount = view ? undefined : getColValAsNumber(result);\n return {tableName, rowCount};\n },\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n async getTables(schema) {\n const tableSchemas = await get().db.loadTableSchemas({schema});\n return tableSchemas.map((t) => t.table.table);\n },\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n async getTableSchema(tableName: string, schema = 'main') {\n const newLocal = await get().db.loadTableSchemas({\n schema,\n table: tableName,\n });\n return newLocal[0];\n },\n\n /**\n * @deprecated Use .loadTableRowCount() instead\n */\n async getTableRowCount(table, schema = 'main') {\n return get().db.loadTableRowCount({table, schema});\n },\n\n async loadTableRowCount(tableName: string | QualifiedTableName) {\n const {schema, database, table} =\n typeof tableName === 'string'\n ? {table: tableName}\n : tableName || {};\n const connector = await get().db.getConnector();\n const result = await connector.query(\n `SELECT COUNT(*) FROM ${makeQualifiedTableName({\n schema,\n database,\n table,\n })}`,\n );\n return getColValAsNumber(result);\n },\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n async getTableSchemas(schema) {\n return await get().db.loadTableSchemas({schema});\n },\n\n async loadTableSchemas(\n filter?: LoadTableSchemasFilter,\n ): Promise<DataTable[]> {\n const connector = await get().db.getConnector();\n return loadTableSchemas(connector, {\n ...filter,\n filterFunction: loadTableSchemasFilter,\n });\n },\n\n async checkTableExists(tableName: string | QualifiedTableName) {\n const table = await loadTableSchemaByName(tableName);\n return Boolean(table);\n },\n\n async dropRelation(tableName): Promise<void> {\n const connector = await get().db.getConnector();\n const qualifiedTable = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n const table =\n get().db.findTableByName(qualifiedTable) ??\n (await loadTableSchemaByName(qualifiedTable));\n const isView = table?.isView;\n if (isView) {\n await connector.query(`DROP VIEW IF EXISTS ${qualifiedTable};`);\n } else {\n await connector.query(`DROP TABLE IF EXISTS ${qualifiedTable};`);\n }\n get().db.refreshTableSchemas();\n },\n\n async dropTable(tableName): Promise<void> {\n const connector = await get().db.getConnector();\n const qualifiedTable = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n const table =\n get().db.findTableByName(qualifiedTable) ??\n (await loadTableSchemaByName(qualifiedTable));\n\n if (table?.isView) {\n throw new Error(\n `\"${qualifiedTable}\" is a view. Use dropRelation() to remove views.`,\n );\n }\n\n await connector.query(`DROP TABLE IF EXISTS ${qualifiedTable};`);\n get().db.refreshTableSchemas();\n },\n\n async addTable(tableName, data) {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n\n const {db} = get();\n if (data instanceof arrow.Table) {\n // TODO: make sure the table is replaced\n await db.connector.loadArrow(data, qualifiedName.toString());\n } else {\n await db.connector.loadObjects(data, qualifiedName.toString(), {\n replace: true,\n });\n }\n const newTable = await loadTableSchemaByName(qualifiedName);\n if (!newTable) {\n throw new Error('Failed to add table');\n }\n set((state) =>\n produce(state, (draft) => {\n draft.db.tables.push(newTable);\n }),\n );\n get().db.refreshTableSchemas();\n return newTable;\n },\n\n async setTableRowCount(tableName, rowCount) {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n set((state) =>\n produce(state, (draft) => {\n draft.db.tableRowCounts[qualifiedName.toString()] = rowCount;\n }),\n );\n },\n\n getTable(tableName) {\n return get().db.findTableByName(tableName);\n },\n\n findTableByName(tableName: string | QualifiedTableName) {\n const {table, schema, database} = {\n schema: get().db.currentSchema,\n database: get().db.currentDatabase,\n ...(typeof tableName === 'string'\n ? {table: tableName}\n : tableName),\n };\n return get().db.tables.find(\n (t) =>\n t.table.table === table &&\n (!schema || t.table.schema === schema) &&\n (!database || t.table.database === database),\n );\n },\n\n async refreshTableSchemas(): Promise<DataTable[]> {\n if (refreshPromise) {\n pendingSchemaRefresh = true;\n return refreshPromise;\n }\n set((state) =>\n produce(state, (draft) => {\n draft.db.isRefreshingTableSchemas = true;\n }),\n );\n refreshPromise = (async () => {\n try {\n let newTables: DataTable[];\n do {\n pendingSchemaRefresh = false;\n const connector = await get().db.getConnector();\n const result = await connector.query(\n `SELECT current_schema() AS schema, current_database() AS database`,\n );\n set((state) =>\n produce(state, (draft) => {\n draft.db.currentSchema = result\n .getChild('schema')\n ?.get(0);\n draft.db.currentDatabase = result\n .getChild('database')\n ?.get(0);\n }),\n );\n newTables = await get().db.loadTableSchemas();\n } while (pendingSchemaRefresh);\n if (!deepEquals(newTables, get().db.tables)) {\n set((state) =>\n produce(state, (draft) => {\n draft.db.tables = newTables;\n draft.db.schemaTrees = createDbSchemaTrees(newTables);\n }),\n );\n }\n return newTables;\n } catch (err) {\n get().room.captureException(err);\n return [];\n } finally {\n refreshPromise = null;\n set((state) =>\n produce(state, (draft) => {\n draft.db.isRefreshingTableSchemas = false;\n }),\n );\n }\n })();\n return refreshPromise;\n },\n\n async sqlSelectToJson(sql: string) {\n const connector = await get().db.getConnector();\n const parsedQuery = (\n await connector.query(\n `SELECT json_serialize_sql(${escapeVal(sql)})`,\n )\n )\n .getChildAt(0)\n ?.get(0);\n return JSON.parse(parsedQuery);\n },\n\n async executeSql(query: string): Promise<QueryHandle | null> {\n // Create a unique key for this query\n const queryKey = `${query}`;\n const connector = await get().db.getConnector();\n\n // Check if we already have a cached query for this key\n const existingQuery = get().db.queryCache[queryKey];\n if (existingQuery) {\n return existingQuery;\n }\n\n const queryHandle = connector.query(query);\n // Cache the query handle immediately\n set((state) =>\n produce(state, (draft) => {\n draft.db.queryCache[queryKey] = queryHandle;\n }),\n );\n\n queryHandle.result.finally(() => {\n // remove from cache after completion\n set((state) =>\n produce(state, (draft) => {\n delete draft.db.queryCache[queryKey];\n }),\n );\n });\n\n return queryHandle;\n },\n },\n };\n },\n );\n}\n\ntype DuckDbCommandStoreState = BaseRoomStoreState & DuckDbSliceState;\n\nfunction createDuckDbCommands(): RoomCommand<DuckDbCommandStoreState>[] {\n return [\n {\n id: 'db.refresh-table-schemas',\n name: 'Refresh table schemas',\n description: 'Reload table and schema metadata from DuckDB',\n group: 'Database',\n keywords: ['duckdb', 'database', 'refresh', 'tables', 'schemas'],\n metadata: {\n readOnly: true,\n idempotent: true,\n riskLevel: 'low',\n },\n isEnabled: ({getState}) => !getState().db.isRefreshingTableSchemas,\n execute: async ({getState}) => {\n await getState().db.refreshTableSchemas();\n return {\n success: true,\n commandId: 'db.refresh-table-schemas',\n message: 'Table schemas refreshed.',\n };\n },\n },\n {\n id: 'db.drop-table',\n name: 'Drop relation',\n description: 'Drop a table or view from DuckDB by name',\n group: 'Database',\n keywords: [\n 'duckdb',\n 'database',\n 'drop',\n 'table',\n 'view',\n 'relation',\n 'delete',\n ],\n inputSchema: DropTableCommandInput,\n inputDescription: 'Provide a tableName to remove from DuckDB.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'high',\n requiresConfirmation: true,\n },\n validateInput: async (input, {getState}) => {\n const {tableName} = input as DropTableCommandInput;\n const exists = await getState().db.checkTableExists(tableName);\n if (!exists) {\n throw new Error(`Table \"${tableName}\" does not exist.`);\n }\n },\n execute: async ({getState}, input) => {\n const {tableName} = input as DropTableCommandInput;\n await getState().db.dropRelation(tableName);\n return {\n success: true,\n commandId: 'db.drop-table',\n message: `Dropped relation \"${tableName}\".`,\n };\n },\n },\n {\n id: 'db.create-table-from-query',\n name: 'Create table from query',\n description: 'Create a table or view from a SQL query',\n group: 'Database',\n keywords: ['duckdb', 'database', 'create', 'table', 'view', 'query'],\n inputSchema: CreateTableFromQueryCommandInput,\n inputDescription:\n 'Provide tableName and query, with optional replace/view/temp flags.',\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'medium',\n },\n validateInput: (input) => {\n const {query} = input as CreateTableFromQueryCommandInput;\n if (!query.trim()) {\n throw new Error('Query cannot be empty.');\n }\n },\n execute: async ({getState}, input) => {\n const {tableName, query, replace, view, temp, allowMultipleStatements} =\n input as CreateTableFromQueryCommandInput;\n const result = await getState().db.createTableFromQuery(\n tableName,\n query,\n {\n replace,\n view,\n temp,\n allowMultipleStatements,\n },\n );\n await getState().db.refreshTableSchemas();\n return {\n success: true,\n commandId: 'db.create-table-from-query',\n message: `Created ${view ? 'view' : 'table'} \"${tableName}\".`,\n data: result,\n };\n },\n },\n ];\n}\n\n/**\n * @internal\n * Select values from the room store that includes the DuckDB slice.\n *\n * This is a typed wrapper around `useBaseRoomStore` that narrows the\n * state to `RoomStateWithDuckDb` so selectors can access `db` safely.\n *\n * @typeParam T - The selected slice of state returned by the selector\n * @param selector - Function that selects a value from the store state\n * @returns The selected value of type `T`\n */\nexport function useStoreWithDuckDb<T>(\n selector: (state: BaseRoomStoreState & DuckDbSliceState) => T,\n): T {\n return useBaseRoomStore<DuckDbSliceState, T>((state) => selector(state));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"WasmDuckDbConnector.d.ts","sourceRoot":"","sources":["../../src/connectors/WasmDuckDbConnector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAEL,eAAe,EAMhB,MAAM,uBAAuB,CAAC;AAS/B,MAAM,WAAW,0BAA2B,SAAQ,MAAM,CAAC,YAAY;IACrE,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC;IAC5B,aAAa,IAAI,MAAM,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAkQrB"}
1
+ {"version":3,"file":"WasmDuckDbConnector.d.ts","sourceRoot":"","sources":["../../src/connectors/WasmDuckDbConnector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAEL,eAAe,EAMhB,MAAM,uBAAuB,CAAC;AAS/B,MAAM,WAAW,0BAA2B,SAAQ,MAAM,CAAC,YAAY;IACrE,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC;IAC5B,aAAa,IAAI,MAAM,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAkRrB"}
@@ -45,6 +45,25 @@ export function createWasmDuckDbConnector(options = {}) {
45
45
  conn = await db.connect();
46
46
  }
47
47
  catch (err) {
48
+ if (conn) {
49
+ try {
50
+ await conn.close();
51
+ }
52
+ catch {
53
+ /* best-effort */
54
+ }
55
+ }
56
+ if (db) {
57
+ try {
58
+ await db.terminate();
59
+ }
60
+ catch {
61
+ /* best-effort */
62
+ }
63
+ }
64
+ else if (worker) {
65
+ worker.terminate();
66
+ }
48
67
  db = null;
49
68
  conn = null;
50
69
  worker = null;
@@ -1 +1 @@
1
- {"version":3,"file":"WasmDuckDbConnector.js","sourceRoot":"","sources":["../../src/connectors/WasmDuckDbConnector.ts"],"names":[],"mappings":"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","sourcesContent":["import * as duckdb from '@duckdb/duckdb-wasm';\nimport {DuckDBDataProtocol} from '@duckdb/duckdb-wasm';\nimport {\n BaseDuckDbConnectorImpl,\n DuckDbConnector,\n createBaseDuckDbConnector,\n getSqlErrorWithPointer,\n load,\n loadObjects as loadObjectsSql,\n loadSpatial,\n} from '@sqlrooms/duckdb-core';\nimport {\n LoadFileOptions,\n StandardLoadOptions,\n isSpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\nimport {safeJsonParse, splitFilePath} from '@sqlrooms/utils';\nimport * as arrow from 'apache-arrow';\n\nexport interface WasmDuckDbConnectorOptions extends duckdb.DuckDBConfig {\n /** @deprecated use `path` instead */\n dbPath?: string;\n initializationQuery?: string;\n logging?: boolean;\n /**\n * DuckDB bundles to use. Defaults to jsDelivr bundles. To use locally\n * bundled files, you will need to import them in your app and construct a\n * `DuckDBBundles` object.\n */\n bundles?: duckdb.DuckDBBundles;\n}\n\nexport interface WasmDuckDbConnector extends DuckDbConnector {\n getDb(): duckdb.AsyncDuckDB;\n getConnection(): duckdb.AsyncDuckDBConnection;\n readonly type: 'wasm';\n}\n\nexport function createWasmDuckDbConnector(\n options: WasmDuckDbConnectorOptions = {},\n): WasmDuckDbConnector {\n const {\n logging = false,\n initializationQuery = '',\n dbPath = ':memory:',\n bundles = duckdb.getJsDelivrBundles(),\n ...restConfig\n } = options;\n\n let db: duckdb.AsyncDuckDB | null = null;\n let conn: duckdb.AsyncDuckDBConnection | null = null;\n let worker: Worker | null = null;\n\n const impl: BaseDuckDbConnectorImpl = {\n async initializeInternal() {\n if (!globalThis.Worker) {\n throw new Error('No Worker support in this environment');\n }\n try {\n const allBundles = bundles;\n const bestBundle = await duckdb.selectBundle(allBundles);\n if (!bestBundle.mainWorker) {\n throw new Error('No best bundle found for DuckDB worker');\n }\n const workerScriptUrl = new URL(\n bestBundle.mainWorker,\n globalThis.location.origin,\n ).href;\n const workerUrl = URL.createObjectURL(\n new Blob([`importScripts(\"${workerScriptUrl}\");`], {\n type: 'text/javascript',\n }),\n );\n\n worker = new window.Worker(workerUrl);\n const logger = logging ? new duckdb.ConsoleLogger() : {log: () => {}};\n\n db = new (class extends duckdb.AsyncDuckDB {\n onError(event: ErrorEvent) {\n super.onError(event);\n console.error('DuckDB worker error:', event);\n }\n })(logger, worker);\n\n const mainModule = new URL(\n bestBundle.mainModule,\n globalThis.location.origin,\n ).href;\n const pthreadWorker = bestBundle.pthreadWorker\n ? new URL(bestBundle.pthreadWorker, globalThis.location.origin).href\n : undefined;\n await db.instantiate(mainModule, pthreadWorker);\n URL.revokeObjectURL(workerUrl);\n\n await db.open({\n ...restConfig,\n path: restConfig.path ?? dbPath,\n });\n\n conn = await db.connect();\n } catch (err) {\n db = null;\n conn = null;\n worker = null;\n throw err;\n }\n },\n\n async destroyInternal() {\n if (conn) {\n await conn.close();\n conn = null;\n }\n if (db) {\n await db.terminate();\n db = null;\n }\n if (worker) {\n worker.terminate();\n worker = null;\n }\n },\n\n async executeQueryInternal<T extends arrow.TypeMap = any>(\n query: string,\n signal: AbortSignal,\n ): Promise<arrow.Table<T>> {\n if (!db) {\n throw new Error('DuckDB not initialized');\n }\n\n if (signal.aborted) {\n throw new Error('Query aborted before execution');\n }\n\n const localConn = await db.connect();\n const streamPromise = localConn.send<T>(query, true);\n let reader: arrow.RecordBatchReader<T> | null = null;\n\n const buildTable = async () => {\n reader = await streamPromise;\n const batches: arrow.RecordBatch<T>[] = [];\n let rowCount = 0;\n for await (const batch of reader) {\n if (batch.numRows === 0) continue;\n batches.push(batch);\n rowCount += batch.numRows;\n }\n if (rowCount === 0) {\n return arrow.tableFromArrays({}) as unknown as arrow.Table<T>;\n }\n return new arrow.Table(batches);\n };\n\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n localConn.cancelSent().catch(() => {});\n reader?.cancel?.();\n reject(new Error('Query cancelled'));\n };\n signal.addEventListener('abort', abortHandler);\n });\n\n try {\n return await Promise.race([buildTable(), abortPromise]);\n } catch (e) {\n // Some errors are returned as JSON, so we try to parse them\n if (e instanceof Error) {\n const parsed: any = safeJsonParse(e.message);\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n 'exception_message' in parsed\n ) {\n throw new Error(\n `${parsed.exception_type} ${parsed.error_subtype}: ${parsed.exception_message}` +\n `\\n${getSqlErrorWithPointer(query, Number(parsed.position)).formatted}`,\n );\n }\n }\n throw e;\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n await localConn.close();\n }\n },\n\n async cancelQueryInternal() {\n if (conn) {\n try {\n await conn.cancelSent();\n } catch (err) {\n console.warn('DuckDB cancelSent failed:', err);\n }\n }\n },\n\n async loadFileInternal(\n file: string | File,\n tableName: string,\n opts?: LoadFileOptions,\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n await withTempRegisteredFile(file, async (fileName) => {\n if (opts && isSpatialLoadFileOptions(opts)) {\n await conn!.query(loadSpatial(tableName, fileName, opts));\n } else {\n await conn!.query(\n load(opts?.method ?? 'auto', tableName, fileName, opts),\n );\n }\n });\n },\n\n async loadArrowInternal(\n file: arrow.Table | Uint8Array,\n tableName: string,\n opts?: {schema?: string},\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n const options = {name: tableName, schema: opts?.schema};\n if (file instanceof arrow.Table) {\n await conn.insertArrowTable(file, options);\n } else {\n await conn.insertArrowFromIPCStream(file, options);\n }\n },\n\n async loadObjectsInternal(\n file: Record<string, unknown>[],\n tableName: string,\n opts?: StandardLoadOptions,\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n await conn.query(loadObjectsSql(tableName, file, opts));\n },\n };\n\n const base = createBaseDuckDbConnector({dbPath, initializationQuery}, impl);\n\n async function withTempRegisteredFile(\n file: string | File,\n action: (fileName: string) => Promise<void>,\n ) {\n if (!conn || !db) {\n throw new Error('DuckDB connection not initialized');\n }\n let fileName: string;\n let tempFileName: string | undefined = undefined;\n if (file instanceof File) {\n const {ext} = splitFilePath(file.name);\n tempFileName = `${Math.random().toString(36).substring(2, 15)}${ext ? `.${ext}` : ''}`;\n fileName = tempFileName;\n await db.registerFileHandle(\n fileName,\n file,\n DuckDBDataProtocol.BROWSER_FILEREADER,\n true,\n );\n } else {\n fileName = file;\n }\n try {\n await action(fileName);\n } finally {\n if (tempFileName) {\n await db!.dropFile(tempFileName);\n }\n }\n }\n\n return {\n ...base,\n getDb() {\n if (!db) {\n throw new Error('DuckDB not initialized');\n }\n return db;\n },\n getConnection() {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n return conn;\n },\n get type() {\n return 'wasm' as const;\n },\n };\n}\n"]}
1
+ {"version":3,"file":"WasmDuckDbConnector.js","sourceRoot":"","sources":["../../src/connectors/WasmDuckDbConnector.ts"],"names":[],"mappings":"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","sourcesContent":["import * as duckdb from '@duckdb/duckdb-wasm';\nimport {DuckDBDataProtocol} from '@duckdb/duckdb-wasm';\nimport {\n BaseDuckDbConnectorImpl,\n DuckDbConnector,\n createBaseDuckDbConnector,\n getSqlErrorWithPointer,\n load,\n loadObjects as loadObjectsSql,\n loadSpatial,\n} from '@sqlrooms/duckdb-core';\nimport {\n LoadFileOptions,\n StandardLoadOptions,\n isSpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\nimport {safeJsonParse, splitFilePath} from '@sqlrooms/utils';\nimport * as arrow from 'apache-arrow';\n\nexport interface WasmDuckDbConnectorOptions extends duckdb.DuckDBConfig {\n /** @deprecated use `path` instead */\n dbPath?: string;\n initializationQuery?: string;\n logging?: boolean;\n /**\n * DuckDB bundles to use. Defaults to jsDelivr bundles. To use locally\n * bundled files, you will need to import them in your app and construct a\n * `DuckDBBundles` object.\n */\n bundles?: duckdb.DuckDBBundles;\n}\n\nexport interface WasmDuckDbConnector extends DuckDbConnector {\n getDb(): duckdb.AsyncDuckDB;\n getConnection(): duckdb.AsyncDuckDBConnection;\n readonly type: 'wasm';\n}\n\nexport function createWasmDuckDbConnector(\n options: WasmDuckDbConnectorOptions = {},\n): WasmDuckDbConnector {\n const {\n logging = false,\n initializationQuery = '',\n dbPath = ':memory:',\n bundles = duckdb.getJsDelivrBundles(),\n ...restConfig\n } = options;\n\n let db: duckdb.AsyncDuckDB | null = null;\n let conn: duckdb.AsyncDuckDBConnection | null = null;\n let worker: Worker | null = null;\n\n const impl: BaseDuckDbConnectorImpl = {\n async initializeInternal() {\n if (!globalThis.Worker) {\n throw new Error('No Worker support in this environment');\n }\n try {\n const allBundles = bundles;\n const bestBundle = await duckdb.selectBundle(allBundles);\n if (!bestBundle.mainWorker) {\n throw new Error('No best bundle found for DuckDB worker');\n }\n const workerScriptUrl = new URL(\n bestBundle.mainWorker,\n globalThis.location.origin,\n ).href;\n const workerUrl = URL.createObjectURL(\n new Blob([`importScripts(\"${workerScriptUrl}\");`], {\n type: 'text/javascript',\n }),\n );\n\n worker = new window.Worker(workerUrl);\n const logger = logging ? new duckdb.ConsoleLogger() : {log: () => {}};\n\n db = new (class extends duckdb.AsyncDuckDB {\n onError(event: ErrorEvent) {\n super.onError(event);\n console.error('DuckDB worker error:', event);\n }\n })(logger, worker);\n\n const mainModule = new URL(\n bestBundle.mainModule,\n globalThis.location.origin,\n ).href;\n const pthreadWorker = bestBundle.pthreadWorker\n ? new URL(bestBundle.pthreadWorker, globalThis.location.origin).href\n : undefined;\n await db.instantiate(mainModule, pthreadWorker);\n URL.revokeObjectURL(workerUrl);\n\n await db.open({\n ...restConfig,\n path: restConfig.path ?? dbPath,\n });\n\n conn = await db.connect();\n } catch (err) {\n if (conn) {\n try {\n await conn.close();\n } catch {\n /* best-effort */\n }\n }\n if (db) {\n try {\n await db.terminate();\n } catch {\n /* best-effort */\n }\n } else if (worker) {\n worker.terminate();\n }\n db = null;\n conn = null;\n worker = null;\n throw err;\n }\n },\n\n async destroyInternal() {\n if (conn) {\n await conn.close();\n conn = null;\n }\n if (db) {\n await db.terminate();\n db = null;\n }\n if (worker) {\n worker.terminate();\n worker = null;\n }\n },\n\n async executeQueryInternal<T extends arrow.TypeMap = any>(\n query: string,\n signal: AbortSignal,\n ): Promise<arrow.Table<T>> {\n if (!db) {\n throw new Error('DuckDB not initialized');\n }\n\n if (signal.aborted) {\n throw new Error('Query aborted before execution');\n }\n\n const localConn = await db.connect();\n const streamPromise = localConn.send<T>(query, true);\n let reader: arrow.RecordBatchReader<T> | null = null;\n\n const buildTable = async () => {\n reader = await streamPromise;\n const batches: arrow.RecordBatch<T>[] = [];\n let rowCount = 0;\n for await (const batch of reader) {\n if (batch.numRows === 0) continue;\n batches.push(batch);\n rowCount += batch.numRows;\n }\n if (rowCount === 0) {\n return arrow.tableFromArrays({}) as unknown as arrow.Table<T>;\n }\n return new arrow.Table(batches);\n };\n\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n localConn.cancelSent().catch(() => {});\n reader?.cancel?.();\n reject(new Error('Query cancelled'));\n };\n signal.addEventListener('abort', abortHandler);\n });\n\n try {\n return await Promise.race([buildTable(), abortPromise]);\n } catch (e) {\n // Some errors are returned as JSON, so we try to parse them\n if (e instanceof Error) {\n const parsed: any = safeJsonParse(e.message);\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n 'exception_message' in parsed\n ) {\n throw new Error(\n `${parsed.exception_type} ${parsed.error_subtype}: ${parsed.exception_message}` +\n `\\n${getSqlErrorWithPointer(query, Number(parsed.position)).formatted}`,\n );\n }\n }\n throw e;\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n await localConn.close();\n }\n },\n\n async cancelQueryInternal() {\n if (conn) {\n try {\n await conn.cancelSent();\n } catch (err) {\n console.warn('DuckDB cancelSent failed:', err);\n }\n }\n },\n\n async loadFileInternal(\n file: string | File,\n tableName: string,\n opts?: LoadFileOptions,\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n await withTempRegisteredFile(file, async (fileName) => {\n if (opts && isSpatialLoadFileOptions(opts)) {\n await conn!.query(loadSpatial(tableName, fileName, opts));\n } else {\n await conn!.query(\n load(opts?.method ?? 'auto', tableName, fileName, opts),\n );\n }\n });\n },\n\n async loadArrowInternal(\n file: arrow.Table | Uint8Array,\n tableName: string,\n opts?: {schema?: string},\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n const options = {name: tableName, schema: opts?.schema};\n if (file instanceof arrow.Table) {\n await conn.insertArrowTable(file, options);\n } else {\n await conn.insertArrowFromIPCStream(file, options);\n }\n },\n\n async loadObjectsInternal(\n file: Record<string, unknown>[],\n tableName: string,\n opts?: StandardLoadOptions,\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n await conn.query(loadObjectsSql(tableName, file, opts));\n },\n };\n\n const base = createBaseDuckDbConnector({dbPath, initializationQuery}, impl);\n\n async function withTempRegisteredFile(\n file: string | File,\n action: (fileName: string) => Promise<void>,\n ) {\n if (!conn || !db) {\n throw new Error('DuckDB connection not initialized');\n }\n let fileName: string;\n let tempFileName: string | undefined = undefined;\n if (file instanceof File) {\n const {ext} = splitFilePath(file.name);\n tempFileName = `${Math.random().toString(36).substring(2, 15)}${ext ? `.${ext}` : ''}`;\n fileName = tempFileName;\n await db.registerFileHandle(\n fileName,\n file,\n DuckDBDataProtocol.BROWSER_FILEREADER,\n true,\n );\n } else {\n fileName = file;\n }\n try {\n await action(fileName);\n } finally {\n if (tempFileName) {\n await db!.dropFile(tempFileName);\n }\n }\n }\n\n return {\n ...base,\n getDb() {\n if (!db) {\n throw new Error('DuckDB not initialized');\n }\n return db;\n },\n getConnection() {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n return conn;\n },\n get type() {\n return 'wasm' as const;\n },\n };\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -7,9 +7,11 @@ export type { DuckDBBundles, DuckDBConfig } from '@duckdb/duckdb-wasm';
7
7
  export { isSpatialLoadFileOptions, LoadFileOptions, SpatialLoadFileOptions, } from '@sqlrooms/room-config';
8
8
  export { createDuckDbConnector, createWasmDuckDbConnector, isWasmDuckDbConnector, type DuckDbConnectorOptions, type DuckDbConnectorType, type WasmDuckDbConnector, } from './connectors/createDuckDbConnector';
9
9
  export { createWebSocketDuckDbConnector, type WebSocketDuckDbConnector, type WebSocketDuckDbConnectorOptions, } from './connectors/WebSocketDuckDbConnector';
10
- export { createDuckDbSlice, useStoreWithDuckDb, type CreateDuckDbSliceProps, type DuckDbSliceState, type SchemaAndDatabase, } from './DuckDbSlice';
11
- export { useExportToCsv } from './exportToCsv';
10
+ export { createDuckDbSlice, useStoreWithDuckDb, createDefaultLoadTableSchemasFilter, type CreateDuckDbSliceProps, type DuckDbSliceState, } from './DuckDbSlice';
11
+ export { type LoadTableSchemasFilter } from './loadTableSchemas';
12
+ export { useExportToCsv, type UseExportToCsvReturn } from './use-export-to-csv';
13
+ export { useCopyAsTsv, type CopyAsTsvOptions, type CopyAsTsvResult, type UseCopyAsTsvReturn, } from './use-copy-as-tsv';
12
14
  export { useDuckDb } from './useDuckDb';
13
15
  export { useDuckDbQuery, useSql, type DuckDbQueryResult, type UseSqlQueryResult, } from './useSql';
14
- export { arrowTableToJson, createBaseDuckDbConnector, createDbSchemaTrees, createTypedRowAccessor, escapeId, escapeVal, getArrowColumnTypeCategory, getColValAsNumber, getDuckDbTypeCategory, getSqlErrorWithPointer, isNumericDuckType, isQualifiedTableName, joinStatements, literalToSQL, load, loadCSV, loadJSON, loadObjects, loadParquet, loadSpatial, makeLimitQuery, makeQualifiedTableName, sanitizeQuery, separateLastStatement, splitSqlStatements, sqlFrom, type BaseDuckDbConnectorImpl, type BaseDuckDbConnectorOptions, type ColumnNodeObject, type ColumnTypeCategory, type DatabaseNodeObject, type DataTable, type DbSchemaNode, type DuckDbConnector, type NodeObject, type QualifiedTableName, type QueryHandle, type QueryOptions, type SchemaNodeObject, type SeparatedStatements, type TableColumn, type TableNodeObject, type TypedRowAccessor, } from '@sqlrooms/duckdb-core';
16
+ export { arrowTableToJson, createBaseDuckDbConnector, createDbSchemaTrees, createTypedRowAccessor, escapeId, escapeVal, getArrowColumnTypeCategory, getColValAsNumber, getDuckDbTypeCategory, getSqlErrorWithPointer, isNumericDuckType, isQualifiedTableName, joinStatements, literalToSQL, load, loadCSV, loadJSON, loadObjects, loadParquet, loadSpatial, makeLimitQuery, makeQualifiedTableName, sanitizeQuery, separateLastStatement, splitSqlStatements, sqlFrom, getFunctionSuggestions, getFunctionDocumentation, type BaseDuckDbConnectorImpl, type BaseDuckDbConnectorOptions, type ColumnNodeObject, type ColumnTypeCategory, type DatabaseNodeObject, type DataTable, type DbSchemaNode, type DuckDbConnector, type FunctionSuggestion, type GroupedFunctionSuggestion, type NodeObject, type QualifiedTableName, type QueryHandle, type QueryOptions, type SchemaNodeObject, type SeparatedStatements, type TableColumn, type TableNodeObject, type TypedRowAccessor, } from '@sqlrooms/duckdb-core';
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAErE,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,GACrC,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EACL,cAAc,EACd,MAAM,EACN,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,OAAO,EACP,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAC,aAAa,EAAE,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAErE,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,GACrC,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mCAAmC,EACnC,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAC,KAAK,sBAAsB,EAAC,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAC,cAAc,EAAE,KAAK,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EACL,cAAc,EACd,MAAM,EACN,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,OAAO,EACP,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -6,10 +6,11 @@ export { DuckDBAccessMode } from '@duckdb/duckdb-wasm';
6
6
  export { isSpatialLoadFileOptions, LoadFileOptions, SpatialLoadFileOptions, } from '@sqlrooms/room-config';
7
7
  export { createDuckDbConnector, createWasmDuckDbConnector, isWasmDuckDbConnector, } from './connectors/createDuckDbConnector';
8
8
  export { createWebSocketDuckDbConnector, } from './connectors/WebSocketDuckDbConnector';
9
- export { createDuckDbSlice, useStoreWithDuckDb, } from './DuckDbSlice';
10
- export { useExportToCsv } from './exportToCsv';
9
+ export { createDuckDbSlice, useStoreWithDuckDb, createDefaultLoadTableSchemasFilter, } from './DuckDbSlice';
10
+ export { useExportToCsv } from './use-export-to-csv';
11
+ export { useCopyAsTsv, } from './use-copy-as-tsv';
11
12
  export { useDuckDb } from './useDuckDb';
12
13
  export { useDuckDbQuery, useSql, } from './useSql';
13
14
  // Re-export from @sqlrooms/duckdb-core
14
- export { arrowTableToJson, createBaseDuckDbConnector, createDbSchemaTrees, createTypedRowAccessor, escapeId, escapeVal, getArrowColumnTypeCategory, getColValAsNumber, getDuckDbTypeCategory, getSqlErrorWithPointer, isNumericDuckType, isQualifiedTableName, joinStatements, literalToSQL, load, loadCSV, loadJSON, loadObjects, loadParquet, loadSpatial, makeLimitQuery, makeQualifiedTableName, sanitizeQuery, separateLastStatement, splitSqlStatements, sqlFrom, } from '@sqlrooms/duckdb-core';
15
+ export { arrowTableToJson, createBaseDuckDbConnector, createDbSchemaTrees, createTypedRowAccessor, escapeId, escapeVal, getArrowColumnTypeCategory, getColValAsNumber, getDuckDbTypeCategory, getSqlErrorWithPointer, isNumericDuckType, isQualifiedTableName, joinStatements, literalToSQL, load, loadCSV, loadJSON, loadObjects, loadParquet, loadSpatial, makeLimitQuery, makeQualifiedTableName, sanitizeQuery, separateLastStatement, splitSqlStatements, sqlFrom, getFunctionSuggestions, getFunctionDocumentation, } from '@sqlrooms/duckdb-core';
15
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,GAItB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,8BAA8B,GAG/B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GAInB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EACL,cAAc,EACd,MAAM,GAGP,MAAM,UAAU,CAAC;AAElB,uCAAuC;AACvC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,OAAO,GAkBR,MAAM,uBAAuB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {DuckDBAccessMode} from '@duckdb/duckdb-wasm';\nexport type {DuckDBBundles, DuckDBConfig} from '@duckdb/duckdb-wasm';\n\nexport {\n isSpatialLoadFileOptions,\n LoadFileOptions,\n SpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\n\nexport {\n createDuckDbConnector,\n createWasmDuckDbConnector,\n isWasmDuckDbConnector,\n type DuckDbConnectorOptions,\n type DuckDbConnectorType,\n type WasmDuckDbConnector,\n} from './connectors/createDuckDbConnector';\n\nexport {\n createWebSocketDuckDbConnector,\n type WebSocketDuckDbConnector,\n type WebSocketDuckDbConnectorOptions,\n} from './connectors/WebSocketDuckDbConnector';\n\nexport {\n createDuckDbSlice,\n useStoreWithDuckDb,\n type CreateDuckDbSliceProps,\n type DuckDbSliceState,\n type SchemaAndDatabase,\n} from './DuckDbSlice';\n\nexport {useExportToCsv} from './exportToCsv';\n\nexport {useDuckDb} from './useDuckDb';\n\nexport {\n useDuckDbQuery,\n useSql,\n type DuckDbQueryResult,\n type UseSqlQueryResult,\n} from './useSql';\n\n// Re-export from @sqlrooms/duckdb-core\nexport {\n arrowTableToJson,\n createBaseDuckDbConnector,\n createDbSchemaTrees,\n createTypedRowAccessor,\n escapeId,\n escapeVal,\n getArrowColumnTypeCategory,\n getColValAsNumber,\n getDuckDbTypeCategory,\n getSqlErrorWithPointer,\n isNumericDuckType,\n isQualifiedTableName,\n joinStatements,\n literalToSQL,\n load,\n loadCSV,\n loadJSON,\n loadObjects,\n loadParquet,\n loadSpatial,\n makeLimitQuery,\n makeQualifiedTableName,\n sanitizeQuery,\n separateLastStatement,\n splitSqlStatements,\n sqlFrom,\n type BaseDuckDbConnectorImpl,\n type BaseDuckDbConnectorOptions,\n type ColumnNodeObject,\n type ColumnTypeCategory,\n type DatabaseNodeObject,\n type DataTable,\n type DbSchemaNode,\n type DuckDbConnector,\n type NodeObject,\n type QualifiedTableName,\n type QueryHandle,\n type QueryOptions,\n type SchemaNodeObject,\n type SeparatedStatements,\n type TableColumn,\n type TableNodeObject,\n type TypedRowAccessor,\n} from '@sqlrooms/duckdb-core';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,GAItB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,8BAA8B,GAG/B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mCAAmC,GAGpC,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAC,cAAc,EAA4B,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EACL,YAAY,GAIb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EACL,cAAc,EACd,MAAM,GAGP,MAAM,UAAU,CAAC;AAElB,uCAAuC;AACvC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,OAAO,EACP,sBAAsB,EACtB,wBAAwB,GAoBzB,MAAM,uBAAuB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {DuckDBAccessMode} from '@duckdb/duckdb-wasm';\nexport type {DuckDBBundles, DuckDBConfig} from '@duckdb/duckdb-wasm';\n\nexport {\n isSpatialLoadFileOptions,\n LoadFileOptions,\n SpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\n\nexport {\n createDuckDbConnector,\n createWasmDuckDbConnector,\n isWasmDuckDbConnector,\n type DuckDbConnectorOptions,\n type DuckDbConnectorType,\n type WasmDuckDbConnector,\n} from './connectors/createDuckDbConnector';\n\nexport {\n createWebSocketDuckDbConnector,\n type WebSocketDuckDbConnector,\n type WebSocketDuckDbConnectorOptions,\n} from './connectors/WebSocketDuckDbConnector';\n\nexport {\n createDuckDbSlice,\n useStoreWithDuckDb,\n createDefaultLoadTableSchemasFilter,\n type CreateDuckDbSliceProps,\n type DuckDbSliceState,\n} from './DuckDbSlice';\n\nexport {type LoadTableSchemasFilter} from './loadTableSchemas';\n\nexport {useExportToCsv, type UseExportToCsvReturn} from './use-export-to-csv';\n\nexport {\n useCopyAsTsv,\n type CopyAsTsvOptions,\n type CopyAsTsvResult,\n type UseCopyAsTsvReturn,\n} from './use-copy-as-tsv';\n\nexport {useDuckDb} from './useDuckDb';\n\nexport {\n useDuckDbQuery,\n useSql,\n type DuckDbQueryResult,\n type UseSqlQueryResult,\n} from './useSql';\n\n// Re-export from @sqlrooms/duckdb-core\nexport {\n arrowTableToJson,\n createBaseDuckDbConnector,\n createDbSchemaTrees,\n createTypedRowAccessor,\n escapeId,\n escapeVal,\n getArrowColumnTypeCategory,\n getColValAsNumber,\n getDuckDbTypeCategory,\n getSqlErrorWithPointer,\n isNumericDuckType,\n isQualifiedTableName,\n joinStatements,\n literalToSQL,\n load,\n loadCSV,\n loadJSON,\n loadObjects,\n loadParquet,\n loadSpatial,\n makeLimitQuery,\n makeQualifiedTableName,\n sanitizeQuery,\n separateLastStatement,\n splitSqlStatements,\n sqlFrom,\n getFunctionSuggestions,\n getFunctionDocumentation,\n type BaseDuckDbConnectorImpl,\n type BaseDuckDbConnectorOptions,\n type ColumnNodeObject,\n type ColumnTypeCategory,\n type DatabaseNodeObject,\n type DataTable,\n type DbSchemaNode,\n type DuckDbConnector,\n type FunctionSuggestion,\n type GroupedFunctionSuggestion,\n type NodeObject,\n type QualifiedTableName,\n type QueryHandle,\n type QueryOptions,\n type SchemaNodeObject,\n type SeparatedStatements,\n type TableColumn,\n type TableNodeObject,\n type TypedRowAccessor,\n} from '@sqlrooms/duckdb-core';\n"]}
@@ -0,0 +1,17 @@
1
+ import { DataTable, DuckDbConnector, QualifiedTableName } from '@sqlrooms/duckdb-core';
2
+ export type LoadTableSchemasFilterFunction = (table: QualifiedTableName) => boolean;
3
+ export type LoadTableSchemasFilter = {
4
+ schema?: string;
5
+ database?: string;
6
+ table?: string;
7
+ };
8
+ export type LoadTableSchemasOptions = LoadTableSchemasFilter & {
9
+ filterFunction?: LoadTableSchemasFilterFunction | null;
10
+ };
11
+ /**
12
+ * Internal helper to load table schemas with optional filter bypass.
13
+ * Used for exact lookups where we don't want the visibility filter to hide results.
14
+ * Omit `filterFunction` to bypass filtering.
15
+ */
16
+ export declare function loadTableSchemas(connector: DuckDbConnector, options?: LoadTableSchemasOptions): Promise<DataTable[]>;
17
+ //# sourceMappingURL=loadTableSchemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadTableSchemas.d.ts","sourceRoot":"","sources":["../src/loadTableSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EAGf,kBAAkB,EAEnB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,8BAA8B,GAAG,CAC3C,KAAK,EAAE,kBAAkB,KACtB,OAAO,CAAC;AAEb,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D,cAAc,CAAC,EAAE,8BAA8B,GAAG,IAAI,CAAC;CACxD,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,eAAe,EAC1B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,SAAS,EAAE,CAAC,CAiBtB"}
@@ -0,0 +1,134 @@
1
+ import { escapeVal, makeQualifiedTableName, } from '@sqlrooms/duckdb-core';
2
+ /**
3
+ * Internal helper to load table schemas with optional filter bypass.
4
+ * Used for exact lookups where we don't want the visibility filter to hide results.
5
+ * Omit `filterFunction` to bypass filtering.
6
+ */
7
+ export async function loadTableSchemas(connector, options = {}) {
8
+ const { filterFunction, ...filter } = options;
9
+ const sql = buildTableSchemasQuery(filter);
10
+ const describeResults = await connector.query(sql);
11
+ const tables = [];
12
+ for (let i = 0; i < describeResults.numRows; i++) {
13
+ const dataTable = parseTableSchemaRow(describeResults, i);
14
+ // Apply filter (if not provided or null, include all tables)
15
+ if (!filterFunction || filterFunction(dataTable.table)) {
16
+ tables.push(dataTable);
17
+ }
18
+ }
19
+ return tables;
20
+ }
21
+ function isDuckDbPlaceholderViewColumn(columnName, columnType) {
22
+ return columnName === '__' && columnType.toUpperCase() === 'UNKNOWN';
23
+ }
24
+ /**
25
+ * Parses a single row from the table schema query results into a DataTable object.
26
+ */
27
+ function parseTableSchemaRow(describeResults, index) {
28
+ const isView = describeResults.getChild('isView')?.get(index);
29
+ const rowDatabase = describeResults.getChild('database')?.get(index);
30
+ const rowSchema = describeResults.getChild('schema')?.get(index);
31
+ const rowTable = describeResults.getChild('name')?.get(index);
32
+ const sql = describeResults.getChild('sql')?.get(index);
33
+ const comment = describeResults.getChild('comment')?.get(index);
34
+ const estimatedSize = describeResults.getChild('estimated_size')?.get(index);
35
+ const columnNames = describeResults.getChild('column_names')?.get(index);
36
+ const columnTypes = describeResults.getChild('column_types')?.get(index);
37
+ const qualifiedTable = makeQualifiedTableName({
38
+ database: rowDatabase,
39
+ schema: rowSchema,
40
+ table: rowTable,
41
+ });
42
+ const columns = [];
43
+ for (let ci = 0; ci < (columnNames?.length ?? 0); ci++) {
44
+ const columnName = String(columnNames.get(ci));
45
+ const columnType = String(columnTypes?.get(ci));
46
+ if (isDuckDbPlaceholderViewColumn(columnName, columnType)) {
47
+ continue;
48
+ }
49
+ columns.push({
50
+ name: columnName,
51
+ type: columnType,
52
+ });
53
+ }
54
+ return {
55
+ table: qualifiedTable,
56
+ database: rowDatabase,
57
+ schema: rowSchema,
58
+ tableName: rowTable,
59
+ columns,
60
+ sql,
61
+ comment,
62
+ isView: Boolean(isView),
63
+ rowCount: typeof estimatedSize === 'bigint'
64
+ ? Number(estimatedSize)
65
+ : estimatedSize === null
66
+ ? undefined
67
+ : estimatedSize,
68
+ };
69
+ }
70
+ function buildMetadataWhereClause(nameColumn, filter) {
71
+ const { schema, database, table } = filter;
72
+ return [
73
+ database
74
+ ? `database_name = ${escapeVal(database)}`
75
+ : `database_name != 'system'`,
76
+ schema ? `schema_name = ${escapeVal(schema)}` : '',
77
+ table ? `${nameColumn} = ${escapeVal(table)}` : '',
78
+ ]
79
+ .filter(Boolean)
80
+ .join(' AND ');
81
+ }
82
+ /**
83
+ * Builds the SQL query to load table and view schemas from DuckDB system catalogs.
84
+ * Uses CTEs to efficiently join table/view metadata with column information.
85
+ */
86
+ function buildTableSchemasQuery(filter) {
87
+ const tableWhereClause = buildMetadataWhereClause('table_name', filter);
88
+ const viewWhereClause = buildMetadataWhereClause('view_name', filter);
89
+ return `WITH tables_and_views AS (
90
+ FROM duckdb_tables() SELECT
91
+ database_name AS database,
92
+ schema_name AS schema,
93
+ table_name AS name,
94
+ sql,
95
+ comment,
96
+ estimated_size,
97
+ FALSE AS isView
98
+ WHERE ${tableWhereClause}
99
+ UNION ALL
100
+ FROM duckdb_views() SELECT
101
+ database_name AS database,
102
+ schema_name AS schema,
103
+ view_name AS name,
104
+ sql,
105
+ comment,
106
+ NULL AS estimated_size,
107
+ TRUE AS isView
108
+ WHERE ${viewWhereClause}
109
+ ),
110
+ columns AS (
111
+ FROM duckdb_columns() SELECT
112
+ database_name AS database,
113
+ schema_name AS schema,
114
+ table_name AS name,
115
+ list(column_name ORDER BY column_index) AS column_names,
116
+ list(data_type ORDER BY column_index) AS column_types
117
+ WHERE ${tableWhereClause}
118
+ GROUP BY database_name, schema_name, table_name
119
+ )
120
+ SELECT
121
+ isView,
122
+ database,
123
+ schema,
124
+ name,
125
+ column_names,
126
+ column_types,
127
+ sql,
128
+ comment,
129
+ estimated_size
130
+ FROM tables_and_views
131
+ LEFT JOIN columns USING (database, schema, name)
132
+ ORDER BY isView, database, schema, name`;
133
+ }
134
+ //# sourceMappingURL=loadTableSchemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadTableSchemas.js","sourceRoot":"","sources":["../src/loadTableSchemas.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n escapeVal,\n makeQualifiedTableName,\n QualifiedTableName,\n TableColumn,\n} from '@sqlrooms/duckdb-core';\n\nexport type LoadTableSchemasFilterFunction = (\n table: QualifiedTableName,\n) => boolean;\n\nexport type LoadTableSchemasFilter = {\n schema?: string;\n database?: string;\n table?: string;\n};\n\nexport type LoadTableSchemasOptions = LoadTableSchemasFilter & {\n filterFunction?: LoadTableSchemasFilterFunction | null;\n};\n\n/**\n * Internal helper to load table schemas with optional filter bypass.\n * Used for exact lookups where we don't want the visibility filter to hide results.\n * Omit `filterFunction` to bypass filtering.\n */\nexport async function loadTableSchemas(\n connector: DuckDbConnector,\n options: LoadTableSchemasOptions = {},\n): Promise<DataTable[]> {\n const {filterFunction, ...filter} = options;\n\n const sql = buildTableSchemasQuery(filter);\n const describeResults = await connector.query(sql);\n const tables: DataTable[] = [];\n\n for (let i = 0; i < describeResults.numRows; i++) {\n const dataTable = parseTableSchemaRow(describeResults, i);\n\n // Apply filter (if not provided or null, include all tables)\n if (!filterFunction || filterFunction(dataTable.table)) {\n tables.push(dataTable);\n }\n }\n\n return tables;\n}\n\nfunction isDuckDbPlaceholderViewColumn(\n columnName: string,\n columnType: string,\n): boolean {\n return columnName === '__' && columnType.toUpperCase() === 'UNKNOWN';\n}\n\n/**\n * Parses a single row from the table schema query results into a DataTable object.\n */\nfunction parseTableSchemaRow(describeResults: any, index: number): DataTable {\n const isView = describeResults.getChild('isView')?.get(index);\n const rowDatabase = describeResults.getChild('database')?.get(index);\n const rowSchema = describeResults.getChild('schema')?.get(index);\n const rowTable = describeResults.getChild('name')?.get(index);\n const sql = describeResults.getChild('sql')?.get(index);\n const comment = describeResults.getChild('comment')?.get(index);\n const estimatedSize = describeResults.getChild('estimated_size')?.get(index);\n const columnNames = describeResults.getChild('column_names')?.get(index);\n const columnTypes = describeResults.getChild('column_types')?.get(index);\n\n const qualifiedTable = makeQualifiedTableName({\n database: rowDatabase,\n schema: rowSchema,\n table: rowTable,\n });\n\n const columns: TableColumn[] = [];\n for (let ci = 0; ci < (columnNames?.length ?? 0); ci++) {\n const columnName = String(columnNames.get(ci));\n const columnType = String(columnTypes?.get(ci));\n if (isDuckDbPlaceholderViewColumn(columnName, columnType)) {\n continue;\n }\n columns.push({\n name: columnName,\n type: columnType,\n });\n }\n\n return {\n table: qualifiedTable,\n database: rowDatabase,\n schema: rowSchema,\n tableName: rowTable,\n columns,\n sql,\n comment,\n isView: Boolean(isView),\n rowCount:\n typeof estimatedSize === 'bigint'\n ? Number(estimatedSize)\n : estimatedSize === null\n ? undefined\n : estimatedSize,\n };\n}\n\nfunction buildMetadataWhereClause(\n nameColumn: string,\n filter: LoadTableSchemasFilter,\n): string {\n const {schema, database, table} = filter;\n return [\n database\n ? `database_name = ${escapeVal(database)}`\n : `database_name != 'system'`,\n schema ? `schema_name = ${escapeVal(schema)}` : '',\n table ? `${nameColumn} = ${escapeVal(table)}` : '',\n ]\n .filter(Boolean)\n .join(' AND ');\n}\n\n/**\n * Builds the SQL query to load table and view schemas from DuckDB system catalogs.\n * Uses CTEs to efficiently join table/view metadata with column information.\n */\nfunction buildTableSchemasQuery(filter: LoadTableSchemasFilter): string {\n const tableWhereClause = buildMetadataWhereClause('table_name', filter);\n const viewWhereClause = buildMetadataWhereClause('view_name', filter);\n\n return `WITH tables_and_views AS (\n FROM duckdb_tables() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n sql,\n comment,\n estimated_size,\n FALSE AS isView\n WHERE ${tableWhereClause}\n UNION ALL\n FROM duckdb_views() SELECT\n database_name AS database,\n schema_name AS schema,\n view_name AS name,\n sql,\n comment,\n NULL AS estimated_size,\n TRUE AS isView\n WHERE ${viewWhereClause}\n ),\n columns AS (\n FROM duckdb_columns() SELECT\n database_name AS database,\n schema_name AS schema,\n table_name AS name,\n list(column_name ORDER BY column_index) AS column_names,\n list(data_type ORDER BY column_index) AS column_types\n WHERE ${tableWhereClause}\n GROUP BY database_name, schema_name, table_name\n )\n SELECT\n isView,\n database,\n schema,\n name,\n column_names,\n column_types,\n sql,\n comment,\n estimated_size\n FROM tables_and_views\n LEFT JOIN columns USING (database, schema, name)\n ORDER BY isView, database, schema, name`;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export interface CopyAsTsvResult {
2
+ rowCount: number;
3
+ limitExceeded: boolean;
4
+ }
5
+ export interface CopyAsTsvOptions {
6
+ pageSize?: number;
7
+ maxSizeBytes?: number;
8
+ }
9
+ export interface UseCopyAsTsvReturn {
10
+ copyAsTsv: (query: string, options?: CopyAsTsvOptions) => Promise<CopyAsTsvResult>;
11
+ }
12
+ export declare function useCopyAsTsv(): UseCopyAsTsvReturn;
13
+ //# sourceMappingURL=use-copy-as-tsv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-copy-as-tsv.d.ts","sourceRoot":"","sources":["../src/use-copy-as-tsv.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,CACT,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,KACvB,OAAO,CAAC,eAAe,CAAC,CAAC;CAC/B;AAED,wBAAgB,YAAY,IAAI,kBAAkB,CAgDjD"}