kysely 0.19.10 → 0.20.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.
Files changed (148) hide show
  1. package/README.md +52 -4
  2. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  3. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -0
  4. package/dist/cjs/dialect/mysql/mysql-driver.js +25 -0
  5. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
  6. package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +5 -0
  7. package/dist/cjs/dialect/mysql/mysql-query-compiler.js +16 -0
  8. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  9. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +6 -2
  10. package/dist/cjs/dialect/postgres/postgres-driver.js +24 -2
  11. package/dist/cjs/dialect/postgres/postgres-introspector.js +7 -1
  12. package/dist/cjs/dialect/postgres/postgres-query-compiler.d.ts +1 -3
  13. package/dist/cjs/dialect/postgres/postgres-query-compiler.js +3 -8
  14. package/dist/cjs/dialect/sqlite/sqlite-driver.js +3 -0
  15. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -0
  16. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +3 -0
  17. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +10 -0
  18. package/dist/cjs/driver/database-connection.d.ts +1 -0
  19. package/dist/cjs/driver/dummy-driver.js +3 -0
  20. package/dist/cjs/index.d.ts +6 -0
  21. package/dist/cjs/index.js +6 -0
  22. package/dist/cjs/operation-node/create-table-node.d.ts +9 -2
  23. package/dist/cjs/operation-node/create-table-node.js +18 -1
  24. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  25. package/dist/cjs/operation-node/delete-query-node.d.ts +3 -0
  26. package/dist/cjs/operation-node/delete-query-node.js +6 -0
  27. package/dist/cjs/operation-node/explain-node.d.ts +16 -0
  28. package/dist/cjs/operation-node/explain-node.js +19 -0
  29. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +2 -2
  30. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -1
  31. package/dist/cjs/operation-node/insert-query-node.js +2 -1
  32. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  33. package/dist/cjs/operation-node/operation-node-transformer.js +15 -0
  34. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  35. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  36. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  37. package/dist/cjs/operation-node/references-node.d.ts +3 -1
  38. package/dist/cjs/operation-node/references-node.js +8 -1
  39. package/dist/cjs/operation-node/select-query-node.d.ts +3 -0
  40. package/dist/cjs/operation-node/select-query-node.js +6 -0
  41. package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
  42. package/dist/cjs/operation-node/update-query-node.js +6 -0
  43. package/dist/cjs/parser/on-commit-action-parse.d.ts +2 -0
  44. package/dist/cjs/parser/on-commit-action-parse.js +11 -0
  45. package/dist/cjs/parser/on-modify-action-parser.d.ts +2 -0
  46. package/dist/cjs/parser/on-modify-action-parser.js +11 -0
  47. package/dist/cjs/query-builder/delete-query-builder.d.ts +19 -1
  48. package/dist/cjs/query-builder/delete-query-builder.js +24 -0
  49. package/dist/cjs/query-builder/function-builder.d.ts +3 -3
  50. package/dist/cjs/query-builder/insert-query-builder.d.ts +21 -3
  51. package/dist/cjs/query-builder/insert-query-builder.js +26 -0
  52. package/dist/cjs/query-builder/select-query-builder.d.ts +65 -1
  53. package/dist/cjs/query-builder/select-query-builder.js +79 -4
  54. package/dist/cjs/query-builder/update-query-builder.d.ts +20 -1
  55. package/dist/cjs/query-builder/update-query-builder.js +25 -0
  56. package/dist/cjs/query-compiler/default-query-compiler.d.ts +7 -0
  57. package/dist/cjs/query-compiler/default-query-compiler.js +75 -2
  58. package/dist/cjs/query-creator.d.ts +27 -0
  59. package/dist/cjs/query-creator.js +33 -0
  60. package/dist/cjs/query-executor/query-executor-base.d.ts +6 -0
  61. package/dist/cjs/query-executor/query-executor-base.js +19 -0
  62. package/dist/cjs/query-executor/query-executor.d.ts +11 -0
  63. package/dist/cjs/raw-builder/sql.d.ts +96 -96
  64. package/dist/cjs/raw-builder/sql.js +0 -96
  65. package/dist/cjs/schema/column-definition-builder.js +3 -2
  66. package/dist/cjs/schema/create-table-builder.d.ts +60 -6
  67. package/dist/cjs/schema/create-table-builder.js +72 -7
  68. package/dist/cjs/schema/create-type-builder.d.ts +9 -0
  69. package/dist/cjs/schema/create-type-builder.js +9 -0
  70. package/dist/cjs/schema/foreign-key-constraint-builder.js +3 -2
  71. package/dist/cjs/util/deferred.d.ts +7 -0
  72. package/dist/cjs/util/deferred.js +28 -0
  73. package/dist/cjs/util/explainable.d.ts +5 -0
  74. package/dist/cjs/util/explainable.js +2 -0
  75. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  76. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -0
  77. package/dist/esm/dialect/mysql/mysql-driver.js +25 -0
  78. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  79. package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +5 -0
  80. package/dist/esm/dialect/mysql/mysql-query-compiler.js +16 -0
  81. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  82. package/dist/esm/dialect/postgres/postgres-driver.d.ts +6 -2
  83. package/dist/esm/dialect/postgres/postgres-driver.js +24 -2
  84. package/dist/esm/dialect/postgres/postgres-introspector.js +7 -1
  85. package/dist/esm/dialect/postgres/postgres-query-compiler.d.ts +1 -3
  86. package/dist/esm/dialect/postgres/postgres-query-compiler.js +3 -8
  87. package/dist/esm/dialect/sqlite/sqlite-driver.js +3 -0
  88. package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -0
  89. package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +3 -0
  90. package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +10 -0
  91. package/dist/esm/driver/database-connection.d.ts +1 -0
  92. package/dist/esm/driver/dummy-driver.js +3 -0
  93. package/dist/esm/index.d.ts +6 -0
  94. package/dist/esm/index.js +6 -0
  95. package/dist/esm/operation-node/create-table-node.d.ts +9 -2
  96. package/dist/esm/operation-node/create-table-node.js +17 -0
  97. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  98. package/dist/esm/operation-node/delete-query-node.d.ts +3 -0
  99. package/dist/esm/operation-node/delete-query-node.js +6 -0
  100. package/dist/esm/operation-node/explain-node.d.ts +16 -0
  101. package/dist/esm/operation-node/explain-node.js +17 -0
  102. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +2 -2
  103. package/dist/esm/operation-node/insert-query-node.d.ts +4 -1
  104. package/dist/esm/operation-node/insert-query-node.js +2 -1
  105. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  106. package/dist/esm/operation-node/operation-node-transformer.js +15 -0
  107. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  108. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  109. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  110. package/dist/esm/operation-node/references-node.d.ts +3 -1
  111. package/dist/esm/operation-node/references-node.js +7 -0
  112. package/dist/esm/operation-node/select-query-node.d.ts +3 -0
  113. package/dist/esm/operation-node/select-query-node.js +6 -0
  114. package/dist/esm/operation-node/update-query-node.d.ts +3 -0
  115. package/dist/esm/operation-node/update-query-node.js +6 -0
  116. package/dist/esm/parser/on-commit-action-parse.d.ts +2 -0
  117. package/dist/esm/parser/on-commit-action-parse.js +8 -0
  118. package/dist/esm/parser/on-modify-action-parser.d.ts +2 -0
  119. package/dist/esm/parser/on-modify-action-parser.js +8 -0
  120. package/dist/esm/query-builder/delete-query-builder.d.ts +19 -1
  121. package/dist/esm/query-builder/delete-query-builder.js +24 -0
  122. package/dist/esm/query-builder/function-builder.d.ts +3 -3
  123. package/dist/esm/query-builder/insert-query-builder.d.ts +21 -3
  124. package/dist/esm/query-builder/insert-query-builder.js +26 -0
  125. package/dist/esm/query-builder/select-query-builder.d.ts +65 -1
  126. package/dist/esm/query-builder/select-query-builder.js +79 -4
  127. package/dist/esm/query-builder/update-query-builder.d.ts +20 -1
  128. package/dist/esm/query-builder/update-query-builder.js +25 -0
  129. package/dist/esm/query-compiler/default-query-compiler.d.ts +7 -0
  130. package/dist/esm/query-compiler/default-query-compiler.js +75 -2
  131. package/dist/esm/query-creator.d.ts +27 -0
  132. package/dist/esm/query-creator.js +33 -0
  133. package/dist/esm/query-executor/query-executor-base.d.ts +6 -0
  134. package/dist/esm/query-executor/query-executor-base.js +19 -0
  135. package/dist/esm/query-executor/query-executor.d.ts +11 -0
  136. package/dist/esm/raw-builder/sql.d.ts +96 -96
  137. package/dist/esm/raw-builder/sql.js +0 -96
  138. package/dist/esm/schema/column-definition-builder.js +3 -2
  139. package/dist/esm/schema/create-table-builder.d.ts +60 -6
  140. package/dist/esm/schema/create-table-builder.js +72 -7
  141. package/dist/esm/schema/create-type-builder.d.ts +9 -0
  142. package/dist/esm/schema/create-type-builder.js +9 -0
  143. package/dist/esm/schema/foreign-key-constraint-builder.js +3 -2
  144. package/dist/esm/util/deferred.d.ts +7 -0
  145. package/dist/esm/util/deferred.js +25 -0
  146. package/dist/esm/util/explainable.d.ts +5 -0
  147. package/dist/esm/util/explainable.js +2 -0
  148. package/package.json +7 -2
