import { OperationNodeSource } from '../operation-node/operation-node-source.js'; import { CompiledQuery } from '../query-compiler/compiled-query.js'; import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js'; import { TableExpression, From, FromTables } from '../parser/table-parser.js'; import { SelectExpression, SelectCallback } from '../parser/select-parser.js'; import { ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js'; import { ReferenceExpression } from '../parser/reference-parser.js'; import { QueryNode } from '../operation-node/query-node.js'; import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, SimplifyResult, SimplifySingleResult, SqlBool } from '../util/type-utils.js'; import { UpdateQueryNode } from '../operation-node/update-query-node.js'; import { UpdateObjectExpression, ExtractUpdateTypeFromReferenceExpression } from '../parser/update-set-parser.js'; import { Compilable } from '../util/compilable.js'; import { QueryExecutor } from '../query-executor/query-executor.js'; import { QueryId } from '../util/query-id.js'; import { UpdateResult } from './update-result.js'; import { KyselyPlugin } from '../plugin/kysely-plugin.js'; import { WhereInterface } from './where-interface.js'; import { ReturningInterface } from './returning-interface.js'; import { NoResultErrorConstructor } from './no-result-error.js'; import { Selectable } from '../util/column-type.js'; import { Explainable, ExplainFormat } from '../util/explainable.js'; import { AliasedExpression, Expression } from '../expression/expression.js'; import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js'; import { KyselyTypeError } from '../util/type-error.js'; import { Streamable } from '../util/streamable.js'; import { ExpressionOrFactory } from '../parser/expression-parser.js'; import { ValueExpression } from '../parser/value-parser.js'; export declare class UpdateQueryBuilder implements WhereInterface, ReturningInterface, OperationNodeSource, Compilable, Explainable, Streamable { #private; constructor(props: UpdateQueryBuilderProps); /** * Adds a `where` expression to the query. * * Calling this method multiple times will combine the expressions using `and`. * * Also see {@link whereRef} * * ### Examples * * * * `where` method calls are combined with `AND`: * * ```ts * const person = await db * .selectFrom('person') * .selectAll() * .where('first_name', '=', 'Jennifer') * .where('age', '>', 40) * .executeTakeFirst() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * from "person" where "first_name" = $1 and "age" > $2 * ``` * * Operator can be any supported operator or if the typings don't support it * you can always use: * * ```ts * sql`your operator` * ``` * * * * Find multiple items using a list of identifiers: * * ```ts * const persons = await db * .selectFrom('person') * .selectAll() * .where('id', 'in', ['1', '2', '3']) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * from "person" where "id" in ($1, $2, $3) * ``` * * * * You can use the `and` function to create a simple equality * filter using an object * * ```ts * const persons = await db * .selectFrom('person') * .selectAll() * .where((eb) => eb.and({ * first_name: 'Jennifer', * last_name: eb.ref('first_name') * })) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * * from "person" * where ( * "first_name" = $1 * and "last_name" = "first_name" * ) * ``` * * * * To combine conditions using `OR`, you can use the expression builder. * There are two ways to create `OR` expressions. Both are shown in this * example: * * ```ts * const persons = await db * .selectFrom('person') * .selectAll() * // 1. Using the `or` method on the expression builder: * .where((eb) => eb.or([ * eb('first_name', '=', 'Jennifer'), * eb('first_name', '=', 'Sylvester') * ])) * // 2. Chaining expressions using the `or` method on the * // created expressions: * .where((eb) => * eb('last_name', '=', 'Aniston').or('last_name', '=', 'Stallone') * ) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * * from "person" * where ( * ("first_name" = $1 or "first_name" = $2) * and * ("last_name" = $3 or "last_name" = $4) * ) * ``` * * * * You can add expressions conditionally like this: * * ```ts * import { Expression, SqlBool } from 'kysely' * * const firstName: string | undefined = 'Jennifer' * const lastName: string | undefined = 'Aniston' * const under18 = true * const over60 = true * * let query = db * .selectFrom('person') * .selectAll() * * if (firstName) { * // The query builder is immutable. Remember to reassign * // the result back to the query variable. * query = query.where('first_name', '=', firstName) * } * * if (lastName) { * query = query.where('last_name', '=', lastName) * } * * if (under18 || over60) { * // Conditional OR expressions can be added like this. * query = query.where((eb) => { * const ors: Expression[] = [] * * if (under18) { * ors.push(eb('age', '<', 18)) * } * * if (over60) { * ors.push(eb('age', '>', 60)) * } * * return eb.or(ors) * }) * } * * const persons = await query.execute() * ``` * * Both the first and third argument can also be arbitrary expressions like * subqueries. An expression can defined by passing a function and calling * the methods of the {@link ExpressionBuilder} passed to the callback: * * ```ts * const persons = await db * .selectFrom('person') * .selectAll() * .where( * (qb) => qb.selectFrom('pet') * .select('pet.name') * .whereRef('pet.owner_id', '=', 'person.id') * .limit(1), * '=', * 'Fluffy' * ) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * * from "person" * where ( * select "pet"."name" * from "pet" * where "pet"."owner_id" = "person"."id" * limit $1 * ) = $2 * ``` * * A `where in` query can be built by using the `in` operator and an array * of values. The values in the array can also be expressions: * * ```ts * const persons = await db * .selectFrom('person') * .selectAll() * .where('person.id', 'in', [100, 200, 300]) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * from "person" where "id" in ($1, $2, $3) * ``` * * * * For complex `where` expressions you can pass in a single callback and * use the `ExpressionBuilder` to build your expression: * * ```ts * const firstName = 'Jennifer' * const maxAge = 60 * * const persons = await db * .selectFrom('person') * .selectAll('person') * .where(({ eb, or, and, not, exists, selectFrom }) => and([ * or([ * eb('first_name', '=', firstName), * eb('age', '<', maxAge) * ]), * not(exists( * selectFrom('pet') * .select('pet.id') * .whereRef('pet.owner_id', '=', 'person.id') * )) * ])) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select "person".* * from "person" * where ( * ( * "first_name" = $1 * or "age" < $2 * ) * and not exists ( * select "pet"."id" from "pet" where "pet"."owner_id" = "person"."id" * ) * ) * ``` * * If everything else fails, you can always use the {@link sql} tag * as any of the arguments, including the operator: * * ```ts * import { sql } from 'kysely' * * const persons = await db * .selectFrom('person') * .selectAll() * .where( * sql`coalesce(first_name, last_name)`, * 'like', * '%' + name + '%', * ) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * from "person" * where coalesce(first_name, last_name) like $1 * ``` * * In all examples above the columns were known at compile time * (except for the raw {@link sql} expressions). By default kysely only * allows you to refer to columns that exist in the database **and** * can be referred to in the current query and context. * * Sometimes you may want to refer to columns that come from the user * input and thus are not available at compile time. * * You have two options, the {@link sql} tag or `db.dynamic`. The example below * uses both: * * ```ts * import { sql } from 'kysely' * const { ref } = db.dynamic * * const persons = await db * .selectFrom('person') * .selectAll() * .where(ref(columnFromUserInput), '=', 1) * .where(sql.id(columnFromUserInput), '=', 2) * .execute() * ``` */ where, VE extends OperandValueExpressionOrList>(lhs: RE, op: ComparisonOperatorExpression, rhs: VE): UpdateQueryBuilder; where>(expression: E): UpdateQueryBuilder; /** * Adds a `where` clause where both sides of the operator are references * to columns. * * The normal `where` method treats the right hand side argument as a * value by default. `whereRef` treats it as a column reference. This method is * expecially useful with joins and correlated subqueries. * * ### Examples * * Usage with a join: * * ```ts * db.selectFrom(['person', 'pet']) * .selectAll() * .whereRef('person.first_name', '=', 'pet.name') * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * from "person", "pet" where "person"."first_name" = "pet"."name" * ``` * * Usage in a subquery: * * ```ts * const persons = await db * .selectFrom('person') * .selectAll('person') * .select((eb) => eb * .selectFrom('pet') * .select('name') * .whereRef('pet.owner_id', '=', 'person.id') * .limit(1) * .as('pet_name') * ) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select "person".*, ( * select "name" * from "pet" * where "pet"."owner_id" = "person"."id" * limit $1 * ) as "pet_name" * from "person" */ whereRef, RRE extends ReferenceExpression>(lhs: LRE, op: ComparisonOperatorExpression, rhs: RRE): UpdateQueryBuilder; /** * Clears all where expressions from the query. * * ### Examples * * ```ts * db.selectFrom('person') * .selectAll() * .where('id','=',42) * .clearWhere() * ``` * * The generated SQL(PostgreSQL): * * ```sql * select * from "person" * ``` */ clearWhere(): UpdateQueryBuilder; /** * Changes an `update` query into a `update top` query. * * `top` clause is only supported by some dialects like MS SQL Server. * * ### Examples * * Update the first row: * * ```ts * await db.updateTable('person') * .top(1) * .set({ first_name: 'Foo' }) * .where('age', '>', 18) * .executeTakeFirstOrThrow() * ``` * * The generated SQL (MS SQL Server): * * ```sql * update top(1) "person" set "first_name" = @1 where "age" > @2 * ``` * * Update the 50% first rows: * * ```ts * await db.updateTable('person') * .top(50, 'percent') * .set({ first_name: 'Foo' }) * .where('age', '>', 18) * .executeTakeFirstOrThrow() * ``` * * The generated SQL (MS SQL Server): * * ```sql * update top(50) percent "person" set "first_name" = @1 where "age" > @2 * ``` */ top(expression: number | bigint, modifiers?: 'percent'): UpdateQueryBuilder; /** * Adds a from clause to the update query. * * This is supported only on some databases like PostgreSQL. * * The API is the same as {@link QueryCreator.selectFrom}. * * ### Examples * * ```ts * db.updateTable('person') * .from('pet') * .set((eb) => ({ * first_name: eb.ref('pet.name') * })) * .whereRef('pet.owner_id', '=', 'person.id') * ``` * * The generated SQL (PostgreSQL): * * ```sql * update "person" * set "first_name" = "pet"."name" * from "pet" * where "pet"."owner_id" = "person"."id" * ``` */ from>(table: TE): UpdateQueryBuilder, UT, FromTables, O>; from>(table: TE[]): UpdateQueryBuilder, UT, FromTables, O>; /** * Joins another table to the query using an inner join. * * ### Examples * * Simple usage by providing a table name and two columns to join: * * ```ts * const result = await db * .selectFrom('person') * .innerJoin('pet', 'pet.owner_id', 'person.id') * // `select` needs to come after the call to `innerJoin` so * // that you can select from the joined table. * .select(['person.id', 'pet.name']) * .execute() * * result[0].id * result[0].name * ``` * * The generated SQL (PostgreSQL): * * ```sql * select "person"."id", "pet"."name" * from "person" * inner join "pet" * on "pet"."owner_id" = "person"."id" * ``` * * You can give an alias for the joined table like this: * * ```ts * await db.selectFrom('person') * .innerJoin('pet as p', 'p.owner_id', 'person.id') * .where('p.name', '=', 'Doggo') * .selectAll() * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * * from "person" * inner join "pet" as "p" * on "p"."owner_id" = "person"."id" * where "p".name" = $1 * ``` * * You can provide a function as the second argument to get a join * builder for creating more complex joins. The join builder has a * bunch of `on*` methods for building the `on` clause of the join. * There's basically an equivalent for every `where` method * (`on`, `onRef`, `onExists` etc.). You can do all the same things * with the `on` method that you can with the corresponding `where` * method. See the `where` method documentation for more examples. * * ```ts * await db.selectFrom('person') * .innerJoin( * 'pet', * (join) => join * .onRef('pet.owner_id', '=', 'person.id') * .on('pet.name', '=', 'Doggo') * ) * .selectAll() * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * * from "person" * inner join "pet" * on "pet"."owner_id" = "person"."id" * and "pet"."name" = $1 * ``` * * You can join a subquery by providing a select query (or a callback) * as the first argument: * * ```ts * await db.selectFrom('person') * .innerJoin( * qb.selectFrom('pet') * .select(['owner_id', 'name']) * .where('name', '=', 'Doggo') * .as('doggos'), * 'doggos.owner_id', * 'person.id', * ) * .selectAll() * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * * from "person" * inner join ( * select "owner_id", "name" * from "pet" * where "name" = $1 * ) as "doggos" * on "doggos"."owner_id" = "person"."id" * ``` */ innerJoin, K1 extends JoinReferenceExpression, K2 extends JoinReferenceExpression>(table: TE, k1: K1, k2: K2): UpdateQueryBuilderWithInnerJoin; innerJoin, FN extends JoinCallbackExpression>(table: TE, callback: FN): UpdateQueryBuilderWithInnerJoin; /** * Just like {@link innerJoin} but adds a left join instead of an inner join. */ leftJoin, K1 extends JoinReferenceExpression, K2 extends JoinReferenceExpression>(table: TE, k1: K1, k2: K2): UpdateQueryBuilderWithLeftJoin; leftJoin, FN extends JoinCallbackExpression>(table: TE, callback: FN): UpdateQueryBuilderWithLeftJoin; /** * Just like {@link innerJoin} but adds a right join instead of an inner join. */ rightJoin, K1 extends JoinReferenceExpression, K2 extends JoinReferenceExpression>(table: TE, k1: K1, k2: K2): UpdateQueryBuilderWithRightJoin; rightJoin, FN extends JoinCallbackExpression>(table: TE, callback: FN): UpdateQueryBuilderWithRightJoin; /** * Just like {@link innerJoin} but adds a full join instead of an inner join. */ fullJoin, K1 extends JoinReferenceExpression, K2 extends JoinReferenceExpression>(table: TE, k1: K1, k2: K2): UpdateQueryBuilderWithFullJoin; fullJoin, FN extends JoinCallbackExpression>(table: TE, callback: FN): UpdateQueryBuilderWithFullJoin; /** * Adds a limit clause to the update query for supported databases, such as MySQL. * * ### Examples * * Update the first 2 rows in the 'person' table: * * ```ts * return await db * .updateTable('person') * .set({ first_name: 'Foo' }) * .limit(2); * ``` * * The generated SQL (MySQL): * ```sql * update `person` set `first_name` = 'Foo' limit 2 * ``` */ limit(limit: ValueExpression): UpdateQueryBuilder; /** * Sets the values to update for an {@link Kysely.updateTable | update} query. * * This method takes an object whose keys are column names and values are * values to update. In addition to the column's type, the values can be * any expressions such as raw {@link sql} snippets or select queries. * * This method also accepts a callback that returns the update object. The * callback takes an instance of {@link ExpressionBuilder} as its only argument. * The expression builder can be used to create arbitrary update expressions. * * The return value of an update query is an instance of {@link UpdateResult}. * You can use the {@link returning} method on supported databases to get out * the updated rows. * * ### Examples * * * * Update a row in `person` table: * * ```ts * const result = await db * .updateTable('person') * .set({ * first_name: 'Jennifer', * last_name: 'Aniston' * }) * .where('id', '=', '1') * .executeTakeFirst() * * console.log(result.numUpdatedRows) * ``` * * The generated SQL (PostgreSQL): * * ```sql * update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3 * ``` * * * * As always, you can provide a callback to the `set` method to get access * to an expression builder: * * ```ts * const result = await db * .updateTable('person') * .set((eb) => ({ * age: eb('age', '+', 1), * first_name: eb.selectFrom('pet').select('name').limit(1), * last_name: 'updated', * })) * .where('id', '=', '1') * .executeTakeFirst() * * console.log(result.numUpdatedRows) * ``` * * The generated SQL (PostgreSQL): * * ```sql * update "person" * set * "first_name" = (select "name" from "pet" limit $1), * "age" = "age" + $2, * "last_name" = $3 * where * "id" = $4 * ``` * * If you provide two arguments the first one is interpreted as the column * (or other target) and the second as the value: * * ```ts * const result = await db * .updateTable('person') * .set('first_name', 'Foo') * // As always, both arguments can be arbitrary expressions or * // callbacks that give you access to an expression builder: * .set(sql`address['postalCode']`, (eb) => eb.val('61710)) * .where('id', '=', '1') * .executeTakeFirst() * ``` * * On PostgreSQL you can chain `returning` to the query to get * the updated rows' columns (or any other expression) as the * return value: * * ```ts * const row = await db * .updateTable('person') * .set({ * first_name: 'Jennifer', * last_name: 'Aniston' * }) * .where('id', '=', 1) * .returning('id') * .executeTakeFirstOrThrow() * * row.id * ``` * * The generated SQL (PostgreSQL): * * ```sql * update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3 returning "id" * ``` * * In addition to primitives, the values can arbitrary expressions including * raw `sql` snippets or subqueries: * * ```ts * import { sql } from 'kysely' * * const result = await db * .updateTable('person') * .set(({ selectFrom, ref, fn, eb }) => ({ * first_name: selectFrom('person').select('first_name').limit(1), * middle_name: ref('first_name'), * age: eb('age', '+', 1), * last_name: sql`${'Ani'} || ${'ston'}`, * })) * .where('id', '=', 1) * .executeTakeFirst() * * console.log(result.numUpdatedRows) * ``` * * The generated SQL (PostgreSQL): * * ```sql * update "person" set * "first_name" = (select "first_name" from "person" limit $1), * "middle_name" = "first_name", * "age" = "age" + $2, * "last_name" = $3 || $4 * where "id" = $5 * ``` */ set(update: UpdateObjectExpression): UpdateQueryBuilder; set>(key: RE, value: ValueExpression>): UpdateQueryBuilder; /** * Allows you to return data from modified rows. * * On supported databases like PostgreSQL, this method can be chained to * `insert`, `update` and `delete` queries to return data. * * Note that on SQLite you need to give aliases for the expressions to avoid * [this bug](https://sqlite.org/forum/forumpost/033daf0b32) in SQLite. * For example `.returning('id as id')`. * * Also see the {@link returningAll} method. * * ### Examples * * Return one column: * * ```ts * const { id } = await db * .insertInto('person') * .values({ * first_name: 'Jennifer', * last_name: 'Aniston' * }) * .returning('id') * .executeTakeFirst() * ``` * * Return multiple columns: * * ```ts * const { id, first_name } = await db * .insertInto('person') * .values({ * first_name: 'Jennifer', * last_name: 'Aniston' * }) * .returning(['id', 'last_name']) * .executeTakeFirst() * ``` * * Return arbitrary expressions: * * ```ts * import { sql } from 'kysely' * * const { id, full_name, first_pet_id } = await db * .insertInto('person') * .values({ * first_name: 'Jennifer', * last_name: 'Aniston' * }) * .returning((eb) => [ * 'id as id', * sql`concat(first_name, ' ', last_name)`.as('full_name'), * eb.selectFrom('pets').select('pet.id').limit(1).as('first_pet_id') * ]) * .executeTakeFirst() * ``` */ returning>(selections: ReadonlyArray): UpdateQueryBuilder>; returning>(callback: CB): UpdateQueryBuilder>; returning>(selection: SE): UpdateQueryBuilder>; /** * Adds a `returning *` to an insert/update/delete query on databases * that support `returning` such as PostgreSQL. */ returningAll(): UpdateQueryBuilder>; /** * Clears all `returning` clauses from the query. * * ### Examples * * ```ts * db.updateTable('person') * .returningAll() * .set({ age: 39 }) * .where('first_name', '=', 'John') * .clearReturning() * ``` * * The generated SQL(PostgreSQL): * * ```sql * update "person" set "age" = 39 where "first_name" = "John" * ``` */ clearReturning(): UpdateQueryBuilder; /** * Simply calls the provided function passing `this` as the only argument. `$call` returns * what the provided function returns. * * If you want to conditionally call a method on `this`, see * the {@link $if} method. * * ### Examples * * The next example uses a helper function `log` to log a query: * * ```ts * function log(qb: T): T { * console.log(qb.compile()) * return qb * } * * db.updateTable('person') * .set(values) * .$call(log) * .execute() * ``` */ $call(func: (qb: this) => T): T; /** * Call `func(this)` if `condition` is true. * * This method is especially handy with optional selects. Any `returning` or `returningAll` * method calls add columns as optional fields to the output type when called inside * the `func` callback. This is because we can't know if those selections were actually * made before running the code. * * You can also call any other methods inside the callback. * * ### Examples * * ```ts * async function updatePerson(id: number, updates: UpdateablePerson, returnLastName: boolean) { * return await db * .updateTable('person') * .set(updates) * .where('id', '=', id) * .returning(['id', 'first_name']) * .$if(returnLastName, (qb) => qb.returning('last_name')) * .executeTakeFirstOrThrow() * } * ``` * * Any selections added inside the `if` callback will be added as optional fields to the * output type since we can't know if the selections were actually made before running * the code. In the example above the return type of the `updatePerson` function is: * * ```ts * { * id: number * first_name: string * last_name?: string * } * ``` */ $if(condition: boolean, func: (qb: this) => UpdateQueryBuilder): O2 extends UpdateResult ? UpdateQueryBuilder : O2 extends O & infer E ? UpdateQueryBuilder> : UpdateQueryBuilder>; /** * Change the output type of the query. * * This method call doesn't change the SQL in any way. This methods simply * returns a copy of this `UpdateQueryBuilder` with a new output type. */ $castTo(): UpdateQueryBuilder; /** * Narrows (parts of) the output type of the query. * * Kysely tries to be as type-safe as possible, but in some cases we have to make * compromises for better maintainability and compilation performance. At present, * Kysely doesn't narrow the output type of the query based on {@link set} input * when using {@link where} and/or {@link returning} or {@link returningAll}. * * This utility method is very useful for these situations, as it removes unncessary * runtime assertion/guard code. Its input type is limited to the output type * of the query, so you can't add a column that doesn't exist, or change a column's * type to something that doesn't exist in its union type. * * ### Examples * * Turn this code: * * ```ts * const person = await db.updateTable('person') * .set({ deletedAt: now }) * .where('id', '=', id) * .where('nullable_column', 'is not', null) * .returningAll() * .executeTakeFirstOrThrow() * * if (person.nullable_column) { * functionThatExpectsPersonWithNonNullValue(person) * } * ``` * * Into this: * * ```ts * const person = await db.updateTable('person') * .set({ deletedAt: now }) * .where('id', '=', id) * .where('nullable_column', 'is not', null) * .returningAll() * .$narrowType<{ deletedAt: Date; nullable_column: string }>() * .executeTakeFirstOrThrow() * * functionThatExpectsPersonWithNonNullValue(person) * ``` */ $narrowType(): UpdateQueryBuilder>; /** * Asserts that query's output row type equals the given type `T`. * * This method can be used to simplify excessively complex types to make typescript happy * and much faster. * * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much * for typescript and you get errors like this: * * ``` * error TS2589: Type instantiation is excessively deep and possibly infinite. * ``` * * In these case you can often use this method to help typescript a little bit. When you use this * method to assert the output type of a query, Kysely can drop the complex output type that * consists of multiple nested helper types and replace it with the simple asserted type. * * Using this method doesn't reduce type safety at all. You have to pass in a type that is * structurally equal to the current type. * * ### Examples * * ```ts * const result = await db * .with('updated_person', (qb) => qb * .updateTable('person') * .set(person) * .where('id', '=', person.id) * .returning('first_name') * .$assertType<{ first_name: string }>() * ) * .with('updated_pet', (qb) => qb * .updateTable('pet') * .set(pet) * .where('owner_id', '=', person.id) * .returning(['name as pet_name', 'species']) * .$assertType<{ pet_name: string, species: Species }>() * ) * .selectFrom(['updated_person', 'updated_pet']) * .selectAll() * .executeTakeFirstOrThrow() * ``` */ $assertType(): O extends T ? UpdateQueryBuilder : KyselyTypeError<`$assertType() call failed: The type passed in is not equal to the output type of the query.`>; /** * Returns a copy of this UpdateQueryBuilder instance with the given plugin installed. */ withPlugin(plugin: KyselyPlugin): UpdateQueryBuilder; toOperationNode(): UpdateQueryNode; compile(): CompiledQuery>; /** * Executes the query and returns an array of rows. * * Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods. */ execute(): Promise[]>; /** * Executes the query and returns the first result or undefined if * the query returned no result. */ executeTakeFirst(): Promise>; /** * Executes the query and returns the first result or throws if * the query returned no result. * * By default an instance of {@link NoResultError} is thrown, but you can * provide a custom error class, or callback as the only argument to throw a different * error. */ executeTakeFirstOrThrow(errorConstructor?: NoResultErrorConstructor | ((node: QueryNode) => Error)): Promise>; /** * Executes the query and streams the rows. * * The optional argument `chunkSize` defines how many rows to fetch from the database * at a time. It only affects some dialects like PostgreSQL that support it. * * ### Examples * * ```ts * const stream = db. * .selectFrom('person') * .select(['first_name', 'last_name']) * .where('gender', '=', 'other') * .stream() * * for await (const person of stream) { * console.log(person.first_name) * * if (person.last_name === 'Something') { * // Breaking or returning before the stream has ended will release * // the database connection and invalidate the stream. * break * } * } * ``` */ stream(chunkSize?: number): AsyncIterableIterator; /** * Executes query with `explain` statement before the main query. * * ```ts * const explained = await db * .selectFrom('person') * .where('gender', '=', 'female') * .selectAll() * .explain('json') * ``` * * The generated SQL (MySQL): * * ```sql * explain format=json select * from `person` where `gender` = ? * ``` * * You can also execute `explain analyze` statements. * * ```ts * import { sql } from 'kysely' * * const explained = await db * .selectFrom('person') * .where('gender', '=', 'female') * .selectAll() * .explain('json', sql`analyze`) * ``` * * The generated SQL (PostgreSQL): * * ```sql * explain (analyze, format json) select * from "person" where "gender" = $1 * ``` */ explain = Record>(format?: ExplainFormat, options?: Expression): Promise; } export interface UpdateQueryBuilderProps { readonly queryId: QueryId; readonly queryNode: UpdateQueryNode; readonly executor: QueryExecutor; } export type UpdateQueryBuilderWithInnerJoin> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? InnerJoinedBuilder : never : TE extends keyof DB ? UpdateQueryBuilder : TE extends AliasedExpression ? InnerJoinedBuilder : TE extends (qb: any) => AliasedExpression ? InnerJoinedBuilder : never; type InnerJoinedBuilder = A extends keyof DB ? UpdateQueryBuilder, UT, TB | A, O> : UpdateQueryBuilder, UT, TB | A, O>; type InnerJoinedDB = DrainOuterGeneric<{ [C in keyof DB | A]: C extends A ? R : C extends keyof DB ? DB[C] : never; }>; export type UpdateQueryBuilderWithLeftJoin> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? LeftJoinedBuilder : never : TE extends keyof DB ? LeftJoinedBuilder : TE extends AliasedExpression ? LeftJoinedBuilder : TE extends (qb: any) => AliasedExpression ? LeftJoinedBuilder : never; type LeftJoinedBuilder = A extends keyof DB ? UpdateQueryBuilder, UT, TB | A, O> : UpdateQueryBuilder>, UT, TB | A, O>; type LeftJoinedDB = DrainOuterGeneric<{ [C in keyof DB | A]: C extends A ? Nullable : C extends keyof DB ? DB[C] : never; }>; export type UpdateQueryBuilderWithRightJoin> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? RightJoinedBuilder : never : TE extends keyof DB ? RightJoinedBuilder : TE extends AliasedExpression ? RightJoinedBuilder : TE extends (qb: any) => AliasedExpression ? RightJoinedBuilder : never; type RightJoinedBuilder = UpdateQueryBuilder, UT, TB | A, O>; type RightJoinedDB = DrainOuterGeneric<{ [C in keyof DB | A]: C extends A ? R : C extends TB ? Nullable : C extends keyof DB ? DB[C] : never; }>; export type UpdateQueryBuilderWithFullJoin> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? OuterJoinedBuilder : never : TE extends keyof DB ? OuterJoinedBuilder : TE extends AliasedExpression ? OuterJoinedBuilder : TE extends (qb: any) => AliasedExpression ? OuterJoinedBuilder : never; type OuterJoinedBuilder = UpdateQueryBuilder, UT, TB | A, O>; type OuterJoinedBuilderDB = DrainOuterGeneric<{ [C in keyof DB | A]: C extends A ? Nullable : C extends TB ? Nullable : C extends keyof DB ? DB[C] : never; }>; export {};