knex 2.5.0 → 3.0.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 +78 -59
  2. package/CONTRIBUTING.md +194 -194
  3. package/LICENSE +22 -22
  4. package/README.md +149 -147
  5. package/UPGRADING.md +245 -233
  6. package/bin/cli.js +475 -473
  7. package/bin/utils/cli-config-utils.js +212 -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 -11
  12. package/lib/builder-interface-augmenter.js +120 -120
  13. package/lib/client.js +495 -495
  14. package/lib/constants.js +61 -61
  15. package/lib/dialects/better-sqlite3/index.js +77 -77
  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/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 +599 -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/stub/cjs.stub +15 -15
  116. package/lib/migrations/migrate/stub/coffee.stub +13 -13
  117. package/lib/migrations/migrate/stub/eg.stub +14 -14
  118. package/lib/migrations/migrate/stub/js-schema.stub +22 -22
  119. package/lib/migrations/migrate/stub/js.stub +22 -22
  120. package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
  121. package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
  122. package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
  123. package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
  124. package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
  125. package/lib/migrations/migrate/stub/ls.stub +14 -14
  126. package/lib/migrations/migrate/stub/mjs.stub +23 -23
  127. package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
  128. package/lib/migrations/migrate/stub/ts.stub +21 -21
  129. package/lib/migrations/migrate/table-creator.js +77 -77
  130. package/lib/migrations/migrate/table-resolver.js +27 -27
  131. package/lib/migrations/seed/Seeder.js +137 -137
  132. package/lib/migrations/seed/seed-stub.js +13 -13
  133. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  134. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  135. package/lib/migrations/seed/stub/coffee.stub +9 -9
  136. package/lib/migrations/seed/stub/eg.stub +11 -11
  137. package/lib/migrations/seed/stub/js.stub +13 -13
  138. package/lib/migrations/seed/stub/ls.stub +11 -11
  139. package/lib/migrations/seed/stub/mjs.stub +12 -12
  140. package/lib/migrations/seed/stub/ts.stub +13 -13
  141. package/lib/migrations/util/fs.js +86 -86
  142. package/lib/migrations/util/import-file.js +12 -12
  143. package/lib/migrations/util/is-module-type.js +9 -9
  144. package/lib/migrations/util/template.js +52 -52
  145. package/lib/migrations/util/timestamp.js +14 -14
  146. package/lib/query/analytic.js +52 -52
  147. package/lib/query/constants.js +15 -15
  148. package/lib/query/joinclause.js +270 -270
  149. package/lib/query/method-constants.js +136 -136
  150. package/lib/query/querybuilder.js +1793 -1793
  151. package/lib/query/querycompiler.js +1591 -1591
  152. package/lib/raw.js +139 -139
  153. package/lib/ref.js +39 -39
  154. package/lib/schema/builder.js +115 -115
  155. package/lib/schema/columnbuilder.js +146 -146
  156. package/lib/schema/columncompiler.js +307 -307
  157. package/lib/schema/compiler.js +187 -187
  158. package/lib/schema/internal/helpers.js +55 -55
  159. package/lib/schema/tablebuilder.js +376 -376
  160. package/lib/schema/tablecompiler.js +433 -433
  161. package/lib/schema/viewbuilder.js +92 -92
  162. package/lib/schema/viewcompiler.js +138 -138
  163. package/lib/util/finally-mixin.js +13 -13
  164. package/lib/util/helpers.js +95 -95
  165. package/lib/util/is.js +32 -32
  166. package/lib/util/nanoid.js +40 -40
  167. package/lib/util/noop.js +1 -1
  168. package/lib/util/save-async-stack.js +14 -14
  169. package/lib/util/security.js +26 -26
  170. package/lib/util/string.js +190 -190
  171. package/lib/util/timeout.js +29 -29
  172. package/package.json +13 -12
  173. package/scripts/build.js +125 -125
  174. package/scripts/clean.js +31 -31
  175. package/scripts/docker-compose.yml +152 -152
  176. package/scripts/next-release-howto.md +24 -24
  177. package/scripts/oracledb-install-driver-libs.sh +82 -82
  178. package/scripts/release.sh +36 -34
  179. package/scripts/runkit-example.js +35 -34
  180. package/scripts/stress-test/README.txt +18 -18
  181. package/scripts/stress-test/docker-compose.yml +57 -57
  182. package/scripts/stress-test/knex-stress-test.js +212 -208
  183. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -145
  184. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -100
  185. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -184
  186. package/scripts/update_gitignore_for_tsc_output.js +90 -90
  187. package/types/index.d.ts +3272 -3273
  188. package/types/result.d.ts +27 -27
  189. package/types/tables.d.ts +4 -4
  190. package/lib/dialects/index.js +0 -34
