knex 3.2.2 → 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 -296
- 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,331 +1,331 @@
|
|
|
1
|
-
/* eslint max-len: 0 */
|
|
2
|
-
|
|
3
|
-
// PostgreSQL Table Builder & Compiler
|
|
4
|
-
// -------
|
|
5
|
-
|
|
6
|
-
const has = require('lodash/has');
|
|
7
|
-
const TableCompiler = require('../../../schema/tablecompiler');
|
|
8
|
-
const { isObject, isString } = require('../../../util/is');
|
|
9
|
-
|
|
10
|
-
class TableCompiler_PG extends TableCompiler {
|
|
11
|
-
constructor(client, tableBuilder) {
|
|
12
|
-
super(client, tableBuilder);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Compile a rename column command.
|
|
16
|
-
renameColumn(from, to) {
|
|
17
|
-
return this.pushQuery({
|
|
18
|
-
sql: `alter table ${this.tableName()} rename ${this.formatter.wrap(
|
|
19
|
-
from
|
|
20
|
-
)} to ${this.formatter.wrap(to)}`,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
_setNullableState(column, isNullable) {
|
|
25
|
-
const constraintAction = isNullable ? 'drop not null' : 'set not null';
|
|
26
|
-
const sql = `alter table ${this.tableName()} alter column ${this.formatter.wrap(
|
|
27
|
-
column
|
|
28
|
-
)} ${constraintAction}`;
|
|
29
|
-
return this.pushQuery({
|
|
30
|
-
sql: sql,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
compileAdd(builder) {
|
|
35
|
-
const table = this.formatter.wrap(builder);
|
|
36
|
-
const columns = this.prefixArray('add column', this.getColumns(builder));
|
|
37
|
-
return this.pushQuery({
|
|
38
|
-
sql: `alter table ${table} ${columns.join(', ')}`,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Adds the "create" query to the query sequence.
|
|
43
|
-
createQuery(columns, ifNot, like) {
|
|
44
|
-
const createStatement = ifNot
|
|
45
|
-
? 'create table if not exists '
|
|
46
|
-
: 'create table ';
|
|
47
|
-
const columnsSql = ` (${columns.sql.join(', ')}${
|
|
48
|
-
this.primaryKeys() || ''
|
|
49
|
-
}${this._addChecks()})`;
|
|
50
|
-
|
|
51
|
-
let sql =
|
|
52
|
-
createStatement +
|
|
53
|
-
this.tableName() +
|
|
54
|
-
(like && this.tableNameLike()
|
|
55
|
-
? ' (like ' +
|
|
56
|
-
this.tableNameLike() +
|
|
57
|
-
' including all' +
|
|
58
|
-
(columns.sql.length ? ', ' + columns.sql.join(', ') : '') +
|
|
59
|
-
')'
|
|
60
|
-
: columnsSql);
|
|
61
|
-
if (this.single.inherits)
|
|
62
|
-
sql += ` inherits (${this.formatter.wrap(this.single.inherits)})`;
|
|
63
|
-
this.pushQuery({
|
|
64
|
-
sql,
|
|
65
|
-
bindings: columns.bindings,
|
|
66
|
-
});
|
|
67
|
-
const hasComment = has(this.single, 'comment');
|
|
68
|
-
if (hasComment) this.comment(this.single.comment);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
primaryKeys() {
|
|
72
|
-
const pks = (this.grouped.alterTable || []).filter(
|
|
73
|
-
(k) => k.method === 'primary'
|
|
74
|
-
);
|
|
75
|
-
if (pks.length > 0 && pks[0].args.length > 0) {
|
|
76
|
-
const columns = pks[0].args[0];
|
|
77
|
-
let constraintName = pks[0].args[1] || '';
|
|
78
|
-
let deferrable;
|
|
79
|
-
if (isObject(constraintName)) {
|
|
80
|
-
({ constraintName, deferrable } = constraintName);
|
|
81
|
-
}
|
|
82
|
-
deferrable = deferrable ? ` deferrable initially ${deferrable}` : '';
|
|
83
|
-
constraintName = constraintName
|
|
84
|
-
? this.formatter.wrap(constraintName)
|
|
85
|
-
: this.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
86
|
-
|
|
87
|
-
return `, constraint ${constraintName} primary key (${this.formatter.columnize(
|
|
88
|
-
columns
|
|
89
|
-
)})${deferrable}`;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
addColumns(columns, prefix, colCompilers) {
|
|
94
|
-
if (prefix === this.alterColumnsPrefix) {
|
|
95
|
-
// alter columns
|
|
96
|
-
for (const col of colCompilers) {
|
|
97
|
-
this._addColumn(col);
|
|
98
|
-
}
|
|
99
|
-
} else {
|
|
100
|
-
// base class implementation for normal add
|
|
101
|
-
super.addColumns(columns, prefix);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
_addColumn(col) {
|
|
106
|
-
const quotedTableName = this.tableName();
|
|
107
|
-
const type = col.getColumnType();
|
|
108
|
-
// We'd prefer to call this.formatter.wrapAsIdentifier here instead, however the context passed to
|
|
109
|
-
// `this` instance is not that of the column, but of the table. Thus, we unfortunately have to call
|
|
110
|
-
// `wrapIdentifier` here as well (it is already called once on the initial column operation) to give
|
|
111
|
-
// our `alter` operation the correct `queryContext`. Refer to issue #2606 and PR #2612.
|
|
112
|
-
const colName = this.client.wrapIdentifier(
|
|
113
|
-
col.getColumnName(),
|
|
114
|
-
col.columnBuilder.queryContext()
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
// To alter enum columns they must be cast to text first
|
|
118
|
-
const isEnum = col.type === 'enu';
|
|
119
|
-
this.pushQuery({
|
|
120
|
-
sql: `alter table ${quotedTableName} alter column ${colName} drop default`,
|
|
121
|
-
bindings: [],
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
const alterNullable = col.columnBuilder.alterNullable;
|
|
125
|
-
if (alterNullable) {
|
|
126
|
-
this.pushQuery({
|
|
127
|
-
sql: `alter table ${quotedTableName} alter column ${colName} drop not null`,
|
|
128
|
-
bindings: [],
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const alterType = col.columnBuilder.alterType;
|
|
133
|
-
if (alterType) {
|
|
134
|
-
this.pushQuery({
|
|
135
|
-
sql: `alter table ${quotedTableName} alter column ${colName} type ${type} using (${colName}${
|
|
136
|
-
isEnum ? '::text::' : '::'
|
|
137
|
-
}${type})`,
|
|
138
|
-
bindings: [],
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const defaultTo = col.modified['defaultTo'];
|
|
143
|
-
if (defaultTo) {
|
|
144
|
-
const modifier = col.defaultTo.apply(col, defaultTo);
|
|
145
|
-
this.pushQuery({
|
|
146
|
-
sql: `alter table ${quotedTableName} alter column ${colName} set ${modifier}`,
|
|
147
|
-
bindings: [],
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (alterNullable) {
|
|
152
|
-
const nullable = col.modified['nullable'];
|
|
153
|
-
if (nullable && nullable[0] === false) {
|
|
154
|
-
this.pushQuery({
|
|
155
|
-
sql: `alter table ${quotedTableName} alter column ${colName} set not null`,
|
|
156
|
-
bindings: [],
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Compiles the comment on the table.
|
|
163
|
-
comment(comment) {
|
|
164
|
-
this.pushQuery(
|
|
165
|
-
`comment on table ${this.tableName()} is '${this.single.comment}'`
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Indexes:
|
|
170
|
-
// -------
|
|
171
|
-
|
|
172
|
-
primary(columns, constraintName) {
|
|
173
|
-
let deferrable;
|
|
174
|
-
if (isObject(constraintName)) {
|
|
175
|
-
({ constraintName, deferrable } = constraintName);
|
|
176
|
-
}
|
|
177
|
-
deferrable = deferrable ? ` deferrable initially ${deferrable}` : '';
|
|
178
|
-
constraintName = constraintName
|
|
179
|
-
? this.formatter.wrap(constraintName)
|
|
180
|
-
: this.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
181
|
-
if (this.method !== 'create' && this.method !== 'createIfNot') {
|
|
182
|
-
this.pushQuery(
|
|
183
|
-
`alter table ${this.tableName()} add constraint ${constraintName} primary key (${this.formatter.columnize(
|
|
184
|
-
columns
|
|
185
|
-
)})${deferrable}`
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
unique(columns, indexName) {
|
|
191
|
-
let deferrable;
|
|
192
|
-
let useConstraint = true;
|
|
193
|
-
let predicate;
|
|
194
|
-
if (isObject(indexName)) {
|
|
195
|
-
({ indexName, deferrable, useConstraint, predicate } = indexName);
|
|
196
|
-
if (useConstraint === undefined) {
|
|
197
|
-
useConstraint = !!deferrable || !predicate;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
if (!useConstraint && deferrable && deferrable !== 'not deferrable') {
|
|
201
|
-
throw new Error('postgres cannot create deferrable index');
|
|
202
|
-
}
|
|
203
|
-
if (useConstraint && predicate) {
|
|
204
|
-
throw new Error('postgres cannot create constraint with predicate');
|
|
205
|
-
}
|
|
206
|
-
deferrable = deferrable ? ` deferrable initially ${deferrable}` : '';
|
|
207
|
-
indexName = indexName
|
|
208
|
-
? this.formatter.wrap(indexName)
|
|
209
|
-
: this._indexCommand('unique', this.tableNameRaw, columns);
|
|
210
|
-
|
|
211
|
-
if (useConstraint) {
|
|
212
|
-
this.pushQuery(
|
|
213
|
-
`alter table ${this.tableName()} add constraint ${indexName}` +
|
|
214
|
-
' unique (' +
|
|
215
|
-
this.formatter.columnize(columns) +
|
|
216
|
-
')' +
|
|
217
|
-
deferrable
|
|
218
|
-
);
|
|
219
|
-
} else {
|
|
220
|
-
const predicateQuery = predicate
|
|
221
|
-
? ' ' + this.client.queryCompiler(predicate).where()
|
|
222
|
-
: '';
|
|
223
|
-
|
|
224
|
-
this.pushQuery(
|
|
225
|
-
`create unique index ${indexName} on ${this.tableName()} (${this.formatter.columnize(
|
|
226
|
-
columns
|
|
227
|
-
)})${predicateQuery}`
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
index(columns, indexName, options) {
|
|
233
|
-
indexName = indexName
|
|
234
|
-
? this.formatter.wrap(indexName)
|
|
235
|
-
: this._indexCommand('index', this.tableNameRaw, columns);
|
|
236
|
-
|
|
237
|
-
let predicate;
|
|
238
|
-
let storageEngineIndexType;
|
|
239
|
-
let indexType;
|
|
240
|
-
|
|
241
|
-
if (isString(options)) {
|
|
242
|
-
storageEngineIndexType = options;
|
|
243
|
-
} else if (isObject(options)) {
|
|
244
|
-
({ indexType, storageEngineIndexType, predicate } = options);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const predicateQuery = predicate
|
|
248
|
-
? ' ' + this.client.queryCompiler(predicate).where()
|
|
249
|
-
: '';
|
|
250
|
-
|
|
251
|
-
this.pushQuery(
|
|
252
|
-
`create${
|
|
253
|
-
typeof indexType === 'string' && indexType.toLowerCase() === 'unique'
|
|
254
|
-
? ' unique'
|
|
255
|
-
: ''
|
|
256
|
-
} index ${indexName} on ${this.tableName()}${
|
|
257
|
-
(storageEngineIndexType && ` using ${storageEngineIndexType}`) || ''
|
|
258
|
-
}` +
|
|
259
|
-
' (' +
|
|
260
|
-
this.formatter.columnize(columns) +
|
|
261
|
-
')' +
|
|
262
|
-
`${predicateQuery}`
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
dropPrimary(constraintName) {
|
|
267
|
-
constraintName = constraintName
|
|
268
|
-
? this.formatter.wrap(constraintName)
|
|
269
|
-
: this.formatter.wrap(this.tableNameRaw + '_pkey');
|
|
270
|
-
this.pushQuery(
|
|
271
|
-
`alter table ${this.tableName()} drop constraint ${constraintName}`
|
|
272
|
-
);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
dropPrimaryIfExists(constraintName) {
|
|
276
|
-
constraintName = constraintName
|
|
277
|
-
? this.formatter.wrap(constraintName)
|
|
278
|
-
: this.formatter.wrap(this.tableNameRaw + '_pkey');
|
|
279
|
-
this.pushQuery(
|
|
280
|
-
`alter table ${this.tableName()} drop constraint if exists ${constraintName}`
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
dropIndex(columns, indexName) {
|
|
285
|
-
indexName = indexName
|
|
286
|
-
? this.formatter.wrap(indexName)
|
|
287
|
-
: this._indexCommand('index', this.tableNameRaw, columns);
|
|
288
|
-
indexName = this.schemaNameRaw
|
|
289
|
-
? `${this.formatter.wrap(this.schemaNameRaw)}.${indexName}`
|
|
290
|
-
: indexName;
|
|
291
|
-
this.pushQuery(`drop index ${indexName}`);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
dropUnique(columns, indexName) {
|
|
295
|
-
indexName = indexName
|
|
296
|
-
? this.formatter.wrap(indexName)
|
|
297
|
-
: this._indexCommand('unique', this.tableNameRaw, columns);
|
|
298
|
-
this.pushQuery(
|
|
299
|
-
`alter table ${this.tableName()} drop constraint ${indexName}`
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
dropUniqueIfExists(columns, indexName) {
|
|
304
|
-
indexName = indexName
|
|
305
|
-
? this.formatter.wrap(indexName)
|
|
306
|
-
: this._indexCommand('unique', this.tableNameRaw, columns);
|
|
307
|
-
this.pushQuery(
|
|
308
|
-
`alter table ${this.tableName()} drop constraint if exists ${indexName}`
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
dropForeign(columns, indexName) {
|
|
313
|
-
indexName = indexName
|
|
314
|
-
? this.formatter.wrap(indexName)
|
|
315
|
-
: this._indexCommand('foreign', this.tableNameRaw, columns);
|
|
316
|
-
this.pushQuery(
|
|
317
|
-
`alter table ${this.tableName()} drop constraint ${indexName}`
|
|
318
|
-
);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
dropForeignIfExists(columns, indexName) {
|
|
322
|
-
indexName = indexName
|
|
323
|
-
? this.formatter.wrap(indexName)
|
|
324
|
-
: this._indexCommand('foreign', this.tableNameRaw, columns);
|
|
325
|
-
this.pushQuery(
|
|
326
|
-
`alter table ${this.tableName()} drop constraint if exists ${indexName}`
|
|
327
|
-
);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
module.exports = TableCompiler_PG;
|
|
1
|
+
/* eslint max-len: 0 */
|
|
2
|
+
|
|
3
|
+
// PostgreSQL Table Builder & Compiler
|
|
4
|
+
// -------
|
|
5
|
+
|
|
6
|
+
const has = require('lodash/has');
|
|
7
|
+
const TableCompiler = require('../../../schema/tablecompiler');
|
|
8
|
+
const { isObject, isString } = require('../../../util/is');
|
|
9
|
+
|
|
10
|
+
class TableCompiler_PG extends TableCompiler {
|
|
11
|
+
constructor(client, tableBuilder) {
|
|
12
|
+
super(client, tableBuilder);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Compile a rename column command.
|
|
16
|
+
renameColumn(from, to) {
|
|
17
|
+
return this.pushQuery({
|
|
18
|
+
sql: `alter table ${this.tableName()} rename ${this.formatter.wrap(
|
|
19
|
+
from
|
|
20
|
+
)} to ${this.formatter.wrap(to)}`,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
_setNullableState(column, isNullable) {
|
|
25
|
+
const constraintAction = isNullable ? 'drop not null' : 'set not null';
|
|
26
|
+
const sql = `alter table ${this.tableName()} alter column ${this.formatter.wrap(
|
|
27
|
+
column
|
|
28
|
+
)} ${constraintAction}`;
|
|
29
|
+
return this.pushQuery({
|
|
30
|
+
sql: sql,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
compileAdd(builder) {
|
|
35
|
+
const table = this.formatter.wrap(builder);
|
|
36
|
+
const columns = this.prefixArray('add column', this.getColumns(builder));
|
|
37
|
+
return this.pushQuery({
|
|
38
|
+
sql: `alter table ${table} ${columns.join(', ')}`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Adds the "create" query to the query sequence.
|
|
43
|
+
createQuery(columns, ifNot, like) {
|
|
44
|
+
const createStatement = ifNot
|
|
45
|
+
? 'create table if not exists '
|
|
46
|
+
: 'create table ';
|
|
47
|
+
const columnsSql = ` (${columns.sql.join(', ')}${
|
|
48
|
+
this.primaryKeys() || ''
|
|
49
|
+
}${this._addChecks()})`;
|
|
50
|
+
|
|
51
|
+
let sql =
|
|
52
|
+
createStatement +
|
|
53
|
+
this.tableName() +
|
|
54
|
+
(like && this.tableNameLike()
|
|
55
|
+
? ' (like ' +
|
|
56
|
+
this.tableNameLike() +
|
|
57
|
+
' including all' +
|
|
58
|
+
(columns.sql.length ? ', ' + columns.sql.join(', ') : '') +
|
|
59
|
+
')'
|
|
60
|
+
: columnsSql);
|
|
61
|
+
if (this.single.inherits)
|
|
62
|
+
sql += ` inherits (${this.formatter.wrap(this.single.inherits)})`;
|
|
63
|
+
this.pushQuery({
|
|
64
|
+
sql,
|
|
65
|
+
bindings: columns.bindings,
|
|
66
|
+
});
|
|
67
|
+
const hasComment = has(this.single, 'comment');
|
|
68
|
+
if (hasComment) this.comment(this.single.comment);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
primaryKeys() {
|
|
72
|
+
const pks = (this.grouped.alterTable || []).filter(
|
|
73
|
+
(k) => k.method === 'primary'
|
|
74
|
+
);
|
|
75
|
+
if (pks.length > 0 && pks[0].args.length > 0) {
|
|
76
|
+
const columns = pks[0].args[0];
|
|
77
|
+
let constraintName = pks[0].args[1] || '';
|
|
78
|
+
let deferrable;
|
|
79
|
+
if (isObject(constraintName)) {
|
|
80
|
+
({ constraintName, deferrable } = constraintName);
|
|
81
|
+
}
|
|
82
|
+
deferrable = deferrable ? ` deferrable initially ${deferrable}` : '';
|
|
83
|
+
constraintName = constraintName
|
|
84
|
+
? this.formatter.wrap(constraintName)
|
|
85
|
+
: this.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
86
|
+
|
|
87
|
+
return `, constraint ${constraintName} primary key (${this.formatter.columnize(
|
|
88
|
+
columns
|
|
89
|
+
)})${deferrable}`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
addColumns(columns, prefix, colCompilers) {
|
|
94
|
+
if (prefix === this.alterColumnsPrefix) {
|
|
95
|
+
// alter columns
|
|
96
|
+
for (const col of colCompilers) {
|
|
97
|
+
this._addColumn(col);
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
// base class implementation for normal add
|
|
101
|
+
super.addColumns(columns, prefix);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
_addColumn(col) {
|
|
106
|
+
const quotedTableName = this.tableName();
|
|
107
|
+
const type = col.getColumnType();
|
|
108
|
+
// We'd prefer to call this.formatter.wrapAsIdentifier here instead, however the context passed to
|
|
109
|
+
// `this` instance is not that of the column, but of the table. Thus, we unfortunately have to call
|
|
110
|
+
// `wrapIdentifier` here as well (it is already called once on the initial column operation) to give
|
|
111
|
+
// our `alter` operation the correct `queryContext`. Refer to issue #2606 and PR #2612.
|
|
112
|
+
const colName = this.client.wrapIdentifier(
|
|
113
|
+
col.getColumnName(),
|
|
114
|
+
col.columnBuilder.queryContext()
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
// To alter enum columns they must be cast to text first
|
|
118
|
+
const isEnum = col.type === 'enu';
|
|
119
|
+
this.pushQuery({
|
|
120
|
+
sql: `alter table ${quotedTableName} alter column ${colName} drop default`,
|
|
121
|
+
bindings: [],
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const alterNullable = col.columnBuilder.alterNullable;
|
|
125
|
+
if (alterNullable) {
|
|
126
|
+
this.pushQuery({
|
|
127
|
+
sql: `alter table ${quotedTableName} alter column ${colName} drop not null`,
|
|
128
|
+
bindings: [],
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const alterType = col.columnBuilder.alterType;
|
|
133
|
+
if (alterType) {
|
|
134
|
+
this.pushQuery({
|
|
135
|
+
sql: `alter table ${quotedTableName} alter column ${colName} type ${type} using (${colName}${
|
|
136
|
+
isEnum ? '::text::' : '::'
|
|
137
|
+
}${type})`,
|
|
138
|
+
bindings: [],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const defaultTo = col.modified['defaultTo'];
|
|
143
|
+
if (defaultTo) {
|
|
144
|
+
const modifier = col.defaultTo.apply(col, defaultTo);
|
|
145
|
+
this.pushQuery({
|
|
146
|
+
sql: `alter table ${quotedTableName} alter column ${colName} set ${modifier}`,
|
|
147
|
+
bindings: [],
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (alterNullable) {
|
|
152
|
+
const nullable = col.modified['nullable'];
|
|
153
|
+
if (nullable && nullable[0] === false) {
|
|
154
|
+
this.pushQuery({
|
|
155
|
+
sql: `alter table ${quotedTableName} alter column ${colName} set not null`,
|
|
156
|
+
bindings: [],
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Compiles the comment on the table.
|
|
163
|
+
comment(comment) {
|
|
164
|
+
this.pushQuery(
|
|
165
|
+
`comment on table ${this.tableName()} is '${this.single.comment}'`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Indexes:
|
|
170
|
+
// -------
|
|
171
|
+
|
|
172
|
+
primary(columns, constraintName) {
|
|
173
|
+
let deferrable;
|
|
174
|
+
if (isObject(constraintName)) {
|
|
175
|
+
({ constraintName, deferrable } = constraintName);
|
|
176
|
+
}
|
|
177
|
+
deferrable = deferrable ? ` deferrable initially ${deferrable}` : '';
|
|
178
|
+
constraintName = constraintName
|
|
179
|
+
? this.formatter.wrap(constraintName)
|
|
180
|
+
: this.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
181
|
+
if (this.method !== 'create' && this.method !== 'createIfNot') {
|
|
182
|
+
this.pushQuery(
|
|
183
|
+
`alter table ${this.tableName()} add constraint ${constraintName} primary key (${this.formatter.columnize(
|
|
184
|
+
columns
|
|
185
|
+
)})${deferrable}`
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
unique(columns, indexName) {
|
|
191
|
+
let deferrable;
|
|
192
|
+
let useConstraint = true;
|
|
193
|
+
let predicate;
|
|
194
|
+
if (isObject(indexName)) {
|
|
195
|
+
({ indexName, deferrable, useConstraint, predicate } = indexName);
|
|
196
|
+
if (useConstraint === undefined) {
|
|
197
|
+
useConstraint = !!deferrable || !predicate;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (!useConstraint && deferrable && deferrable !== 'not deferrable') {
|
|
201
|
+
throw new Error('postgres cannot create deferrable index');
|
|
202
|
+
}
|
|
203
|
+
if (useConstraint && predicate) {
|
|
204
|
+
throw new Error('postgres cannot create constraint with predicate');
|
|
205
|
+
}
|
|
206
|
+
deferrable = deferrable ? ` deferrable initially ${deferrable}` : '';
|
|
207
|
+
indexName = indexName
|
|
208
|
+
? this.formatter.wrap(indexName)
|
|
209
|
+
: this._indexCommand('unique', this.tableNameRaw, columns);
|
|
210
|
+
|
|
211
|
+
if (useConstraint) {
|
|
212
|
+
this.pushQuery(
|
|
213
|
+
`alter table ${this.tableName()} add constraint ${indexName}` +
|
|
214
|
+
' unique (' +
|
|
215
|
+
this.formatter.columnize(columns) +
|
|
216
|
+
')' +
|
|
217
|
+
deferrable
|
|
218
|
+
);
|
|
219
|
+
} else {
|
|
220
|
+
const predicateQuery = predicate
|
|
221
|
+
? ' ' + this.client.queryCompiler(predicate).where()
|
|
222
|
+
: '';
|
|
223
|
+
|
|
224
|
+
this.pushQuery(
|
|
225
|
+
`create unique index ${indexName} on ${this.tableName()} (${this.formatter.columnize(
|
|
226
|
+
columns
|
|
227
|
+
)})${predicateQuery}`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
index(columns, indexName, options) {
|
|
233
|
+
indexName = indexName
|
|
234
|
+
? this.formatter.wrap(indexName)
|
|
235
|
+
: this._indexCommand('index', this.tableNameRaw, columns);
|
|
236
|
+
|
|
237
|
+
let predicate;
|
|
238
|
+
let storageEngineIndexType;
|
|
239
|
+
let indexType;
|
|
240
|
+
|
|
241
|
+
if (isString(options)) {
|
|
242
|
+
storageEngineIndexType = options;
|
|
243
|
+
} else if (isObject(options)) {
|
|
244
|
+
({ indexType, storageEngineIndexType, predicate } = options);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const predicateQuery = predicate
|
|
248
|
+
? ' ' + this.client.queryCompiler(predicate).where()
|
|
249
|
+
: '';
|
|
250
|
+
|
|
251
|
+
this.pushQuery(
|
|
252
|
+
`create${
|
|
253
|
+
typeof indexType === 'string' && indexType.toLowerCase() === 'unique'
|
|
254
|
+
? ' unique'
|
|
255
|
+
: ''
|
|
256
|
+
} index ${indexName} on ${this.tableName()}${
|
|
257
|
+
(storageEngineIndexType && ` using ${storageEngineIndexType}`) || ''
|
|
258
|
+
}` +
|
|
259
|
+
' (' +
|
|
260
|
+
this.formatter.columnize(columns) +
|
|
261
|
+
')' +
|
|
262
|
+
`${predicateQuery}`
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
dropPrimary(constraintName) {
|
|
267
|
+
constraintName = constraintName
|
|
268
|
+
? this.formatter.wrap(constraintName)
|
|
269
|
+
: this.formatter.wrap(this.tableNameRaw + '_pkey');
|
|
270
|
+
this.pushQuery(
|
|
271
|
+
`alter table ${this.tableName()} drop constraint ${constraintName}`
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
dropPrimaryIfExists(constraintName) {
|
|
276
|
+
constraintName = constraintName
|
|
277
|
+
? this.formatter.wrap(constraintName)
|
|
278
|
+
: this.formatter.wrap(this.tableNameRaw + '_pkey');
|
|
279
|
+
this.pushQuery(
|
|
280
|
+
`alter table ${this.tableName()} drop constraint if exists ${constraintName}`
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
dropIndex(columns, indexName) {
|
|
285
|
+
indexName = indexName
|
|
286
|
+
? this.formatter.wrap(indexName)
|
|
287
|
+
: this._indexCommand('index', this.tableNameRaw, columns);
|
|
288
|
+
indexName = this.schemaNameRaw
|
|
289
|
+
? `${this.formatter.wrap(this.schemaNameRaw)}.${indexName}`
|
|
290
|
+
: indexName;
|
|
291
|
+
this.pushQuery(`drop index ${indexName}`);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
dropUnique(columns, indexName) {
|
|
295
|
+
indexName = indexName
|
|
296
|
+
? this.formatter.wrap(indexName)
|
|
297
|
+
: this._indexCommand('unique', this.tableNameRaw, columns);
|
|
298
|
+
this.pushQuery(
|
|
299
|
+
`alter table ${this.tableName()} drop constraint ${indexName}`
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
dropUniqueIfExists(columns, indexName) {
|
|
304
|
+
indexName = indexName
|
|
305
|
+
? this.formatter.wrap(indexName)
|
|
306
|
+
: this._indexCommand('unique', this.tableNameRaw, columns);
|
|
307
|
+
this.pushQuery(
|
|
308
|
+
`alter table ${this.tableName()} drop constraint if exists ${indexName}`
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
dropForeign(columns, indexName) {
|
|
313
|
+
indexName = indexName
|
|
314
|
+
? this.formatter.wrap(indexName)
|
|
315
|
+
: this._indexCommand('foreign', this.tableNameRaw, columns);
|
|
316
|
+
this.pushQuery(
|
|
317
|
+
`alter table ${this.tableName()} drop constraint ${indexName}`
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
dropForeignIfExists(columns, indexName) {
|
|
322
|
+
indexName = indexName
|
|
323
|
+
? this.formatter.wrap(indexName)
|
|
324
|
+
: this._indexCommand('foreign', this.tableNameRaw, columns);
|
|
325
|
+
this.pushQuery(
|
|
326
|
+
`alter table ${this.tableName()} drop constraint if exists ${indexName}`
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
module.exports = TableCompiler_PG;
|