knex 2.4.2 → 2.5.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 (190) hide show
  1. package/CHANGELOG.md +54 -18
  2. package/CONTRIBUTING.md +194 -194
  3. package/LICENSE +22 -22
  4. package/README.md +147 -148
  5. package/UPGRADING.md +233 -233
  6. package/bin/cli.js +473 -473
  7. package/bin/utils/cli-config-utils.js +210 -210
  8. package/bin/utils/constants.js +7 -7
  9. package/bin/utils/migrationsLister.js +37 -37
  10. package/knex.js +23 -23
  11. package/knex.mjs +11 -0
  12. package/lib/builder-interface-augmenter.js +120 -120
  13. package/lib/client.js +495 -475
  14. package/lib/constants.js +61 -61
  15. package/lib/dialects/better-sqlite3/index.js +77 -72
  16. package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
  17. package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
  18. package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
  19. package/lib/dialects/cockroachdb/crdb-tablecompiler.js +37 -37
  20. package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
  21. package/lib/dialects/cockroachdb/index.js +86 -86
  22. package/lib/dialects/index.js +33 -33
  23. package/lib/dialects/mssql/index.js +500 -495
  24. package/lib/dialects/mssql/mssql-formatter.js +34 -34
  25. package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -600
  26. package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
  27. package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
  28. package/lib/dialects/mssql/schema/mssql-tablecompiler.js +378 -378
  29. package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
  30. package/lib/dialects/mssql/transaction.js +176 -176
  31. package/lib/dialects/mysql/index.js +201 -201
  32. package/lib/dialects/mysql/query/mysql-querycompiler.js +274 -274
  33. package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
  34. package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
  35. package/lib/dialects/mysql/schema/mysql-tablecompiler.js +381 -381
  36. package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
  37. package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
  38. package/lib/dialects/mysql/transaction.js +46 -46
  39. package/lib/dialects/mysql2/index.js +53 -33
  40. package/lib/dialects/mysql2/transaction.js +44 -44
  41. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  42. package/lib/dialects/oracle/index.js +92 -92
  43. package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -342
  44. package/lib/dialects/oracle/schema/internal/incrementUtils.js +20 -20
  45. package/lib/dialects/oracle/schema/internal/trigger.js +135 -135
  46. package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
  47. package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
  48. package/lib/dialects/oracle/schema/oracle-compiler.js +122 -122
  49. package/lib/dialects/oracle/schema/oracle-tablecompiler.js +190 -190
  50. package/lib/dialects/oracle/utils.js +87 -87
  51. package/lib/dialects/oracledb/index.js +327 -327
  52. package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
  53. package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -55
  54. package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
  55. package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
  56. package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
  57. package/lib/dialects/oracledb/transaction.js +98 -98
  58. package/lib/dialects/oracledb/utils.js +208 -208
  59. package/lib/dialects/pgnative/index.js +60 -60
  60. package/lib/dialects/postgres/execution/pg-transaction.js +19 -12
  61. package/lib/dialects/postgres/index.js +358 -358
  62. package/lib/dialects/postgres/query/pg-querybuilder.js +43 -38
  63. package/lib/dialects/postgres/query/pg-querycompiler.js +400 -395
  64. package/lib/dialects/postgres/schema/pg-columncompiler.js +156 -156
  65. package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
  66. package/lib/dialects/postgres/schema/pg-tablecompiler.js +304 -299
  67. package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
  68. package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
  69. package/lib/dialects/redshift/index.js +86 -86
  70. package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
  71. package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
  72. package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
  73. package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
  74. package/lib/dialects/redshift/schema/redshift-tablecompiler.js +122 -122
  75. package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
  76. package/lib/dialects/redshift/transaction.js +32 -25
  77. package/lib/dialects/sqlite3/execution/sqlite-transaction.js +25 -18
  78. package/lib/dialects/sqlite3/index.js +250 -250
  79. package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
  80. package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +334 -334
  81. package/lib/dialects/sqlite3/schema/ddl.js +400 -400
  82. package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
  83. package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
  84. package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
  85. package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
  86. package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
  87. package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
  88. package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
  89. package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
  90. package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +347 -347
  91. package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
  92. package/lib/execution/batch-insert.js +51 -51
  93. package/lib/execution/internal/delay.js +6 -6
  94. package/lib/execution/internal/ensure-connection-callback.js +41 -41
  95. package/lib/execution/internal/query-executioner.js +62 -62
  96. package/lib/execution/runner.js +325 -307
  97. package/lib/execution/transaction.js +409 -401
  98. package/lib/formatter/formatterUtils.js +42 -42
  99. package/lib/formatter/rawFormatter.js +84 -84
  100. package/lib/formatter/wrappingFormatter.js +250 -250
  101. package/lib/formatter.js +25 -25
  102. package/lib/index.js +3 -3
  103. package/lib/knex-builder/FunctionHelper.js +80 -54
  104. package/lib/knex-builder/Knex.js +59 -59
  105. package/lib/knex-builder/internal/config-resolver.js +57 -57
  106. package/lib/knex-builder/internal/parse-connection.js +87 -87
  107. package/lib/knex-builder/make-knex.js +345 -340
  108. package/lib/logger.js +76 -76
  109. package/lib/migrations/common/MigrationsLoader.js +36 -36
  110. package/lib/migrations/migrate/MigrationGenerator.js +84 -84
  111. package/lib/migrations/migrate/Migrator.js +598 -598
  112. package/lib/migrations/migrate/migrate-stub.js +17 -17
  113. package/lib/migrations/migrate/migration-list-resolver.js +33 -33
  114. package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
  115. package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
  116. package/lib/migrations/migrate/stub/cjs.stub +15 -15
  117. package/lib/migrations/migrate/stub/coffee.stub +13 -13
  118. package/lib/migrations/migrate/stub/eg.stub +14 -14
  119. package/lib/migrations/migrate/stub/js-schema.stub +22 -22
  120. package/lib/migrations/migrate/stub/js.stub +22 -22
  121. package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
  122. package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
  123. package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
  124. package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
  125. package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
  126. package/lib/migrations/migrate/stub/ls.stub +14 -14
  127. package/lib/migrations/migrate/stub/mjs.stub +23 -23
  128. package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
  129. package/lib/migrations/migrate/stub/ts.stub +21 -21
  130. package/lib/migrations/migrate/table-creator.js +77 -77
  131. package/lib/migrations/migrate/table-resolver.js +27 -27
  132. package/lib/migrations/seed/Seeder.js +137 -137
  133. package/lib/migrations/seed/seed-stub.js +13 -13
  134. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  135. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  136. package/lib/migrations/seed/stub/coffee.stub +9 -9
  137. package/lib/migrations/seed/stub/eg.stub +11 -11
  138. package/lib/migrations/seed/stub/js.stub +13 -13
  139. package/lib/migrations/seed/stub/ls.stub +11 -11
  140. package/lib/migrations/seed/stub/mjs.stub +12 -12
  141. package/lib/migrations/seed/stub/ts.stub +13 -13
  142. package/lib/migrations/util/fs.js +86 -86
  143. package/lib/migrations/util/import-file.js +12 -12
  144. package/lib/migrations/util/is-module-type.js +9 -9
  145. package/lib/migrations/util/template.js +52 -52
  146. package/lib/migrations/util/timestamp.js +14 -14
  147. package/lib/query/analytic.js +52 -52
  148. package/lib/query/constants.js +15 -15
  149. package/lib/query/joinclause.js +270 -270
  150. package/lib/query/method-constants.js +136 -135
  151. package/lib/query/querybuilder.js +1793 -1794
  152. package/lib/query/querycompiler.js +1591 -1580
  153. package/lib/raw.js +139 -139
  154. package/lib/ref.js +39 -39
  155. package/lib/schema/builder.js +115 -115
  156. package/lib/schema/columnbuilder.js +146 -146
  157. package/lib/schema/columncompiler.js +307 -307
  158. package/lib/schema/compiler.js +187 -187
  159. package/lib/schema/internal/helpers.js +55 -55
  160. package/lib/schema/tablebuilder.js +376 -376
  161. package/lib/schema/tablecompiler.js +433 -433
  162. package/lib/schema/viewbuilder.js +92 -92
  163. package/lib/schema/viewcompiler.js +138 -138
  164. package/lib/util/finally-mixin.js +13 -13
  165. package/lib/util/helpers.js +95 -95
  166. package/lib/util/is.js +32 -32
  167. package/lib/util/nanoid.js +40 -40
  168. package/lib/util/noop.js +1 -1
  169. package/lib/util/save-async-stack.js +14 -14
  170. package/lib/util/security.js +26 -0
  171. package/lib/util/string.js +190 -190
  172. package/lib/util/timeout.js +29 -29
  173. package/package.json +12 -10
  174. package/scripts/build.js +125 -125
  175. package/scripts/clean.js +31 -31
  176. package/scripts/docker-compose.yml +152 -152
  177. package/scripts/next-release-howto.md +24 -24
  178. package/scripts/oracledb-install-driver-libs.sh +82 -82
  179. package/scripts/release.sh +34 -34
  180. package/scripts/runkit-example.js +34 -34
  181. package/scripts/stress-test/README.txt +18 -18
  182. package/scripts/stress-test/docker-compose.yml +57 -57
  183. package/scripts/stress-test/knex-stress-test.js +208 -208
  184. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
  185. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
  186. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
  187. package/scripts/update_gitignore_for_tsc_output.js +90 -90
  188. package/types/index.d.ts +3273 -3233
  189. package/types/result.d.ts +27 -27
  190. package/types/tables.d.ts +4 -4
