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
@@ -121,6 +121,31 @@ class MysqlConnection {
121
121
  });
122
122
  });
123
123
  }
124
+ async *streamQuery(compiledQuery, chunkSize) {
125
+ const stream = this.#rawConnection
126
+ .query(compiledQuery.sql, compiledQuery.parameters)
127
+ .stream({
128
+ objectMode: true,
129
+ });
130
+ try {
131
+ for await (const row of stream) {
132
+ yield {
133
+ rows: [row],
134
+ };
135
+ }
136
+ }
137
+ catch (ex) {
138
+ if (ex &&
139
+ typeof ex === 'object' &&
140
+ 'code' in ex &&
141
+ // @ts-ignore
142
+ ex.code === 'ERR_STREAM_PREMATURE_CLOSE') {
143
+ // Most likely because of https://github.com/mysqljs/mysql/blob/master/lib/protocol/sequences/Query.js#L220
144
+ return;
145
+ }
146
+ throw ex;
147
+ }
148
+ }
124
149
  [PRIVATE_RELEASE_METHOD]() {
125
150
  this.#rawConnection.release();
126
151
  }
@@ -28,6 +28,8 @@ export class MysqlIntrospector {
28
28
  'extra',
29
29
  ])
30
30
  .where('table_schema', '=', sql `database()`)
31
+ .orderBy('table_name')
32
+ .orderBy('column_name')
31
33
  .castTo();
32
34
  if (!options.withInternalKyselyTables) {
33
35
  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
  }
@@ -1,13 +1,29 @@
1
1
  /// <reference types="./mysql-query-compiler.d.ts" />
2
2
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
3
+ const ID_WRAP_REGEX = /`/g;
3
4
  export class MysqlQueryCompiler extends DefaultQueryCompiler {
4
5
  getCurrentParameterPlaceholder() {
5
6
  return '?';
6
7
  }
8
+ getLeftExplainOptionsWrapper() {
9
+ return '';
10
+ }
11
+ getExplainOptionAssignment() {
12
+ return '=';
13
+ }
14
+ getExplainOptionsDelimiter() {
15
+ return ' ';
16
+ }
17
+ getRightExplainOptionsWrapper() {
18
+ return '';
19
+ }
7
20
  getLeftIdentifierWrapper() {
8
21
  return '`';
9
22
  }
10
23
  getRightIdentifierWrapper() {
11
24
  return '`';
12
25
  }
26
+ sanitizeIdentifier(identifier) {
27
+ return identifier.replace(ID_WRAP_REGEX, '``');
28
+ }
13
29
  }
