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,22 +1,22 @@
|
|
|
1
|
-
const Trigger = require('./trigger');
|
|
2
|
-
|
|
3
|
-
// helper function for pushAdditional in increments() and bigincrements()
|
|
4
|
-
function createAutoIncrementTriggerAndSequence(columnCompiler) {
|
|
5
|
-
const trigger = new Trigger(columnCompiler.client.version);
|
|
6
|
-
|
|
7
|
-
// TODO Add warning that sequence etc is created
|
|
8
|
-
columnCompiler.pushAdditional(function () {
|
|
9
|
-
const tableName = this.tableCompiler.tableNameRaw;
|
|
10
|
-
const schemaName = this.tableCompiler.schemaNameRaw;
|
|
11
|
-
const createTriggerSQL = trigger.createAutoIncrementTrigger(
|
|
12
|
-
this.client.logger,
|
|
13
|
-
tableName,
|
|
14
|
-
schemaName
|
|
15
|
-
);
|
|
16
|
-
this.pushQuery(createTriggerSQL);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
module.exports = {
|
|
21
|
-
createAutoIncrementTriggerAndSequence,
|
|
22
|
-
};
|
|
1
|
+
const Trigger = require('./trigger');
|
|
2
|
+
|
|
3
|
+
// helper function for pushAdditional in increments() and bigincrements()
|
|
4
|
+
function createAutoIncrementTriggerAndSequence(columnCompiler) {
|
|
5
|
+
const trigger = new Trigger(columnCompiler.client.version);
|
|
6
|
+
|
|
7
|
+
// TODO Add warning that sequence etc is created
|
|
8
|
+
columnCompiler.pushAdditional(function () {
|
|
9
|
+
const tableName = this.tableCompiler.tableNameRaw;
|
|
10
|
+
const schemaName = this.tableCompiler.schemaNameRaw;
|
|
11
|
+
const createTriggerSQL = trigger.createAutoIncrementTrigger(
|
|
12
|
+
this.client.logger,
|
|
13
|
+
tableName,
|
|
14
|
+
schemaName
|
|
15
|
+
);
|
|
16
|
+
this.pushQuery(createTriggerSQL);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
module.exports = {
|
|
21
|
+
createAutoIncrementTriggerAndSequence,
|
|
22
|
+
};
|
|
@@ -1,155 +1,155 @@
|
|
|
1
|
-
const { NameHelper } = require('../../utils');
|
|
2
|
-
|
|
3
|
-
class Trigger {
|
|
4
|
-
constructor(oracleVersion) {
|
|
5
|
-
this.nameHelper = new NameHelper(oracleVersion);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
renameColumnTrigger(logger, tableName, columnName, to) {
|
|
9
|
-
const triggerName = this.nameHelper.generateCombinedName(
|
|
10
|
-
logger,
|
|
11
|
-
'autoinc_trg',
|
|
12
|
-
tableName
|
|
13
|
-
);
|
|
14
|
-
const sequenceName = this.nameHelper.generateCombinedName(
|
|
15
|
-
logger,
|
|
16
|
-
'seq',
|
|
17
|
-
tableName
|
|
18
|
-
);
|
|
19
|
-
return (
|
|
20
|
-
`DECLARE ` +
|
|
21
|
-
`PK_NAME VARCHAR(200); ` +
|
|
22
|
-
`IS_AUTOINC NUMBER := 0; ` +
|
|
23
|
-
`BEGIN` +
|
|
24
|
-
` EXECUTE IMMEDIATE ('ALTER TABLE "${tableName}" RENAME COLUMN "${columnName}" TO "${to}"');` +
|
|
25
|
-
` SELECT COUNT(*) INTO IS_AUTOINC from "USER_TRIGGERS" where trigger_name = '${triggerName}';` +
|
|
26
|
-
` IF (IS_AUTOINC > 0) THEN` +
|
|
27
|
-
` SELECT cols.column_name INTO PK_NAME` +
|
|
28
|
-
` FROM all_constraints cons, all_cons_columns cols` +
|
|
29
|
-
` WHERE cons.constraint_type = 'P'` +
|
|
30
|
-
` AND cons.constraint_name = cols.constraint_name` +
|
|
31
|
-
` AND cons.owner = cols.owner` +
|
|
32
|
-
` AND cols.table_name = '${tableName}';` +
|
|
33
|
-
` IF ('${to}' = PK_NAME) THEN` +
|
|
34
|
-
` EXECUTE IMMEDIATE ('DROP TRIGGER "${triggerName}"');` +
|
|
35
|
-
` EXECUTE IMMEDIATE ('create or replace trigger "${triggerName}"` +
|
|
36
|
-
` BEFORE INSERT on "${tableName}" for each row` +
|
|
37
|
-
` declare` +
|
|
38
|
-
` checking number := 1;` +
|
|
39
|
-
` begin` +
|
|
40
|
-
` if (:new."${to}" is null) then` +
|
|
41
|
-
` while checking >= 1 loop` +
|
|
42
|
-
` select "${sequenceName}".nextval into :new."${to}" from dual;` +
|
|
43
|
-
` select count("${to}") into checking from "${tableName}"` +
|
|
44
|
-
` where "${to}" = :new."${to}";` +
|
|
45
|
-
` end loop;` +
|
|
46
|
-
` end if;` +
|
|
47
|
-
` end;');` +
|
|
48
|
-
` end if;` +
|
|
49
|
-
` end if;` +
|
|
50
|
-
`END;`
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
createAutoIncrementTrigger(logger, tableName, schemaName) {
|
|
55
|
-
const tableQuoted = `"${tableName}"`;
|
|
56
|
-
const tableUnquoted = tableName;
|
|
57
|
-
const schemaQuoted = schemaName ? `"${schemaName}".` : '';
|
|
58
|
-
const constraintOwner = schemaName ? `'${schemaName}'` : 'cols.owner';
|
|
59
|
-
const triggerName = this.nameHelper.generateCombinedName(
|
|
60
|
-
logger,
|
|
61
|
-
'autoinc_trg',
|
|
62
|
-
tableName
|
|
63
|
-
);
|
|
64
|
-
const sequenceNameUnquoted = this.nameHelper.generateCombinedName(
|
|
65
|
-
logger,
|
|
66
|
-
'seq',
|
|
67
|
-
tableName
|
|
68
|
-
);
|
|
69
|
-
const sequenceNameQuoted = `"${sequenceNameUnquoted}"`;
|
|
70
|
-
return (
|
|
71
|
-
`DECLARE ` +
|
|
72
|
-
`PK_NAME VARCHAR(200); ` +
|
|
73
|
-
`BEGIN` +
|
|
74
|
-
` EXECUTE IMMEDIATE ('CREATE SEQUENCE ${schemaQuoted}${sequenceNameQuoted}');` +
|
|
75
|
-
` SELECT cols.column_name INTO PK_NAME` + // TODO : support autoincrement on table with multiple primary keys
|
|
76
|
-
` FROM all_constraints cons, all_cons_columns cols` +
|
|
77
|
-
` WHERE cons.constraint_type = 'P'` +
|
|
78
|
-
` AND cons.constraint_name = cols.constraint_name` +
|
|
79
|
-
` AND cons.owner = ${constraintOwner}` +
|
|
80
|
-
` AND cols.table_name = '${tableUnquoted}';` +
|
|
81
|
-
` execute immediate ('create or replace trigger ${schemaQuoted}"${triggerName}"` +
|
|
82
|
-
` BEFORE INSERT on ${schemaQuoted}${tableQuoted}` +
|
|
83
|
-
` for each row` +
|
|
84
|
-
` declare` +
|
|
85
|
-
` checking number := 1;` +
|
|
86
|
-
` begin` +
|
|
87
|
-
` if (:new."' || PK_NAME || '" is null) then` +
|
|
88
|
-
` while checking >= 1 loop` +
|
|
89
|
-
` select ${schemaQuoted}${sequenceNameQuoted}.nextval into :new."' || PK_NAME || '" from dual;` +
|
|
90
|
-
` select count("' || PK_NAME || '") into checking from ${schemaQuoted}${tableQuoted}` +
|
|
91
|
-
` where "' || PK_NAME || '" = :new."' || PK_NAME || '";` +
|
|
92
|
-
` end loop;` +
|
|
93
|
-
` end if;` +
|
|
94
|
-
` end;'); ` +
|
|
95
|
-
`END;`
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
renameTableAndAutoIncrementTrigger(logger, tableName, to) {
|
|
100
|
-
const triggerName = this.nameHelper.generateCombinedName(
|
|
101
|
-
logger,
|
|
102
|
-
'autoinc_trg',
|
|
103
|
-
tableName
|
|
104
|
-
);
|
|
105
|
-
const sequenceName = this.nameHelper.generateCombinedName(
|
|
106
|
-
logger,
|
|
107
|
-
'seq',
|
|
108
|
-
tableName
|
|
109
|
-
);
|
|
110
|
-
const toTriggerName = this.nameHelper.generateCombinedName(
|
|
111
|
-
logger,
|
|
112
|
-
'autoinc_trg',
|
|
113
|
-
to
|
|
114
|
-
);
|
|
115
|
-
const toSequenceName = this.nameHelper.generateCombinedName(
|
|
116
|
-
logger,
|
|
117
|
-
'seq',
|
|
118
|
-
to
|
|
119
|
-
);
|
|
120
|
-
return (
|
|
121
|
-
`DECLARE ` +
|
|
122
|
-
`PK_NAME VARCHAR(200); ` +
|
|
123
|
-
`IS_AUTOINC NUMBER := 0; ` +
|
|
124
|
-
`BEGIN` +
|
|
125
|
-
` EXECUTE IMMEDIATE ('RENAME "${tableName}" TO "${to}"');` +
|
|
126
|
-
` SELECT COUNT(*) INTO IS_AUTOINC from "USER_TRIGGERS" where trigger_name = '${triggerName}';` +
|
|
127
|
-
` IF (IS_AUTOINC > 0) THEN` +
|
|
128
|
-
` EXECUTE IMMEDIATE ('DROP TRIGGER "${triggerName}"');` +
|
|
129
|
-
` EXECUTE IMMEDIATE ('RENAME "${sequenceName}" TO "${toSequenceName}"');` +
|
|
130
|
-
` SELECT cols.column_name INTO PK_NAME` +
|
|
131
|
-
` FROM all_constraints cons, all_cons_columns cols` +
|
|
132
|
-
` WHERE cons.constraint_type = 'P'` +
|
|
133
|
-
` AND cons.constraint_name = cols.constraint_name` +
|
|
134
|
-
` AND cons.owner = cols.owner` +
|
|
135
|
-
` AND cols.table_name = '${to}';` +
|
|
136
|
-
` EXECUTE IMMEDIATE ('create or replace trigger "${toTriggerName}"` +
|
|
137
|
-
` BEFORE INSERT on "${to}" for each row` +
|
|
138
|
-
` declare` +
|
|
139
|
-
` checking number := 1;` +
|
|
140
|
-
` begin` +
|
|
141
|
-
` if (:new."' || PK_NAME || '" is null) then` +
|
|
142
|
-
` while checking >= 1 loop` +
|
|
143
|
-
` select "${toSequenceName}".nextval into :new."' || PK_NAME || '" from dual;` +
|
|
144
|
-
` select count("' || PK_NAME || '") into checking from "${to}"` +
|
|
145
|
-
` where "' || PK_NAME || '" = :new."' || PK_NAME || '";` +
|
|
146
|
-
` end loop;` +
|
|
147
|
-
` end if;` +
|
|
148
|
-
` end;');` +
|
|
149
|
-
` end if;` +
|
|
150
|
-
`END;`
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
module.exports = Trigger;
|
|
1
|
+
const { NameHelper } = require('../../utils');
|
|
2
|
+
|
|
3
|
+
class Trigger {
|
|
4
|
+
constructor(oracleVersion) {
|
|
5
|
+
this.nameHelper = new NameHelper(oracleVersion);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
renameColumnTrigger(logger, tableName, columnName, to) {
|
|
9
|
+
const triggerName = this.nameHelper.generateCombinedName(
|
|
10
|
+
logger,
|
|
11
|
+
'autoinc_trg',
|
|
12
|
+
tableName
|
|
13
|
+
);
|
|
14
|
+
const sequenceName = this.nameHelper.generateCombinedName(
|
|
15
|
+
logger,
|
|
16
|
+
'seq',
|
|
17
|
+
tableName
|
|
18
|
+
);
|
|
19
|
+
return (
|
|
20
|
+
`DECLARE ` +
|
|
21
|
+
`PK_NAME VARCHAR(200); ` +
|
|
22
|
+
`IS_AUTOINC NUMBER := 0; ` +
|
|
23
|
+
`BEGIN` +
|
|
24
|
+
` EXECUTE IMMEDIATE ('ALTER TABLE "${tableName}" RENAME COLUMN "${columnName}" TO "${to}"');` +
|
|
25
|
+
` SELECT COUNT(*) INTO IS_AUTOINC from "USER_TRIGGERS" where trigger_name = '${triggerName}';` +
|
|
26
|
+
` IF (IS_AUTOINC > 0) THEN` +
|
|
27
|
+
` SELECT cols.column_name INTO PK_NAME` +
|
|
28
|
+
` FROM all_constraints cons, all_cons_columns cols` +
|
|
29
|
+
` WHERE cons.constraint_type = 'P'` +
|
|
30
|
+
` AND cons.constraint_name = cols.constraint_name` +
|
|
31
|
+
` AND cons.owner = cols.owner` +
|
|
32
|
+
` AND cols.table_name = '${tableName}';` +
|
|
33
|
+
` IF ('${to}' = PK_NAME) THEN` +
|
|
34
|
+
` EXECUTE IMMEDIATE ('DROP TRIGGER "${triggerName}"');` +
|
|
35
|
+
` EXECUTE IMMEDIATE ('create or replace trigger "${triggerName}"` +
|
|
36
|
+
` BEFORE INSERT on "${tableName}" for each row` +
|
|
37
|
+
` declare` +
|
|
38
|
+
` checking number := 1;` +
|
|
39
|
+
` begin` +
|
|
40
|
+
` if (:new."${to}" is null) then` +
|
|
41
|
+
` while checking >= 1 loop` +
|
|
42
|
+
` select "${sequenceName}".nextval into :new."${to}" from dual;` +
|
|
43
|
+
` select count("${to}") into checking from "${tableName}"` +
|
|
44
|
+
` where "${to}" = :new."${to}";` +
|
|
45
|
+
` end loop;` +
|
|
46
|
+
` end if;` +
|
|
47
|
+
` end;');` +
|
|
48
|
+
` end if;` +
|
|
49
|
+
` end if;` +
|
|
50
|
+
`END;`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
createAutoIncrementTrigger(logger, tableName, schemaName) {
|
|
55
|
+
const tableQuoted = `"${tableName}"`;
|
|
56
|
+
const tableUnquoted = tableName;
|
|
57
|
+
const schemaQuoted = schemaName ? `"${schemaName}".` : '';
|
|
58
|
+
const constraintOwner = schemaName ? `'${schemaName}'` : 'cols.owner';
|
|
59
|
+
const triggerName = this.nameHelper.generateCombinedName(
|
|
60
|
+
logger,
|
|
61
|
+
'autoinc_trg',
|
|
62
|
+
tableName
|
|
63
|
+
);
|
|
64
|
+
const sequenceNameUnquoted = this.nameHelper.generateCombinedName(
|
|
65
|
+
logger,
|
|
66
|
+
'seq',
|
|
67
|
+
tableName
|
|
68
|
+
);
|
|
69
|
+
const sequenceNameQuoted = `"${sequenceNameUnquoted}"`;
|
|
70
|
+
return (
|
|
71
|
+
`DECLARE ` +
|
|
72
|
+
`PK_NAME VARCHAR(200); ` +
|
|
73
|
+
`BEGIN` +
|
|
74
|
+
` EXECUTE IMMEDIATE ('CREATE SEQUENCE ${schemaQuoted}${sequenceNameQuoted}');` +
|
|
75
|
+
` SELECT cols.column_name INTO PK_NAME` + // TODO : support autoincrement on table with multiple primary keys
|
|
76
|
+
` FROM all_constraints cons, all_cons_columns cols` +
|
|
77
|
+
` WHERE cons.constraint_type = 'P'` +
|
|
78
|
+
` AND cons.constraint_name = cols.constraint_name` +
|
|
79
|
+
` AND cons.owner = ${constraintOwner}` +
|
|
80
|
+
` AND cols.table_name = '${tableUnquoted}';` +
|
|
81
|
+
` execute immediate ('create or replace trigger ${schemaQuoted}"${triggerName}"` +
|
|
82
|
+
` BEFORE INSERT on ${schemaQuoted}${tableQuoted}` +
|
|
83
|
+
` for each row` +
|
|
84
|
+
` declare` +
|
|
85
|
+
` checking number := 1;` +
|
|
86
|
+
` begin` +
|
|
87
|
+
` if (:new."' || PK_NAME || '" is null) then` +
|
|
88
|
+
` while checking >= 1 loop` +
|
|
89
|
+
` select ${schemaQuoted}${sequenceNameQuoted}.nextval into :new."' || PK_NAME || '" from dual;` +
|
|
90
|
+
` select count("' || PK_NAME || '") into checking from ${schemaQuoted}${tableQuoted}` +
|
|
91
|
+
` where "' || PK_NAME || '" = :new."' || PK_NAME || '";` +
|
|
92
|
+
` end loop;` +
|
|
93
|
+
` end if;` +
|
|
94
|
+
` end;'); ` +
|
|
95
|
+
`END;`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
renameTableAndAutoIncrementTrigger(logger, tableName, to) {
|
|
100
|
+
const triggerName = this.nameHelper.generateCombinedName(
|
|
101
|
+
logger,
|
|
102
|
+
'autoinc_trg',
|
|
103
|
+
tableName
|
|
104
|
+
);
|
|
105
|
+
const sequenceName = this.nameHelper.generateCombinedName(
|
|
106
|
+
logger,
|
|
107
|
+
'seq',
|
|
108
|
+
tableName
|
|
109
|
+
);
|
|
110
|
+
const toTriggerName = this.nameHelper.generateCombinedName(
|
|
111
|
+
logger,
|
|
112
|
+
'autoinc_trg',
|
|
113
|
+
to
|
|
114
|
+
);
|
|
115
|
+
const toSequenceName = this.nameHelper.generateCombinedName(
|
|
116
|
+
logger,
|
|
117
|
+
'seq',
|
|
118
|
+
to
|
|
119
|
+
);
|
|
120
|
+
return (
|
|
121
|
+
`DECLARE ` +
|
|
122
|
+
`PK_NAME VARCHAR(200); ` +
|
|
123
|
+
`IS_AUTOINC NUMBER := 0; ` +
|
|
124
|
+
`BEGIN` +
|
|
125
|
+
` EXECUTE IMMEDIATE ('RENAME "${tableName}" TO "${to}"');` +
|
|
126
|
+
` SELECT COUNT(*) INTO IS_AUTOINC from "USER_TRIGGERS" where trigger_name = '${triggerName}';` +
|
|
127
|
+
` IF (IS_AUTOINC > 0) THEN` +
|
|
128
|
+
` EXECUTE IMMEDIATE ('DROP TRIGGER "${triggerName}"');` +
|
|
129
|
+
` EXECUTE IMMEDIATE ('RENAME "${sequenceName}" TO "${toSequenceName}"');` +
|
|
130
|
+
` SELECT cols.column_name INTO PK_NAME` +
|
|
131
|
+
` FROM all_constraints cons, all_cons_columns cols` +
|
|
132
|
+
` WHERE cons.constraint_type = 'P'` +
|
|
133
|
+
` AND cons.constraint_name = cols.constraint_name` +
|
|
134
|
+
` AND cons.owner = cols.owner` +
|
|
135
|
+
` AND cols.table_name = '${to}';` +
|
|
136
|
+
` EXECUTE IMMEDIATE ('create or replace trigger "${toTriggerName}"` +
|
|
137
|
+
` BEFORE INSERT on "${to}" for each row` +
|
|
138
|
+
` declare` +
|
|
139
|
+
` checking number := 1;` +
|
|
140
|
+
` begin` +
|
|
141
|
+
` if (:new."' || PK_NAME || '" is null) then` +
|
|
142
|
+
` while checking >= 1 loop` +
|
|
143
|
+
` select "${toSequenceName}".nextval into :new."' || PK_NAME || '" from dual;` +
|
|
144
|
+
` select count("' || PK_NAME || '") into checking from "${to}"` +
|
|
145
|
+
` where "' || PK_NAME || '" = :new."' || PK_NAME || '";` +
|
|
146
|
+
` end loop;` +
|
|
147
|
+
` end if;` +
|
|
148
|
+
` end;');` +
|
|
149
|
+
` end if;` +
|
|
150
|
+
`END;`
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
module.exports = Trigger;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
const ColumnBuilder = require('../../../schema/columnbuilder');
|
|
2
|
-
const toArray = require('lodash/toArray');
|
|
3
|
-
|
|
4
|
-
class ColumnBuilder_Oracle extends ColumnBuilder {
|
|
5
|
-
constructor() {
|
|
6
|
-
super(...arguments);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// checkIn added to the builder to allow the column compiler to change the
|
|
10
|
-
// order via the modifiers ("check" must be after "default")
|
|
11
|
-
checkIn() {
|
|
12
|
-
this._modifiers.checkIn = toArray(arguments);
|
|
13
|
-
return this;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
module.exports = ColumnBuilder_Oracle;
|
|
1
|
+
const ColumnBuilder = require('../../../schema/columnbuilder');
|
|
2
|
+
const toArray = require('lodash/toArray');
|
|
3
|
+
|
|
4
|
+
class ColumnBuilder_Oracle extends ColumnBuilder {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// checkIn added to the builder to allow the column compiler to change the
|
|
10
|
+
// order via the modifiers ("check" must be after "default")
|
|
11
|
+
checkIn() {
|
|
12
|
+
this._modifiers.checkIn = toArray(arguments);
|
|
13
|
+
return this;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
module.exports = ColumnBuilder_Oracle;
|
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
const uniq = require('lodash/uniq');
|
|
2
|
-
const Raw = require('../../../raw');
|
|
3
|
-
const ColumnCompiler = require('../../../schema/columncompiler');
|
|
4
|
-
const {
|
|
5
|
-
createAutoIncrementTriggerAndSequence,
|
|
6
|
-
} = require('./internal/incrementUtils');
|
|
7
|
-
const { toNumber } = require('../../../util/helpers');
|
|
8
|
-
|
|
9
|
-
// Column Compiler
|
|
10
|
-
// -------
|
|
11
|
-
|
|
12
|
-
class ColumnCompiler_Oracle extends ColumnCompiler {
|
|
13
|
-
constructor() {
|
|
14
|
-
super(...arguments);
|
|
15
|
-
this.modifiers = ['defaultTo', 'checkIn', 'nullable', 'comment'];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
increments(options = { primaryKey: true }) {
|
|
19
|
-
createAutoIncrementTriggerAndSequence(this);
|
|
20
|
-
return (
|
|
21
|
-
'integer not null' +
|
|
22
|
-
(this.tableCompiler._canBeAddPrimaryKey(options) ? ' primary key' : '')
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
bigincrements(options = { primaryKey: true }) {
|
|
27
|
-
createAutoIncrementTriggerAndSequence(this);
|
|
28
|
-
return (
|
|
29
|
-
'number(20, 0) not null' +
|
|
30
|
-
(this.tableCompiler._canBeAddPrimaryKey(options) ? ' primary key' : '')
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
floating(precision) {
|
|
35
|
-
const parsedPrecision = toNumber(precision, 0);
|
|
36
|
-
return `float${parsedPrecision ? `(${parsedPrecision})` : ''}`;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
double(precision, scale) {
|
|
40
|
-
// if (!precision) return 'number'; // TODO: Check If default is ok
|
|
41
|
-
return `number(${toNumber(precision, 8)}, ${toNumber(scale, 2)})`;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
decimal(precision, scale) {
|
|
45
|
-
if (precision === null) return 'decimal';
|
|
46
|
-
return `decimal(${toNumber(precision, 8)}, ${toNumber(scale, 2)})`;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
integer(length) {
|
|
50
|
-
return length ? `number(${toNumber(length, 11)})` : 'integer';
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
enu(allowed) {
|
|
54
|
-
allowed = uniq(allowed);
|
|
55
|
-
const maxLength = (allowed || []).reduce(
|
|
56
|
-
(maxLength, name) => Math.max(maxLength, String(name).length),
|
|
57
|
-
1
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
// implicitly add the enum values as checked values
|
|
61
|
-
this.columnBuilder._modifiers.checkIn = [allowed];
|
|
62
|
-
|
|
63
|
-
return `varchar2(${maxLength})`;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
datetime(without) {
|
|
67
|
-
return without ? 'timestamp' : 'timestamp with time zone';
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
timestamp(without) {
|
|
71
|
-
return without ? 'timestamp' : 'timestamp with time zone';
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
bool() {
|
|
75
|
-
// implicitly add the check for 0 and 1
|
|
76
|
-
this.columnBuilder._modifiers.checkIn = [[0, 1]];
|
|
77
|
-
return 'number(1, 0)';
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
varchar(length) {
|
|
81
|
-
return `varchar2(${toNumber(length, 255)})`;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Modifiers
|
|
85
|
-
// ------
|
|
86
|
-
|
|
87
|
-
comment(comment) {
|
|
88
|
-
const columnName = this.args[0] || this.defaults('columnName');
|
|
89
|
-
|
|
90
|
-
this.pushAdditional(function () {
|
|
91
|
-
this.pushQuery(
|
|
92
|
-
`comment on column ${this.tableCompiler.tableName()}.` +
|
|
93
|
-
this.formatter.wrap(columnName) +
|
|
94
|
-
" is '" +
|
|
95
|
-
(comment || '') +
|
|
96
|
-
"'"
|
|
97
|
-
);
|
|
98
|
-
}, comment);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
checkIn(value) {
|
|
102
|
-
// TODO: Maybe accept arguments also as array
|
|
103
|
-
// TODO: value(s) should be escaped properly
|
|
104
|
-
if (value === undefined) {
|
|
105
|
-
return '';
|
|
106
|
-
} else if (value instanceof Raw) {
|
|
107
|
-
value = value.toQuery();
|
|
108
|
-
} else if (Array.isArray(value)) {
|
|
109
|
-
value = value.map((v) => `'${v}'`).join(', ');
|
|
110
|
-
} else {
|
|
111
|
-
value = `'${value}'`;
|
|
112
|
-
}
|
|
113
|
-
return `check (${this.formatter.wrap(this.args[0])} in (${value}))`;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
ColumnCompiler_Oracle.prototype.tinyint = 'smallint';
|
|
118
|
-
ColumnCompiler_Oracle.prototype.smallint = 'smallint';
|
|
119
|
-
ColumnCompiler_Oracle.prototype.mediumint = 'integer';
|
|
120
|
-
ColumnCompiler_Oracle.prototype.biginteger = 'number(20, 0)';
|
|
121
|
-
ColumnCompiler_Oracle.prototype.text = 'clob';
|
|
122
|
-
ColumnCompiler_Oracle.prototype.time = 'timestamp with time zone';
|
|
123
|
-
ColumnCompiler_Oracle.prototype.bit = 'clob';
|
|
124
|
-
ColumnCompiler_Oracle.prototype.json = 'clob';
|
|
125
|
-
|
|
126
|
-
module.exports = ColumnCompiler_Oracle;
|
|
1
|
+
const uniq = require('lodash/uniq');
|
|
2
|
+
const Raw = require('../../../raw');
|
|
3
|
+
const ColumnCompiler = require('../../../schema/columncompiler');
|
|
4
|
+
const {
|
|
5
|
+
createAutoIncrementTriggerAndSequence,
|
|
6
|
+
} = require('./internal/incrementUtils');
|
|
7
|
+
const { toNumber } = require('../../../util/helpers');
|
|
8
|
+
|
|
9
|
+
// Column Compiler
|
|
10
|
+
// -------
|
|
11
|
+
|
|
12
|
+
class ColumnCompiler_Oracle extends ColumnCompiler {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.modifiers = ['defaultTo', 'checkIn', 'nullable', 'comment'];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
increments(options = { primaryKey: true }) {
|
|
19
|
+
createAutoIncrementTriggerAndSequence(this);
|
|
20
|
+
return (
|
|
21
|
+
'integer not null' +
|
|
22
|
+
(this.tableCompiler._canBeAddPrimaryKey(options) ? ' primary key' : '')
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
bigincrements(options = { primaryKey: true }) {
|
|
27
|
+
createAutoIncrementTriggerAndSequence(this);
|
|
28
|
+
return (
|
|
29
|
+
'number(20, 0) not null' +
|
|
30
|
+
(this.tableCompiler._canBeAddPrimaryKey(options) ? ' primary key' : '')
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
floating(precision) {
|
|
35
|
+
const parsedPrecision = toNumber(precision, 0);
|
|
36
|
+
return `float${parsedPrecision ? `(${parsedPrecision})` : ''}`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
double(precision, scale) {
|
|
40
|
+
// if (!precision) return 'number'; // TODO: Check If default is ok
|
|
41
|
+
return `number(${toNumber(precision, 8)}, ${toNumber(scale, 2)})`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
decimal(precision, scale) {
|
|
45
|
+
if (precision === null) return 'decimal';
|
|
46
|
+
return `decimal(${toNumber(precision, 8)}, ${toNumber(scale, 2)})`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
integer(length) {
|
|
50
|
+
return length ? `number(${toNumber(length, 11)})` : 'integer';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
enu(allowed) {
|
|
54
|
+
allowed = uniq(allowed);
|
|
55
|
+
const maxLength = (allowed || []).reduce(
|
|
56
|
+
(maxLength, name) => Math.max(maxLength, String(name).length),
|
|
57
|
+
1
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// implicitly add the enum values as checked values
|
|
61
|
+
this.columnBuilder._modifiers.checkIn = [allowed];
|
|
62
|
+
|
|
63
|
+
return `varchar2(${maxLength})`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
datetime(without) {
|
|
67
|
+
return without ? 'timestamp' : 'timestamp with time zone';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
timestamp(without) {
|
|
71
|
+
return without ? 'timestamp' : 'timestamp with time zone';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
bool() {
|
|
75
|
+
// implicitly add the check for 0 and 1
|
|
76
|
+
this.columnBuilder._modifiers.checkIn = [[0, 1]];
|
|
77
|
+
return 'number(1, 0)';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
varchar(length) {
|
|
81
|
+
return `varchar2(${toNumber(length, 255)})`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Modifiers
|
|
85
|
+
// ------
|
|
86
|
+
|
|
87
|
+
comment(comment) {
|
|
88
|
+
const columnName = this.args[0] || this.defaults('columnName');
|
|
89
|
+
|
|
90
|
+
this.pushAdditional(function () {
|
|
91
|
+
this.pushQuery(
|
|
92
|
+
`comment on column ${this.tableCompiler.tableName()}.` +
|
|
93
|
+
this.formatter.wrap(columnName) +
|
|
94
|
+
" is '" +
|
|
95
|
+
(comment || '') +
|
|
96
|
+
"'"
|
|
97
|
+
);
|
|
98
|
+
}, comment);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
checkIn(value) {
|
|
102
|
+
// TODO: Maybe accept arguments also as array
|
|
103
|
+
// TODO: value(s) should be escaped properly
|
|
104
|
+
if (value === undefined) {
|
|
105
|
+
return '';
|
|
106
|
+
} else if (value instanceof Raw) {
|
|
107
|
+
value = value.toQuery();
|
|
108
|
+
} else if (Array.isArray(value)) {
|
|
109
|
+
value = value.map((v) => `'${v}'`).join(', ');
|
|
110
|
+
} else {
|
|
111
|
+
value = `'${value}'`;
|
|
112
|
+
}
|
|
113
|
+
return `check (${this.formatter.wrap(this.args[0])} in (${value}))`;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
ColumnCompiler_Oracle.prototype.tinyint = 'smallint';
|
|
118
|
+
ColumnCompiler_Oracle.prototype.smallint = 'smallint';
|
|
119
|
+
ColumnCompiler_Oracle.prototype.mediumint = 'integer';
|
|
120
|
+
ColumnCompiler_Oracle.prototype.biginteger = 'number(20, 0)';
|
|
121
|
+
ColumnCompiler_Oracle.prototype.text = 'clob';
|
|
122
|
+
ColumnCompiler_Oracle.prototype.time = 'timestamp with time zone';
|
|
123
|
+
ColumnCompiler_Oracle.prototype.bit = 'clob';
|
|
124
|
+
ColumnCompiler_Oracle.prototype.json = 'clob';
|
|
125
|
+
|
|
126
|
+
module.exports = ColumnCompiler_Oracle;
|