knex 0.21.20 → 0.21.21

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 (141) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/CONTRIBUTING.md +184 -184
  3. package/LICENSE +22 -22
  4. package/README.md +95 -95
  5. package/bin/cli.js +414 -414
  6. package/bin/utils/cli-config-utils.js +151 -151
  7. package/bin/utils/constants.js +7 -7
  8. package/bin/utils/migrationsLister.js +37 -37
  9. package/knex.js +8 -8
  10. package/lib/client.js +413 -413
  11. package/lib/config-resolver.js +61 -61
  12. package/lib/constants.js +44 -44
  13. package/lib/dialects/mssql/index.js +390 -390
  14. package/lib/dialects/mssql/query/compiler.js +444 -444
  15. package/lib/dialects/mssql/schema/columncompiler.js +103 -103
  16. package/lib/dialects/mssql/schema/compiler.js +59 -59
  17. package/lib/dialects/mssql/schema/tablecompiler.js +245 -245
  18. package/lib/dialects/mssql/transaction.js +97 -97
  19. package/lib/dialects/mysql/index.js +191 -191
  20. package/lib/dialects/mysql/query/compiler.js +142 -142
  21. package/lib/dialects/mysql/schema/columncompiler.js +171 -171
  22. package/lib/dialects/mysql/schema/compiler.js +60 -60
  23. package/lib/dialects/mysql/schema/tablecompiler.js +262 -262
  24. package/lib/dialects/mysql/transaction.js +48 -48
  25. package/lib/dialects/mysql2/index.js +35 -35
  26. package/lib/dialects/mysql2/transaction.js +46 -46
  27. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  28. package/lib/dialects/oracle/formatter.js +20 -20
  29. package/lib/dialects/oracle/index.js +79 -79
  30. package/lib/dialects/oracle/query/compiler.js +327 -327
  31. package/lib/dialects/oracle/schema/columnbuilder.js +18 -18
  32. package/lib/dialects/oracle/schema/columncompiler.js +139 -139
  33. package/lib/dialects/oracle/schema/compiler.js +81 -81
  34. package/lib/dialects/oracle/schema/tablecompiler.js +165 -165
  35. package/lib/dialects/oracle/schema/trigger.js +126 -126
  36. package/lib/dialects/oracle/utils.js +86 -86
  37. package/lib/dialects/oracledb/index.js +489 -489
  38. package/lib/dialects/oracledb/query/compiler.js +363 -363
  39. package/lib/dialects/oracledb/schema/columncompiler.js +35 -35
  40. package/lib/dialects/oracledb/transaction.js +76 -76
  41. package/lib/dialects/oracledb/utils.js +14 -14
  42. package/lib/dialects/postgres/index.js +319 -319
  43. package/lib/dialects/postgres/query/compiler.js +206 -206
  44. package/lib/dialects/postgres/schema/columncompiler.js +125 -125
  45. package/lib/dialects/postgres/schema/compiler.js +109 -109
  46. package/lib/dialects/postgres/schema/tablecompiler.js +183 -183
  47. package/lib/dialects/redshift/index.js +73 -73
  48. package/lib/dialects/redshift/query/compiler.js +119 -119
  49. package/lib/dialects/redshift/schema/columnbuilder.js +20 -20
  50. package/lib/dialects/redshift/schema/columncompiler.js +60 -60
  51. package/lib/dialects/redshift/schema/compiler.js +14 -14
  52. package/lib/dialects/redshift/schema/tablecompiler.js +123 -123
  53. package/lib/dialects/redshift/transaction.js +18 -18
  54. package/lib/dialects/sqlite3/formatter.js +21 -21
  55. package/lib/dialects/sqlite3/index.js +169 -169
  56. package/lib/dialects/sqlite3/query/compiler.js +222 -222
  57. package/lib/dialects/sqlite3/schema/columncompiler.js +27 -27
  58. package/lib/dialects/sqlite3/schema/compiler.js +49 -49
  59. package/lib/dialects/sqlite3/schema/ddl.js +525 -525
  60. package/lib/dialects/sqlite3/schema/tablecompiler.js +238 -238
  61. package/lib/formatter.js +295 -295
  62. package/lib/functionhelper.js +14 -14
  63. package/lib/helpers.js +92 -92
  64. package/lib/index.js +3 -3
  65. package/lib/interface.js +115 -115
  66. package/lib/knex.js +42 -42
  67. package/lib/logger.js +76 -76
  68. package/lib/migrate/MigrationGenerator.js +82 -82
  69. package/lib/migrate/Migrator.js +611 -611
  70. package/lib/migrate/configuration-merger.js +60 -60
  71. package/lib/migrate/migrate-stub.js +17 -17
  72. package/lib/migrate/migration-list-resolver.js +36 -36
  73. package/lib/migrate/sources/fs-migrations.js +99 -99
  74. package/lib/migrate/stub/cjs.stub +15 -15
  75. package/lib/migrate/stub/coffee.stub +13 -13
  76. package/lib/migrate/stub/eg.stub +14 -14
  77. package/lib/migrate/stub/js.stub +15 -15
  78. package/lib/migrate/stub/knexfile-coffee.stub +34 -34
  79. package/lib/migrate/stub/knexfile-eg.stub +43 -43
  80. package/lib/migrate/stub/knexfile-js.stub +44 -44
  81. package/lib/migrate/stub/knexfile-ls.stub +35 -35
  82. package/lib/migrate/stub/knexfile-ts.stub +44 -44
  83. package/lib/migrate/stub/ls.stub +14 -14
  84. package/lib/migrate/stub/ts.stub +21 -21
  85. package/lib/migrate/table-creator.js +67 -67
  86. package/lib/migrate/table-resolver.js +27 -27
  87. package/lib/query/builder.js +1372 -1372
  88. package/lib/query/compiler.js +889 -889
  89. package/lib/query/constants.js +13 -13
  90. package/lib/query/joinclause.js +263 -263
  91. package/lib/query/methods.js +92 -92
  92. package/lib/query/string.js +190 -190
  93. package/lib/raw.js +188 -188
  94. package/lib/ref.js +39 -39
  95. package/lib/runner.js +285 -285
  96. package/lib/schema/builder.js +82 -82
  97. package/lib/schema/columnbuilder.js +117 -117
  98. package/lib/schema/columncompiler.js +177 -177
  99. package/lib/schema/compiler.js +101 -101
  100. package/lib/schema/helpers.js +51 -51
  101. package/lib/schema/tablebuilder.js +288 -288
  102. package/lib/schema/tablecompiler.js +296 -296
  103. package/lib/seed/Seeder.js +203 -203
  104. package/lib/seed/seed-stub.js +13 -13
  105. package/lib/seed/stub/coffee.stub +9 -9
  106. package/lib/seed/stub/eg.stub +11 -11
  107. package/lib/seed/stub/js.stub +13 -13
  108. package/lib/seed/stub/ls.stub +11 -11
  109. package/lib/seed/stub/ts.stub +13 -13
  110. package/lib/transaction.js +363 -363
  111. package/lib/util/batchInsert.js +59 -59
  112. package/lib/util/delay.js +6 -6
  113. package/lib/util/fake-client.js +9 -9
  114. package/lib/util/finally-mixin.js +13 -13
  115. package/lib/util/fs.js +76 -76
  116. package/lib/util/import-file.js +13 -13
  117. package/lib/util/is-module-type.js +14 -14
  118. package/lib/util/is.js +32 -32
  119. package/lib/util/make-knex.js +338 -338
  120. package/lib/util/nanoid.js +29 -29
  121. package/lib/util/noop.js +1 -1
  122. package/lib/util/parse-connection.js +66 -66
  123. package/lib/util/save-async-stack.js +14 -14
  124. package/lib/util/template.js +52 -52
  125. package/lib/util/timeout.js +29 -29
  126. package/lib/util/timestamp.js +16 -16
  127. package/package.json +1 -1
  128. package/scripts/build.js +125 -125
  129. package/scripts/docker-compose.yml +111 -111
  130. package/scripts/next-release-howto.md +24 -24
  131. package/scripts/release.sh +34 -34
  132. package/scripts/runkit-example.js +34 -34
  133. package/scripts/stress-test/README.txt +18 -18
  134. package/scripts/stress-test/docker-compose.yml +47 -47
  135. package/scripts/stress-test/knex-stress-test.js +196 -196
  136. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
  137. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
  138. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
  139. package/types/index.d.ts +2249 -2249
  140. package/types/result.d.ts +27 -27
  141. package/types/tables.d.ts +4 -4
