knex 2.5.0 → 2.5.1

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 (167) hide show
  1. package/CHANGELOG.md +64 -58
  2. package/CONTRIBUTING.md +194 -194
  3. package/README.md +149 -147
  4. package/UPGRADING.md +245 -233
  5. package/bin/cli.js +475 -473
  6. package/bin/utils/cli-config-utils.js +212 -210
  7. package/bin/utils/constants.js +7 -7
  8. package/bin/utils/migrationsLister.js +37 -37
  9. package/knex.js +23 -23
  10. package/knex.mjs +11 -11
  11. package/lib/builder-interface-augmenter.js +120 -120
  12. package/lib/client.js +495 -495
  13. package/lib/constants.js +61 -61
  14. package/lib/dialects/better-sqlite3/index.js +77 -77
  15. package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
  16. package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
  17. package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
  18. package/lib/dialects/cockroachdb/crdb-tablecompiler.js +37 -37
  19. package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
  20. package/lib/dialects/cockroachdb/index.js +86 -86
  21. package/lib/dialects/index.js +20 -20
  22. package/lib/dialects/mssql/index.js +500 -500
  23. package/lib/dialects/mssql/mssql-formatter.js +34 -34
  24. package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -601
  25. package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
  26. package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
  27. package/lib/dialects/mssql/schema/mssql-tablecompiler.js +378 -378
  28. package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
  29. package/lib/dialects/mssql/transaction.js +176 -176
  30. package/lib/dialects/mysql/index.js +201 -201
  31. package/lib/dialects/mysql/query/mysql-querycompiler.js +274 -274
  32. package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
  33. package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
  34. package/lib/dialects/mysql/schema/mysql-tablecompiler.js +381 -381
  35. package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
  36. package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
  37. package/lib/dialects/mysql/transaction.js +46 -46
  38. package/lib/dialects/mysql2/index.js +53 -53
  39. package/lib/dialects/mysql2/transaction.js +44 -44
  40. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  41. package/lib/dialects/oracle/index.js +92 -92
  42. package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -343
  43. package/lib/dialects/oracle/schema/internal/incrementUtils.js +20 -20
  44. package/lib/dialects/oracle/schema/internal/trigger.js +135 -135
  45. package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
  46. package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
  47. package/lib/dialects/oracle/schema/oracle-compiler.js +122 -122
  48. package/lib/dialects/oracle/schema/oracle-tablecompiler.js +190 -190
  49. package/lib/dialects/oracle/utils.js +87 -87
  50. package/lib/dialects/oracledb/index.js +327 -327
  51. package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
  52. package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -61
  53. package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
  54. package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
  55. package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
  56. package/lib/dialects/oracledb/transaction.js +98 -98
  57. package/lib/dialects/oracledb/utils.js +208 -208
  58. package/lib/dialects/pgnative/index.js +60 -60
  59. package/lib/dialects/postgres/execution/pg-transaction.js +19 -19
  60. package/lib/dialects/postgres/index.js +358 -358
  61. package/lib/dialects/postgres/query/pg-querybuilder.js +43 -43
  62. package/lib/dialects/postgres/query/pg-querycompiler.js +400 -400
  63. package/lib/dialects/postgres/schema/pg-columncompiler.js +156 -156
  64. package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
  65. package/lib/dialects/postgres/schema/pg-tablecompiler.js +304 -304
  66. package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
  67. package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
  68. package/lib/dialects/redshift/index.js +86 -86
  69. package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
  70. package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
  71. package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
  72. package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
  73. package/lib/dialects/redshift/schema/redshift-tablecompiler.js +122 -122
  74. package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
  75. package/lib/dialects/redshift/transaction.js +32 -32
  76. package/lib/dialects/sqlite3/execution/sqlite-transaction.js +25 -25
  77. package/lib/dialects/sqlite3/index.js +250 -250
  78. package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
  79. package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +334 -334
  80. package/lib/dialects/sqlite3/schema/ddl.js +400 -400
  81. package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
  82. package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
  83. package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
  84. package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
  85. package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
  86. package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
  87. package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
  88. package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
  89. package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +347 -347
  90. package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
  91. package/lib/execution/batch-insert.js +51 -51
  92. package/lib/execution/internal/delay.js +6 -6
  93. package/lib/execution/internal/ensure-connection-callback.js +41 -41
  94. package/lib/execution/internal/query-executioner.js +62 -62
  95. package/lib/execution/runner.js +325 -325
  96. package/lib/execution/transaction.js +409 -409
  97. package/lib/formatter/formatterUtils.js +42 -42
  98. package/lib/formatter/rawFormatter.js +84 -84
  99. package/lib/formatter/wrappingFormatter.js +250 -250
  100. package/lib/formatter.js +25 -25
  101. package/lib/index.js +3 -3
  102. package/lib/knex-builder/FunctionHelper.js +80 -80
  103. package/lib/knex-builder/Knex.js +59 -59
  104. package/lib/knex-builder/internal/config-resolver.js +57 -57
  105. package/lib/knex-builder/internal/parse-connection.js +87 -87
  106. package/lib/knex-builder/make-knex.js +345 -345
  107. package/lib/logger.js +76 -76
  108. package/lib/migrations/common/MigrationsLoader.js +36 -36
  109. package/lib/migrations/migrate/MigrationGenerator.js +84 -84
  110. package/lib/migrations/migrate/Migrator.js +598 -598
  111. package/lib/migrations/migrate/migrate-stub.js +17 -17
  112. package/lib/migrations/migrate/migration-list-resolver.js +33 -33
  113. package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
  114. package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
  115. package/lib/migrations/migrate/table-creator.js +77 -77
  116. package/lib/migrations/migrate/table-resolver.js +27 -27
  117. package/lib/migrations/seed/Seeder.js +137 -137
  118. package/lib/migrations/seed/seed-stub.js +13 -13
  119. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  120. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  121. package/lib/migrations/util/fs.js +86 -86
  122. package/lib/migrations/util/import-file.js +12 -12
  123. package/lib/migrations/util/is-module-type.js +9 -9
  124. package/lib/migrations/util/template.js +52 -52
  125. package/lib/migrations/util/timestamp.js +14 -14
  126. package/lib/query/analytic.js +52 -52
  127. package/lib/query/constants.js +15 -15
  128. package/lib/query/joinclause.js +270 -270
  129. package/lib/query/method-constants.js +136 -136
  130. package/lib/query/querybuilder.js +1793 -1793
  131. package/lib/query/querycompiler.js +1591 -1591
  132. package/lib/raw.js +139 -139
  133. package/lib/ref.js +39 -39
  134. package/lib/schema/builder.js +115 -115
  135. package/lib/schema/columnbuilder.js +146 -146
  136. package/lib/schema/columncompiler.js +307 -307
  137. package/lib/schema/compiler.js +187 -187
  138. package/lib/schema/internal/helpers.js +55 -55
  139. package/lib/schema/tablebuilder.js +376 -376
  140. package/lib/schema/tablecompiler.js +433 -433
  141. package/lib/schema/viewbuilder.js +92 -92
  142. package/lib/schema/viewcompiler.js +138 -138
  143. package/lib/util/finally-mixin.js +13 -13
  144. package/lib/util/helpers.js +95 -95
  145. package/lib/util/is.js +32 -32
  146. package/lib/util/nanoid.js +40 -40
  147. package/lib/util/noop.js +1 -1
  148. package/lib/util/save-async-stack.js +14 -14
  149. package/lib/util/security.js +26 -26
  150. package/lib/util/string.js +190 -190
  151. package/lib/util/timeout.js +29 -29
  152. package/package.json +11 -10
  153. package/scripts/build.js +125 -125
  154. package/scripts/clean.js +31 -31
  155. package/scripts/docker-compose.yml +152 -152
  156. package/scripts/next-release-howto.md +24 -24
  157. package/scripts/release.sh +2 -0
  158. package/scripts/runkit-example.js +35 -34
  159. package/scripts/stress-test/docker-compose.yml +57 -57
  160. package/scripts/stress-test/knex-stress-test.js +212 -208
  161. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -145
  162. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -100
  163. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -184
  164. package/scripts/update_gitignore_for_tsc_output.js +90 -90
  165. package/types/index.d.ts +3274 -3273
  166. package/types/result.d.ts +27 -27
  167. package/types/tables.d.ts +4 -4