@@ -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 {};
@@ -19,7 +19,9 @@ export class PostgresDriver {
19
19
  const client = await this.#pool.connect();
20
20
  let connection = this.#connections.get(client);
21
21
  if (!connection) {
22
- connection = new PostgresConnection(client);
22
+ connection = new PostgresConnection(client, {
23
+ cursor: this.#config.cursor ?? null,
24
+ });
23
25
  this.#connections.set(client, connection);
24
26
  // The driver must take care of calling `onCreateConnection` when a new
25
27
  // connection is created. The `pg` module doesn't provide an async hook
@@ -57,8 +59,10 @@ export class PostgresDriver {
57
59
  }
58
60
  class PostgresConnection {
59
61
  #client;
60
- constructor(client) {
62
+ #options;
63
+ constructor(client, options) {
61
64
  this.#client = client;
65
+ this.#options = options;
62
66
  }
63
67
  async executeQuery(compiledQuery) {
64
68
  try {
@@ -79,6 +83,24 @@ class PostgresConnection {
79
83
  throw extendStackTrace(err, new Error());
80
84
  }
81
85
  }
86
+ async *streamQuery(compiledQuery, chunkSize) {
87
+ if (!this.#options.cursor) {
88
+ throw new Error("'cursor' is not present in your postgres dialect config. It's required to make streaming work in postgres.");
89
+ }
90
+ const cursor = this.#client.query(new this.#options.cursor(compiledQuery.sql, compiledQuery.parameters));
91
+ while (true) {
92
+ if (cursor.state === 'done') {
93
+ break;
94
+ }
95
+ if (cursor.state === 'error') {
96
+ throw cursor._error;
97
+ }
98
+ const rows = await cursor.read(chunkSize);
99
+ yield {
100
+ rows,
101
+ };
102
+ }
103
+ }
82
104
  [PRIVATE_RELEASE_METHOD]() {
83
105
  this.#client.release();
84
106
  }
@@ -19,7 +19,10 @@ export class PostgresIntrospector {
19
19
  let query = this.#db
20
20
  .selectFrom('pg_catalog.pg_attribute as a')
21
21
  .innerJoin('pg_catalog.pg_class as c', 'a.attrelid', 'c.oid')
22
- .innerJoin('pg_catalog.pg_tables as t', 't.tablename', 'c.relname')
22
+ .innerJoin('pg_catalog.pg_namespace as ns', 'c.relnamespace', 'ns.oid')
23
+ .innerJoin('pg_catalog.pg_tables as t', (join) => join
24
+ .onRef('t.tablename', '=', 'c.relname')
25
+ .onRef('t.schemaname', '=', 'ns.nspname'))
23
26
  .innerJoin('pg_catalog.pg_type as typ', 'a.atttypid', 'typ.oid')
24
27
  .select([
25
28
  'a.attname as column',
@@ -41,6 +44,9 @@ export class PostgresIntrospector {
41
44
  .where('t.schemaname', '!=', 'information_schema')
42
45
  .where('a.attnum', '>=', 0) // No system columns
43
46
  .where('a.attisdropped', '!=', true)
47
+ .orderBy('t.schemaname')
48
+ .orderBy('t.tablename')
49
+ .orderBy('a.attname')
44
50
  .castTo();
45
51
  if (!options.withInternalKyselyTables) {
46
52
  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
  }
@@ -1,13 +1,8 @@
1
1
  /// <reference types="./postgres-query-compiler.d.ts" />
2
2
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
3
+ const ID_WRAP_REGEX = /"/g;
3
4
  export class PostgresQueryCompiler extends DefaultQueryCompiler {
4
- getCurrentParameterPlaceholder() {
5
- return '$' + this.numParameters;
6
- }
7
- getLeftIdentifierWrapper() {
8
- return '"';
9
- }
10
- getRightIdentifierWrapper() {
11
- return '"';
5
+ sanitizeIdentifier(identifier) {
6
+ return identifier.replace(ID_WRAP_REGEX, '""');
12
7
  }
13
8
  }
@@ -66,6 +66,9 @@ class SqliteConnection {
66
66
  });
67
67
  }
68
68
  }
69
+ async *streamQuery() {
70
+ throw new Error("Sqlite driver doesn't support streaming");
71
+ }
69
72
  }
70
73
  class ConnectionMutex {
71
74
  #promise;
@@ -16,6 +16,7 @@ export class SqliteIntrospector {
16
16
  .where('type', '=', 'table')
17
17
  .where('name', 'not like', 'sqlite_%')
18
18
  .select('name')
19
+ .orderBy('name')
19
20
  .castTo();
20
21
  if (!options.withInternalKyselyTables) {
21
22
  query = query
@@ -48,6 +49,7 @@ export class SqliteIntrospector {
48
49
  const columns = await db
49
50
  .selectFrom(sql `pragma_table_info(${table})`.as('table_info'))
50
51
  .select(['name', 'type', 'notnull', 'dflt_value'])
52
+ .orderBy('name')
51
53
  .execute();
52
54
  return {
53
55
  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
  }
@@ -1,9 +1,16 @@
1
1
  /// <reference types="./sqlite-query-compiler.d.ts" />
2
2
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
3
+ const ID_WRAP_REGEX = /"/g;
3
4
  export class SqliteQueryCompiler extends DefaultQueryCompiler {
4
5
  getCurrentParameterPlaceholder() {
5
6
  return '?';
6
7
  }
8
+ getLeftExplainOptionsWrapper() {
9
+ return '';
10
+ }
11
+ getRightExplainOptionsWrapper() {
12
+ return '';
13
+ }
7
14
  getLeftIdentifierWrapper() {
8
15
  return '"';
9
16
  }
@@ -13,4 +20,7 @@ export class SqliteQueryCompiler extends DefaultQueryCompiler {
13
20
  getAutoIncrement() {
14
21
  return 'autoincrement';
15
22
  }
23
+ sanitizeIdentifier(identifier) {
24
+ return identifier.replace(ID_WRAP_REGEX, '""');
25
+ }
16
26
  }
@@ -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
  /**
@@ -64,4 +64,7 @@ class DummyConnection {
64
64
  rows: [],
65
65
  };
66
66
  }
67
+ async *streamQuery() {
68
+ // Nothing to do here.
69
+ }
67
70
  }
@@ -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/esm/index.js CHANGED
@@ -26,7 +26,9 @@ export * from './query-compiler/default-query-compiler.js';
26
26
  export * from './query-compiler/compiled-query.js';
27
27
  export * from './schema/schema.js';
28
28
  export * from './schema/create-table-builder.js';
29
+ export * from './schema/create-type-builder.js';
29
30
  export * from './schema/drop-table-builder.js';
31
+ export * from './schema/drop-type-builder.js';
30
32
  export * from './schema/create-index-builder.js';
31
33
  export * from './schema/drop-index-builder.js';
32
34
  export * from './schema/create-schema-builder.js';
@@ -88,6 +90,7 @@ export * from './operation-node/constraint-node.js';
88
90
  export * from './operation-node/create-index-node.js';
89
91
  export * from './operation-node/create-schema-node.js';
90
92
  export * from './operation-node/create-table-node.js';
93
+ export * from './operation-node/create-type-node.js';
91
94
  export * from './operation-node/create-view-node.js';
92
95
  export * from './operation-node/data-type-node.js';
93
96
  export * from './operation-node/default-value-node.js';
@@ -97,6 +100,7 @@ export * from './operation-node/drop-constraint-node.js';
97
100
  export * from './operation-node/drop-index-node.js';
98
101
  export * from './operation-node/drop-schema-node.js';
99
102
  export * from './operation-node/drop-table-node.js';
103
+ export * from './operation-node/drop-type-node.js';
100
104
  export * from './operation-node/drop-view-node.js';
101
105
  export * from './operation-node/filter-node.js';
102
106
  export * from './operation-node/foreign-key-constraint-node.js';
@@ -146,6 +150,8 @@ export * from './operation-node/value-node.js';
146
150
  export * from './operation-node/values-node.js';
147
151
  export * from './operation-node/where-node.js';
148
152
  export * from './operation-node/with-node.js';
153
+ export * from './operation-node/explain-node.js';
149
154
  export * from './util/column-type.js';
150
155
  export * from './util/compilable.js';
156
+ export * from './util/explainable.js';
151
157
  export * from './util/log.js';
@@ -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,5 +1,6 @@
1
1
  /// <reference types="./create-table-node.d.ts" />
2
2
  import { freeze } from '../util/object-utils.js';
3
+ export const ON_COMMIT_ACTIONS = ['preserve rows', 'delete rows', 'drop'];
3
4
  /**
4
5
  * @internal
5
6
  */
@@ -28,6 +29,22 @@ export const CreateTableNode = freeze({
28
29
  : freeze([constraint]),
29
30
  });
30
31
  },
32
+ cloneWithFrontModifier(createTable, modifier) {
33
+ return freeze({
34
+ ...createTable,
35
+ frontModifiers: createTable.frontModifiers
36
+ ? freeze([...createTable.frontModifiers, modifier])
37
+ : freeze([modifier]),
38
+ });
39
+ },
40
+ cloneWithEndModifier(createTable, modifier) {
41
+ return freeze({
42
+ ...createTable,
43
+ endModifiers: createTable.endModifiers
44
+ ? freeze([...createTable.endModifiers, modifier])
45
+ : freeze([modifier]),
46
+ });
47
+ },
31
48
  cloneWith(createTable, params) {
32
49
  return freeze({
33
50
  ...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
  }>;
@@ -30,4 +30,10 @@ export const DeleteQueryNode = freeze({
30
30
  limit,
31
31
  });
32
32
  },
33
+ cloneWithExplain(deleteNode, explain) {
34
+ return freeze({
35
+ ...deleteNode,
36
+ explain,
37
+ });
38
+ },
33
39
  });
@@ -0,0 +1,16 @@
1
+ import { ExplainFormat } from '../util/explainable.js';
2
+ import { AnyRawBuilder } from '../util/type-utils.js';
3
+ import { OperationNode } from './operation-node.js';
4
+ import { RawNode } from './raw-node.js';
5
+ export interface ExplainNode extends OperationNode {
6
+ readonly kind: 'ExplainNode';
7
+ readonly format?: ExplainFormat;
8
+ readonly options?: RawNode;
9
+ }
10
+ /**
11
+ * @internal
12
+ */
13
+ export declare const ExplainNode: Readonly<{
14
+ is(node: OperationNode): node is ExplainNode;
15
+ create(format?: ExplainFormat, options?: AnyRawBuilder): ExplainNode;
16
+ }>;
@@ -0,0 +1,17 @@
1
+ /// <reference types="./explain-node.d.ts" />
2
+ import { freeze } from '../util/object-utils.js';
3
+ /**
4
+ * @internal
5
+ */
6
+ export const ExplainNode = freeze({
7
+ is(node) {
8
+ return node.kind === 'ExplainNode';
9
+ },
10
+ create(format, options) {
11
+ return freeze({
12
+ kind: 'ExplainNode',
13
+ format,
14
+ options: options?.toOperationNode(),
15
+ });
16
+ },
17
+ });
@@ -20,8 +20,8 @@ export declare const ForeignKeyConstraintNode: Readonly<{
20
20
  create(sourceColumns: ReadonlyArray<ColumnNode>, targetTable: TableNode, targetColumns: ReadonlyArray<ColumnNode>, constraintName?: string): ForeignKeyConstraintNode;
21
21
  cloneWith(node: ForeignKeyConstraintNode, props: ForeignKeyConstraintNodeProps): Readonly<{
22
22
  name?: IdentifierNode | undefined;
23
- onDelete?: OnModifyForeignAction | undefined;
24
- onUpdate?: OnModifyForeignAction | undefined;
23
+ onDelete?: "no action" | "restrict" | "cascade" | "set null" | "set default" | undefined;
24
+ onUpdate?: "no action" | "restrict" | "cascade" | "set null" | "set default" | undefined;
25
25
  kind: 'ForeignKeyConstraintNode';
26
26
  columns: ReadonlyArray<ColumnNode>;
27
27
  references: ReferencesNode;
@@ -1,4 +1,5 @@
1
1
  import { ColumnNode } from './column-node.js';
2
+ import { ExplainNode } from './explain-node.js';
2
3
  import { OnConflictNode } from './on-conflict-node.js';
3
4
  import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
4
5
  import { OperationNode } from './operation-node.js';
@@ -19,12 +20,14 @@ export interface InsertQueryNode extends OperationNode {
19
20
  readonly onDuplicateKey?: OnDuplicateKeyNode;
20
21
  readonly with?: WithNode;
21
22
  readonly ignore?: boolean;
23
+ readonly replace?: boolean;
24
+ readonly explain?: ExplainNode;
22
25
  }
23
26
  /**
24
27
  * @internal
25
28
  */
26
29
  export declare const InsertQueryNode: Readonly<{
27
30
  is(node: OperationNode): node is InsertQueryNode;
28
- create(into: TableNode, withNode?: WithNode): InsertQueryNode;
31
+ create(into: TableNode, withNode?: WithNode, replace?: boolean): InsertQueryNode;
29
32
  cloneWith(insertQuery: InsertQueryNode, props: InsertQueryNodeProps): InsertQueryNode;
30
33
  }>;
@@ -7,11 +7,12 @@ export const InsertQueryNode = freeze({
7
7
  is(node) {
8
8
  return node.kind === 'InsertQueryNode';
9
9
  },
10
- create(into, withNode) {
10
+ create(into, withNode, replace) {
11
11
  return freeze({
12
12
  kind: 'InsertQueryNode',
13
13
  into,
14
14
  ...(withNode && { with: withNode }),
15
+ replace,
15
16
  });
16
17
  },
17
18
  cloneWith(insertQuery, props) {
@@ -68,6 +68,7 @@ import { ValuesNode } from './values-node.js';
68
68
  import { SelectModifierNode } from './select-modifier-node.js';
69
69
  import { CreateTypeNode } from './create-type-node.js';
70
70
  import { DropTypeNode } from './drop-type-node.js';
71
+ import { ExplainNode } from './explain-node.js';
71
72
  /**
72
73
  * Transforms an operation node tree into another one.
73
74
  *
@@ -172,4 +173,5 @@ export declare class OperationNodeTransformer {
172
173
  protected transformValue(node: ValueNode): ValueNode;
173
174
  protected transformPrimitiveValueList(node: PrimitiveValueListNode): PrimitiveValueListNode;
174
175
  protected transformOperator(node: OperatorNode): OperatorNode;
176
+ protected transformExplain(node: ExplainNode): ExplainNode;
175
177
  }