package/README.md CHANGED
@@ -21,7 +21,7 @@ column names, aliases and types from selected subqueries, joined subqueries, `wi
21
21
  much anything you can think of.
22
22
 
23
23
  Of course there are cases where things cannot be typed at compile time, and Kysely offers escape
24
- hatches for these situations. See the [sql template tag](https://koskimas.github.io/kysely/modules.html#sql)
24
+ hatches for these situations. See the [sql template tag](https://koskimas.github.io/kysely/functions/sql.html)
25
25
  and the [DynamicModule](https://koskimas.github.io/kysely/classes/DynamicModule.html#ref) for more info.
26
26
 
27
27
  If you start using Kysely and can't find something you'd want to use, please open an issue or join our
@@ -32,15 +32,21 @@ You can find a more thorough introduction [here](https://www.jakso.me/blog/kysel
32
32
  # Table of contents
33
33
 
34
34
  - [Installation](#installation)
35
+ - [3rd party dialects](#3rd-party-dialects)
35
36
  - [Minimal example](#minimal-example)
36
37
  - [Generating types](#generating-types)
37
38
  - [Query examples](#query-examples)
38
- - [Recipes](https://github.com/koskimas/kysely/tree/master/recipes)
39
+ - [Select queries](#select-queries)
40
+ - [Stream select query results](#stream-select-query-results)
41
+ - [Update queries](#update-queries)
42
+ - [Insert queries](#insert-queries)
43
+ - [Delete queries](#delete-queries)
39
44
  - [Migrations](#migrations)
45
+ - [PostgreSQL migration example](#postgresql-migration-example)
46
+ - [MySQL migration example](#mysql-migration-example)
40
47
  - [Deno](#deno)
41
48
  - [Browser](#browser)
42
- - [API reference](https://koskimas.github.io/kysely/index.html)
43
- - [Changelog](https://github.com/koskimas/kysely/releases)
49
+ - [Why not just contribute to knex](#why-not-just-contribute-to-knex)
44
50
 
45
51
  # Installation
46
52
 
@@ -180,6 +186,48 @@ You can find examples of select queries in the documentation of the
180
186
  the [where method](https://koskimas.github.io/kysely/classes/SelectQueryBuilder.html#where)
181
187
  among other places.
182
188
 
189
+ ### Stream select query results
190
+
191
+ *Currently only supported by `postgres` and `mysql` dialects.*
192
+
193
+ ```ts
194
+ import { Pool } from 'pg'
195
+ // or `import * as Cursor from 'pg-cursor'` depending on your tsconfig
196
+ import Cursor from 'pg-cursor'
197
+ import {
198
+ Kysely,
199
+ PostgresDialect,
200
+ } from 'kysely'
201
+
202
+ const db = new Kysely<Database>({
203
+ // PostgresDialect requires the Cursor dependency
204
+ dialect: new PostgresDialect({
205
+ pool: new Pool({
206
+ host: 'localhost',
207
+ database: 'kysely_test'
208
+ }),
209
+ cursor: Cursor
210
+ }),
211
+
212
+ // MysqlDialect doesn't require any special configuration
213
+ })
214
+
215
+ async function demo() {
216
+ for await (const male of db.selectFrom("person")
217
+ .selectAll()
218
+ .where("person.gender", "=", "male")
219
+ .stream()) {
220
+ console.log(`Hello mr. ${male.first_name}!`)
221
+
222
+ if (male.first_name === "John") {
223
+ // After this line the db connection is released and no more
224
+ // rows are streamed from the database to the client
225
+ break;
226
+ }
227
+ }
228
+ }
229
+ ```
230
+
183
231
  ## Update queries
184
232
 
185
233
  See the [set method](https://koskimas.github.io/kysely/classes/UpdateQueryBuilder.html#set) and the
@@ -31,9 +31,19 @@ export interface MysqlPool {
31
31
  end(callback: (error: unknown) => void): void;
32
32
  }
33
33
  export interface MysqlPoolConnection {
34
+ query(sql: string, parameters: ReadonlyArray<unknown>): {
35
+ stream: <T>(options: MysqlStreamOptions) => MysqlStream<T>;
36
+ };
34
37
  query(sql: string, parameters: ReadonlyArray<unknown>, callback: (error: unknown, result: MysqlQueryResult) => void): void;
35
38
  release(): void;
36
39
  }
40
+ export interface MysqlStreamOptions {
41
+ highWaterMark?: number;
42
+ objectMode?: boolean;
43
+ }
44
+ export interface MysqlStream<T> {
45
+ [Symbol.asyncIterator](): AsyncIterableIterator<T>;
46
+ }
37
47
  export interface MysqlOkPacket {
38
48
  affectedRows: number;
39
49
  insertId: number;
@@ -42,6 +42,7 @@ declare class MysqlConnection implements DatabaseConnection {
42
42
  #private;
43
43
  constructor(rawConnection: MysqlPoolConnection);
44
44
  executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>>;
45
+ streamQuery<O>(compiledQuery: CompiledQuery, chunkSize: number): AsyncIterableIterator<QueryResult<O>>;
45
46
  [PRIVATE_RELEASE_METHOD](): void;
46
47
  }
47
48
  export {};
@@ -124,6 +124,31 @@ class MysqlConnection {
124
124
  });
125
125
  });
126
126
  }
127
+ async *streamQuery(compiledQuery, chunkSize) {
128
+ const stream = this.#rawConnection
129
+ .query(compiledQuery.sql, compiledQuery.parameters)
130
+ .stream({
131
+ objectMode: true,
132
+ });
133
+ try {
134
+ for await (const row of stream) {
135
+ yield {
136
+ rows: [row],
137
+ };
138
+ }
139
+ }
140
+ catch (ex) {
141
+ if (ex &&
142
+ typeof ex === 'object' &&
143
+ 'code' in ex &&
144
+ // @ts-ignore
145
+ ex.code === 'ERR_STREAM_PREMATURE_CLOSE') {
146
+ // Most likely because of https://github.com/mysqljs/mysql/blob/master/lib/protocol/sequences/Query.js#L220
147
+ return;
148
+ }
149
+ throw ex;
150
+ }
151
+ }
127
152
  [PRIVATE_RELEASE_METHOD]() {
128
153
  this.#rawConnection.release();
129
154
  }
@@ -30,6 +30,8 @@ class MysqlIntrospector {
30
30
  'extra',
31
31
  ])
32
32
  .where('table_schema', '=', (0, sql_js_1.sql) `database()`)
33
+ .orderBy('table_name')
34
+ .orderBy('column_name')
33
35
  .castTo();
34
36
  if (!options.withInternalKyselyTables) {
35
37
  query = query
@@ -1,6 +1,11 @@
1
1
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
2
2
  export declare class MysqlQueryCompiler extends DefaultQueryCompiler {
3
3
  protected getCurrentParameterPlaceholder(): string;
4
+ protected getLeftExplainOptionsWrapper(): string;
5
+ protected getExplainOptionAssignment(): string;
6
+ protected getExplainOptionsDelimiter(): string;
7
+ protected getRightExplainOptionsWrapper(): string;
4
8
  protected getLeftIdentifierWrapper(): string;
5
9
  protected getRightIdentifierWrapper(): string;
10
+ protected sanitizeIdentifier(identifier: string): string;
6
11
  }
@@ -2,15 +2,31 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MysqlQueryCompiler = void 0;
4
4
  const default_query_compiler_js_1 = require("../../query-compiler/default-query-compiler.js");
5
+ const ID_WRAP_REGEX = /`/g;
5
6
  class MysqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompiler {
6
7
  getCurrentParameterPlaceholder() {
7
8
  return '?';
8
9
  }
10
+ getLeftExplainOptionsWrapper() {
11
+ return '';
12
+ }
13
+ getExplainOptionAssignment() {
14
+ return '=';
15
+ }
16
+ getExplainOptionsDelimiter() {
17
+ return ' ';
18
+ }
19
+ getRightExplainOptionsWrapper() {
20
+ return '';
21
+ }
9
22
  getLeftIdentifierWrapper() {
10
23
  return '`';
11
24
  }
12
25
  getRightIdentifierWrapper() {
13
26
  return '`';
14
27
  }
28
+ sanitizeIdentifier(identifier) {
29
+ return identifier.replace(ID_WRAP_REGEX, '``');
30
+ }
15
31
  }