@@ -1,185 +1,185 @@
1
- // MSSQL Column Compiler
2
- // -------
3
- const ColumnCompiler = require('../../../schema/columncompiler');
4
- const { toNumber } = require('../../../util/helpers');
5
- const { formatDefault } = require('../../../formatter/formatterUtils');
6
- const { operator: operator_ } = require('../../../formatter/wrappingFormatter');
7
-
8
- class ColumnCompiler_MSSQL extends ColumnCompiler {
9
- constructor(client, tableCompiler, columnBuilder) {
10
- super(client, tableCompiler, columnBuilder);
11
- this.modifiers = ['nullable', 'defaultTo', 'first', 'after', 'comment'];
12
- this._addCheckModifiers();
13
- }
14
-
15
- // Types
16
- // ------
17
-
18
- double(precision, scale) {
19
- return 'float';
20
- }
21
-
22
- floating(precision, scale) {
23
- // ignore precicion / scale which is mysql specific stuff
24
- return `float`;
25
- }
26
-
27
- integer() {
28
- // mssql does not support length
29
- return 'int';
30
- }
31
-
32
- tinyint() {
33
- // mssql does not support length
34
- return 'tinyint';
35
- }
36
-
37
- varchar(length) {
38
- return `nvarchar(${toNumber(length, 255)})`;
39
- }
40
-
41
- timestamp({ useTz = false } = {}) {
42
- return useTz ? 'datetimeoffset' : 'datetime2';
43
- }
44
-
45
- bit(length) {
46
- if (length > 1) {
47
- this.client.logger.warn('Bit field is exactly 1 bit length for MSSQL');
48
- }
49
- return 'bit';
50
- }
51
-
52
- binary(length) {
53
- return length ? `varbinary(${toNumber(length)})` : 'varbinary(max)';
54
- }
55
-
56
- // Modifiers
57
- // ------
58
-
59
- first() {
60
- this.client.logger.warn('Column first modifier not available for MSSQL');
61
- return '';
62
- }
63
-
64
- after(column) {
65
- this.client.logger.warn('Column after modifier not available for MSSQL');
66
- return '';
67
- }
68
-
69
- defaultTo(value, { constraintName } = {}) {
70
- const formattedValue = formatDefault(value, this.type, this.client);
71
- constraintName =
72
- typeof constraintName !== 'undefined'
73
- ? constraintName
74
- : `${
75
- this.tableCompiler.tableNameRaw
76
- }_${this.getColumnName()}_default`.toLowerCase();
77
- if (this.columnBuilder._method === 'alter') {
78
- this.pushAdditional(function () {
79
- this.pushQuery(
80
- `ALTER TABLE ${this.tableCompiler.tableName()} ADD CONSTRAINT ${this.formatter.wrap(
81
- constraintName
82
- )} DEFAULT ${formattedValue} FOR ${this.formatter.wrap(
83
- this.getColumnName()
84
- )}`
85
- );
86
- });
87
- return '';
88
- }
89
- if (!constraintName) {
90
- return `DEFAULT ${formattedValue}`;
91
- }
92
- return `CONSTRAINT ${this.formatter.wrap(
93
- constraintName
94
- )} DEFAULT ${formattedValue}`;
95
- }
96
-
97
- comment(/** @type {string} */ comment) {
98
- if (!comment) {
99
- return;
100
- }
101
-
102
- // XXX: This is a byte limit, not character, so we cannot definitively say they'll exceed the limit without database collation info.
103
- // (Yes, even if the column has its own collation, the sqlvariant still uses the database collation.)
104
- // I'm not sure we even need to raise a warning, as MSSQL will return an error when the limit is exceeded itself.
105
- if (comment && comment.length > 7500 / 2) {
106
- this.client.logger.warn(
107
- 'Your comment might be longer than the max comment length for MSSQL of 7,500 bytes.'
108
- );
109
- }
110
-
111
- // See: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-addextendedproperty-transact-sql?view=sql-server-ver15#b-adding-an-extended-property-to-a-column-in-a-table
112
- const value = this.formatter.escapingStringDelimiters(comment);
113
- const level0name = this.tableCompiler.schemaNameRaw || 'dbo';
114
- const level1name = this.formatter.escapingStringDelimiters(
115
- this.tableCompiler.tableNameRaw
116
- );
117
- const level2name = this.formatter.escapingStringDelimiters(
118
- this.args[0] || this.defaults('columnName')
119
- );
120
-
121
- const args = `N'MS_Description', N'${value}', N'Schema', N'${level0name}', N'Table', N'${level1name}', N'Column', N'${level2name}'`;
122
-
123
- this.pushAdditional(function () {
124
- const isAlreadyDefined = `EXISTS(SELECT * FROM sys.fn_listextendedproperty(N'MS_Description', N'Schema', N'${level0name}', N'Table', N'${level1name}', N'Column', N'${level2name}'))`;
125
- this.pushQuery(
126
- `IF ${isAlreadyDefined}\n EXEC sys.sp_updateextendedproperty ${args}\nELSE\n EXEC sys.sp_addextendedproperty ${args}`
127
- );
128
- });
129
- return '';
130
- }
131
-
132
- checkLength(operator, length, constraintName) {
133
- return this._check(
134
- `LEN(${this.formatter.wrap(this.getColumnName())}) ${operator_(
135
- operator,
136
- this.columnBuilder,
137
- this.bindingsHolder
138
- )} ${toNumber(length)}`,
139
- constraintName
140
- );
141
- }
142
-
143
- checkRegex(regex, constraintName) {
144
- return this._check(
145
- `${this.formatter.wrap(
146
- this.getColumnName()
147
- )} LIKE ${this.client._escapeBinding('%' + regex + '%')}`,
148
- constraintName
149
- );
150
- }
151
-
152
- increments(options = { primaryKey: true }) {
153
- return (
154
- 'int identity(1,1) not null' +
155
- (this.tableCompiler._canBeAddPrimaryKey(options) ? ' primary key' : '')
156
- );
157
- }
158
-
159
- bigincrements(options = { primaryKey: true }) {
160
- return (
161
- 'bigint identity(1,1) not null' +
162
- (this.tableCompiler._canBeAddPrimaryKey(options) ? ' primary key' : '')
163
- );
164
- }
165
- }
166
-
167
- ColumnCompiler_MSSQL.prototype.bigint = 'bigint';
168
- ColumnCompiler_MSSQL.prototype.mediumint = 'int';
169
- ColumnCompiler_MSSQL.prototype.smallint = 'smallint';
170
- ColumnCompiler_MSSQL.prototype.text = 'nvarchar(max)';
171
- ColumnCompiler_MSSQL.prototype.mediumtext = 'nvarchar(max)';
172
- ColumnCompiler_MSSQL.prototype.longtext = 'nvarchar(max)';
173
- ColumnCompiler_MSSQL.prototype.json = ColumnCompiler_MSSQL.prototype.jsonb =
174
- 'nvarchar(max)';
175
-
176
- // TODO: mssql supports check constraints as of SQL Server 2008
177
- // so make enu here more like postgres
178
- ColumnCompiler_MSSQL.prototype.enu = 'nvarchar(100)';
179
- ColumnCompiler_MSSQL.prototype.uuid = ({ useBinaryUuid = false } = {}) =>
180
- useBinaryUuid ? 'binary(16)' : 'uniqueidentifier';
181
-
182
- ColumnCompiler_MSSQL.prototype.datetime = 'datetime2';
183
- ColumnCompiler_MSSQL.prototype.bool = 'bit';
184
-
185
- module.exports = ColumnCompiler_MSSQL;
1
+ // MSSQL Column Compiler
2
+ // -------
3
+ const ColumnCompiler = require('../../../schema/columncompiler');
4
+ const { toNumber } = require('../../../util/helpers');
5
+ const { formatDefault } = require('../../../formatter/formatterUtils');
6
+ const { operator: operator_ } = require('../../../formatter/wrappingFormatter');
7
+
8
+ class ColumnCompiler_MSSQL extends ColumnCompiler {
9
+ constructor(client, tableCompiler, columnBuilder) {
10
+ super(client, tableCompiler, columnBuilder);
11
+ this.modifiers = ['nullable', 'defaultTo', 'first', 'after', 'comment'];
12
+ this._addCheckModifiers();
13
+ }
14
+
15
+ // Types
16
+ // ------
17
+
18
+ double(precision, scale) {
19
+ return 'float';
20
+ }
21
+
22
+ floating(precision, scale) {
23
+ // ignore precicion / scale which is mysql specific stuff
24
+ return `float`;
25
+ }
26
+
27
+ integer() {
28
+ // mssql does not support length
29
+ return 'int';
30
+ }
31
+
32
+ tinyint() {
33
+ // mssql does not support length
34
+ return 'tinyint';
35
+ }
36
+
37
+ varchar(length) {
38
+ return `nvarchar(${toNumber(length, 255)})`;
39
+ }
40
+
41
+ timestamp({ useTz = false } = {}) {
42
+ return useTz ? 'datetimeoffset' : 'datetime2';
43
+ }
44
+
45
+ bit(length) {
46
+ if (length > 1) {
47
+ this.client.logger.warn('Bit field is exactly 1 bit length for MSSQL');
48
+ }
49
+ return 'bit';
50
+ }
51
+
52
+ binary(length) {
53
+ return length ? `varbinary(${toNumber(length)})` : 'varbinary(max)';
54
+ }
55
+
56
+ // Modifiers
57
+ // ------
58
+
59
+ first() {
60
+ this.client.logger.warn('Column first modifier not available for MSSQL');
61
+ return '';
62
+ }
63
+
64
+ after(column) {
65
+ this.client.logger.warn('Column after modifier not available for MSSQL');
66
+ return '';
67
+ }
68
+
69
+ defaultTo(value, { constraintName } = {}) {
70
+ const formattedValue = formatDefault(value, this.type, this.client);
71
+ constraintName =
72
+ typeof constraintName !== 'undefined'
73
+ ? constraintName
74
+ : `${
75
+ this.tableCompiler.tableNameRaw
76
+ }_${this.getColumnName()}_default`.toLowerCase();
77
+ if (this.columnBuilder._method === 'alter') {
78
+ this.pushAdditional(function () {
79
+ this.pushQuery(
80
+ `ALTER TABLE ${this.tableCompiler.tableName()} ADD CONSTRAINT ${this.formatter.wrap(
81
+ constraintName
82
+ )} DEFAULT ${formattedValue} FOR ${this.formatter.wrap(
83
+ this.getColumnName()
84
+ )}`
85
+ );
86
+ });
87
+ return '';
88
+ }
89
+ if (!constraintName) {
90
+ return `DEFAULT ${formattedValue}`;
91
+ }
92
+ return `CONSTRAINT ${this.formatter.wrap(
93
+ constraintName
94
+ )} DEFAULT ${formattedValue}`;
95
+ }
96
+
97
+ comment(/** @type {string} */ comment) {
98
+ if (!comment) {
99
+ return;
100
+ }
101
+
102
+ // XXX: This is a byte limit, not character, so we cannot definitively say they'll exceed the limit without database collation info.
103
+ // (Yes, even if the column has its own collation, the sqlvariant still uses the database collation.)
104
+ // I'm not sure we even need to raise a warning, as MSSQL will return an error when the limit is exceeded itself.
105
+ if (comment && comment.length > 7500 / 2) {
106
+ this.client.logger.warn(
107
+ 'Your comment might be longer than the max comment length for MSSQL of 7,500 bytes.'
108
+ );
109
+ }
110
+
111
+ // See: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-addextendedproperty-transact-sql?view=sql-server-ver15#b-adding-an-extended-property-to-a-column-in-a-table
112
+ const value = this.formatter.escapingStringDelimiters(comment);
113
+ const level0name = this.tableCompiler.schemaNameRaw || 'dbo';
114
+ const level1name = this.formatter.escapingStringDelimiters(
115
+ this.tableCompiler.tableNameRaw
116
+ );
117
+ const level2name = this.formatter.escapingStringDelimiters(
118
+ this.args[0] || this.defaults('columnName')
119
+ );
120
+
121
+ const args = `N'MS_Description', N'${value}', N'Schema', N'${level0name}', N'Table', N'${level1name}', N'Column', N'${level2name}'`;
122
+
123
+ this.pushAdditional(function () {
124
+ const isAlreadyDefined = `EXISTS(SELECT * FROM sys.fn_listextendedproperty(N'MS_Description', N'Schema', N'${level0name}', N'Table', N'${level1name}', N'Column', N'${level2name}'))`;
125
+ this.pushQuery(
126
+ `IF ${isAlreadyDefined}\n EXEC sys.sp_updateextendedproperty ${args}\nELSE\n EXEC sys.sp_addextendedproperty ${args}`
127
+ );
128
+ });
129
+ return '';
130
+ }
131
+
132
+ checkLength(operator, length, constraintName) {
133
+ return this._check(
134
+ `LEN(${this.formatter.wrap(this.getColumnName())}) ${operator_(
135
+ operator,
136
+ this.columnBuilder,
137
+ this.bindingsHolder
138
+ )} ${toNumber(length)}`,
139
+ constraintName
140
+ );
141
+ }
142
+
143
+ checkRegex(regex, constraintName) {
144
+ return this._check(
145
+ `${this.formatter.wrap(
146
+ this.getColumnName()
147
+ )} LIKE ${this.client._escapeBinding('%' + regex + '%')}`,
148
+ constraintName
149
+ );
150
+ }
151
+
152
+ increments(options = { primaryKey: true }) {
153
+ return (
154
+ 'int identity(1,1) not null' +
155
+ (this.tableCompiler._canBeAddPrimaryKey(options) ? ' primary key' : '')
156
+ );
157
+ }
158
+
159
+ bigincrements(options = { primaryKey: true }) {
160
+ return (
161
+ 'bigint identity(1,1) not null' +
162
+ (this.tableCompiler._canBeAddPrimaryKey(options) ? ' primary key' : '')
163
+ );
164
+ }
165
+ }
166
+
167
+ ColumnCompiler_MSSQL.prototype.bigint = 'bigint';
168
+ ColumnCompiler_MSSQL.prototype.mediumint = 'int';
169
+ ColumnCompiler_MSSQL.prototype.smallint = 'smallint';
170
+ ColumnCompiler_MSSQL.prototype.text = 'nvarchar(max)';
171
+ ColumnCompiler_MSSQL.prototype.mediumtext = 'nvarchar(max)';
172
+ ColumnCompiler_MSSQL.prototype.longtext = 'nvarchar(max)';
173
+ ColumnCompiler_MSSQL.prototype.json = ColumnCompiler_MSSQL.prototype.jsonb =
174
+ 'nvarchar(max)';
175
+
176
+ // TODO: mssql supports check constraints as of SQL Server 2008
177
+ // so make enu here more like postgres
178
+ ColumnCompiler_MSSQL.prototype.enu = 'nvarchar(100)';
179
+ ColumnCompiler_MSSQL.prototype.uuid = ({ useBinaryUuid = false } = {}) =>
180
+ useBinaryUuid ? 'binary(16)' : 'uniqueidentifier';
181
+
182
+ ColumnCompiler_MSSQL.prototype.datetime = 'datetime2';
183
+ ColumnCompiler_MSSQL.prototype.bool = 'bit';
184
+
185
+ module.exports = ColumnCompiler_MSSQL;
@@ -1,91 +1,91 @@
1
- // MySQL Schema Compiler
2
- // -------
3
- const SchemaCompiler = require('../../../schema/compiler');
4
-
5
- class SchemaCompiler_MSSQL extends SchemaCompiler {
6
- constructor(client, builder) {
7
- super(client, builder);
8
- }
9
-
10
- dropTableIfExists(tableName) {
11
- const name = this.formatter.wrap(prefixedTableName(this.schema, tableName));
12
- this.pushQuery(
13
- `if object_id('${name}', 'U') is not null DROP TABLE ${name}`
14
- );
15
- }
16
-
17
- dropViewIfExists(viewName) {
18
- const name = this.formatter.wrap(prefixedTableName(this.schema, viewName));
19
- this.pushQuery(
20
- `if object_id('${name}', 'V') is not null DROP VIEW ${name}`
21
- );
22
- }
23
-
24
- // Rename a table on the schema.
25
- renameTable(tableName, to) {
26
- this.pushQuery(
27
- `exec sp_rename ${this.client.parameter(
28
- prefixedTableName(this.schema, tableName),
29
- this.builder,
30
- this.bindingsHolder
31
- )}, ${this.client.parameter(to, this.builder, this.bindingsHolder)}`
32
- );
33
- }
34
-
35
- renameView(viewTable, to) {
36
- this.pushQuery(
37
- `exec sp_rename ${this.client.parameter(
38
- prefixedTableName(this.schema, viewTable),
39
- this.builder,
40
- this.bindingsHolder
41
- )}, ${this.client.parameter(to, this.builder, this.bindingsHolder)}`
42
- );
43
- }
44
-
45
- // Check whether a table exists on the query.
46
- hasTable(tableName) {
47
- const formattedTable = this.client.parameter(
48
- prefixedTableName(this.schema, tableName),
49
- this.builder,
50
- this.bindingsHolder
51
- );
52
- const bindings = [tableName];
53
- let sql =
54
- `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ` +
55
- `WHERE TABLE_NAME = ${formattedTable}`;
56
-
57
- if (this.schema) {
58
- sql += ' AND TABLE_SCHEMA = ?';
59
- bindings.push(this.schema);
60
- }
61
-
62
- this.pushQuery({ sql, bindings, output: (resp) => resp.length > 0 });
63
- }
64
-
65
- // Check whether a column exists on the schema.
66
- hasColumn(tableName, column) {
67
- const formattedColumn = this.client.parameter(
68
- column,
69
- this.builder,
70
- this.bindingsHolder
71
- );
72
- const formattedTable = this.client.parameter(
73
- this.formatter.wrap(prefixedTableName(this.schema, tableName)),
74
- this.builder,
75
- this.bindingsHolder
76
- );
77
- const sql =
78
- `select object_id from sys.columns ` +
79
- `where name = ${formattedColumn} ` +
80
- `and object_id = object_id(${formattedTable})`;
81
- this.pushQuery({ sql, output: (resp) => resp.length > 0 });
82
- }
83
- }
84
-
85
- SchemaCompiler_MSSQL.prototype.dropTablePrefix = 'DROP TABLE ';
86
-
87
- function prefixedTableName(prefix, table) {
88
- return prefix ? `${prefix}.${table}` : table;
89
- }
90
-
91
- module.exports = SchemaCompiler_MSSQL;
1
+ // MySQL Schema Compiler
2
+ // -------
3
+ const SchemaCompiler = require('../../../schema/compiler');
4
+
5
+ class SchemaCompiler_MSSQL extends SchemaCompiler {
6
+ constructor(client, builder) {
7
+ super(client, builder);
8
+ }
9
+
10
+ dropTableIfExists(tableName) {
11
+ const name = this.formatter.wrap(prefixedTableName(this.schema, tableName));
12
+ this.pushQuery(
13
+ `if object_id('${name}', 'U') is not null DROP TABLE ${name}`
14
+ );
15
+ }
16
+
17
+ dropViewIfExists(viewName) {
18
+ const name = this.formatter.wrap(prefixedTableName(this.schema, viewName));
19
+ this.pushQuery(
20
+ `if object_id('${name}', 'V') is not null DROP VIEW ${name}`
21
+ );
22
+ }
23
+
24
+ // Rename a table on the schema.
25
+ renameTable(tableName, to) {
26
+ this.pushQuery(
27
+ `exec sp_rename ${this.client.parameter(
28
+ prefixedTableName(this.schema, tableName),
29
+ this.builder,
30
+ this.bindingsHolder
31
+ )}, ${this.client.parameter(to, this.builder, this.bindingsHolder)}`
32
+ );
33
+ }
34
+
35
+ renameView(viewTable, to) {
36
+ this.pushQuery(
37
+ `exec sp_rename ${this.client.parameter(
38
+ prefixedTableName(this.schema, viewTable),
39
+ this.builder,
40
+ this.bindingsHolder
41
+ )}, ${this.client.parameter(to, this.builder, this.bindingsHolder)}`
42
+ );
43
+ }
44
+
45
+ // Check whether a table exists on the query.
46
+ hasTable(tableName) {
47
+ const formattedTable = this.client.parameter(
48
+ prefixedTableName(this.schema, tableName),
49
+ this.builder,
50
+ this.bindingsHolder
51
+ );
52
+ const bindings = [tableName];
53
+ let sql =
54
+ `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ` +
55
+ `WHERE TABLE_NAME = ${formattedTable}`;
56
+
57
+ if (this.schema) {
58
+ sql += ' AND TABLE_SCHEMA = ?';
59
+ bindings.push(this.schema);
60
+ }
61
+
62
+ this.pushQuery({ sql, bindings, output: (resp) => resp.length > 0 });
63
+ }
64
+
65
+ // Check whether a column exists on the schema.
66
+ hasColumn(tableName, column) {
67
+ const formattedColumn = this.client.parameter(
68
+ column,
69
+ this.builder,
70
+ this.bindingsHolder
71
+ );
72
+ const formattedTable = this.client.parameter(
73
+ this.formatter.wrap(prefixedTableName(this.schema, tableName)),
74
+ this.builder,
75
+ this.bindingsHolder
76
+ );
77
+ const sql =
78
+ `select object_id from sys.columns ` +
79
+ `where name = ${formattedColumn} ` +
80
+ `and object_id = object_id(${formattedTable})`;
81
+ this.pushQuery({ sql, output: (resp) => resp.length > 0 });
82
+ }
83
+ }
84
+
85
+ SchemaCompiler_MSSQL.prototype.dropTablePrefix = 'DROP TABLE ';
86
+
87
+ function prefixedTableName(prefix, table) {
88
+ return prefix ? `${prefix}.${table}` : table;
89
+ }
90
+
91
+ module.exports = SchemaCompiler_MSSQL;