kysely 0.11.4 → 0.13.0
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.
- package/README.md +35 -11
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +36 -0
- package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +38 -2
- package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -1
- package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +16 -0
- package/dist/cjs/dialect/mysql/mysql-driver.d.ts +29 -0
- package/dist/cjs/dialect/mysql/mysql-introspector.d.ts +3 -0
- package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +38 -2
- package/dist/cjs/dialect/postgres/postgres-adapter.js +2 -1
- package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +16 -0
- package/dist/cjs/dialect/postgres/postgres-driver.d.ts +29 -0
- package/dist/cjs/dialect/postgres/postgres-introspector.d.ts +3 -0
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +38 -2
- package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +16 -0
- package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +29 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.d.ts +3 -0
- package/dist/cjs/driver/default-connection-provider.d.ts +4 -0
- package/dist/cjs/driver/runtime-driver.d.ts +29 -0
- package/dist/cjs/driver/single-connection-provider.d.ts +4 -0
- package/dist/cjs/dynamic/dynamic-reference-builder.d.ts +1 -0
- package/dist/cjs/dynamic/dynamic-reference-builder.js +9 -1
- package/dist/cjs/dynamic/dynamic.d.ts +6 -7
- package/dist/cjs/dynamic/dynamic.js +6 -7
- package/dist/cjs/index.d.ts +15 -4
- package/dist/cjs/index.js +12 -1
- package/dist/cjs/kysely.d.ts +170 -11
- package/dist/cjs/kysely.js +69 -9
- package/dist/cjs/migration/migration.d.ts +156 -13
- package/dist/cjs/migration/migration.js +256 -135
- package/dist/cjs/operation-node/column-definition-node.d.ts +6 -5
- package/dist/cjs/operation-node/column-definition-node.js +0 -4
- package/dist/cjs/operation-node/common-table-expression-name-node.d.ts +15 -0
- package/dist/cjs/operation-node/common-table-expression-name-node.js +23 -0
- package/dist/cjs/operation-node/common-table-expression-node.d.ts +3 -3
- package/dist/cjs/operation-node/create-table-node.d.ts +6 -2
- package/dist/cjs/operation-node/create-table-node.js +6 -6
- package/dist/cjs/operation-node/create-view-node.d.ts +1 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +4 -4
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +22 -2
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/query-node.d.ts +0 -2
- package/dist/cjs/operation-node/query-node.js +0 -10
- package/dist/cjs/operation-node/values-node.d.ts +15 -0
- package/dist/cjs/operation-node/values-node.js +18 -0
- package/dist/cjs/operation-node/with-node.d.ts +3 -1
- package/dist/cjs/operation-node/with-node.js +2 -1
- package/dist/cjs/package.json +1 -3
- package/dist/cjs/parser/complex-expression-parser.d.ts +9 -0
- package/dist/cjs/parser/complex-expression-parser.js +25 -0
- package/dist/cjs/parser/filter-parser.d.ts +13 -4
- package/dist/cjs/parser/filter-parser.js +21 -24
- package/dist/cjs/parser/insert-values-parser.d.ts +5 -9
- package/dist/cjs/parser/insert-values-parser.js +27 -41
- package/dist/cjs/parser/order-by-parser.d.ts +1 -1
- package/dist/cjs/parser/parse-context.d.ts +22 -8
- package/dist/cjs/parser/parse-context.js +10 -10
- package/dist/cjs/parser/reference-parser.d.ts +8 -7
- package/dist/cjs/parser/reference-parser.js +8 -17
- package/dist/cjs/parser/returning-parser.d.ts +1 -5
- package/dist/cjs/parser/select-parser.d.ts +12 -14
- package/dist/cjs/parser/select-parser.js +5 -9
- package/dist/cjs/parser/table-parser.d.ts +9 -11
- package/dist/cjs/parser/table-parser.js +2 -8
- package/dist/cjs/parser/union-parser.d.ts +2 -2
- package/dist/cjs/parser/union-parser.js +1 -6
- package/dist/cjs/parser/update-set-parser.d.ts +2 -8
- package/dist/cjs/parser/update-set-parser.js +6 -26
- package/dist/cjs/parser/value-parser.d.ts +9 -6
- package/dist/cjs/parser/value-parser.js +7 -30
- package/dist/cjs/parser/with-parser.d.ts +36 -6
- package/dist/cjs/parser/with-parser.js +13 -2
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +36 -2
- package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.d.ts +34 -0
- package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
- package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +34 -0
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +8 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +647 -0
- package/dist/cjs/query-builder/delete-query-builder.js +185 -0
- package/dist/cjs/query-builder/expression-builder.d.ts +8 -6
- package/dist/cjs/query-builder/expression-builder.js +3 -3
- package/dist/cjs/query-builder/function-builder.d.ts +2 -1
- package/dist/cjs/query-builder/function-builder.js +2 -1
- package/dist/cjs/query-builder/having-interface.d.ts +49 -0
- package/dist/cjs/query-builder/having-interface.js +2 -0
- package/dist/cjs/query-builder/insert-query-builder.d.ts +504 -0
- package/dist/cjs/query-builder/insert-query-builder.js +256 -0
- package/dist/cjs/query-builder/insert-result.d.ts +3 -2
- package/dist/cjs/query-builder/insert-result.js +3 -2
- package/dist/cjs/query-builder/join-builder.d.ts +19 -20
- package/dist/cjs/query-builder/join-builder.js +12 -12
- package/dist/cjs/query-builder/join-interface.d.ts +130 -0
- package/dist/cjs/query-builder/join-interface.js +2 -0
- package/dist/cjs/query-builder/no-result-error.d.ts +9 -0
- package/dist/cjs/query-builder/no-result-error.js +14 -0
- package/dist/cjs/query-builder/returning-interface.d.ts +73 -0
- package/dist/cjs/query-builder/returning-interface.js +2 -0
- package/dist/cjs/query-builder/{query-builder.d.ts → select-query-builder.d.ts} +145 -651
- package/dist/cjs/query-builder/select-query-builder.js +571 -0
- package/dist/cjs/query-builder/update-query-builder.d.ts +735 -0
- package/dist/cjs/query-builder/update-query-builder.js +279 -0
- package/dist/cjs/query-builder/where-interface.d.ts +378 -0
- package/dist/cjs/query-builder/where-interface.js +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +37 -6
- package/dist/cjs/query-creator.d.ts +69 -43
- package/dist/cjs/query-creator.js +66 -29
- package/dist/cjs/query-executor/default-query-executor.d.ts +19 -0
- package/dist/cjs/query-executor/noop-query-executor.d.ts +19 -0
- package/dist/cjs/query-executor/query-executor.d.ts +1 -1
- package/dist/cjs/query-executor/query-executor.js +1 -1
- package/dist/cjs/raw-builder/raw-builder.d.ts +2 -0
- package/dist/cjs/raw-builder/raw-builder.js +7 -1
- package/dist/cjs/schema/alter-table-builder.d.ts +230 -2
- package/dist/cjs/schema/alter-table-builder.js +12 -0
- package/dist/cjs/schema/column-definition-builder.d.ts +147 -20
- package/dist/cjs/schema/column-definition-builder.js +4 -1
- package/dist/cjs/schema/create-index-builder.d.ts +2 -1
- package/dist/cjs/schema/create-index-builder.js +2 -1
- package/dist/cjs/schema/create-table-builder.d.ts +26 -9
- package/dist/cjs/schema/create-table-builder.js +42 -9
- package/dist/cjs/schema/create-view-builder.d.ts +17 -3
- package/dist/cjs/schema/create-view-builder.js +25 -16
- package/dist/cjs/schema/schema.d.ts +18 -11
- package/dist/cjs/schema/schema.js +18 -11
- package/dist/cjs/util/log.d.ts +3 -2
- package/dist/cjs/util/log.js +8 -15
- package/dist/cjs/util/type-utils.d.ts +7 -7
- package/dist/esm/dialect/dialect-adapter-base.d.ts +36 -0
- package/dist/esm/dialect/mysql/mysql-adapter.d.ts +38 -2
- package/dist/esm/dialect/mysql/mysql-adapter.js +2 -1
- package/dist/esm/dialect/mysql/mysql-dialect.d.ts +16 -0
- package/dist/esm/dialect/mysql/mysql-driver.d.ts +29 -0
- package/dist/esm/dialect/mysql/mysql-introspector.d.ts +3 -0
- package/dist/esm/dialect/postgres/postgres-adapter.d.ts +38 -2
- package/dist/esm/dialect/postgres/postgres-adapter.js +2 -1
- package/dist/esm/dialect/postgres/postgres-dialect.d.ts +16 -0
- package/dist/esm/dialect/postgres/postgres-driver.d.ts +29 -0
- package/dist/esm/dialect/postgres/postgres-introspector.d.ts +3 -0
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +38 -2
- package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +16 -0
- package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +29 -0
- package/dist/esm/dialect/sqlite/sqlite-introspector.d.ts +3 -0
- package/dist/esm/driver/default-connection-provider.d.ts +4 -0
- package/dist/esm/driver/runtime-driver.d.ts +29 -0
- package/dist/esm/driver/single-connection-provider.d.ts +4 -0
- package/dist/esm/dynamic/dynamic-reference-builder.d.ts +1 -0
- package/dist/esm/dynamic/dynamic-reference-builder.js +7 -0
- package/dist/esm/dynamic/dynamic.d.ts +6 -7
- package/dist/esm/dynamic/dynamic.js +6 -7
- package/dist/esm/index.d.ts +15 -4
- package/dist/esm/index.js +12 -1
- package/dist/esm/kysely.d.ts +170 -11
- package/dist/esm/kysely.js +69 -9
- package/dist/esm/migration/migration.d.ts +156 -13
- package/dist/esm/migration/migration.js +255 -134
- package/dist/esm/operation-node/column-definition-node.d.ts +6 -5
- package/dist/esm/operation-node/column-definition-node.js +0 -4
- package/dist/esm/operation-node/common-table-expression-name-node.d.ts +15 -0
- package/dist/esm/operation-node/common-table-expression-name-node.js +20 -0
- package/dist/esm/operation-node/common-table-expression-node.d.ts +3 -3
- package/dist/esm/operation-node/create-table-node.d.ts +6 -2
- package/dist/esm/operation-node/create-table-node.js +6 -6
- package/dist/esm/operation-node/create-view-node.d.ts +1 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +4 -4
- package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-transformer.js +22 -2
- package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-visitor.js +2 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/query-node.d.ts +0 -2
- package/dist/esm/operation-node/query-node.js +0 -10
- package/dist/esm/operation-node/values-node.d.ts +15 -0
- package/dist/esm/operation-node/values-node.js +15 -0
- package/dist/esm/operation-node/with-node.d.ts +3 -1
- package/dist/esm/operation-node/with-node.js +2 -1
- package/dist/esm/package.json +1 -3
- package/dist/esm/parser/complex-expression-parser.d.ts +9 -0
- package/dist/esm/parser/complex-expression-parser.js +20 -0
- package/dist/esm/parser/filter-parser.d.ts +13 -4
- package/dist/esm/parser/filter-parser.js +21 -24
- package/dist/esm/parser/insert-values-parser.d.ts +5 -9
- package/dist/esm/parser/insert-values-parser.js +27 -40
- package/dist/esm/parser/order-by-parser.d.ts +1 -1
- package/dist/esm/parser/parse-context.d.ts +22 -8
- package/dist/esm/parser/parse-context.js +10 -10
- package/dist/esm/parser/reference-parser.d.ts +8 -7
- package/dist/esm/parser/reference-parser.js +9 -18
- package/dist/esm/parser/returning-parser.d.ts +1 -5
- package/dist/esm/parser/select-parser.d.ts +12 -14
- package/dist/esm/parser/select-parser.js +6 -10
- package/dist/esm/parser/table-parser.d.ts +9 -11
- package/dist/esm/parser/table-parser.js +3 -9
- package/dist/esm/parser/union-parser.d.ts +2 -2
- package/dist/esm/parser/union-parser.js +1 -6
- package/dist/esm/parser/update-set-parser.d.ts +2 -8
- package/dist/esm/parser/update-set-parser.js +5 -24
- package/dist/esm/parser/value-parser.d.ts +9 -6
- package/dist/esm/parser/value-parser.js +8 -31
- package/dist/esm/parser/with-parser.d.ts +36 -6
- package/dist/esm/parser/with-parser.js +13 -2
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +36 -2
- package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.d.ts +34 -0
- package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
- package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +34 -0
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +8 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +647 -0
- package/dist/esm/query-builder/delete-query-builder.js +181 -0
- package/dist/esm/query-builder/expression-builder.d.ts +8 -6
- package/dist/esm/query-builder/expression-builder.js +3 -3
- package/dist/esm/query-builder/function-builder.d.ts +2 -1
- package/dist/esm/query-builder/function-builder.js +2 -1
- package/dist/esm/query-builder/having-interface.d.ts +49 -0
- package/dist/esm/query-builder/having-interface.js +1 -0
- package/dist/esm/query-builder/insert-query-builder.d.ts +504 -0
- package/dist/esm/query-builder/insert-query-builder.js +252 -0
- package/dist/esm/query-builder/insert-result.d.ts +3 -2
- package/dist/esm/query-builder/insert-result.js +3 -2
- package/dist/esm/query-builder/join-builder.d.ts +19 -20
- package/dist/esm/query-builder/join-builder.js +12 -12
- package/dist/esm/query-builder/join-interface.d.ts +130 -0
- package/dist/esm/query-builder/join-interface.js +1 -0
- package/dist/esm/query-builder/no-result-error.d.ts +9 -0
- package/dist/esm/query-builder/no-result-error.js +10 -0
- package/dist/esm/query-builder/returning-interface.d.ts +73 -0
- package/dist/esm/query-builder/returning-interface.js +1 -0
- package/dist/esm/query-builder/{query-builder.d.ts → select-query-builder.d.ts} +145 -651
- package/dist/esm/query-builder/select-query-builder.js +566 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +735 -0
- package/dist/esm/query-builder/update-query-builder.js +275 -0
- package/dist/esm/query-builder/where-interface.d.ts +378 -0
- package/dist/esm/query-builder/where-interface.js +1 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/esm/query-compiler/default-query-compiler.js +37 -6
- package/dist/esm/query-creator.d.ts +69 -43
- package/dist/esm/query-creator.js +66 -29
- package/dist/esm/query-executor/default-query-executor.d.ts +19 -0
- package/dist/esm/query-executor/noop-query-executor.d.ts +19 -0
- package/dist/esm/query-executor/query-executor.d.ts +1 -1
- package/dist/esm/query-executor/query-executor.js +1 -1
- package/dist/esm/raw-builder/raw-builder.d.ts +2 -0
- package/dist/esm/raw-builder/raw-builder.js +7 -1
- package/dist/esm/schema/alter-table-builder.d.ts +230 -2
- package/dist/esm/schema/alter-table-builder.js +12 -0
- package/dist/esm/schema/column-definition-builder.d.ts +147 -20
- package/dist/esm/schema/column-definition-builder.js +4 -1
- package/dist/esm/schema/create-index-builder.d.ts +2 -1
- package/dist/esm/schema/create-index-builder.js +2 -1
- package/dist/esm/schema/create-table-builder.d.ts +26 -9
- package/dist/esm/schema/create-table-builder.js +43 -10
- package/dist/esm/schema/create-view-builder.d.ts +17 -3
- package/dist/esm/schema/create-view-builder.js +25 -16
- package/dist/esm/schema/schema.d.ts +18 -11
- package/dist/esm/schema/schema.js +18 -11
- package/dist/esm/util/log.d.ts +3 -2
- package/dist/esm/util/log.js +7 -14
- package/dist/esm/util/type-utils.d.ts +7 -7
- package/package.json +10 -8
- package/dist/cjs/query-builder/query-builder.js +0 -1067
- package/dist/esm/query-builder/query-builder.js +0 -1061
|
@@ -1,1061 +0,0 @@
|
|
|
1
|
-
import { AliasNode } from '../operation-node/alias-node.js';
|
|
2
|
-
import { parseJoin, } from '../parser/join-parser.js';
|
|
3
|
-
import { parseSelectExpressionOrList, parseSelectAll, } from '../parser/select-parser.js';
|
|
4
|
-
import { parseExistFilter, parseReferenceFilter, parseWhereFilter, parseHavingFilter, parseNotExistFilter, } from '../parser/filter-parser.js';
|
|
5
|
-
import { parseInsertObjectOrList, } from '../parser/insert-values-parser.js';
|
|
6
|
-
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
7
|
-
import { InsertQueryNode } from '../operation-node/insert-query-node.js';
|
|
8
|
-
import { QueryNode, } from '../operation-node/query-node.js';
|
|
9
|
-
import { parseOrderBy, } from '../parser/order-by-parser.js';
|
|
10
|
-
import { UpdateQueryNode } from '../operation-node/update-query-node.js';
|
|
11
|
-
import { parseUpdateObject, } from '../parser/update-set-parser.js';
|
|
12
|
-
import { preventAwait } from '../util/prevent-await.js';
|
|
13
|
-
import { LimitNode } from '../operation-node/limit-node.js';
|
|
14
|
-
import { OffsetNode } from '../operation-node/offset-node.js';
|
|
15
|
-
import { parseOnConflictDoNothing, parseOnConflictUpdate, } from '../parser/on-conflict-parser.js';
|
|
16
|
-
import { freeze } from '../util/object-utils.js';
|
|
17
|
-
import { DeleteQueryNode } from '../operation-node/delete-query-node.js';
|
|
18
|
-
import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
|
|
19
|
-
import { parseGroupBy } from '../parser/group-by-parser.js';
|
|
20
|
-
import { parseUnion } from '../parser/union-parser.js';
|
|
21
|
-
import { InsertResult } from './insert-result.js';
|
|
22
|
-
import { UpdateResult } from './update-result.js';
|
|
23
|
-
import { DeleteResult } from './delete-result.js';
|
|
24
|
-
/**
|
|
25
|
-
* The main query builder class.
|
|
26
|
-
*
|
|
27
|
-
* @typeParam DB - A type whose keys are table names/aliases and values are interfaces that
|
|
28
|
-
* define the table's columns and their types. This type defines the tables, subqueries
|
|
29
|
-
* etc. that are available to the query. This type contains all tables, even the ones
|
|
30
|
-
* that have not actually been joined to the query. the `TB` parameter defines the
|
|
31
|
-
* table names/aliases that have been joined to the query.
|
|
32
|
-
*
|
|
33
|
-
* @typeParam TB - The names/aliases of the tables that have been joined to the query
|
|
34
|
-
* using `from`, `with` any join method and so on. This type is a union of `DB`
|
|
35
|
-
* type's keys. For example `'person' | 'pet'`.
|
|
36
|
-
*
|
|
37
|
-
* @typePAram O - The query output row type.
|
|
38
|
-
*/
|
|
39
|
-
export class QueryBuilder {
|
|
40
|
-
#props;
|
|
41
|
-
constructor(props) {
|
|
42
|
-
this.#props = freeze(props);
|
|
43
|
-
}
|
|
44
|
-
where(...args) {
|
|
45
|
-
assertCanHaveWhereClause(this.#props.queryNode);
|
|
46
|
-
return new QueryBuilder({
|
|
47
|
-
...this.#props,
|
|
48
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Adds a `where` clause where both sides of the operator are references
|
|
53
|
-
* to columns.
|
|
54
|
-
*
|
|
55
|
-
* The normal `where` method treats the right hand side argument as a
|
|
56
|
-
* value by default. `whereRef` treats it as a column reference. This method is
|
|
57
|
-
* expecially useful with joins and correclated subqueries.
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* Usage with a join:
|
|
61
|
-
*
|
|
62
|
-
* ```ts
|
|
63
|
-
* db.selectFrom(['person', 'pet'])
|
|
64
|
-
* .selectAll()
|
|
65
|
-
* .whereRef('person.first_name', '=', 'pet.name')
|
|
66
|
-
* ```
|
|
67
|
-
*
|
|
68
|
-
* The generated SQL (PostgreSQL):
|
|
69
|
-
*
|
|
70
|
-
* ```sql
|
|
71
|
-
* select * from "person", "pet" where "person"."first_name" = "pet"."name"
|
|
72
|
-
* ```
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* Usage in a subquery:
|
|
76
|
-
*
|
|
77
|
-
* ```ts
|
|
78
|
-
* const persons = await db
|
|
79
|
-
* .selectFrom('person')
|
|
80
|
-
* .selectAll('person')
|
|
81
|
-
* .select((qb) => qb
|
|
82
|
-
* .subQuery('pet')
|
|
83
|
-
* .select('name')
|
|
84
|
-
* .whereRef('pet.owner_id', '=', 'person.id')
|
|
85
|
-
* .limit(1)
|
|
86
|
-
* .as('pet_name')
|
|
87
|
-
* )
|
|
88
|
-
* .execute()
|
|
89
|
-
* ```
|
|
90
|
-
*
|
|
91
|
-
* The generated SQL (PostgreSQL):
|
|
92
|
-
*
|
|
93
|
-
* ```sql
|
|
94
|
-
* select "person".*, (
|
|
95
|
-
* select "name"
|
|
96
|
-
* from "pet"
|
|
97
|
-
* where "pet"."owner_id" = "person"."id"
|
|
98
|
-
* limit $1
|
|
99
|
-
* ) as "pet_name"
|
|
100
|
-
* from "person"
|
|
101
|
-
*/
|
|
102
|
-
whereRef(lhs, op, rhs) {
|
|
103
|
-
assertCanHaveWhereClause(this.#props.queryNode);
|
|
104
|
-
return new QueryBuilder({
|
|
105
|
-
...this.#props,
|
|
106
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
orWhere(...args) {
|
|
110
|
-
assertCanHaveWhereClause(this.#props.queryNode);
|
|
111
|
-
return new QueryBuilder({
|
|
112
|
-
...this.#props,
|
|
113
|
-
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Adds an `or where` clause to the query. Otherwise works just like
|
|
118
|
-
* {@link QueryBuilder.whereRef | whereRef}.
|
|
119
|
-
*
|
|
120
|
-
* Also see {@link QueryBuilder.orWhere | orWhere} and {@link QueryBuilder.where | where}.
|
|
121
|
-
*/
|
|
122
|
-
orWhereRef(lhs, op, rhs) {
|
|
123
|
-
assertCanHaveWhereClause(this.#props.queryNode);
|
|
124
|
-
return new QueryBuilder({
|
|
125
|
-
...this.#props,
|
|
126
|
-
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Adds a `where exists` clause to the query.
|
|
131
|
-
*
|
|
132
|
-
* You can either use a subquery or a raw instance.
|
|
133
|
-
*
|
|
134
|
-
* @example
|
|
135
|
-
* The query below selets all persons that own a pet named Catto:
|
|
136
|
-
*
|
|
137
|
-
* ```ts
|
|
138
|
-
* const persons = await db
|
|
139
|
-
* .selectFrom('person')
|
|
140
|
-
* .selectAll()
|
|
141
|
-
* .whereExists((qb) => qb
|
|
142
|
-
* .subQuery('pet')
|
|
143
|
-
* .select('pet.id')
|
|
144
|
-
* .whereRef('person.id', '=', 'pet.owner_id')
|
|
145
|
-
* .where('pet.name', '=', 'Catto')
|
|
146
|
-
* )
|
|
147
|
-
* .execute()
|
|
148
|
-
* ```
|
|
149
|
-
*
|
|
150
|
-
* The generated SQL (PostgreSQL):
|
|
151
|
-
*
|
|
152
|
-
* ```sql
|
|
153
|
-
* select * from "person"
|
|
154
|
-
* where exists (
|
|
155
|
-
* select "pet"."id"
|
|
156
|
-
* from "pet"
|
|
157
|
-
* where "person"."id" = "pet"."owner_id"
|
|
158
|
-
* and "pet"."name" = $1
|
|
159
|
-
* )
|
|
160
|
-
* ```
|
|
161
|
-
*
|
|
162
|
-
* @example
|
|
163
|
-
* The same query as in the previous example but with using raw:
|
|
164
|
-
*
|
|
165
|
-
* ```ts
|
|
166
|
-
* db.selectFrom('person')
|
|
167
|
-
* .selectAll()
|
|
168
|
-
* .whereExists(
|
|
169
|
-
* db.raw(
|
|
170
|
-
* '(select pet.id from pet where person.id = pet.owner_id and pet.name = ?)',
|
|
171
|
-
* ['Catto']
|
|
172
|
-
* )
|
|
173
|
-
* )
|
|
174
|
-
* ```
|
|
175
|
-
*
|
|
176
|
-
* The generated SQL (PostgreSQL):
|
|
177
|
-
*
|
|
178
|
-
* ```sql
|
|
179
|
-
* select * from "person"
|
|
180
|
-
* where exists (
|
|
181
|
-
* select pet.id
|
|
182
|
-
* from pet
|
|
183
|
-
* where person.id = pet.owner_id
|
|
184
|
-
* and pet.name = $1
|
|
185
|
-
* )
|
|
186
|
-
* ```
|
|
187
|
-
*/
|
|
188
|
-
whereExists(arg) {
|
|
189
|
-
assertCanHaveWhereClause(this.#props.queryNode);
|
|
190
|
-
return new QueryBuilder({
|
|
191
|
-
...this.#props,
|
|
192
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Just like {@link QueryBuilder.whereExists | whereExists} but creates a `not exists` clause.
|
|
197
|
-
*/
|
|
198
|
-
whereNotExists(arg) {
|
|
199
|
-
assertCanHaveWhereClause(this.#props.queryNode);
|
|
200
|
-
return new QueryBuilder({
|
|
201
|
-
...this.#props,
|
|
202
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Just like {@link QueryBuilder.whereExists | whereExists} but creates a `or exists` clause.
|
|
207
|
-
*/
|
|
208
|
-
orWhereExists(arg) {
|
|
209
|
-
assertCanHaveWhereClause(this.#props.queryNode);
|
|
210
|
-
return new QueryBuilder({
|
|
211
|
-
...this.#props,
|
|
212
|
-
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Just like {@link QueryBuilder.whereExists | whereExists} but creates a `or not exists` clause.
|
|
217
|
-
*/
|
|
218
|
-
orWhereNotExists(arg) {
|
|
219
|
-
assertCanHaveWhereClause(this.#props.queryNode);
|
|
220
|
-
return new QueryBuilder({
|
|
221
|
-
...this.#props,
|
|
222
|
-
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
having(...args) {
|
|
226
|
-
assertCanHaveHavingClause(this.#props.queryNode);
|
|
227
|
-
return new QueryBuilder({
|
|
228
|
-
...this.#props,
|
|
229
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Just like {@link QueryBuilder.whereRef | whereRef} but adds a `having` statement
|
|
234
|
-
* instead of a `where` statement.
|
|
235
|
-
*/
|
|
236
|
-
havingRef(lhs, op, rhs) {
|
|
237
|
-
assertCanHaveHavingClause(this.#props.queryNode);
|
|
238
|
-
return new QueryBuilder({
|
|
239
|
-
...this.#props,
|
|
240
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
orHaving(...args) {
|
|
244
|
-
assertCanHaveHavingClause(this.#props.queryNode);
|
|
245
|
-
return new QueryBuilder({
|
|
246
|
-
...this.#props,
|
|
247
|
-
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Just like {@link QueryBuilder.orWhereRef | orWhereRef} but adds a `having` statement
|
|
252
|
-
* instead of a `where` statement.
|
|
253
|
-
*/
|
|
254
|
-
orHavingRef(lhs, op, rhs) {
|
|
255
|
-
assertCanHaveHavingClause(this.#props.queryNode);
|
|
256
|
-
return new QueryBuilder({
|
|
257
|
-
...this.#props,
|
|
258
|
-
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Just like {@link QueryBuilder.whereExists | whereExists} but adds a `having` statement
|
|
263
|
-
* instead of a `where` statement.
|
|
264
|
-
*/
|
|
265
|
-
havingExists(arg) {
|
|
266
|
-
assertCanHaveHavingClause(this.#props.queryNode);
|
|
267
|
-
return new QueryBuilder({
|
|
268
|
-
...this.#props,
|
|
269
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Just like {@link QueryBuilder.whereNotExists | whereNotExists} but adds a `having` statement
|
|
274
|
-
* instead of a `where` statement.
|
|
275
|
-
*/
|
|
276
|
-
havingNotExist(arg) {
|
|
277
|
-
assertCanHaveHavingClause(this.#props.queryNode);
|
|
278
|
-
return new QueryBuilder({
|
|
279
|
-
...this.#props,
|
|
280
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Just like {@link QueryBuilder.orWhereExists | orWhereExists} but adds a `having` statement
|
|
285
|
-
* instead of a `where` statement.
|
|
286
|
-
*/
|
|
287
|
-
orHavingExists(arg) {
|
|
288
|
-
assertCanHaveHavingClause(this.#props.queryNode);
|
|
289
|
-
return new QueryBuilder({
|
|
290
|
-
...this.#props,
|
|
291
|
-
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Just like {@link QueryBuilder.orWhereNotExists | orWhereNotExists} but adds a `having` statement
|
|
296
|
-
* instead of a `where` statement.
|
|
297
|
-
*/
|
|
298
|
-
orHavingNotExists(arg) {
|
|
299
|
-
assertCanHaveHavingClause(this.#props.queryNode);
|
|
300
|
-
return new QueryBuilder({
|
|
301
|
-
...this.#props,
|
|
302
|
-
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
select(selection) {
|
|
306
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
307
|
-
return new QueryBuilder({
|
|
308
|
-
...this.#props,
|
|
309
|
-
queryNode: SelectQueryNode.cloneWithSelections(this.#props.queryNode, parseSelectExpressionOrList(this.#props.parseContext, selection)),
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
distinctOn(selection) {
|
|
313
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
314
|
-
return new QueryBuilder({
|
|
315
|
-
...this.#props,
|
|
316
|
-
queryNode: SelectQueryNode.cloneWithDistinctOnSelections(this.#props.queryNode, parseSelectExpressionOrList(this.#props.parseContext, selection)),
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Makes the selection distinct.
|
|
321
|
-
*
|
|
322
|
-
* @example
|
|
323
|
-
* ```ts
|
|
324
|
-
* await db.selectFrom('person')
|
|
325
|
-
* .select('first_name')
|
|
326
|
-
* .distinct()
|
|
327
|
-
* .execute()
|
|
328
|
-
* ```
|
|
329
|
-
*
|
|
330
|
-
* The generated SQL (PostgreSQL):
|
|
331
|
-
*
|
|
332
|
-
* ```sql
|
|
333
|
-
* select distinct "first_name" from "person"
|
|
334
|
-
* ```
|
|
335
|
-
*/
|
|
336
|
-
distinct() {
|
|
337
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
338
|
-
return new QueryBuilder({
|
|
339
|
-
...this.#props,
|
|
340
|
-
queryNode: SelectQueryNode.cloneWithDistinct(this.#props.queryNode),
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Adds the `for update` option to a select query on supported databases.
|
|
345
|
-
*/
|
|
346
|
-
forUpdate() {
|
|
347
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
348
|
-
return new QueryBuilder({
|
|
349
|
-
...this.#props,
|
|
350
|
-
queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForUpdate'),
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Adds the `for share` option to a select query on supported databases.
|
|
355
|
-
*/
|
|
356
|
-
forShare() {
|
|
357
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
358
|
-
return new QueryBuilder({
|
|
359
|
-
...this.#props,
|
|
360
|
-
queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForShare'),
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Adds the `for key share` option to a select query on supported databases.
|
|
365
|
-
*/
|
|
366
|
-
forKeyShare() {
|
|
367
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
368
|
-
return new QueryBuilder({
|
|
369
|
-
...this.#props,
|
|
370
|
-
queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForKeyShare'),
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* Adds the `for no key update` option to a select query on supported databases.
|
|
375
|
-
*/
|
|
376
|
-
forNoKeyUpdate() {
|
|
377
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
378
|
-
return new QueryBuilder({
|
|
379
|
-
...this.#props,
|
|
380
|
-
queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForNoKeyUpdate'),
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Adds the `skip locked` option to a select query on supported databases.
|
|
385
|
-
*/
|
|
386
|
-
skipLocked() {
|
|
387
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
388
|
-
return new QueryBuilder({
|
|
389
|
-
...this.#props,
|
|
390
|
-
queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'SkipLocked'),
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Adds the `nowait` option to a select query on supported databases.
|
|
395
|
-
*/
|
|
396
|
-
noWait() {
|
|
397
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
398
|
-
return new QueryBuilder({
|
|
399
|
-
...this.#props,
|
|
400
|
-
queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'NoWait'),
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
selectAll(table) {
|
|
404
|
-
assertCanHaveSelectClause(this.#props.queryNode);
|
|
405
|
-
return new QueryBuilder({
|
|
406
|
-
...this.#props,
|
|
407
|
-
queryNode: SelectQueryNode.cloneWithSelections(this.#props.queryNode, parseSelectAll(table)),
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
innerJoin(...args) {
|
|
411
|
-
assertCanHaveJoins(this.#props.queryNode);
|
|
412
|
-
return new QueryBuilder({
|
|
413
|
-
...this.#props,
|
|
414
|
-
queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin(this.#props.parseContext, 'InnerJoin', args)),
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
|
-
leftJoin(...args) {
|
|
418
|
-
assertCanHaveJoins(this.#props.queryNode);
|
|
419
|
-
return new QueryBuilder({
|
|
420
|
-
...this.#props,
|
|
421
|
-
queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin(this.#props.parseContext, 'LeftJoin', args)),
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
rightJoin(...args) {
|
|
425
|
-
assertCanHaveJoins(this.#props.queryNode);
|
|
426
|
-
return new QueryBuilder({
|
|
427
|
-
...this.#props,
|
|
428
|
-
queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin(this.#props.parseContext, 'RightJoin', args)),
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
fullJoin(...args) {
|
|
432
|
-
assertCanHaveJoins(this.#props.queryNode);
|
|
433
|
-
return new QueryBuilder({
|
|
434
|
-
...this.#props,
|
|
435
|
-
queryNode: QueryNode.cloneWithJoin(this.#props.queryNode, parseJoin(this.#props.parseContext, 'FullJoin', args)),
|
|
436
|
-
});
|
|
437
|
-
}
|
|
438
|
-
values(args) {
|
|
439
|
-
assertCanHaveInsertValues(this.#props.queryNode);
|
|
440
|
-
const [columns, values] = parseInsertObjectOrList(this.#props.parseContext, args);
|
|
441
|
-
return new QueryBuilder({
|
|
442
|
-
...this.#props,
|
|
443
|
-
queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
|
|
444
|
-
columns,
|
|
445
|
-
values,
|
|
446
|
-
}),
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
onConflictDoNothing(target) {
|
|
450
|
-
assertCanHaveOnConflict(this.#props.queryNode);
|
|
451
|
-
return new QueryBuilder({
|
|
452
|
-
...this.#props,
|
|
453
|
-
queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
|
|
454
|
-
onConflict: parseOnConflictDoNothing(target),
|
|
455
|
-
}),
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
/**
|
|
459
|
-
* Changes an `insert into` query to an `insert ignore into` query.
|
|
460
|
-
*
|
|
461
|
-
* If you use the ignore modifier, ignorable errors that occur while executing the
|
|
462
|
-
* insert statement are ignored. For example, without ignore, a row that duplicates
|
|
463
|
-
* an existing unique index or primary key value in the table causes a duplicate-key
|
|
464
|
-
* error and the statement is aborted. With ignore, the row is discarded and no error
|
|
465
|
-
* occurs.
|
|
466
|
-
*
|
|
467
|
-
* This is only supported on some dialects like MySQL. On most dialects you should
|
|
468
|
-
* use the {@link onConflictDoNothing} method.
|
|
469
|
-
*
|
|
470
|
-
* @example
|
|
471
|
-
* ```ts
|
|
472
|
-
* await db.insertInto('person')
|
|
473
|
-
* .ignore()
|
|
474
|
-
* .values(values)
|
|
475
|
-
* .execute()
|
|
476
|
-
* ```
|
|
477
|
-
*/
|
|
478
|
-
ignore() {
|
|
479
|
-
assertCanHaveInsertIgnore(this.#props.queryNode);
|
|
480
|
-
return new QueryBuilder({
|
|
481
|
-
...this.#props,
|
|
482
|
-
queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
|
|
483
|
-
ignore: true,
|
|
484
|
-
}),
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
onConflictUpdate(target, updates) {
|
|
488
|
-
assertCanHaveOnConflict(this.#props.queryNode);
|
|
489
|
-
return new QueryBuilder({
|
|
490
|
-
...this.#props,
|
|
491
|
-
queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
|
|
492
|
-
onConflict: parseOnConflictUpdate(this.#props.parseContext, target, updates),
|
|
493
|
-
}),
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
-
/**
|
|
497
|
-
* Adds `on duplicate key update` to an insert query.
|
|
498
|
-
*
|
|
499
|
-
* If you specify `on duplicate key update`, and a row is inserted that would cause
|
|
500
|
-
* a duplicate value in a unique index or primary key, an update of the old row occurs.
|
|
501
|
-
*
|
|
502
|
-
* This is only implemented by some dialects like MySQL. On most dialects you should
|
|
503
|
-
* use {@link onConflictUpdate} instead.
|
|
504
|
-
*
|
|
505
|
-
* @example
|
|
506
|
-
* ```ts
|
|
507
|
-
* await db
|
|
508
|
-
* .insertInto('person')
|
|
509
|
-
* .values(values)
|
|
510
|
-
* .onDuplicateKeyUpdate({ species: 'hamster' })
|
|
511
|
-
* ```
|
|
512
|
-
*/
|
|
513
|
-
onDuplicateKeyUpdate(updates) {
|
|
514
|
-
assertCanHaveOnDuplicateKey(this.#props.queryNode);
|
|
515
|
-
return new QueryBuilder({
|
|
516
|
-
...this.#props,
|
|
517
|
-
queryNode: InsertQueryNode.cloneWith(this.#props.queryNode, {
|
|
518
|
-
onDuplicateKey: OnDuplicateKeyNode.create(parseUpdateObject(this.#props.parseContext, updates)),
|
|
519
|
-
}),
|
|
520
|
-
});
|
|
521
|
-
}
|
|
522
|
-
/**
|
|
523
|
-
* Sets the values to update for an {@link Kysely.updateTable | update} query.
|
|
524
|
-
*
|
|
525
|
-
* This method takes an object whose keys are column names and values are
|
|
526
|
-
* values to update. In addition to the column's type, the values can be `raw`
|
|
527
|
-
* instances or select queries.
|
|
528
|
-
*
|
|
529
|
-
* The return value of an update query is an instance of {@link UpdateResult}.
|
|
530
|
-
* You can use the {@link QueryBuilder.returning | returning} method on
|
|
531
|
-
* supported databases to get out the updated rows.
|
|
532
|
-
*
|
|
533
|
-
* @example
|
|
534
|
-
* Update a row in `person` table:
|
|
535
|
-
*
|
|
536
|
-
* ```ts
|
|
537
|
-
* const result = await db
|
|
538
|
-
* .updateTable('person')
|
|
539
|
-
* .set({
|
|
540
|
-
* first_name: 'Jennifer',
|
|
541
|
-
* last_name: 'Aniston'
|
|
542
|
-
* })
|
|
543
|
-
* .where('id', '=', 1)
|
|
544
|
-
* .executeTakeFirst()
|
|
545
|
-
*
|
|
546
|
-
* console.log(result.numUpdatedRows)
|
|
547
|
-
* ```
|
|
548
|
-
*
|
|
549
|
-
* The generated SQL (PostgreSQL):
|
|
550
|
-
*
|
|
551
|
-
* ```sql
|
|
552
|
-
* update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3
|
|
553
|
-
* ```
|
|
554
|
-
*
|
|
555
|
-
* @example
|
|
556
|
-
* On postgresql you ca chain `returning` to the query to get
|
|
557
|
-
* the updated rows' columns (or any other expression) as the
|
|
558
|
-
* return value:
|
|
559
|
-
*
|
|
560
|
-
* ```ts
|
|
561
|
-
* const row = await db
|
|
562
|
-
* .updateTable('person')
|
|
563
|
-
* .set({
|
|
564
|
-
* first_name: 'Jennifer',
|
|
565
|
-
* last_name: 'Aniston'
|
|
566
|
-
* })
|
|
567
|
-
* .where('id', '=', 1)
|
|
568
|
-
* .returning('id')
|
|
569
|
-
* .executeTakeFirstOrThrow()
|
|
570
|
-
*
|
|
571
|
-
* row.id
|
|
572
|
-
* ```
|
|
573
|
-
*
|
|
574
|
-
* The generated SQL (PostgreSQL):
|
|
575
|
-
*
|
|
576
|
-
* ```sql
|
|
577
|
-
* update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3 returning "id"
|
|
578
|
-
* ```
|
|
579
|
-
*
|
|
580
|
-
* @example
|
|
581
|
-
* In addition to primitives, the values can also be `raw` expressions or
|
|
582
|
-
* select queries:
|
|
583
|
-
*
|
|
584
|
-
* ```ts
|
|
585
|
-
* const result = await db
|
|
586
|
-
* .updateTable('person')
|
|
587
|
-
* .set({
|
|
588
|
-
* first_name: 'Jennifer',
|
|
589
|
-
* last_name: db.raw('? || ?', ['Ani', 'ston']),
|
|
590
|
-
* age: db.selectFrom('person').select(raw('avg(age)')),
|
|
591
|
-
* })
|
|
592
|
-
* .where('id', '=', 1)
|
|
593
|
-
* .executeTakeFirst()
|
|
594
|
-
*
|
|
595
|
-
* console.log(result.numUpdatedRows)
|
|
596
|
-
* ```
|
|
597
|
-
*
|
|
598
|
-
* The generated SQL (PostgreSQL):
|
|
599
|
-
*
|
|
600
|
-
* ```sql
|
|
601
|
-
* update "person" set
|
|
602
|
-
* "first_name" = $1,
|
|
603
|
-
* "last_name" = $2 || $3,
|
|
604
|
-
* "age" = (select avg(age) from "person")
|
|
605
|
-
* where "id" = $4
|
|
606
|
-
* ```
|
|
607
|
-
*/
|
|
608
|
-
set(row) {
|
|
609
|
-
assertCanHaveUpdates(this.#props.queryNode);
|
|
610
|
-
return new QueryBuilder({
|
|
611
|
-
...this.#props,
|
|
612
|
-
queryNode: UpdateQueryNode.cloneWithUpdates(this.#props.queryNode, parseUpdateObject(this.#props.parseContext, row)),
|
|
613
|
-
});
|
|
614
|
-
}
|
|
615
|
-
returning(selection) {
|
|
616
|
-
assertCanHaveReturningClause(this.#props.queryNode);
|
|
617
|
-
return new QueryBuilder({
|
|
618
|
-
...this.#props,
|
|
619
|
-
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectExpressionOrList(this.#props.parseContext, selection)),
|
|
620
|
-
});
|
|
621
|
-
}
|
|
622
|
-
/**
|
|
623
|
-
* Adds a `returning *` to an insert/update/delete query on databases
|
|
624
|
-
* that support `returning` such as PostgreSQL.
|
|
625
|
-
*/
|
|
626
|
-
returningAll() {
|
|
627
|
-
assertCanHaveReturningClause(this.#props.queryNode);
|
|
628
|
-
return new QueryBuilder({
|
|
629
|
-
...this.#props,
|
|
630
|
-
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll()),
|
|
631
|
-
});
|
|
632
|
-
}
|
|
633
|
-
/**
|
|
634
|
-
* Adds an `order by` clause to the query.
|
|
635
|
-
*
|
|
636
|
-
* `orderBy` calls are additive. To order by multiple columns, call `orderBy`
|
|
637
|
-
* multiple times.
|
|
638
|
-
*
|
|
639
|
-
* The first argument is the expression to order by and the second is the
|
|
640
|
-
* order (`asc` or `desc`).
|
|
641
|
-
*
|
|
642
|
-
* @example
|
|
643
|
-
* ```ts
|
|
644
|
-
* await db
|
|
645
|
-
* .selectFrom('person')
|
|
646
|
-
* .select('person.first_name as fn')
|
|
647
|
-
* .orderBy('id')
|
|
648
|
-
* .orderBy('fn', 'desc')
|
|
649
|
-
* .execute()
|
|
650
|
-
* ```
|
|
651
|
-
*
|
|
652
|
-
* The generated SQL (PostgreSQL):
|
|
653
|
-
*
|
|
654
|
-
* ```sql
|
|
655
|
-
* select "person"."first_name" as "fn"
|
|
656
|
-
* from "person"
|
|
657
|
-
* order by "id" asc, "fn" desc
|
|
658
|
-
* ```
|
|
659
|
-
*
|
|
660
|
-
* @example
|
|
661
|
-
* The order by expression can also be a `raw` expression or a subquery
|
|
662
|
-
* in addition to column references:
|
|
663
|
-
*
|
|
664
|
-
* ```ts
|
|
665
|
-
* await db
|
|
666
|
-
* .selectFrom('person')
|
|
667
|
-
* .selectAll()
|
|
668
|
-
* .orderBy((qb) => qb.subQuery('pet')
|
|
669
|
-
* .select('pet.name')
|
|
670
|
-
* .whereRef('pet.owner_id', '=', 'person.id')
|
|
671
|
-
* .limit(1)
|
|
672
|
-
* )
|
|
673
|
-
* .orderBy(
|
|
674
|
-
* db.raw('concat(first_name, last_name)')
|
|
675
|
-
* )
|
|
676
|
-
* .execute()
|
|
677
|
-
* ```
|
|
678
|
-
*
|
|
679
|
-
* The generated SQL (PostgreSQL):
|
|
680
|
-
*
|
|
681
|
-
* ```sql
|
|
682
|
-
* select *
|
|
683
|
-
* from "person"
|
|
684
|
-
* order by
|
|
685
|
-
* ( select "pet"."name"
|
|
686
|
-
* from "pet"
|
|
687
|
-
* where "pet"."owner_id" = "person"."id"
|
|
688
|
-
* limit 1
|
|
689
|
-
* ) asc,
|
|
690
|
-
* concat(first_name, last_name) asc
|
|
691
|
-
* ```
|
|
692
|
-
*
|
|
693
|
-
* @example
|
|
694
|
-
* `dynamic.ref` can be used to refer to columns not known at
|
|
695
|
-
* compile time:
|
|
696
|
-
*
|
|
697
|
-
* ```ts
|
|
698
|
-
* async function someQuery(orderBy: string) {
|
|
699
|
-
* const { ref } = db.dynamic
|
|
700
|
-
*
|
|
701
|
-
* return await db
|
|
702
|
-
* .selectFrom('person')
|
|
703
|
-
* .select('person.first_name as fn')
|
|
704
|
-
* .orderBy(ref(orderBy))
|
|
705
|
-
* .execute()
|
|
706
|
-
* }
|
|
707
|
-
*
|
|
708
|
-
* someQuery('fn')
|
|
709
|
-
* ```
|
|
710
|
-
*
|
|
711
|
-
* The generated SQL (PostgreSQL):
|
|
712
|
-
*
|
|
713
|
-
* ```sql
|
|
714
|
-
* select "person"."first_name" as "fn"
|
|
715
|
-
* from "person"
|
|
716
|
-
* order by "fn" asc
|
|
717
|
-
* ```
|
|
718
|
-
*/
|
|
719
|
-
orderBy(orderBy, direction) {
|
|
720
|
-
assertCanHaveOrderByClause(this.#props.queryNode);
|
|
721
|
-
return new QueryBuilder({
|
|
722
|
-
...this.#props,
|
|
723
|
-
queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode, parseOrderBy(this.#props.parseContext, orderBy, direction)),
|
|
724
|
-
});
|
|
725
|
-
}
|
|
726
|
-
groupBy(orderBy) {
|
|
727
|
-
assertCanHaveGroupByClause(this.#props.queryNode);
|
|
728
|
-
return new QueryBuilder({
|
|
729
|
-
...this.#props,
|
|
730
|
-
queryNode: SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode, parseGroupBy(this.#props.parseContext, orderBy)),
|
|
731
|
-
});
|
|
732
|
-
}
|
|
733
|
-
/**
|
|
734
|
-
* Adds a limit clause to the query.
|
|
735
|
-
*
|
|
736
|
-
* @example
|
|
737
|
-
* Select the first 10 rows of the result:
|
|
738
|
-
*
|
|
739
|
-
* ```ts
|
|
740
|
-
* return await db
|
|
741
|
-
* .selectFrom('person')
|
|
742
|
-
* .select('first_name')
|
|
743
|
-
* .limit(10)
|
|
744
|
-
* ```
|
|
745
|
-
*
|
|
746
|
-
* @example
|
|
747
|
-
* Select rows from index 10 to index 19 of the result:
|
|
748
|
-
*
|
|
749
|
-
* ```ts
|
|
750
|
-
* return await db
|
|
751
|
-
* .selectFrom('person')
|
|
752
|
-
* .select('first_name')
|
|
753
|
-
* .offset(10)
|
|
754
|
-
* .limit(10)
|
|
755
|
-
* ```
|
|
756
|
-
*/
|
|
757
|
-
limit(limit) {
|
|
758
|
-
assertCanHaveLimit(this.#props.queryNode);
|
|
759
|
-
return new QueryBuilder({
|
|
760
|
-
...this.#props,
|
|
761
|
-
queryNode: SelectQueryNode.cloneWithLimit(this.#props.queryNode, LimitNode.create(limit)),
|
|
762
|
-
});
|
|
763
|
-
}
|
|
764
|
-
/**
|
|
765
|
-
* Adds an offset clause to the query.
|
|
766
|
-
*
|
|
767
|
-
* @example
|
|
768
|
-
* Select rows from index 10 to index 19 of the result:
|
|
769
|
-
*
|
|
770
|
-
* ```ts
|
|
771
|
-
* return await db
|
|
772
|
-
* .selectFrom('person')
|
|
773
|
-
* .select('first_name')
|
|
774
|
-
* .offset(10)
|
|
775
|
-
* .limit(10)
|
|
776
|
-
* ```
|
|
777
|
-
*/
|
|
778
|
-
offset(offset) {
|
|
779
|
-
assertCanHaveOffset(this.#props.queryNode);
|
|
780
|
-
return new QueryBuilder({
|
|
781
|
-
...this.#props,
|
|
782
|
-
queryNode: SelectQueryNode.cloneWithOffset(this.#props.queryNode, OffsetNode.create(offset)),
|
|
783
|
-
});
|
|
784
|
-
}
|
|
785
|
-
/**
|
|
786
|
-
* Combines another select query or raw expression to this query using `union`.
|
|
787
|
-
*
|
|
788
|
-
* The output row type of the combined query must match `this` query.
|
|
789
|
-
*
|
|
790
|
-
* @xample
|
|
791
|
-
* ```ts
|
|
792
|
-
* db.selectFrom('person')
|
|
793
|
-
* .select(['id', 'first_name as name'])
|
|
794
|
-
* .union(db.selectFrom('pet').select(['id', 'name']))
|
|
795
|
-
* .orderBy('name')
|
|
796
|
-
* ```
|
|
797
|
-
*/
|
|
798
|
-
union(expression) {
|
|
799
|
-
assertCanHaveUnion(this.#props.queryNode);
|
|
800
|
-
return new QueryBuilder({
|
|
801
|
-
...this.#props,
|
|
802
|
-
queryNode: SelectQueryNode.cloneWithUnion(this.#props.queryNode, parseUnion(expression, false)),
|
|
803
|
-
});
|
|
804
|
-
}
|
|
805
|
-
/**
|
|
806
|
-
* Combines another select query or raw expression to this query using `union all`.
|
|
807
|
-
*
|
|
808
|
-
* The output row type of the combined query must match `this` query.
|
|
809
|
-
*
|
|
810
|
-
* @xample
|
|
811
|
-
* ```ts
|
|
812
|
-
* db.selectFrom('person')
|
|
813
|
-
* .select(['id', 'first_name as name'])
|
|
814
|
-
* .unionAll(db.selectFrom('pet').select(['id', 'name']))
|
|
815
|
-
* .orderBy('name')
|
|
816
|
-
* ```
|
|
817
|
-
*/
|
|
818
|
-
unionAll(expression) {
|
|
819
|
-
assertCanHaveUnion(this.#props.queryNode);
|
|
820
|
-
return new QueryBuilder({
|
|
821
|
-
...this.#props,
|
|
822
|
-
queryNode: SelectQueryNode.cloneWithUnion(this.#props.queryNode, parseUnion(expression, true)),
|
|
823
|
-
});
|
|
824
|
-
}
|
|
825
|
-
/**
|
|
826
|
-
* Simply calls the given function passing `this` as the only argument.
|
|
827
|
-
*
|
|
828
|
-
* This method can be useful when adding optional method calls:
|
|
829
|
-
*
|
|
830
|
-
* @example
|
|
831
|
-
* ```ts
|
|
832
|
-
* db.selectFrom('person')
|
|
833
|
-
* .selectAll()
|
|
834
|
-
* .call((qb) => {
|
|
835
|
-
* if (something) {
|
|
836
|
-
* return qb.where('something', '=', something)
|
|
837
|
-
* } else {
|
|
838
|
-
* return qb.where('somethingElse', '=', somethingElse)
|
|
839
|
-
* }
|
|
840
|
-
* })
|
|
841
|
-
* .execute()
|
|
842
|
-
* ```
|
|
843
|
-
*
|
|
844
|
-
* The next example uses a helper funtion `log` to log a query:
|
|
845
|
-
*
|
|
846
|
-
* @example
|
|
847
|
-
* ```ts
|
|
848
|
-
* function log<T extends AnyQueryBuilder>(qb: T): T {
|
|
849
|
-
* console.log(qb.compile())
|
|
850
|
-
* return qb
|
|
851
|
-
* }
|
|
852
|
-
*
|
|
853
|
-
* db.selectFrom('person')
|
|
854
|
-
* .selectAll()
|
|
855
|
-
* .call(log)
|
|
856
|
-
* .execute()
|
|
857
|
-
* ```
|
|
858
|
-
*/
|
|
859
|
-
call(func) {
|
|
860
|
-
return func(this);
|
|
861
|
-
}
|
|
862
|
-
/**
|
|
863
|
-
* Gives an alias for the query. This method is only useful for sub queries.
|
|
864
|
-
*
|
|
865
|
-
* @example
|
|
866
|
-
* ```ts
|
|
867
|
-
* await db.selectFrom('pet')
|
|
868
|
-
* .selectAll('pet')
|
|
869
|
-
* .select(
|
|
870
|
-
* (qb) => qb.subQuery('person')
|
|
871
|
-
* .select('first_name')
|
|
872
|
-
* .whereRef('pet.owner_id', '=', 'person.id')
|
|
873
|
-
* .as('owner_first_name')
|
|
874
|
-
* )
|
|
875
|
-
* .execute()
|
|
876
|
-
* ```
|
|
877
|
-
*/
|
|
878
|
-
as(alias) {
|
|
879
|
-
return new AliasedQueryBuilder(this, alias);
|
|
880
|
-
}
|
|
881
|
-
/**
|
|
882
|
-
* Change the output type of the query.
|
|
883
|
-
*
|
|
884
|
-
* You should only use this method as the last resort if the types
|
|
885
|
-
* don't support your use case.
|
|
886
|
-
*/
|
|
887
|
-
castTo() {
|
|
888
|
-
return new QueryBuilder(this.#props);
|
|
889
|
-
}
|
|
890
|
-
toOperationNode() {
|
|
891
|
-
return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
|
|
892
|
-
}
|
|
893
|
-
compile() {
|
|
894
|
-
return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
|
|
895
|
-
}
|
|
896
|
-
/**
|
|
897
|
-
* Executes the query and returns an array of rows.
|
|
898
|
-
*
|
|
899
|
-
* Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
|
|
900
|
-
*/
|
|
901
|
-
async execute() {
|
|
902
|
-
const compildQuery = this.compile();
|
|
903
|
-
const query = compildQuery.query;
|
|
904
|
-
const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
|
|
905
|
-
if (this.#props.parseContext.adapter.supportsReturning &&
|
|
906
|
-
QueryNode.isMutating(query) &&
|
|
907
|
-
query.returning) {
|
|
908
|
-
return result.rows;
|
|
909
|
-
}
|
|
910
|
-
else if (InsertQueryNode.is(query)) {
|
|
911
|
-
return [new InsertResult(result.insertId)];
|
|
912
|
-
}
|
|
913
|
-
else if (UpdateQueryNode.is(query)) {
|
|
914
|
-
return [new UpdateResult(result.numUpdatedOrDeletedRows)];
|
|
915
|
-
}
|
|
916
|
-
else if (DeleteQueryNode.is(query)) {
|
|
917
|
-
return [new DeleteResult(result.numUpdatedOrDeletedRows)];
|
|
918
|
-
}
|
|
919
|
-
else {
|
|
920
|
-
return result.rows;
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
/**
|
|
924
|
-
* Executes the query and returns the first result or undefined if
|
|
925
|
-
* the query returned no result.
|
|
926
|
-
*/
|
|
927
|
-
async executeTakeFirst() {
|
|
928
|
-
const [result] = await this.execute();
|
|
929
|
-
return result;
|
|
930
|
-
}
|
|
931
|
-
/**
|
|
932
|
-
* Executes the query and returns the first result or throws if
|
|
933
|
-
* the query returned no result.
|
|
934
|
-
*
|
|
935
|
-
* By default an instance of {@link NoResultError} is thrown, but you can
|
|
936
|
-
* provide a custom error class as the only argument to throw a different
|
|
937
|
-
* error.
|
|
938
|
-
*/
|
|
939
|
-
async executeTakeFirstOrThrow(errorConstructor = NoResultError) {
|
|
940
|
-
const result = await this.executeTakeFirst();
|
|
941
|
-
if (result === undefined) {
|
|
942
|
-
throw new errorConstructor(this.toOperationNode());
|
|
943
|
-
}
|
|
944
|
-
return result;
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
preventAwait(QueryBuilder, "don't await QueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
|
|
948
|
-
/**
|
|
949
|
-
* {@link QueryBuilder} with an alias. The result of calling {@link QueryBuilder.as}.
|
|
950
|
-
*/
|
|
951
|
-
export class AliasedQueryBuilder {
|
|
952
|
-
#queryBuilder;
|
|
953
|
-
#alias;
|
|
954
|
-
constructor(queryBuilder, alias) {
|
|
955
|
-
this.#queryBuilder = queryBuilder;
|
|
956
|
-
this.#alias = alias;
|
|
957
|
-
}
|
|
958
|
-
/**
|
|
959
|
-
* @private
|
|
960
|
-
*
|
|
961
|
-
* This needs to be here just so that the typings work. Without this
|
|
962
|
-
* the generated .d.ts file contains no reference to the type param A
|
|
963
|
-
* which causes this type to be equal to AliasedQueryBuilder with any A
|
|
964
|
-
* as long as D, TB and O are the same.
|
|
965
|
-
*/
|
|
966
|
-
get alias() {
|
|
967
|
-
return this.#alias;
|
|
968
|
-
}
|
|
969
|
-
toOperationNode() {
|
|
970
|
-
const node = this.#queryBuilder.toOperationNode();
|
|
971
|
-
if (SelectQueryNode.is(node)) {
|
|
972
|
-
return AliasNode.create(node, this.#alias);
|
|
973
|
-
}
|
|
974
|
-
throw new Error('only select queries can be aliased');
|
|
975
|
-
}
|
|
976
|
-
}
|
|
977
|
-
export class NoResultError extends Error {
|
|
978
|
-
/**
|
|
979
|
-
* The operation node tree of the query that was executed.
|
|
980
|
-
*/
|
|
981
|
-
node;
|
|
982
|
-
constructor(node) {
|
|
983
|
-
super('no result');
|
|
984
|
-
this.node = node;
|
|
985
|
-
}
|
|
986
|
-
}
|
|
987
|
-
function assertCanHaveWhereClause(node) {
|
|
988
|
-
if (!QueryNode.isFilterable(node)) {
|
|
989
|
-
throw new Error('only select, delete and update queries can have a where clause');
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
function assertCanHaveHavingClause(node) {
|
|
993
|
-
if (!SelectQueryNode.is(node)) {
|
|
994
|
-
throw new Error('only select queries can have a having clause');
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
function assertCanHaveSelectClause(node) {
|
|
998
|
-
if (!SelectQueryNode.is(node)) {
|
|
999
|
-
throw new Error('only a select query can have selections');
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
function assertCanHaveJoins(node) {
|
|
1003
|
-
if (!QueryNode.isFilterable(node)) {
|
|
1004
|
-
throw new Error('only select, delete and update queries can have joins');
|
|
1005
|
-
}
|
|
1006
|
-
}
|
|
1007
|
-
function assertCanHaveInsertValues(node) {
|
|
1008
|
-
if (!InsertQueryNode.is(node)) {
|
|
1009
|
-
throw new Error('only an insert query can have insert values');
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
function assertCanHaveInsertIgnore(node) {
|
|
1013
|
-
if (!InsertQueryNode.is(node)) {
|
|
1014
|
-
throw new Error('only an insert query can have the ignore clause');
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
function assertCanHaveOnConflict(node) {
|
|
1018
|
-
if (!InsertQueryNode.is(node)) {
|
|
1019
|
-
throw new Error('only an insert query can have an on conflict clause');
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
|
-
function assertCanHaveOnDuplicateKey(node) {
|
|
1023
|
-
if (!InsertQueryNode.is(node)) {
|
|
1024
|
-
throw new Error('only an insert query can have an on duplicate key clause');
|
|
1025
|
-
}
|
|
1026
|
-
}
|
|
1027
|
-
function assertCanHaveUpdates(node) {
|
|
1028
|
-
if (!UpdateQueryNode.is(node)) {
|
|
1029
|
-
throw new Error('only an update query can set values');
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
function assertCanHaveReturningClause(node) {
|
|
1033
|
-
if (!QueryNode.isMutating(node)) {
|
|
1034
|
-
throw new Error('only insert, delete and update queries can have a returning clause');
|
|
1035
|
-
}
|
|
1036
|
-
}
|
|
1037
|
-
function assertCanHaveOrderByClause(node) {
|
|
1038
|
-
if (!SelectQueryNode.is(node)) {
|
|
1039
|
-
throw new Error('only a select query can have an order by clause');
|
|
1040
|
-
}
|
|
1041
|
-
}
|
|
1042
|
-
function assertCanHaveGroupByClause(node) {
|
|
1043
|
-
if (!SelectQueryNode.is(node)) {
|
|
1044
|
-
throw new Error('only a select query can have a group by clause');
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
function assertCanHaveLimit(node) {
|
|
1048
|
-
if (!SelectQueryNode.is(node)) {
|
|
1049
|
-
throw new Error('only a select query can have a limit');
|
|
1050
|
-
}
|
|
1051
|
-
}
|
|
1052
|
-
function assertCanHaveOffset(node) {
|
|
1053
|
-
if (!SelectQueryNode.is(node)) {
|
|
1054
|
-
throw new Error('only a select query can have an offset');
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
|
-
function assertCanHaveUnion(node) {
|
|
1058
|
-
if (!SelectQueryNode.is(node)) {
|
|
1059
|
-
throw new Error('only a select query can have an union');
|
|
1060
|
-
}
|
|
1061
|
-
}
|