16
32
  exports.MysqlQueryCompiler = MysqlQueryCompiler;
@@ -1,4 +1,14 @@
1
1
  import { DatabaseConnection } from '../../driver/database-connection.js';
2
+ export declare type PostgresCursorConstructor = new <T>(sql: string, parameters: readonly unknown[]) => PostgresCursor<T>;
3
+ export declare type PostgresCursor<T> = {
4
+ state: 'initialized' | 'idle' | 'submitted' | 'busy';
5
+ read: (rowsCount: number) => Promise<T[]>;
6
+ } | {
7
+ state: 'done';
8
+ } | {
9
+ state: 'error';
10
+ _error: Error;
11
+ };
2
12
  /**
3
13
  * Config for the PostgreSQL dialect.
4
14
  */
@@ -11,6 +21,19 @@ export interface PostgresDialectConfig {
11
21
  * https://node-postgres.com/api/pool
12
22
  */
13
23
  pool: PostgresPool | (() => Promise<PostgresPool>);
24
+ /**
25
+ * https://github.com/brianc/node-postgres/tree/master/packages/pg-cursor
26
+ * ```ts
27
+ * import Cursor from 'pg-cursor'
28
+ * // or
29
+ * import * as Cursor from 'pg-cursor'
30
+ *
31
+ * new PostgresDialect({
32
+ * cursor: Cursor
33
+ * })
34
+ * ```
35
+ */
36
+ cursor?: PostgresCursorConstructor;
14
37
  /**
15
38
  * Called once for each created connection.
16
39
  */
@@ -30,6 +53,7 @@ export interface PostgresPool {
30
53
  }
31
54
  export interface PostgresPoolClient {
32
55
  query<R>(sql: string, parameters: ReadonlyArray<unknown>): Promise<PostgresQueryResult<R>>;
56
+ query<R>(cursor: PostgresCursor<R>): PostgresCursor<R>;
33
57
  release(): void;
34
58
  }
35
59
  export interface PostgresQueryResult<R> {
@@ -37,3 +61,8 @@ export interface PostgresQueryResult<R> {
37
61
  rowCount: number;
38
62
  rows: R[];
39
63
  }
64
+ export interface PostgresStreamOptions {
65
+ }
66
+ export interface PostgresStream<T> {
67
+ [Symbol.asyncIterator](): AsyncIterableIterator<T>;
68
+ }
@@ -1,7 +1,7 @@
1
1
  import { DatabaseConnection, QueryResult } from '../../driver/database-connection.js';
2
2
  import { Driver, TransactionSettings } from '../../driver/driver.js';
3
3
  import { CompiledQuery } from '../../query-compiler/compiled-query.js';
4
- import { PostgresDialectConfig, PostgresPoolClient } from './postgres-dialect-config.js';
4
+ import { PostgresCursorConstructor, PostgresDialectConfig, PostgresPoolClient } from './postgres-dialect-config.js';
5
5
  declare const PRIVATE_RELEASE_METHOD: unique symbol;
6
6
  export declare class PostgresDriver implements Driver {
7
7
  #private;
@@ -38,10 +38,14 @@ export declare class PostgresDriver implements Driver {
38
38
  */
39
39
  destroy(): Promise<void>;
40
40
  }
41
+ interface PostgresConnectionOptions {
42
+ cursor: PostgresCursorConstructor | null;
43
+ }
41
44
  declare class PostgresConnection implements DatabaseConnection {
42
45
  #private;
43
- constructor(client: PostgresPoolClient);
46
+ constructor(client: PostgresPoolClient, options: PostgresConnectionOptions);
44
47
  executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>>;
48
+ streamQuery<O>(compiledQuery: CompiledQuery, chunkSize: number): AsyncIterableIterator<QueryResult<O>>;
45
49
  [PRIVATE_RELEASE_METHOD](): void;
46
50
  }
47
51
  export {};
@@ -21,7 +21,9 @@ class PostgresDriver {
21
21
  const client = await this.#pool.connect();
22
22
  let connection = this.#connections.get(client);
23
23
  if (!connection) {
24
- connection = new PostgresConnection(client);
24
+ connection = new PostgresConnection(client, {
25
+ cursor: this.#config.cursor ?? null,
26
+ });
25
27
  this.#connections.set(client, connection);
26
28
  // The driver must take care of calling `onCreateConnection` when a new
27
29
  // connection is created. The `pg` module doesn't provide an async hook
@@ -60,8 +62,10 @@ class PostgresDriver {
60
62
  exports.PostgresDriver = PostgresDriver;
61
63
  class PostgresConnection {
62
64
  #client;
63
- constructor(client) {
65
+ #options;
66
+ constructor(client, options) {
64
67
  this.#client = client;
68
+ this.#options = options;
65
69
  }
66
70
  async executeQuery(compiledQuery) {
67
71
  try {
@@ -82,6 +86,24 @@ class PostgresConnection {
82
86
  throw (0, stack_trace_utils_js_1.extendStackTrace)(err, new Error());
83
87
  }
84
88
  }
89
+ async *streamQuery(compiledQuery, chunkSize) {
90
+ if (!this.#options.cursor) {
91
+ throw new Error("'cursor' is not present in your postgres dialect config. It's required to make streaming work in postgres.");
92
+ }
93
+ const cursor = this.#client.query(new this.#options.cursor(compiledQuery.sql, compiledQuery.parameters));
94
+ while (true) {
95
+ if (cursor.state === 'done') {
96
+ break;
97
+ }
98
+ if (cursor.state === 'error') {
99
+ throw cursor._error;
100
+ }
101
+ const rows = await cursor.read(chunkSize);
102
+ yield {
103
+ rows,
104
+ };
105
+ }
106
+ }
85
107
  [PRIVATE_RELEASE_METHOD]() {
86
108
  this.#client.release();
87
109
  }
@@ -21,7 +21,10 @@ class PostgresIntrospector {
21
21
  let query = this.#db
22
22
  .selectFrom('pg_catalog.pg_attribute as a')
23
23
  .innerJoin('pg_catalog.pg_class as c', 'a.attrelid', 'c.oid')
24
- .innerJoin('pg_catalog.pg_tables as t', 't.tablename', 'c.relname')
24
+ .innerJoin('pg_catalog.pg_namespace as ns', 'c.relnamespace', 'ns.oid')
25
+ .innerJoin('pg_catalog.pg_tables as t', (join) => join
26
+ .onRef('t.tablename', '=', 'c.relname')
27
+ .onRef('t.schemaname', '=', 'ns.nspname'))
25
28
  .innerJoin('pg_catalog.pg_type as typ', 'a.atttypid', 'typ.oid')
26
29
  .select([
27
30
  'a.attname as column',
@@ -43,6 +46,9 @@ class PostgresIntrospector {
43
46
  .where('t.schemaname', '!=', 'information_schema')
44
47
  .where('a.attnum', '>=', 0) // No system columns
45
48
  .where('a.attisdropped', '!=', true)
49
+ .orderBy('t.schemaname')
50
+ .orderBy('t.tablename')
51
+ .orderBy('a.attname')
46
52
  .castTo();
47
53
  if (!options.withInternalKyselyTables) {
48
54
  query = query
@@ -1,6 +1,4 @@
1
1
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
2
2
  export declare class PostgresQueryCompiler extends DefaultQueryCompiler {
3
- protected getCurrentParameterPlaceholder(): string;
4
- protected getLeftIdentifierWrapper(): string;
5
- protected getRightIdentifierWrapper(): string;
3
+ protected sanitizeIdentifier(identifier: string): string;
6
4
  }
@@ -2,15 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PostgresQueryCompiler = void 0;
4
4
  const default_query_compiler_js_1 = require("../../query-compiler/default-query-compiler.js");
5
+ const ID_WRAP_REGEX = /"/g;
5
6
  class PostgresQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompiler {
6
- getCurrentParameterPlaceholder() {
7
- return '$' + this.numParameters;
8
- }
9
- getLeftIdentifierWrapper() {
10
- return '"';
11
- }
12
- getRightIdentifierWrapper() {
13
- return '"';
7
+ sanitizeIdentifier(identifier) {
8
+ return identifier.replace(ID_WRAP_REGEX, '""');
14
9
  }
15
10
  }
16
11
  exports.PostgresQueryCompiler = PostgresQueryCompiler;
@@ -69,6 +69,9 @@ class SqliteConnection {
69
69
  });
70
70
  }
71
71
  }
72
+ async *streamQuery() {
73
+ throw new Error("Sqlite driver doesn't support streaming");
74
+ }
72
75
  }
73
76
  class ConnectionMutex {
74
77
  #promise;
@@ -18,6 +18,7 @@ class SqliteIntrospector {
18
18
  .where('type', '=', 'table')
19
19
  .where('name', 'not like', 'sqlite_%')
20
20
  .select('name')
21
+ .orderBy('name')
21
22
  .castTo();
22
23
  if (!options.withInternalKyselyTables) {
23
24
  query = query
@@ -50,6 +51,7 @@ class SqliteIntrospector {
50
51
  const columns = await db
51
52
  .selectFrom((0, sql_js_1.sql) `pragma_table_info(${table})`.as('table_info'))
52
53
  .select(['name', 'type', 'notnull', 'dflt_value'])
54
+ .orderBy('name')
53
55
  .execute();
54
56
  return {
55
57
  name: table,
@@ -1,7 +1,10 @@
1
1
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
2
2
  export declare class SqliteQueryCompiler extends DefaultQueryCompiler {
3
3
  protected getCurrentParameterPlaceholder(): string;
4
+ protected getLeftExplainOptionsWrapper(): string;
5
+ protected getRightExplainOptionsWrapper(): string;
4
6
  protected getLeftIdentifierWrapper(): string;
5
7
  protected getRightIdentifierWrapper(): string;
6
8
  protected getAutoIncrement(): string;
9
+ protected sanitizeIdentifier(identifier: string): string;
7
10
  }
@@ -2,10 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SqliteQueryCompiler = void 0;
4
4
  const default_query_compiler_js_1 = require("../../query-compiler/default-query-compiler.js");
5
+ const ID_WRAP_REGEX = /"/g;
5
6
  class SqliteQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompiler {
6
7
  getCurrentParameterPlaceholder() {
7
8
  return '?';
8
9
  }
10
+ getLeftExplainOptionsWrapper() {
11
+ return '';
12
+ }
13
+ getRightExplainOptionsWrapper() {
14
+ return '';
15
+ }
9
16
  getLeftIdentifierWrapper() {
10
17
  return '"';
11
18
  }
@@ -15,5 +22,8 @@ class SqliteQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompil
15
22
  getAutoIncrement() {
16
23
  return 'autoincrement';
17
24
  }
25
+ sanitizeIdentifier(identifier) {
26
+ return identifier.replace(ID_WRAP_REGEX, '""');
27
+ }
18
28
  }
19
29
  exports.SqliteQueryCompiler = SqliteQueryCompiler;
@@ -6,6 +6,7 @@ import { CompiledQuery } from '../query-compiler/compiled-query.js';
6
6
  */
7
7
  export interface DatabaseConnection {
8
8
  executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>>;
9
+ streamQuery<R>(compiledQuery: CompiledQuery, chunkSize?: number): AsyncIterableIterator<QueryResult<R>>;
9
10
  }
10
11
  export interface QueryResult<O> {
11
12
  /**
@@ -67,4 +67,7 @@ class DummyConnection {
67
67
  rows: [],
68
68
  };
69
69
  }
70
+ async *streamQuery() {
71
+ // Nothing to do here.
72
+ }
70
73
  }
@@ -25,7 +25,9 @@ export * from './query-compiler/default-query-compiler.js';
25
25
  export * from './query-compiler/compiled-query.js';
26
26
  export * from './schema/schema.js';
27
27
  export * from './schema/create-table-builder.js';
28
+ export * from './schema/create-type-builder.js';
28
29
  export * from './schema/drop-table-builder.js';
30
+ export * from './schema/drop-type-builder.js';
29
31
  export * from './schema/create-index-builder.js';
30
32
  export * from './schema/drop-index-builder.js';
31
33
  export * from './schema/create-schema-builder.js';
@@ -87,6 +89,7 @@ export * from './operation-node/constraint-node.js';
87
89
  export * from './operation-node/create-index-node.js';
88
90
  export * from './operation-node/create-schema-node.js';
89
91
  export * from './operation-node/create-table-node.js';
92
+ export * from './operation-node/create-type-node.js';
90
93
  export * from './operation-node/create-view-node.js';
91
94
  export * from './operation-node/data-type-node.js';
92
95
  export * from './operation-node/default-value-node.js';
@@ -96,6 +99,7 @@ export * from './operation-node/drop-constraint-node.js';
96
99
  export * from './operation-node/drop-index-node.js';
97
100
  export * from './operation-node/drop-schema-node.js';
98
101
  export * from './operation-node/drop-table-node.js';
102
+ export * from './operation-node/drop-type-node.js';
99
103
  export * from './operation-node/drop-view-node.js';
100
104
  export * from './operation-node/filter-node.js';
101
105
  export * from './operation-node/foreign-key-constraint-node.js';
@@ -145,8 +149,10 @@ export * from './operation-node/value-node.js';
145
149
  export * from './operation-node/values-node.js';
146
150
  export * from './operation-node/where-node.js';
147
151
  export * from './operation-node/with-node.js';
152
+ export * from './operation-node/explain-node.js';
148
153
  export * from './util/column-type.js';
149
154
  export * from './util/compilable.js';
155
+ export * from './util/explainable.js';
150
156
  export * from './util/log.js';
151
157
  export { AnyColumn, UnknownRow, AnySelectQueryBuilder, } from './util/type-utils.js';
152
158
  export { SelectExpression, SelectExpressionOrList, Selection, } from './parser/select-parser.js';
package/dist/cjs/index.js CHANGED
@@ -41,7 +41,9 @@ __exportStar(require("./query-compiler/default-query-compiler.js"), exports);
41
41
  __exportStar(require("./query-compiler/compiled-query.js"), exports);
42
42
  __exportStar(require("./schema/schema.js"), exports);
43
43
  __exportStar(require("./schema/create-table-builder.js"), exports);
44
+ __exportStar(require("./schema/create-type-builder.js"), exports);
44
45
  __exportStar(require("./schema/drop-table-builder.js"), exports);
46
+ __exportStar(require("./schema/drop-type-builder.js"), exports);
45
47
  __exportStar(require("./schema/create-index-builder.js"), exports);
46
48
  __exportStar(require("./schema/drop-index-builder.js"), exports);
47
49
  __exportStar(require("./schema/create-schema-builder.js"), exports);
@@ -103,6 +105,7 @@ __exportStar(require("./operation-node/constraint-node.js"), exports);
103
105
  __exportStar(require("./operation-node/create-index-node.js"), exports);
104
106
  __exportStar(require("./operation-node/create-schema-node.js"), exports);
105
107
  __exportStar(require("./operation-node/create-table-node.js"), exports);
108
+ __exportStar(require("./operation-node/create-type-node.js"), exports);
106
109
  __exportStar(require("./operation-node/create-view-node.js"), exports);
107
110
  __exportStar(require("./operation-node/data-type-node.js"), exports);
108
111
  __exportStar(require("./operation-node/default-value-node.js"), exports);
@@ -112,6 +115,7 @@ __exportStar(require("./operation-node/drop-constraint-node.js"), exports);
112
115
  __exportStar(require("./operation-node/drop-index-node.js"), exports);
113
116
  __exportStar(require("./operation-node/drop-schema-node.js"), exports);
114
117
  __exportStar(require("./operation-node/drop-table-node.js"), exports);
118
+ __exportStar(require("./operation-node/drop-type-node.js"), exports);
115
119
  __exportStar(require("./operation-node/drop-view-node.js"), exports);
116
120
  __exportStar(require("./operation-node/filter-node.js"), exports);
117
121
  __exportStar(require("./operation-node/foreign-key-constraint-node.js"), exports);
@@ -161,6 +165,8 @@ __exportStar(require("./operation-node/value-node.js"), exports);
161
165
  __exportStar(require("./operation-node/values-node.js"), exports);
162
166
  __exportStar(require("./operation-node/where-node.js"), exports);
163
167
  __exportStar(require("./operation-node/with-node.js"), exports);
168
+ __exportStar(require("./operation-node/explain-node.js"), exports);
164
169
  __exportStar(require("./util/column-type.js"), exports);
165
170
  __exportStar(require("./util/compilable.js"), exports);
171
+ __exportStar(require("./util/explainable.js"), exports);
166
172
  __exportStar(require("./util/log.js"), exports);
@@ -2,8 +2,11 @@ import { OperationNode } from './operation-node.js';
2
2
  import { TableNode } from './table-node.js';
3
3
  import { ConstraintNode } from './constraint-node.js';
4
4
  import { ColumnDefinitionNode } from './column-definition-node.js';
5
- export declare type OnCommitAction = 'preserve rows' | 'delete rows' | 'drop';
6
- export declare type CreateTableNodeParams = Omit<CreateTableNode, 'kind' | 'table' | 'columns' | 'constraints'>;
5
+ import { ArrayItemType } from '../util/type-utils.js';
6
+ import { RawNode } from './raw-node.js';
7
+ export declare const ON_COMMIT_ACTIONS: string[];
8
+ export declare type OnCommitAction = ArrayItemType<typeof ON_COMMIT_ACTIONS>;
9
+ export declare type CreateTableNodeParams = Omit<CreateTableNode, 'kind' | 'table' | 'columns' | 'constraints' | 'frontModifiers' | 'endModifiers'>;
7
10
  export interface CreateTableNode extends OperationNode {
8
11
  readonly kind: 'CreateTableNode';
9
12
  readonly table: TableNode;
@@ -12,6 +15,8 @@ export interface CreateTableNode extends OperationNode {
12
15
  readonly temporary?: boolean;
13
16
  readonly ifNotExists?: boolean;
14
17
  readonly onCommit?: OnCommitAction;
18
+ readonly frontModifiers?: ReadonlyArray<RawNode>;
19
+ readonly endModifiers?: ReadonlyArray<RawNode>;
15
20
  }
16
21
  /**
17
22
  * @internal
@@ -21,5 +26,7 @@ export declare const CreateTableNode: Readonly<{
21
26
  create(table: TableNode): CreateTableNode;
22
27
  cloneWithColumn(createTable: CreateTableNode, column: ColumnDefinitionNode): CreateTableNode;
23
28
  cloneWithConstraint(createTable: CreateTableNode, constraint: ConstraintNode): CreateTableNode;
29
+ cloneWithFrontModifier(createTable: CreateTableNode, modifier: RawNode): CreateTableNode;
30
+ cloneWithEndModifier(createTable: CreateTableNode, modifier: RawNode): CreateTableNode;
24
31
  cloneWith(createTable: CreateTableNode, params: CreateTableNodeParams): CreateTableNode;
25
32
  }>;
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CreateTableNode = void 0;
3
+ exports.CreateTableNode = exports.ON_COMMIT_ACTIONS = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
+ exports.ON_COMMIT_ACTIONS = ['preserve rows', 'delete rows', 'drop'];
5
6
  /**
6
7
  * @internal
7
8
  */
@@ -30,6 +31,22 @@ exports.CreateTableNode = (0, object_utils_js_1.freeze)({
30
31
  : (0, object_utils_js_1.freeze)([constraint]),
31
32
  });
32
33
  },
34
+ cloneWithFrontModifier(createTable, modifier) {
35
+ return (0, object_utils_js_1.freeze)({
36
+ ...createTable,
37
+ frontModifiers: createTable.frontModifiers
38
+ ? (0, object_utils_js_1.freeze)([...createTable.frontModifiers, modifier])
39
+ : (0, object_utils_js_1.freeze)([modifier]),
40
+ });
41
+ },
42
+ cloneWithEndModifier(createTable, modifier) {
43
+ return (0, object_utils_js_1.freeze)({
44
+ ...createTable,
45
+ endModifiers: createTable.endModifiers
46
+ ? (0, object_utils_js_1.freeze)([...createTable.endModifiers, modifier])
47
+ : (0, object_utils_js_1.freeze)([modifier]),
48
+ });
49
+ },
33
50
  cloneWith(createTable, params) {
34
51
  return (0, object_utils_js_1.freeze)({
35
52
  ...createTable,
@@ -1,5 +1,5 @@
1
1
  import { OperationNode } from './operation-node.js';
2
- export declare type ColumnDataType = 'varchar' | `varchar(${number})` | 'text' | 'integer' | 'int2' | 'int4' | 'int8' | 'bigint' | 'boolean' | 'real' | 'double precision' | 'float4' | 'float8' | 'decimal' | `decimal(${number}, ${number})` | 'numeric' | `numeric(${number}, ${number})` | 'binary' | 'date' | 'datetime' | 'time' | 'timetz' | 'timestamp' | 'timestamptz' | 'serial' | 'bigserial' | 'uuid' | 'json' | 'jsonb' | 'blob';
2
+ export declare type ColumnDataType = 'varchar' | `varchar(${number})` | 'text' | 'integer' | 'int2' | 'int4' | 'int8' | 'bigint' | 'boolean' | 'real' | 'double precision' | 'float4' | 'float8' | 'decimal' | `decimal(${number}, ${number})` | 'numeric' | `numeric(${number}, ${number})` | 'binary' | 'date' | 'datetime' | `datetime(${number})` | 'time' | `time(${number})` | 'timetz' | `timetz(${number})` | 'timestamp' | `timestamp(${number})` | 'timestamptz' | `timestamptz(${number})` | 'serial' | 'bigserial' | 'uuid' | 'json' | 'jsonb' | 'blob';
3
3
  export declare type DataTypeParams = Omit<DataTypeNode, 'kind' | 'dataType'>;
4
4
  export interface DataTypeNode extends OperationNode {
5
5
  readonly kind: 'DataTypeNode';
@@ -8,6 +8,7 @@ import { WithNode } from './with-node.js';
8
8
  import { LimitNode } from './limit-node.js';
9
9
  import { OrderByNode } from './order-by-node.js';
10
10
  import { OrderByItemNode } from './order-by-item-node.js';
11
+ import { ExplainNode } from './explain-node.js';
11
12
  export interface DeleteQueryNode extends OperationNode {
12
13
  readonly kind: 'DeleteQueryNode';
13
14
  readonly from: FromNode;
@@ -17,6 +18,7 @@ export interface DeleteQueryNode extends OperationNode {
17
18
  readonly with?: WithNode;
18
19
  readonly orderBy?: OrderByNode;
19
20
  readonly limit?: LimitNode;
21
+ readonly explain?: ExplainNode;
20
22
  }
21
23
  /**
22
24
  * @internal
@@ -26,4 +28,5 @@ export declare const DeleteQueryNode: Readonly<{
26
28
  create(fromItem: TableExpressionNode, withNode?: WithNode): DeleteQueryNode;
27
29
  cloneWithOrderByItem(deleteNode: DeleteQueryNode, item: OrderByItemNode): DeleteQueryNode;
28
30
  cloneWithLimit(deleteNode: DeleteQueryNode, limit: LimitNode): DeleteQueryNode;
31
+ cloneWithExplain(deleteNode: DeleteQueryNode, explain: ExplainNode): DeleteQueryNode;
29
32
  }>;
@@ -32,4 +32,10 @@ exports.DeleteQueryNode = (0, object_utils_js_1.freeze)({
32
32
  limit,
33
33
  });
34
34
  },
35
+ cloneWithExplain(deleteNode, explain) {
36
+ return (0, object_utils_js_1.freeze)({
37
+ ...deleteNode,
38
+ explain,
39
+ });
40
+ },
35
41
  });