package/lib/constants.js CHANGED
@@ -1,61 +1,61 @@
1
- // The client names we'll allow in the `{name: lib}` pairing.
2
- const CLIENT_ALIASES = Object.freeze({
3
- pg: 'postgres',
4
- postgresql: 'postgres',
5
- sqlite: 'sqlite3',
6
- });
7
-
8
- const SUPPORTED_CLIENTS = Object.freeze(
9
- [
10
- 'mssql',
11
- 'mysql',
12
- 'mysql2',
13
- 'oracledb',
14
- 'postgres',
15
- 'pgnative',
16
- 'redshift',
17
- 'sqlite3',
18
- 'cockroachdb',
19
- 'better-sqlite3',
20
- ].concat(Object.keys(CLIENT_ALIASES))
21
- );
22
-
23
- const DRIVER_NAMES = Object.freeze({
24
- MsSQL: 'mssql',
25
- MySQL: 'mysql',
26
- MySQL2: 'mysql2',
27
- Oracle: 'oracledb',
28
- PostgreSQL: 'pg',
29
- PgNative: 'pgnative',
30
- Redshift: 'pg-redshift',
31
- SQLite: 'sqlite3',
32
- CockroachDB: 'cockroachdb',
33
- BetterSQLite3: 'better-sqlite3',
34
- });
35
-
36
- const POOL_CONFIG_OPTIONS = Object.freeze([
37
- 'maxWaitingClients',
38
- 'testOnBorrow',
39
- 'fifo',
40
- 'priorityRange',
41
- 'autostart',
42
- 'evictionRunIntervalMillis',
43
- 'numTestsPerRun',
44
- 'softIdleTimeoutMillis',
45
- 'Promise',
46
- ]);
47
-
48
- /**
49
- * Regex that only matches comma's in strings that aren't wrapped in parentheses. Can be used to
50
- * safely split strings like `id int, name string, body text, primary key (id, name)` into definition
51
- * rows
52
- */
53
- const COMMA_NO_PAREN_REGEX = /,[\s](?![^(]*\))/g;
54
-
55
- module.exports = {
56
- CLIENT_ALIASES,
57
- SUPPORTED_CLIENTS,
58
- POOL_CONFIG_OPTIONS,
59
- COMMA_NO_PAREN_REGEX,
60
- DRIVER_NAMES,
61
- };
1
+ // The client names we'll allow in the `{name: lib}` pairing.
2
+ const CLIENT_ALIASES = Object.freeze({
3
+ pg: 'postgres',
4
+ postgresql: 'postgres',
5
+ sqlite: 'sqlite3',
6
+ });
7
+
8
+ const SUPPORTED_CLIENTS = Object.freeze(
9
+ [
10
+ 'mssql',
11
+ 'mysql',
12
+ 'mysql2',
13
+ 'oracledb',
14
+ 'postgres',
15
+ 'pgnative',
16
+ 'redshift',
17
+ 'sqlite3',
18
+ 'cockroachdb',
19
+ 'better-sqlite3',
20
+ ].concat(Object.keys(CLIENT_ALIASES))
21
+ );
22
+
23
+ const DRIVER_NAMES = Object.freeze({
24
+ MsSQL: 'mssql',
25
+ MySQL: 'mysql',
26
+ MySQL2: 'mysql2',
27
+ Oracle: 'oracledb',
28
+ PostgreSQL: 'pg',
29
+ PgNative: 'pgnative',
30
+ Redshift: 'pg-redshift',
31
+ SQLite: 'sqlite3',
32
+ CockroachDB: 'cockroachdb',
33
+ BetterSQLite3: 'better-sqlite3',
34
+ });
35
+
36
+ const POOL_CONFIG_OPTIONS = Object.freeze([
37
+ 'maxWaitingClients',
38
+ 'testOnBorrow',
39
+ 'fifo',
40
+ 'priorityRange',
41
+ 'autostart',
42
+ 'evictionRunIntervalMillis',
43
+ 'numTestsPerRun',
44
+ 'softIdleTimeoutMillis',
45
+ 'Promise',
46
+ ]);
47
+
48
+ /**
49
+ * Regex that only matches comma's in strings that aren't wrapped in parentheses. Can be used to
50
+ * safely split strings like `id int, name string, body text, primary key (id, name)` into definition
51
+ * rows
52
+ */
53
+ const COMMA_NO_PAREN_REGEX = /,[\s](?![^(]*\))/g;
54
+
55
+ module.exports = {
56
+ CLIENT_ALIASES,
57
+ SUPPORTED_CLIENTS,
58
+ POOL_CONFIG_OPTIONS,
59
+ COMMA_NO_PAREN_REGEX,
60
+ DRIVER_NAMES,
61
+ };
@@ -1,77 +1,77 @@
1
- // better-sqlite3 Client
2
- // -------
3
- const Client_SQLite3 = require('../sqlite3');
4
-
5
- class Client_BetterSQLite3 extends Client_SQLite3 {
6
- _driver() {
7
- return require('better-sqlite3');
8
- }
9
-
10
- // Get a raw connection from the database, returning a promise with the connection object.
11
- async acquireRawConnection() {
12
- const options = this.connectionSettings.options || {};
13
-
14
- return new this.driver(this.connectionSettings.filename, {
15
- nativeBinding: options.nativeBinding,
16
- readonly: !!options.readonly,
17
- });
18
- }
19
-
20
- // Used to explicitly close a connection, called internally by the pool when
21
- // a connection times out or the pool is shutdown.
22
- async destroyRawConnection(connection) {
23
- return connection.close();
24
- }
25
-
26
- // Runs the query on the specified connection, providing the bindings and any
27
- // other necessary prep work.
28
- async _query(connection, obj) {
29
- if (!obj.sql) throw new Error('The query is empty');
30
-
31
- if (!connection) {
32
- throw new Error('No connection provided');
33
- }
34
-
35
- const statement = connection.prepare(obj.sql);
36
- const bindings = this._formatBindings(obj.bindings);
37
-
38
- if (statement.reader) {
39
- const response = await statement.all(bindings);
40
- obj.response = response;
41
- return obj;
42
- }
43
-
44
- const response = await statement.run(bindings);
45
- obj.response = response;
46
- obj.context = {
47
- lastID: response.lastInsertRowid,
48
- changes: response.changes,
49
- };
50
-
51
- return obj;
52
- }
53
-
54
- _formatBindings(bindings) {
55
- if (!bindings) {
56
- return [];
57
- }
58
- return bindings.map((binding) => {
59
- if (binding instanceof Date) {
60
- return binding.valueOf();
61
- }
62
-
63
- if (typeof binding === 'boolean') {
64
- return Number(binding);
65
- }
66
-
67
- return binding;
68
- });
69
- }
70
- }
71
-
72
- Object.assign(Client_BetterSQLite3.prototype, {
73
- // The "dialect", for reference .
74
- driverName: 'better-sqlite3',
75
- });
76
-
77
- module.exports = Client_BetterSQLite3;
1
+ // better-sqlite3 Client
2
+ // -------
3
+ const Client_SQLite3 = require('../sqlite3');
4
+
5
+ class Client_BetterSQLite3 extends Client_SQLite3 {
6
+ _driver() {
7
+ return require('better-sqlite3');
8
+ }
9
+
10
+ // Get a raw connection from the database, returning a promise with the connection object.
11
+ async acquireRawConnection() {
12
+ const options = this.connectionSettings.options || {};
13
+
14
+ return new this.driver(this.connectionSettings.filename, {
15
+ nativeBinding: options.nativeBinding,
16
+ readonly: !!options.readonly,
17
+ });
18
+ }
19
+
20
+ // Used to explicitly close a connection, called internally by the pool when
21
+ // a connection times out or the pool is shutdown.
22
+ async destroyRawConnection(connection) {
23
+ return connection.close();
24
+ }
25
+
26
+ // Runs the query on the specified connection, providing the bindings and any
27
+ // other necessary prep work.
28
+ async _query(connection, obj) {
29
+ if (!obj.sql) throw new Error('The query is empty');
30
+
31
+ if (!connection) {
32
+ throw new Error('No connection provided');
33
+ }
34
+
35
+ const statement = connection.prepare(obj.sql);
36
+ const bindings = this._formatBindings(obj.bindings);
37
+
38
+ if (statement.reader) {
39
+ const response = await statement.all(bindings);
40
+ obj.response = response;
41
+ return obj;
42
+ }
43
+
44
+ const response = await statement.run(bindings);
45
+ obj.response = response;
46
+ obj.context = {
47
+ lastID: response.lastInsertRowid,
48
+ changes: response.changes,
49
+ };
50
+
51
+ return obj;
52
+ }
53
+
54
+ _formatBindings(bindings) {
55
+ if (!bindings) {
56
+ return [];
57
+ }
58
+ return bindings.map((binding) => {
59
+ if (binding instanceof Date) {
60
+ return binding.valueOf();
61
+ }
62
+
63
+ if (typeof binding === 'boolean') {
64
+ return Number(binding);
65
+ }
66
+
67
+ return binding;
68
+ });
69
+ }
70
+ }
71
+
72
+ Object.assign(Client_BetterSQLite3.prototype, {
73
+ // The "dialect", for reference .
74
+ driverName: 'better-sqlite3',
75
+ });
76
+
77
+ module.exports = Client_BetterSQLite3;
@@ -1,14 +1,14 @@
1
- const ColumnCompiler_PG = require('../postgres/schema/pg-columncompiler.js');
2
-
3
- class ColumnCompiler_CRDB extends ColumnCompiler_PG {
4
- uuid(options = { primaryKey: false }) {
5
- return (
6
- 'uuid' +
7
- (this.tableCompiler._canBeAddPrimaryKey(options)
8
- ? ' primary key default gen_random_uuid()'
9
- : '')
10
- );
11
- }
12
- }
13
-
14
- module.exports = ColumnCompiler_CRDB;
1
+ const ColumnCompiler_PG = require('../postgres/schema/pg-columncompiler.js');
2
+
3
+ class ColumnCompiler_CRDB extends ColumnCompiler_PG {
4
+ uuid(options = { primaryKey: false }) {
5
+ return (
6
+ 'uuid' +
7
+ (this.tableCompiler._canBeAddPrimaryKey(options)
8
+ ? ' primary key default gen_random_uuid()'
9
+ : '')
10
+ );
11
+ }
12
+ }
13
+
14
+ module.exports = ColumnCompiler_CRDB;
@@ -1,11 +1,11 @@
1
- const QueryBuilder = require('../../query/querybuilder');
2
- const isEmpty = require('lodash/isEmpty');
3
-
4
- module.exports = class QueryBuilder_CockroachDB extends QueryBuilder {
5
- upsert(values, returning, options) {
6
- this._method = 'upsert';
7
- if (!isEmpty(returning)) this.returning(returning, options);
8
- this._single.upsert = values;
9
- return this;
10
- }
11
- };
1
+ const QueryBuilder = require('../../query/querybuilder');
2
+ const isEmpty = require('lodash/isEmpty');
3
+
4
+ module.exports = class QueryBuilder_CockroachDB extends QueryBuilder {
5
+ upsert(values, returning, options) {
6
+ this._method = 'upsert';
7
+ if (!isEmpty(returning)) this.returning(returning, options);
8
+ this._single.upsert = values;
9
+ return this;
10
+ }
11
+ };
@@ -1,122 +1,122 @@
1
- const QueryCompiler_PG = require('../postgres/query/pg-querycompiler');
2
- const {
3
- columnize: columnize_,
4
- wrap: wrap_,
5
- operator: operator_,
6
- } = require('../../formatter/wrappingFormatter');
7
-
8
- class QueryCompiler_CRDB extends QueryCompiler_PG {
9
- truncate() {
10
- return `truncate ${this.tableName}`;
11
- }
12
-
13
- upsert() {
14
- let sql = this._upsert();
15
- if (sql === '') return sql;
16
- const { returning } = this.single;
17
- if (returning) sql += this._returning(returning);
18
- return {
19
- sql: sql,
20
- returning,
21
- };
22
- }
23
-
24
- _upsert() {
25
- const upsertValues = this.single.upsert || [];
26
- const sql = this.with() + `upsert into ${this.tableName} `;
27
- const body = this._insertBody(upsertValues);
28
- return body === '' ? '' : sql + body;
29
- }
30
-
31
- _groupOrder(item, type) {
32
- // CockroachDB don't support PostgreSQL order nulls first/last syntax, we take the generic one.
33
- return this._basicGroupOrder(item, type);
34
- }
35
-
36
- whereJsonPath(statement) {
37
- let castValue = '';
38
- if (!isNaN(statement.value) && parseInt(statement.value)) {
39
- castValue = '::int';
40
- } else if (!isNaN(statement.value) && parseFloat(statement.value)) {
41
- castValue = '::float';
42
- } else {
43
- castValue = " #>> '{}'";
44
- }
45
- return `json_extract_path(${this._columnClause(
46
- statement
47
- )}, ${this.client.toArrayPathFromJsonPath(
48
- statement.jsonPath,
49
- this.builder,
50
- this.bindingsHolder
51
- )})${castValue} ${operator_(
52
- statement.operator,
53
- this.builder,
54
- this.client,
55
- this.bindingsHolder
56
- )} ${this._jsonValueClause(statement)}`;
57
- }
58
-
59
- // Json common functions
60
- _jsonExtract(nameFunction, params) {
61
- let extractions;
62
- if (Array.isArray(params.column)) {
63
- extractions = params.column;
64
- } else {
65
- extractions = [params];
66
- }
67
- return extractions
68
- .map((extraction) => {
69
- const jsonCol = `json_extract_path(${columnize_(
70
- extraction.column || extraction[0],
71
- this.builder,
72
- this.client,
73
- this.bindingsHolder
74
- )}, ${this.client.toArrayPathFromJsonPath(
75
- extraction.path || extraction[1],
76
- this.builder,
77
- this.bindingsHolder
78
- )})`;
79
- const alias = extraction.alias || extraction[2];
80
- return alias
81
- ? this.client.alias(jsonCol, this.formatter.wrap(alias))
82
- : jsonCol;
83
- })
84
- .join(', ');
85
- }
86
-
87
- _onJsonPathEquals(nameJoinFunction, clause) {
88
- return (
89
- 'json_extract_path(' +
90
- wrap_(
91
- clause.columnFirst,
92
- undefined,
93
- this.builder,
94
- this.client,
95
- this.bindingsHolder
96
- ) +
97
- ', ' +
98
- this.client.toArrayPathFromJsonPath(
99
- clause.jsonPathFirst,
100
- this.builder,
101
- this.bindingsHolder
102
- ) +
103
- ') = json_extract_path(' +
104
- wrap_(
105
- clause.columnSecond,
106
- undefined,
107
- this.builder,
108
- this.client,
109
- this.bindingsHolder
110
- ) +
111
- ', ' +
112
- this.client.toArrayPathFromJsonPath(
113
- clause.jsonPathSecond,
114
- this.builder,
115
- this.bindingsHolder
116
- ) +
117
- ')'
118
- );
119
- }
120
- }
121
-
122
- module.exports = QueryCompiler_CRDB;
1
+ const QueryCompiler_PG = require('../postgres/query/pg-querycompiler');
2
+ const {
3
+ columnize: columnize_,
4
+ wrap: wrap_,
5
+ operator: operator_,
6
+ } = require('../../formatter/wrappingFormatter');
7
+
8
+ class QueryCompiler_CRDB extends QueryCompiler_PG {
9
+ truncate() {
10
+ return `truncate ${this.tableName}`;
11
+ }
12
+
13
+ upsert() {
14
+ let sql = this._upsert();
15
+ if (sql === '') return sql;
16
+ const { returning } = this.single;
17
+ if (returning) sql += this._returning(returning);
18
+ return {
19
+ sql: sql,
20
+ returning,
21
+ };
22
+ }
23
+
24
+ _upsert() {
25
+ const upsertValues = this.single.upsert || [];
26
+ const sql = this.with() + `upsert into ${this.tableName} `;
27
+ const body = this._insertBody(upsertValues);
28
+ return body === '' ? '' : sql + body;
29
+ }
30
+
31
+ _groupOrder(item, type) {
32
+ // CockroachDB don't support PostgreSQL order nulls first/last syntax, we take the generic one.
33
+ return this._basicGroupOrder(item, type);
34
+ }
35
+
36
+ whereJsonPath(statement) {
37
+ let castValue = '';
38
+ if (!isNaN(statement.value) && parseInt(statement.value)) {
39
+ castValue = '::int';
40
+ } else if (!isNaN(statement.value) && parseFloat(statement.value)) {
41
+ castValue = '::float';
42
+ } else {
43
+ castValue = " #>> '{}'";
44
+ }
45
+ return `json_extract_path(${this._columnClause(
46
+ statement
47
+ )}, ${this.client.toArrayPathFromJsonPath(
48
+ statement.jsonPath,
49
+ this.builder,
50
+ this.bindingsHolder
51
+ )})${castValue} ${operator_(
52
+ statement.operator,
53
+ this.builder,
54
+ this.client,
55
+ this.bindingsHolder
56
+ )} ${this._jsonValueClause(statement)}`;
57
+ }
58
+
59
+ // Json common functions
60
+ _jsonExtract(nameFunction, params) {
61
+ let extractions;
62
+ if (Array.isArray(params.column)) {
63
+ extractions = params.column;
64
+ } else {
65
+ extractions = [params];
66
+ }
67
+ return extractions
68
+ .map((extraction) => {
69
+ const jsonCol = `json_extract_path(${columnize_(
70
+ extraction.column || extraction[0],
71
+ this.builder,
72
+ this.client,
73
+ this.bindingsHolder
74
+ )}, ${this.client.toArrayPathFromJsonPath(
75
+ extraction.path || extraction[1],
76
+ this.builder,
77
+ this.bindingsHolder
78
+ )})`;
79
+ const alias = extraction.alias || extraction[2];
80
+ return alias
81
+ ? this.client.alias(jsonCol, this.formatter.wrap(alias))
82
+ : jsonCol;
83
+ })
84
+ .join(', ');
85
+ }
86
+
87
+ _onJsonPathEquals(nameJoinFunction, clause) {
88
+ return (
89
+ 'json_extract_path(' +
90
+ wrap_(
91
+ clause.columnFirst,
92
+ undefined,
93
+ this.builder,
94
+ this.client,
95
+ this.bindingsHolder
96
+ ) +
97
+ ', ' +
98
+ this.client.toArrayPathFromJsonPath(
99
+ clause.jsonPathFirst,
100
+ this.builder,
101
+ this.bindingsHolder
102
+ ) +
103
+ ') = json_extract_path(' +
104
+ wrap_(
105
+ clause.columnSecond,
106
+ undefined,
107
+ this.builder,
108
+ this.client,
109
+ this.bindingsHolder
110
+ ) +
111
+ ', ' +
112
+ this.client.toArrayPathFromJsonPath(
113
+ clause.jsonPathSecond,
114
+ this.builder,
115
+ this.bindingsHolder
116
+ ) +
117
+ ')'
118
+ );
119
+ }
120
+ }
121
+
122
+ module.exports = QueryCompiler_CRDB;
@@ -1,37 +1,37 @@
1
- /* eslint max-len: 0 */
2
-
3
- const TableCompiler = require('../postgres/schema/pg-tablecompiler');
4
-
5
- class TableCompiler_CRDB extends TableCompiler {
6
- constructor(client, tableBuilder) {
7
- super(client, tableBuilder);
8
- }
9
-
10
- addColumns(columns, prefix, colCompilers) {
11
- if (prefix === this.alterColumnsPrefix) {
12
- // alter columns
13
- for (const col of colCompilers) {
14
- this.client.logger.warn(
15
- 'Experimental alter column in use, see issue: https://github.com/cockroachdb/cockroach/issues/49329'
16
- );
17
- this.pushQuery({
18
- sql: 'SET enable_experimental_alter_column_type_general = true',
19
- bindings: [],
20
- });
21
- super._addColumn(col);
22
- }
23
- } else {
24
- // base class implementation for normal add
25
- super.addColumns(columns, prefix);
26
- }
27
- }
28
-
29
- dropUnique(columns, indexName) {
30
- indexName = indexName
31
- ? this.formatter.wrap(indexName)
32
- : this._indexCommand('unique', this.tableNameRaw, columns);
33
- this.pushQuery(`drop index ${this.tableName()}@${indexName} cascade `);
34
- }
35
- }
36
-
37
- module.exports = TableCompiler_CRDB;
1
+ /* eslint max-len: 0 */
2
+
3
+ const TableCompiler = require('../postgres/schema/pg-tablecompiler');
4
+
5
+ class TableCompiler_CRDB extends TableCompiler {
6
+ constructor(client, tableBuilder) {
7
+ super(client, tableBuilder);
8
+ }
9
+
10
+ addColumns(columns, prefix, colCompilers) {
11
+ if (prefix === this.alterColumnsPrefix) {
12
+ // alter columns
13
+ for (const col of colCompilers) {
14
+ this.client.logger.warn(
15
+ 'Experimental alter column in use, see issue: https://github.com/cockroachdb/cockroach/issues/49329'
16
+ );
17
+ this.pushQuery({
18
+ sql: 'SET enable_experimental_alter_column_type_general = true',
19
+ bindings: [],
20
+ });
21
+ super._addColumn(col);
22
+ }
23
+ } else {
24
+ // base class implementation for normal add
25
+ super.addColumns(columns, prefix);
26
+ }
27
+ }
28
+
29
+ dropUnique(columns, indexName) {
30
+ indexName = indexName
31
+ ? this.formatter.wrap(indexName)
32
+ : this._indexCommand('unique', this.tableNameRaw, columns);
33
+ this.pushQuery(`drop index ${this.tableName()}@${indexName} cascade `);
34
+ }
35
+ }
36
+
37
+ module.exports = TableCompiler_CRDB;