knex 3.2.3 → 3.2.4
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.
- package/CHANGELOG.md +2447 -2441
- package/CONTRIBUTING.md +190 -190
- package/LICENSE +22 -22
- package/README.md +156 -156
- package/UPGRADING.md +245 -245
- package/bin/cli.js +516 -516
- package/bin/knexfile-runtime-error.js +27 -27
- package/bin/utils/cli-config-utils.js +217 -217
- package/bin/utils/constants.js +7 -7
- package/bin/utils/migrationsLister.js +37 -37
- package/knex.js +23 -23
- package/knex.mjs +11 -11
- package/lib/builder-interface-augmenter.js +120 -120
- package/lib/client.js +585 -585
- package/lib/constants.js +61 -61
- package/lib/dialects/better-sqlite3/index.js +101 -101
- package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
- package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
- package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
- package/lib/dialects/cockroachdb/crdb-tablecompiler.js +46 -46
- package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
- package/lib/dialects/cockroachdb/index.js +86 -86
- package/lib/dialects/index.js +34 -34
- package/lib/dialects/mssql/index.js +498 -498
- package/lib/dialects/mssql/mssql-formatter.js +34 -34
- package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -601
- package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
- package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
- package/lib/dialects/mssql/schema/mssql-tablecompiler.js +393 -393
- package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
- package/lib/dialects/mssql/transaction.js +176 -176
- package/lib/dialects/mysql/index.js +317 -317
- package/lib/dialects/mysql/query/mysql-querybuilder.js +14 -14
- package/lib/dialects/mysql/query/mysql-querycompiler.js +292 -292
- package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
- package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
- package/lib/dialects/mysql/schema/mysql-tablecompiler.js +426 -426
- package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
- package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
- package/lib/dialects/mysql/transaction.js +46 -46
- package/lib/dialects/mysql2/index.js +53 -53
- package/lib/dialects/mysql2/transaction.js +44 -44
- package/lib/dialects/oracle/DEAD_CODE.md +5 -5
- package/lib/dialects/oracle/index.js +92 -92
- package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -343
- package/lib/dialects/oracle/schema/internal/incrementUtils.js +22 -22
- package/lib/dialects/oracle/schema/internal/trigger.js +155 -155
- package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
- package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
- package/lib/dialects/oracle/schema/oracle-compiler.js +124 -124
- package/lib/dialects/oracle/schema/oracle-tablecompiler.js +210 -210
- package/lib/dialects/oracle/utils.js +107 -107
- package/lib/dialects/oracledb/index.js +381 -381
- package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
- package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -61
- package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
- package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
- package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
- package/lib/dialects/oracledb/transaction.js +98 -98
- package/lib/dialects/oracledb/utils.js +208 -208
- package/lib/dialects/pgnative/index.js +60 -60
- package/lib/dialects/postgres/execution/pg-transaction.js +19 -19
- package/lib/dialects/postgres/index.js +373 -373
- package/lib/dialects/postgres/query/pg-querybuilder.js +43 -43
- package/lib/dialects/postgres/query/pg-querycompiler.js +400 -400
- package/lib/dialects/postgres/schema/pg-columncompiler.js +162 -162
- package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
- package/lib/dialects/postgres/schema/pg-tablecompiler.js +331 -331
- package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
- package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
- package/lib/dialects/redshift/index.js +86 -86
- package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
- package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
- package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
- package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
- package/lib/dialects/redshift/schema/redshift-tablecompiler.js +134 -134
- package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
- package/lib/dialects/redshift/transaction.js +32 -32
- package/lib/dialects/sqlite3/execution/sqlite-transaction.js +172 -172
- package/lib/dialects/sqlite3/index.js +263 -263
- package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
- package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +341 -341
- package/lib/dialects/sqlite3/schema/ddl.js +380 -380
- package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
- package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
- package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
- package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
- package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
- package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
- package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
- package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
- package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +364 -364
- package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
- package/lib/execution/batch-insert.js +51 -51
- package/lib/execution/internal/delay.js +6 -6
- package/lib/execution/internal/ensure-connection-callback.js +41 -41
- package/lib/execution/internal/query-executioner.js +62 -62
- package/lib/execution/runner.js +325 -325
- package/lib/execution/transaction.js +417 -417
- package/lib/formatter/formatterUtils.js +42 -42
- package/lib/formatter/rawFormatter.js +84 -84
- package/lib/formatter/wrappingFormatter.js +253 -253
- package/lib/formatter.js +25 -25
- package/lib/index.js +3 -3
- package/lib/knex-builder/FunctionHelper.js +80 -80
- package/lib/knex-builder/Knex.js +59 -59
- package/lib/knex-builder/internal/config-resolver.js +57 -57
- package/lib/knex-builder/internal/parse-connection.js +87 -87
- package/lib/knex-builder/make-knex.js +345 -345
- package/lib/logger.js +76 -76
- package/lib/migrations/common/MigrationsLoader.js +36 -36
- package/lib/migrations/migrate/MigrationGenerator.js +84 -84
- package/lib/migrations/migrate/Migrator.js +632 -632
- package/lib/migrations/migrate/migrate-stub.js +17 -17
- package/lib/migrations/migrate/migration-list-resolver.js +33 -33
- package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
- package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
- package/lib/migrations/migrate/stub/cjs.stub +15 -15
- package/lib/migrations/migrate/stub/coffee.stub +13 -13
- package/lib/migrations/migrate/stub/eg.stub +14 -14
- package/lib/migrations/migrate/stub/js-schema.stub +22 -22
- package/lib/migrations/migrate/stub/js.stub +22 -22
- package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
- package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
- package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
- package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
- package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
- package/lib/migrations/migrate/stub/ls.stub +14 -14
- package/lib/migrations/migrate/stub/mjs.stub +23 -23
- package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
- package/lib/migrations/migrate/stub/ts.stub +21 -21
- package/lib/migrations/migrate/table-creator.js +77 -77
- package/lib/migrations/migrate/table-resolver.js +27 -27
- package/lib/migrations/seed/Seeder.js +137 -137
- package/lib/migrations/seed/seed-stub.js +13 -13
- package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
- package/lib/migrations/seed/sources/fs-seeds.js +65 -65
- package/lib/migrations/seed/stub/coffee.stub +9 -9
- package/lib/migrations/seed/stub/eg.stub +11 -11
- package/lib/migrations/seed/stub/js.stub +13 -13
- package/lib/migrations/seed/stub/ls.stub +11 -11
- package/lib/migrations/seed/stub/mjs.stub +12 -12
- package/lib/migrations/seed/stub/ts.stub +13 -13
- package/lib/migrations/util/fs.js +86 -86
- package/lib/migrations/util/import-file.js +12 -12
- package/lib/migrations/util/is-module-type.js +9 -9
- package/lib/migrations/util/template.js +52 -52
- package/lib/migrations/util/timestamp.js +14 -14
- package/lib/query/analytic.js +52 -52
- package/lib/query/constants.js +15 -15
- package/lib/query/joinclause.js +270 -270
- package/lib/query/method-constants.js +136 -136
- package/lib/query/querybuilder.js +1793 -1793
- package/lib/query/querycompiler.js +1634 -1634
- package/lib/raw.js +139 -139
- package/lib/ref.js +39 -39
- package/lib/schema/builder.js +115 -115
- package/lib/schema/columnbuilder.js +146 -146
- package/lib/schema/columncompiler.js +307 -307
- package/lib/schema/compiler.js +187 -187
- package/lib/schema/internal/helpers.js +55 -55
- package/lib/schema/tablebuilder.js +379 -379
- package/lib/schema/tablecompiler.js +450 -450
- package/lib/schema/viewbuilder.js +92 -92
- package/lib/schema/viewcompiler.js +138 -138
- package/lib/util/finally-mixin.js +13 -13
- package/lib/util/helpers.js +95 -95
- package/lib/util/is.js +32 -32
- package/lib/util/nanoid.js +40 -40
- package/lib/util/noop.js +1 -1
- package/lib/util/save-async-stack.js +14 -14
- package/lib/util/security.js +32 -32
- package/lib/util/string.js +190 -190
- package/lib/util/timeout.js +29 -29
- package/package.json +294 -293
- package/scripts/act-testing/act.sh +19 -19
- package/scripts/act-testing/merged-no-label.json +11 -11
- package/scripts/act-testing/merged-patch-labeled.json +12 -12
- package/scripts/act-testing/merged-skip-labeled.json +12 -12
- package/scripts/act-testing/not-merged-patch-labeled.json +12 -12
- package/scripts/build-for-release.sh +121 -121
- package/scripts/build.js +125 -125
- package/scripts/clean.js +31 -31
- package/scripts/docker-compose.yml +150 -150
- package/scripts/format-changelog.js +55 -55
- package/scripts/next-release-howto.md +24 -24
- package/scripts/oracledb-install-driver-libs.sh +82 -82
- package/scripts/release.sh +36 -36
- package/scripts/runkit-example.js +35 -35
- package/scripts/stress-test/README.txt +18 -18
- package/scripts/stress-test/docker-compose.yml +55 -55
- package/scripts/stress-test/knex-stress-test.js +212 -212
- package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -149
- package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -101
- package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -188
- package/types/index.d.mts +11 -0
- package/types/index.d.ts +3321 -3321
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
|
@@ -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;
|