@@ -1,67 +1,67 @@
1
- // Redshift Column Compiler
2
- // -------
3
-
4
- const ColumnCompiler_PG = require('../../postgres/schema/pg-columncompiler');
5
- const ColumnCompiler = require('../../../schema/columncompiler');
6
-
7
- class ColumnCompiler_Redshift extends ColumnCompiler_PG {
8
- constructor() {
9
- super(...arguments);
10
- }
11
-
12
- // Types:
13
- // ------
14
-
15
- bit(column) {
16
- return column.length !== false ? `char(${column.length})` : 'char(1)';
17
- }
18
-
19
- datetime(without) {
20
- return without ? 'timestamp' : 'timestamptz';
21
- }
22
-
23
- timestamp(without) {
24
- return without ? 'timestamp' : 'timestamptz';
25
- }
26
-
27
- // Modifiers:
28
- // ------
29
- comment(comment) {
30
- this.pushAdditional(function () {
31
- this.pushQuery(
32
- `comment on column ${this.tableCompiler.tableName()}.` +
33
- this.formatter.wrap(this.args[0]) +
34
- ' is ' +
35
- (comment ? `'${comment}'` : 'NULL')
36
- );
37
- }, comment);
38
- }
39
- }
40
-
41
- ColumnCompiler_Redshift.prototype.increments = ({ primaryKey = true } = {}) =>
42
- 'integer identity(1,1)' + (primaryKey ? ' primary key' : '') + ' not null';
43
- ColumnCompiler_Redshift.prototype.bigincrements = ({
44
- primaryKey = true,
45
- } = {}) =>
46
- 'bigint identity(1,1)' + (primaryKey ? ' primary key' : '') + ' not null';
47
- ColumnCompiler_Redshift.prototype.binary = 'varchar(max)';
48
- ColumnCompiler_Redshift.prototype.blob = 'varchar(max)';
49
- ColumnCompiler_Redshift.prototype.enu = 'varchar(255)';
50
- ColumnCompiler_Redshift.prototype.enum = 'varchar(255)';
51
- ColumnCompiler_Redshift.prototype.json = 'varchar(max)';
52
- ColumnCompiler_Redshift.prototype.jsonb = 'varchar(max)';
53
- ColumnCompiler_Redshift.prototype.longblob = 'varchar(max)';
54
- ColumnCompiler_Redshift.prototype.mediumblob = 'varchar(16777218)';
55
- ColumnCompiler_Redshift.prototype.set = 'text';
56
- ColumnCompiler_Redshift.prototype.text = 'varchar(max)';
57
- ColumnCompiler_Redshift.prototype.tinyblob = 'varchar(256)';
58
- ColumnCompiler_Redshift.prototype.uuid = ColumnCompiler.prototype.uuid;
59
- ColumnCompiler_Redshift.prototype.varbinary = 'varchar(max)';
60
- ColumnCompiler_Redshift.prototype.bigint = 'bigint';
61
- ColumnCompiler_Redshift.prototype.bool = 'boolean';
62
- ColumnCompiler_Redshift.prototype.double = 'double precision';
63
- ColumnCompiler_Redshift.prototype.floating = 'real';
64
- ColumnCompiler_Redshift.prototype.smallint = 'smallint';
65
- ColumnCompiler_Redshift.prototype.tinyint = 'smallint';
66
-
67
- module.exports = ColumnCompiler_Redshift;
1
+ // Redshift Column Compiler
2
+ // -------
3
+
4
+ const ColumnCompiler_PG = require('../../postgres/schema/pg-columncompiler');
5
+ const ColumnCompiler = require('../../../schema/columncompiler');
6
+
7
+ class ColumnCompiler_Redshift extends ColumnCompiler_PG {
8
+ constructor() {
9
+ super(...arguments);
10
+ }
11
+
12
+ // Types:
13
+ // ------
14
+
15
+ bit(column) {
16
+ return column.length !== false ? `char(${column.length})` : 'char(1)';
17
+ }
18
+
19
+ datetime(without) {
20
+ return without ? 'timestamp' : 'timestamptz';
21
+ }
22
+
23
+ timestamp(without) {
24
+ return without ? 'timestamp' : 'timestamptz';
25
+ }
26
+
27
+ // Modifiers:
28
+ // ------
29
+ comment(comment) {
30
+ this.pushAdditional(function () {
31
+ this.pushQuery(
32
+ `comment on column ${this.tableCompiler.tableName()}.` +
33
+ this.formatter.wrap(this.args[0]) +
34
+ ' is ' +
35
+ (comment ? `'${comment}'` : 'NULL')
36
+ );
37
+ }, comment);
38
+ }
39
+ }
40
+
41
+ ColumnCompiler_Redshift.prototype.increments = ({ primaryKey = true } = {}) =>
42
+ 'integer identity(1,1)' + (primaryKey ? ' primary key' : '') + ' not null';
43
+ ColumnCompiler_Redshift.prototype.bigincrements = ({
44
+ primaryKey = true,
45
+ } = {}) =>
46
+ 'bigint identity(1,1)' + (primaryKey ? ' primary key' : '') + ' not null';
47
+ ColumnCompiler_Redshift.prototype.binary = 'varchar(max)';
48
+ ColumnCompiler_Redshift.prototype.blob = 'varchar(max)';
49
+ ColumnCompiler_Redshift.prototype.enu = 'varchar(255)';
50
+ ColumnCompiler_Redshift.prototype.enum = 'varchar(255)';
51
+ ColumnCompiler_Redshift.prototype.json = 'varchar(max)';
52
+ ColumnCompiler_Redshift.prototype.jsonb = 'varchar(max)';
53
+ ColumnCompiler_Redshift.prototype.longblob = 'varchar(max)';
54
+ ColumnCompiler_Redshift.prototype.mediumblob = 'varchar(16777218)';
55
+ ColumnCompiler_Redshift.prototype.set = 'text';
56
+ ColumnCompiler_Redshift.prototype.text = 'varchar(max)';
57
+ ColumnCompiler_Redshift.prototype.tinyblob = 'varchar(256)';
58
+ ColumnCompiler_Redshift.prototype.uuid = ColumnCompiler.prototype.uuid;
59
+ ColumnCompiler_Redshift.prototype.varbinary = 'varchar(max)';
60
+ ColumnCompiler_Redshift.prototype.bigint = 'bigint';
61
+ ColumnCompiler_Redshift.prototype.bool = 'boolean';
62
+ ColumnCompiler_Redshift.prototype.double = 'double precision';
63
+ ColumnCompiler_Redshift.prototype.floating = 'real';
64
+ ColumnCompiler_Redshift.prototype.smallint = 'smallint';
65
+ ColumnCompiler_Redshift.prototype.tinyint = 'smallint';
66
+
67
+ module.exports = ColumnCompiler_Redshift;
@@ -1,14 +1,14 @@
1
- /* eslint max-len: 0 */
2
-
3
- // Redshift Table Builder & Compiler
4
- // -------
5
-
6
- const SchemaCompiler_PG = require('../../postgres/schema/pg-compiler');
7
-
8
- class SchemaCompiler_Redshift extends SchemaCompiler_PG {
9
- constructor() {
10
- super(...arguments);
11
- }
12
- }
13
-
14
- module.exports = SchemaCompiler_Redshift;
1
+ /* eslint max-len: 0 */
2
+
3
+ // Redshift Table Builder & Compiler
4
+ // -------
5
+
6
+ const SchemaCompiler_PG = require('../../postgres/schema/pg-compiler');
7
+
8
+ class SchemaCompiler_Redshift extends SchemaCompiler_PG {
9
+ constructor() {
10
+ super(...arguments);
11
+ }
12
+ }
13
+
14
+ module.exports = SchemaCompiler_Redshift;
@@ -1,122 +1,122 @@
1
- /* eslint max-len: 0 */
2
-
3
- // Redshift Table Builder & Compiler
4
- // -------
5
-
6
- const has = require('lodash/has');
7
- const TableCompiler_PG = require('../../postgres/schema/pg-tablecompiler');
8
-
9
- class TableCompiler_Redshift extends TableCompiler_PG {
10
- constructor() {
11
- super(...arguments);
12
- }
13
-
14
- index(columns, indexName, options) {
15
- this.client.logger.warn(
16
- 'Redshift does not support the creation of indexes.'
17
- );
18
- }
19
-
20
- dropIndex(columns, indexName) {
21
- this.client.logger.warn(
22
- 'Redshift does not support the deletion of indexes.'
23
- );
24
- }
25
-
26
- // TODO: have to disable setting not null on columns that already exist...
27
-
28
- // Adds the "create" query to the query sequence.
29
- createQuery(columns, ifNot, like) {
30
- const createStatement = ifNot
31
- ? 'create table if not exists '
32
- : 'create table ';
33
- const columnsSql = ' (' + columns.sql.join(', ') + this._addChecks() + ')';
34
- let sql =
35
- createStatement +
36
- this.tableName() +
37
- (like && this.tableNameLike()
38
- ? ' (like ' + this.tableNameLike() + ')'
39
- : columnsSql);
40
- if (this.single.inherits)
41
- sql += ` like (${this.formatter.wrap(this.single.inherits)})`;
42
- this.pushQuery({
43
- sql,
44
- bindings: columns.bindings,
45
- });
46
- const hasComment = has(this.single, 'comment');
47
- if (hasComment) this.comment(this.single.comment);
48
- if (like) {
49
- this.addColumns(columns, this.addColumnsPrefix);
50
- }
51
- }
52
-
53
- primary(columns, constraintName) {
54
- const self = this;
55
- constraintName = constraintName
56
- ? self.formatter.wrap(constraintName)
57
- : self.formatter.wrap(`${this.tableNameRaw}_pkey`);
58
- if (columns.constructor !== Array) {
59
- columns = [columns];
60
- }
61
- const thiscolumns = self.grouped.columns;
62
-
63
- if (thiscolumns) {
64
- for (let i = 0; i < columns.length; i++) {
65
- let exists = thiscolumns.find(
66
- (tcb) =>
67
- tcb.grouping === 'columns' &&
68
- tcb.builder &&
69
- tcb.builder._method === 'add' &&
70
- tcb.builder._args &&
71
- tcb.builder._args.indexOf(columns[i]) > -1
72
- );
73
- if (exists) {
74
- exists = exists.builder;
75
- }
76
- const nullable = !(
77
- exists &&
78
- exists._modifiers &&
79
- exists._modifiers['nullable'] &&
80
- exists._modifiers['nullable'][0] === false
81
- );
82
- if (nullable) {
83
- if (exists) {
84
- return this.client.logger.warn(
85
- 'Redshift does not allow primary keys to contain nullable columns.'
86
- );
87
- } else {
88
- return this.client.logger.warn(
89
- 'Redshift does not allow primary keys to contain nonexistent columns.'
90
- );
91
- }
92
- }
93
- }
94
- }
95
- return self.pushQuery(
96
- `alter table ${self.tableName()} add constraint ${constraintName} primary key (${self.formatter.columnize(
97
- columns
98
- )})`
99
- );
100
- }
101
-
102
- // Compiles column add. Redshift can only add one column per ALTER TABLE, so core addColumns doesn't work. #2545
103
- addColumns(columns, prefix, colCompilers) {
104
- if (prefix === this.alterColumnsPrefix) {
105
- super.addColumns(columns, prefix, colCompilers);
106
- } else {
107
- prefix = prefix || this.addColumnsPrefix;
108
- colCompilers = colCompilers || this.getColumns();
109
- for (const col of colCompilers) {
110
- const quotedTableName = this.tableName();
111
- const colCompiled = col.compileColumn();
112
-
113
- this.pushQuery({
114
- sql: `alter table ${quotedTableName} ${prefix}${colCompiled}`,
115
- bindings: [],
116
- });
117
- }
118
- }
119
- }
120
- }
121
-
122
- module.exports = TableCompiler_Redshift;
1
+ /* eslint max-len: 0 */
2
+
3
+ // Redshift Table Builder & Compiler
4
+ // -------
5
+
6
+ const has = require('lodash/has');
7
+ const TableCompiler_PG = require('../../postgres/schema/pg-tablecompiler');
8
+
9
+ class TableCompiler_Redshift extends TableCompiler_PG {
10
+ constructor() {
11
+ super(...arguments);
12
+ }
13
+
14
+ index(columns, indexName, options) {
15
+ this.client.logger.warn(
16
+ 'Redshift does not support the creation of indexes.'
17
+ );
18
+ }
19
+
20
+ dropIndex(columns, indexName) {
21
+ this.client.logger.warn(
22
+ 'Redshift does not support the deletion of indexes.'
23
+ );
24
+ }
25
+
26
+ // TODO: have to disable setting not null on columns that already exist...
27
+
28
+ // Adds the "create" query to the query sequence.
29
+ createQuery(columns, ifNot, like) {
30
+ const createStatement = ifNot
31
+ ? 'create table if not exists '
32
+ : 'create table ';
33
+ const columnsSql = ' (' + columns.sql.join(', ') + this._addChecks() + ')';
34
+ let sql =
35
+ createStatement +
36
+ this.tableName() +
37
+ (like && this.tableNameLike()
38
+ ? ' (like ' + this.tableNameLike() + ')'
39
+ : columnsSql);
40
+ if (this.single.inherits)
41
+ sql += ` like (${this.formatter.wrap(this.single.inherits)})`;
42
+ this.pushQuery({
43
+ sql,
44
+ bindings: columns.bindings,
45
+ });
46
+ const hasComment = has(this.single, 'comment');
47
+ if (hasComment) this.comment(this.single.comment);
48
+ if (like) {
49
+ this.addColumns(columns, this.addColumnsPrefix);
50
+ }
51
+ }
52
+
53
+ primary(columns, constraintName) {
54
+ const self = this;
55
+ constraintName = constraintName
56
+ ? self.formatter.wrap(constraintName)
57
+ : self.formatter.wrap(`${this.tableNameRaw}_pkey`);
58
+ if (columns.constructor !== Array) {
59
+ columns = [columns];
60
+ }
61
+ const thiscolumns = self.grouped.columns;
62
+
63
+ if (thiscolumns) {
64
+ for (let i = 0; i < columns.length; i++) {
65
+ let exists = thiscolumns.find(
66
+ (tcb) =>
67
+ tcb.grouping === 'columns' &&
68
+ tcb.builder &&
69
+ tcb.builder._method === 'add' &&
70
+ tcb.builder._args &&
71
+ tcb.builder._args.indexOf(columns[i]) > -1
72
+ );
73
+ if (exists) {
74
+ exists = exists.builder;
75
+ }
76
+ const nullable = !(
77
+ exists &&
78
+ exists._modifiers &&
79
+ exists._modifiers['nullable'] &&
80
+ exists._modifiers['nullable'][0] === false
81
+ );
82
+ if (nullable) {
83
+ if (exists) {
84
+ return this.client.logger.warn(
85
+ 'Redshift does not allow primary keys to contain nullable columns.'
86
+ );
87
+ } else {
88
+ return this.client.logger.warn(
89
+ 'Redshift does not allow primary keys to contain nonexistent columns.'
90
+ );
91
+ }
92
+ }
93
+ }
94
+ }
95
+ return self.pushQuery(
96
+ `alter table ${self.tableName()} add constraint ${constraintName} primary key (${self.formatter.columnize(
97
+ columns
98
+ )})`
99
+ );
100
+ }
101
+
102
+ // Compiles column add. Redshift can only add one column per ALTER TABLE, so core addColumns doesn't work. #2545
103
+ addColumns(columns, prefix, colCompilers) {
104
+ if (prefix === this.alterColumnsPrefix) {
105
+ super.addColumns(columns, prefix, colCompilers);
106
+ } else {
107
+ prefix = prefix || this.addColumnsPrefix;
108
+ colCompilers = colCompilers || this.getColumns();
109
+ for (const col of colCompilers) {
110
+ const quotedTableName = this.tableName();
111
+ const colCompiled = col.compileColumn();
112
+
113
+ this.pushQuery({
114
+ sql: `alter table ${quotedTableName} ${prefix}${colCompiled}`,
115
+ bindings: [],
116
+ });
117
+ }
118
+ }
119
+ }
120
+ }
121
+
122
+ module.exports = TableCompiler_Redshift;
@@ -1,11 +1,11 @@
1
- /* eslint max-len: 0 */
2
-
3
- const ViewCompiler_PG = require('../../postgres/schema/pg-viewcompiler.js');
4
-
5
- class ViewCompiler_Redshift extends ViewCompiler_PG {
6
- constructor(client, viewCompiler) {
7
- super(client, viewCompiler);
8
- }
9
- }
10
-
11
- module.exports = ViewCompiler_Redshift;
1
+ /* eslint max-len: 0 */
2
+
3
+ const ViewCompiler_PG = require('../../postgres/schema/pg-viewcompiler.js');
4
+
5
+ class ViewCompiler_Redshift extends ViewCompiler_PG {
6
+ constructor(client, viewCompiler) {
7
+ super(client, viewCompiler);
8
+ }
9
+ }
10
+
11
+ module.exports = ViewCompiler_Redshift;
@@ -1,25 +1,32 @@
1
- const Transaction = require('../../execution/transaction');
2
-
3
- module.exports = class Redshift_Transaction extends Transaction {
4
- begin(conn) {
5
- if (this.isolationLevel) {
6
- return this.query(conn, `BEGIN ISOLATION LEVEL ${this.isolationLevel};`);
7
- }
8
- return this.query(conn, 'BEGIN;');
9
- }
10
-
11
- savepoint(conn) {
12
- this.trxClient.logger('Redshift does not support savepoints.');
13
- return Promise.resolve();
14
- }
15
-
16
- release(conn, value) {
17
- this.trxClient.logger('Redshift does not support savepoints.');
18
- return Promise.resolve();
19
- }
20
-
21
- rollbackTo(conn, error) {
22
- this.trxClient.logger('Redshift does not support savepoints.');
23
- return Promise.resolve();
24
- }
25
- };
1
+ const Transaction = require('../../execution/transaction');
2
+
3
+ module.exports = class Redshift_Transaction extends Transaction {
4
+ begin(conn) {
5
+ const trxMode = [
6
+ this.isolationLevel ? `ISOLATION LEVEL ${this.isolationLevel}` : '',
7
+ this.readOnly ? 'READ ONLY' : '',
8
+ ]
9
+ .join(' ')
10
+ .trim();
11
+
12
+ if (trxMode.length === 0) {
13
+ return this.query(conn, 'BEGIN;');
14
+ }
15
+ return this.query(conn, `BEGIN ${trxMode};`);
16
+ }
17
+
18
+ savepoint(conn) {
19
+ this.trxClient.logger('Redshift does not support savepoints.');
20
+ return Promise.resolve();
21
+ }
22
+
23
+ release(conn, value) {
24
+ this.trxClient.logger('Redshift does not support savepoints.');
25
+ return Promise.resolve();
26
+ }
27
+
28
+ rollbackTo(conn, error) {
29
+ this.trxClient.logger('Redshift does not support savepoints.');
30
+ return Promise.resolve();
31
+ }
32
+ };
@@ -1,18 +1,25 @@
1
- const Transaction = require('../../../execution/transaction');
2
-
3
- class Transaction_Sqlite extends Transaction {
4
- begin(conn) {
5
- // SQLite doesn't really support isolation levels, it is serializable by
6
- // default and so we override it to ignore isolation level.
7
- // There is a `PRAGMA read_uncommitted = true;`, but that's probably not
8
- // what the user wants
9
- if (this.isolationLevel) {
10
- this.client.logger.warn(
11
- 'sqlite3 only supports serializable transactions, ignoring the isolation level param'
12
- );
13
- }
14
- return this.query(conn, 'BEGIN;');
15
- }
16
- }
17
-
18
- module.exports = Transaction_Sqlite;
1
+ const Transaction = require('../../../execution/transaction');
2
+
3
+ class Transaction_Sqlite extends Transaction {
4
+ begin(conn) {
5
+ // SQLite doesn't really support isolation levels, it is serializable by
6
+ // default and so we override it to ignore isolation level.
7
+ // There is a `PRAGMA read_uncommitted = true;`, but that's probably not
8
+ // what the user wants
9
+ if (this.isolationLevel) {
10
+ this.client.logger.warn(
11
+ 'sqlite3 only supports serializable transactions, ignoring the isolation level param'
12
+ );
13
+ }
14
+ // SQLite infers read vs write transactions from the statement operation
15
+ // https://www.sqlite.org/lang_transaction.html#read_transactions_versus_write_transactions
16
+ if (this.readOnly) {
17
+ this.client.logger.warn(
18
+ 'sqlite3 implicitly handles read vs write transactions'
19
+ );
20
+ }
21
+ return this.query(conn, 'BEGIN;');
22
+ }
23
+ }
24
+
25
+ module.exports = Transaction_Sqlite;