diff --git a/package.json b/package.json index 6584cc77c..86171ea05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kysely", - "version": "0.16.9", + "version": "0.16.10", "description": "Type safe SQL query builder", "repository": { "type": "git", diff --git a/src/kysely.ts b/src/kysely.ts index 4909c43f7..88996c570 100644 --- a/src/kysely.ts +++ b/src/kysely.ts @@ -440,13 +440,13 @@ export class ConnectionBuilder { const connection = await this.#props.driver.acquireConnection() const connectionProvider = new SingleConnectionProvider(connection) - const transaction = new Kysely({ + const db = new Kysely({ ...this.#props, executor: this.#props.executor.withConnectionProvider(connectionProvider), }) try { - return await callback(transaction) + return await callback(db) } finally { await this.#props.driver.releaseConnection(connection) } diff --git a/src/query-compiler/default-query-compiler.ts b/src/query-compiler/default-query-compiler.ts index 56146cd76..fceff60c7 100644 --- a/src/query-compiler/default-query-compiler.ts +++ b/src/query-compiler/default-query-compiler.ts @@ -114,9 +114,9 @@ export class DefaultQueryCompiler protected override visitSelectQuery(node: SelectQueryNode): void { const wrapInParens = this.parentNode !== undefined && + !InsertQueryNode.is(this.parentNode) && !CreateViewNode.is(this.parentNode) && - !UnionNode.is(this.parentNode) && - !InsertQueryNode.is(this.parentNode) + !UnionNode.is(this.parentNode) if (wrapInParens) { this.append('(') @@ -442,13 +442,15 @@ export class DefaultQueryCompiler } protected override visitRaw(node: RawNode): void { - node.sqlFragments.forEach((sql, i) => { - this.append(sql) + const { sqlFragments, params } = node - if (node.params.length > i) { - this.visitNode(node.params[i]) + for (let i = 0; i < sqlFragments.length; ++i) { + this.append(sqlFragments[i]) + + if (params.length > i) { + this.visitNode(params[i]) } - }) + } } protected override visitOperator(node: OperatorNode): void { diff --git a/src/schema/alter-table-builder.ts b/src/schema/alter-table-builder.ts index 8c0132b67..7a980bae0 100644 --- a/src/schema/alter-table-builder.ts +++ b/src/schema/alter-table-builder.ts @@ -11,7 +11,6 @@ import { IdentifierNode } from '../operation-node/identifier-node.js' import { OperationNodeSource } from '../operation-node/operation-node-source.js' import { OnModifyForeignAction } from '../operation-node/references-node.js' import { RenameColumnNode } from '../operation-node/rename-column-node.js' -import { TableNode } from '../operation-node/table-node.js' import { CompiledQuery } from '../query-compiler/compiled-query.js' import { Compilable } from '../util/compilable.js' import { freeze } from '../util/object-utils.js' @@ -41,6 +40,7 @@ import { DefaultValueExpression, parseDefaultValueExpression, } from '../parser/default-value-parser.js' +import { parseTable } from '../parser/table-parser.js' /** * This builder can be used to create a `alter table` query. @@ -56,7 +56,7 @@ export class AlterTableBuilder { return new AlterTableExecutor({ ...this.#props, alterTableNode: AlterTableNode.cloneWith(this.#props.alterTableNode, { - renameTo: TableNode.create(newTableName), + renameTo: parseTable(newTableName), }), }) } @@ -172,7 +172,7 @@ export class AlterTableBuilder { constraintBuilder: new ForeignKeyConstraintBuilder( ForeignKeyConstraintNode.create( columns.map(ColumnNode.create), - TableNode.create(targetTable), + parseTable(targetTable), targetColumns.map(ColumnNode.create), constraintName ) diff --git a/src/schema/create-table-builder.ts b/src/schema/create-table-builder.ts index a0bec306b..e5c47c775 100644 --- a/src/schema/create-table-builder.ts +++ b/src/schema/create-table-builder.ts @@ -13,7 +13,6 @@ import { QueryId } from '../util/query-id.js' import { freeze, noop } from '../util/object-utils.js' import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constraint-node.js' import { ColumnNode } from '../operation-node/column-node.js' -import { TableNode } from '../operation-node/table-node.js' import { ForeignKeyConstraintBuilder } from './foreign-key-constraint-builder.js' import { DataTypeExpression, @@ -23,6 +22,7 @@ import { PrimaryConstraintNode } from '../operation-node/primary-constraint-node import { UniqueConstraintNode } from '../operation-node/unique-constraint-node.js' import { CheckConstraintNode } from '../operation-node/check-constraint-node.js' import { AnyRawBuilder } from '../util/type-utils.js' +import { parseTable } from '../parser/table-parser.js' /** * This builder can be used to create a `create table` query. @@ -262,7 +262,7 @@ export class CreateTableBuilder new ForeignKeyConstraintBuilder( ForeignKeyConstraintNode.create( columns.map(ColumnNode.create), - TableNode.create(targetTable), + parseTable(targetTable), targetColumns.map(ColumnNode.create), constraintName ) diff --git a/test/node/src/schema.test.ts b/test/node/src/schema.test.ts index 7d3637152..51eee8361 100644 --- a/test/node/src/schema.test.ts +++ b/test/node/src/schema.test.ts @@ -336,6 +336,39 @@ for (const dialect of BUILT_IN_DIALECTS) { await builder.execute() }) + if (dialect === 'postgres') { + it('should support schemas in foreign key target table', async () => { + await ctx.db.schema + .createTable('test2') + .addColumn('c', 'integer') + .addColumn('d', 'integer') + .addPrimaryKeyConstraint('primary_key', ['c', 'd']) + .execute() + + const builder = ctx.db.schema + .createTable('test') + .addColumn('a', 'integer') + .addColumn('b', 'integer') + .addForeignKeyConstraint( + 'foreign_key', + ['a', 'b'], + 'public.test2', + ['c', 'd'] + ) + + testSql(builder, dialect, { + postgres: { + sql: 'create table "test" ("a" integer, "b" integer, constraint "foreign_key" foreign key ("a", "b") references "public"."test2" ("c", "d"))', + parameters: [], + }, + mysql: NOT_SUPPORTED, + sqlite: NOT_SUPPORTED, + }) + + await builder.execute() + }) + } + it('should create a table with a foreign key constraint that has an `on update` statement', async () => { await ctx.db.schema .createTable('test2')