@@ -1,245 +1,245 @@
1
- /* eslint max-len:0 */
2
-
3
- // MSSQL Table Builder & Compiler
4
- // -------
5
- const { inherits } = require('util');
6
- const TableCompiler = require('../../../schema/tablecompiler');
7
- const helpers = require('../../../helpers');
8
-
9
- // Table Compiler
10
- // ------
11
-
12
- function TableCompiler_MSSQL() {
13
- TableCompiler.apply(this, arguments);
14
- }
15
- inherits(TableCompiler_MSSQL, TableCompiler);
16
-
17
- Object.assign(TableCompiler_MSSQL.prototype, {
18
- createAlterTableMethods: ['foreign', 'primary'],
19
- createQuery(columns, ifNot) {
20
- const createStatement = ifNot
21
- ? `if object_id('${this.tableName()}', 'U') is null CREATE TABLE `
22
- : 'CREATE TABLE ';
23
- const sql =
24
- createStatement +
25
- this.tableName() +
26
- (this._formatting ? ' (\n ' : ' (') +
27
- columns.sql.join(this._formatting ? ',\n ' : ', ') +
28
- ')';
29
-
30
- if (this.single.comment) {
31
- const { comment } = this.single;
32
- if (comment.length > 60)
33
- this.client.logger.warn(
34
- 'The max length for a table comment is 60 characters'
35
- );
36
- }
37
-
38
- this.pushQuery(sql);
39
- },
40
-
41
- lowerCase: false,
42
-
43
- addColumnsPrefix: 'ADD ',
44
-
45
- dropColumnPrefix: 'DROP COLUMN ',
46
-
47
- alterColumnPrefix: 'ALTER COLUMN ',
48
-
49
- // Compiles column add. Multiple columns need only one ADD clause (not one ADD per column) so core addColumns doesn't work. #1348
50
- addColumns(columns, prefix) {
51
- prefix = prefix || this.addColumnsPrefix;
52
-
53
- if (columns.sql.length > 0) {
54
- this.pushQuery({
55
- sql:
56
- (this.lowerCase ? 'alter table ' : 'ALTER TABLE ') +
57
- this.tableName() +
58
- ' ' +
59
- prefix +
60
- columns.sql.join(', '),
61
- bindings: columns.bindings,
62
- });
63
- }
64
- },
65
-
66
- // Compiles column drop. Multiple columns need only one DROP clause (not one DROP per column) so core dropColumn doesn't work. #1348
67
- dropColumn() {
68
- const _this2 = this;
69
- const columns = helpers.normalizeArr.apply(null, arguments);
70
- const columnsArray = Array.isArray(columns) ? columns : [columns];
71
- const drops = columnsArray.map((column) => _this2.formatter.wrap(column));
72
- const schema = this.schemaNameRaw || 'dbo';
73
-
74
- for (const column of columns) {
75
- const baseQuery = `
76
- DECLARE @constraint varchar(100) = (SELECT default_constraints.name
77
- FROM sys.all_columns
78
- INNER JOIN sys.tables
79
- ON all_columns.object_id = tables.object_id
80
- INNER JOIN sys.schemas
81
- ON tables.schema_id = schemas.schema_id
82
- INNER JOIN sys.default_constraints
83
- ON all_columns.default_object_id = default_constraints.object_id
84
- WHERE schemas.name = '${schema}'
85
- AND tables.name = '${this.tableNameRaw}'
86
- AND all_columns.name = '${column}')
87
-
88
- IF @constraint IS NOT NULL EXEC('ALTER TABLE ${this.tableNameRaw} DROP CONSTRAINT ' + @constraint)`;
89
- this.pushQuery(baseQuery);
90
- }
91
- this.pushQuery(
92
- (this.lowerCase ? 'alter table ' : 'ALTER TABLE ') +
93
- this.tableName() +
94
- ' ' +
95
- this.dropColumnPrefix +
96
- drops.join(', ')
97
- );
98
- },
99
-
100
- // Compiles the comment on the table.
101
- comment() {},
102
-
103
- changeType() {},
104
-
105
- // Renames a column on the table.
106
- renameColumn(from, to) {
107
- this.pushQuery(
108
- `exec sp_rename ${this.formatter.parameter(
109
- this.tableName() + '.' + from
110
- )}, ${this.formatter.parameter(to)}, 'COLUMN'`
111
- );
112
- },
113
-
114
- dropFKRefs(runner, refs) {
115
- const formatter = this.client.formatter(this.tableBuilder);
116
- return Promise.all(
117
- refs.map(function (ref) {
118
- const constraintName = formatter.wrap(ref.CONSTRAINT_NAME);
119
- const tableName = formatter.wrap(ref.TABLE_NAME);
120
- return runner.query({
121
- sql: `ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName}`,
122
- });
123
- })
124
- );
125
- },
126
- createFKRefs(runner, refs) {
127
- const formatter = this.client.formatter(this.tableBuilder);
128
-
129
- return Promise.all(
130
- refs.map(function (ref) {
131
- const tableName = formatter.wrap(ref.TABLE_NAME);
132
- const keyName = formatter.wrap(ref.CONSTRAINT_NAME);
133
- const column = formatter.columnize(ref.COLUMN_NAME);
134
- const references = formatter.columnize(ref.REFERENCED_COLUMN_NAME);
135
- const inTable = formatter.wrap(ref.REFERENCED_TABLE_NAME);
136
- const onUpdate = ` ON UPDATE ${ref.UPDATE_RULE}`;
137
- const onDelete = ` ON DELETE ${ref.DELETE_RULE}`;
138
-
139
- return runner.query({
140
- sql:
141
- `ALTER TABLE ${tableName} ADD CONSTRAINT ${keyName}` +
142
- ' FOREIGN KEY (' +
143
- column +
144
- ') REFERENCES ' +
145
- inTable +
146
- ' (' +
147
- references +
148
- ')' +
149
- onUpdate +
150
- onDelete,
151
- });
152
- })
153
- );
154
- },
155
-
156
- index(columns, indexName) {
157
- indexName = indexName
158
- ? this.formatter.wrap(indexName)
159
- : this._indexCommand('index', this.tableNameRaw, columns);
160
- this.pushQuery(
161
- `CREATE INDEX ${indexName} ON ${this.tableName()} (${this.formatter.columnize(
162
- columns
163
- )})`
164
- );
165
- },
166
-
167
- primary(columns, constraintName) {
168
- constraintName = constraintName
169
- ? this.formatter.wrap(constraintName)
170
- : this.formatter.wrap(`${this.tableNameRaw}_pkey`);
171
- if (!this.forCreate) {
172
- this.pushQuery(
173
- `ALTER TABLE ${this.tableName()} ADD CONSTRAINT ${constraintName} PRIMARY KEY (${this.formatter.columnize(
174
- columns
175
- )})`
176
- );
177
- } else {
178
- this.pushQuery(
179
- `CONSTRAINT ${constraintName} PRIMARY KEY (${this.formatter.columnize(
180
- columns
181
- )})`
182
- );
183
- }
184
- },
185
-
186
- unique(columns, indexName) {
187
- indexName = indexName
188
- ? this.formatter.wrap(indexName)
189
- : this._indexCommand('unique', this.tableNameRaw, columns);
190
-
191
- if (!Array.isArray(columns)) {
192
- columns = [columns];
193
- }
194
-
195
- const whereAllTheColumnsAreNotNull = columns
196
- .map((column) => this.formatter.columnize(column) + ' IS NOT NULL')
197
- .join(' AND ');
198
-
199
- // make unique constraint that allows null https://stackoverflow.com/a/767702/360060
200
- // to be more or less compatible with other DBs (if any of the columns is NULL then "duplicates" are allowed)
201
- this.pushQuery(
202
- `CREATE UNIQUE INDEX ${indexName} ON ${this.tableName()} (${this.formatter.columnize(
203
- columns
204
- )}) WHERE ${whereAllTheColumnsAreNotNull}`
205
- );
206
- },
207
-
208
- // Compile a drop index command.
209
- dropIndex(columns, indexName) {
210
- indexName = indexName
211
- ? this.formatter.wrap(indexName)
212
- : this._indexCommand('index', this.tableNameRaw, columns);
213
- this.pushQuery(`DROP INDEX ${indexName} ON ${this.tableName()}`);
214
- },
215
-
216
- // Compile a drop foreign key command.
217
- dropForeign(columns, indexName) {
218
- indexName = indexName
219
- ? this.formatter.wrap(indexName)
220
- : this._indexCommand('foreign', this.tableNameRaw, columns);
221
- this.pushQuery(
222
- `ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${indexName}`
223
- );
224
- },
225
-
226
- // Compile a drop primary key command.
227
- dropPrimary(constraintName) {
228
- constraintName = constraintName
229
- ? this.formatter.wrap(constraintName)
230
- : this.formatter.wrap(`${this.tableNameRaw}_pkey`);
231
- this.pushQuery(
232
- `ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${constraintName}`
233
- );
234
- },
235
-
236
- // Compile a drop unique key command.
237
- dropUnique(column, indexName) {
238
- indexName = indexName
239
- ? this.formatter.wrap(indexName)
240
- : this._indexCommand('unique', this.tableNameRaw, column);
241
- this.pushQuery(`DROP INDEX ${indexName} ON ${this.tableName()}`);
242
- },
243
- });
244
-
245
- module.exports = TableCompiler_MSSQL;
1
+ /* eslint max-len:0 */
2
+
3
+ // MSSQL Table Builder & Compiler
4
+ // -------
5
+ const { inherits } = require('util');
6
+ const TableCompiler = require('../../../schema/tablecompiler');
7
+ const helpers = require('../../../helpers');
8
+
9
+ // Table Compiler
10
+ // ------
11
+
12
+ function TableCompiler_MSSQL() {
13
+ TableCompiler.apply(this, arguments);
14
+ }
15
+ inherits(TableCompiler_MSSQL, TableCompiler);
16
+
17
+ Object.assign(TableCompiler_MSSQL.prototype, {
18
+ createAlterTableMethods: ['foreign', 'primary'],
19
+ createQuery(columns, ifNot) {
20
+ const createStatement = ifNot
21
+ ? `if object_id('${this.tableName()}', 'U') is null CREATE TABLE `
22
+ : 'CREATE TABLE ';
23
+ const sql =
24
+ createStatement +
25
+ this.tableName() +
26
+ (this._formatting ? ' (\n ' : ' (') +
27
+ columns.sql.join(this._formatting ? ',\n ' : ', ') +
28
+ ')';
29
+
30
+ if (this.single.comment) {
31
+ const { comment } = this.single;
32
+ if (comment.length > 60)
33
+ this.client.logger.warn(
34
+ 'The max length for a table comment is 60 characters'
35
+ );
36
+ }
37
+
38
+ this.pushQuery(sql);
39
+ },
40
+
41
+ lowerCase: false,
42
+
43
+ addColumnsPrefix: 'ADD ',
44
+
45
+ dropColumnPrefix: 'DROP COLUMN ',
46
+
47
+ alterColumnPrefix: 'ALTER COLUMN ',
48
+
49
+ // Compiles column add. Multiple columns need only one ADD clause (not one ADD per column) so core addColumns doesn't work. #1348
50
+ addColumns(columns, prefix) {
51
+ prefix = prefix || this.addColumnsPrefix;
52
+
53
+ if (columns.sql.length > 0) {
54
+ this.pushQuery({
55
+ sql:
56
+ (this.lowerCase ? 'alter table ' : 'ALTER TABLE ') +
57
+ this.tableName() +
58
+ ' ' +
59
+ prefix +
60
+ columns.sql.join(', '),
61
+ bindings: columns.bindings,
62
+ });
63
+ }
64
+ },
65
+
66
+ // Compiles column drop. Multiple columns need only one DROP clause (not one DROP per column) so core dropColumn doesn't work. #1348
67
+ dropColumn() {
68
+ const _this2 = this;
69
+ const columns = helpers.normalizeArr.apply(null, arguments);
70
+ const columnsArray = Array.isArray(columns) ? columns : [columns];
71
+ const drops = columnsArray.map((column) => _this2.formatter.wrap(column));
72
+ const schema = this.schemaNameRaw || 'dbo';
73
+
74
+ for (const column of columns) {
75
+ const baseQuery = `
76
+ DECLARE @constraint varchar(100) = (SELECT default_constraints.name
77
+ FROM sys.all_columns
78
+ INNER JOIN sys.tables
79
+ ON all_columns.object_id = tables.object_id
80
+ INNER JOIN sys.schemas
81
+ ON tables.schema_id = schemas.schema_id
82
+ INNER JOIN sys.default_constraints
83
+ ON all_columns.default_object_id = default_constraints.object_id
84
+ WHERE schemas.name = '${schema}'
85
+ AND tables.name = '${this.tableNameRaw}'
86
+ AND all_columns.name = '${column}')
87
+
88
+ IF @constraint IS NOT NULL EXEC('ALTER TABLE ${this.tableNameRaw} DROP CONSTRAINT ' + @constraint)`;
89
+ this.pushQuery(baseQuery);
90
+ }
91
+ this.pushQuery(
92
+ (this.lowerCase ? 'alter table ' : 'ALTER TABLE ') +
93
+ this.tableName() +
94
+ ' ' +
95
+ this.dropColumnPrefix +
96
+ drops.join(', ')
97
+ );
98
+ },
99
+
100
+ // Compiles the comment on the table.
101
+ comment() {},
102
+
103
+ changeType() {},
104
+
105
+ // Renames a column on the table.
106
+ renameColumn(from, to) {
107
+ this.pushQuery(
108
+ `exec sp_rename ${this.formatter.parameter(
109
+ this.tableName() + '.' + from
110
+ )}, ${this.formatter.parameter(to)}, 'COLUMN'`
111
+ );
112
+ },
113
+
114
+ dropFKRefs(runner, refs) {
115
+ const formatter = this.client.formatter(this.tableBuilder);
116
+ return Promise.all(
117
+ refs.map(function (ref) {
118
+ const constraintName = formatter.wrap(ref.CONSTRAINT_NAME);
119
+ const tableName = formatter.wrap(ref.TABLE_NAME);
120
+ return runner.query({
121
+ sql: `ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName}`,
122
+ });
123
+ })
124
+ );
125
+ },
126
+ createFKRefs(runner, refs) {
127
+ const formatter = this.client.formatter(this.tableBuilder);
128
+
129
+ return Promise.all(
130
+ refs.map(function (ref) {
131
+ const tableName = formatter.wrap(ref.TABLE_NAME);
132
+ const keyName = formatter.wrap(ref.CONSTRAINT_NAME);
133
+ const column = formatter.columnize(ref.COLUMN_NAME);
134
+ const references = formatter.columnize(ref.REFERENCED_COLUMN_NAME);
135
+ const inTable = formatter.wrap(ref.REFERENCED_TABLE_NAME);
136
+ const onUpdate = ` ON UPDATE ${ref.UPDATE_RULE}`;
137
+ const onDelete = ` ON DELETE ${ref.DELETE_RULE}`;
138
+
139
+ return runner.query({
140
+ sql:
141
+ `ALTER TABLE ${tableName} ADD CONSTRAINT ${keyName}` +
142
+ ' FOREIGN KEY (' +
143
+ column +
144
+ ') REFERENCES ' +
145
+ inTable +
146
+ ' (' +
147
+ references +
148
+ ')' +
149
+ onUpdate +
150
+ onDelete,
151
+ });
152
+ })
153
+ );
154
+ },
155
+
156
+ index(columns, indexName) {
157
+ indexName = indexName
158
+ ? this.formatter.wrap(indexName)
159
+ : this._indexCommand('index', this.tableNameRaw, columns);
160
+ this.pushQuery(
161
+ `CREATE INDEX ${indexName} ON ${this.tableName()} (${this.formatter.columnize(
162
+ columns
163
+ )})`
164
+ );
165
+ },
166
+
167
+ primary(columns, constraintName) {
168
+ constraintName = constraintName
169
+ ? this.formatter.wrap(constraintName)
170
+ : this.formatter.wrap(`${this.tableNameRaw}_pkey`);
171
+ if (!this.forCreate) {
172
+ this.pushQuery(
173
+ `ALTER TABLE ${this.tableName()} ADD CONSTRAINT ${constraintName} PRIMARY KEY (${this.formatter.columnize(
174
+ columns
175
+ )})`
176
+ );
177
+ } else {
178
+ this.pushQuery(
179
+ `CONSTRAINT ${constraintName} PRIMARY KEY (${this.formatter.columnize(
180
+ columns
181
+ )})`
182
+ );
183
+ }
184
+ },
185
+
186
+ unique(columns, indexName) {
187
+ indexName = indexName
188
+ ? this.formatter.wrap(indexName)
189
+ : this._indexCommand('unique', this.tableNameRaw, columns);
190
+
191
+ if (!Array.isArray(columns)) {
192
+ columns = [columns];
193
+ }
194
+
195
+ const whereAllTheColumnsAreNotNull = columns
196
+ .map((column) => this.formatter.columnize(column) + ' IS NOT NULL')
197
+ .join(' AND ');
198
+
199
+ // make unique constraint that allows null https://stackoverflow.com/a/767702/360060
200
+ // to be more or less compatible with other DBs (if any of the columns is NULL then "duplicates" are allowed)
201
+ this.pushQuery(
202
+ `CREATE UNIQUE INDEX ${indexName} ON ${this.tableName()} (${this.formatter.columnize(
203
+ columns
204
+ )}) WHERE ${whereAllTheColumnsAreNotNull}`
205
+ );
206
+ },
207
+
208
+ // Compile a drop index command.
209
+ dropIndex(columns, indexName) {
210
+ indexName = indexName
211
+ ? this.formatter.wrap(indexName)
212
+ : this._indexCommand('index', this.tableNameRaw, columns);
213
+ this.pushQuery(`DROP INDEX ${indexName} ON ${this.tableName()}`);
214
+ },
215
+
216
+ // Compile a drop foreign key command.
217
+ dropForeign(columns, indexName) {
218
+ indexName = indexName
219
+ ? this.formatter.wrap(indexName)
220
+ : this._indexCommand('foreign', this.tableNameRaw, columns);
221
+ this.pushQuery(
222
+ `ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${indexName}`
223
+ );
224
+ },
225
+
226
+ // Compile a drop primary key command.
227
+ dropPrimary(constraintName) {
228
+ constraintName = constraintName
229
+ ? this.formatter.wrap(constraintName)
230
+ : this.formatter.wrap(`${this.tableNameRaw}_pkey`);
231
+ this.pushQuery(
232
+ `ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${constraintName}`
233
+ );
234
+ },
235
+
236
+ // Compile a drop unique key command.
237
+ dropUnique(column, indexName) {
238
+ indexName = indexName
239
+ ? this.formatter.wrap(indexName)
240
+ : this._indexCommand('unique', this.tableNameRaw, column);
241
+ this.pushQuery(`DROP INDEX ${indexName} ON ${this.tableName()}`);
242
+ },
243
+ });
244
+
245
+ module.exports = TableCompiler_MSSQL;