Browse Source

Merge pull request #3668 from nocodb/feat/sqlite-change-column

feat: sqlite alter table change column
pull/4550/head
աɨռɢӄաօռɢ 2 years ago committed by GitHub
parent
commit
b2a79593e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts
  2. 4
      packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts
  3. 32
      packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts
  4. 38
      packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts
  5. 11
      packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts
  6. 169
      packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts
  7. 5
      tests/playwright/scripts/stressTestNewlyAddedTest.js
  8. 4
      tests/playwright/tests/viewKanban.spec.ts

25
packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts

@ -5,7 +5,8 @@ import Debug from '../../util/Debug';
import Emit from '../../util/emit';
import Result from '../../util/Result';
import lodash from 'lodash';
import findIndex from 'lodash/findIndex';
import find from 'lodash/find';
import fs from 'fs';
import { promisify } from 'util';
import jsonfile from 'jsonfile';
@ -685,7 +686,7 @@ class KnexClient extends SqlClient {
}
_isColumnForeignKey(tableObj, cn) {
if (lodash.findIndex(tableObj.foreignKeys, { cn: cn }) === -1) {
if (findIndex(tableObj.foreignKeys, { cn: cn }) === -1) {
return false;
}
return true;
@ -699,7 +700,7 @@ class KnexClient extends SqlClient {
) {
if (tableObj.primaryKeys.length > 1) {
if (
lodash.findIndex(tableObj.primaryKeys, {
findIndex(tableObj.primaryKeys, {
cn: columnObj.cn,
}) > 0
) {
@ -763,7 +764,7 @@ class KnexClient extends SqlClient {
if (tableObj.primaryKeys.length) {
const dt = this.getKnexDataTypeMock(pk.ct);
const col = lodash.find(tableObj.columns, {
const col = find(tableObj.columns, {
cn: pk.cn,
});
@ -778,7 +779,7 @@ class KnexClient extends SqlClient {
let max1 = 10000;
let searchFrom = 0;
let foundIndex = lodash.findIndex(
let foundIndex = findIndex(
tableObj.columns,
{ ck: 'UNI' },
searchFrom
@ -798,7 +799,7 @@ class KnexClient extends SqlClient {
}
searchFrom = foundIndex;
foundIndex = lodash.findIndex(
foundIndex = findIndex(
tableObj.columns,
{ ck: 'UNI' },
searchFrom + 1
@ -807,7 +808,7 @@ class KnexClient extends SqlClient {
let max2 = 10000;
searchFrom = 0;
foundIndex = lodash.findIndex(tableObj.columns, { ck: 'MUL' }, searchFrom);
foundIndex = findIndex(tableObj.columns, { ck: 'MUL' }, searchFrom);
while (foundIndex !== -1) {
const col = tableObj.columns[foundIndex];
@ -823,7 +824,7 @@ class KnexClient extends SqlClient {
}
searchFrom = foundIndex;
foundIndex = lodash.findIndex(
foundIndex = findIndex(
tableObj.columns,
{ ck: 'MUL' },
searchFrom + 1
@ -1895,7 +1896,7 @@ class KnexClient extends SqlClient {
// let downQuery = "";
//
// for (let i = 0; i < args.columns.length; ++i) {
// const oldColumn = lodash.find(originalColumns, {
// const oldColumn = find(originalColumns, {
// cn: args.columns[i].cno
// });
//
@ -2046,7 +2047,7 @@ class KnexClient extends SqlClient {
pkUpdate(table, args.columns, args.originalColumns);
} else {
for (let i = 0; i < args.columns.length; ++i) {
const column = lodash.find(originalColumns, {
const column = find(originalColumns, {
cn: args.columns[i].cno,
});
@ -2090,7 +2091,7 @@ class KnexClient extends SqlClient {
pkUpdate(table, args.columns, args.originalColumns);
} else {
for (let i = 0; i < args.columns.length; ++i) {
const column = lodash.find(originalColumns, {
const column = find(originalColumns, {
cn: args.columns[i].cno,
});
if (args.columns[i].altered & 8) {
@ -2124,7 +2125,7 @@ class KnexClient extends SqlClient {
pkUpdate(table, args.columns, args.originalColumns);
} else {
for (let i = 0; i < args.columns.length; ++i) {
const column = lodash.find(originalColumns, {
const column = find(originalColumns, {
cn: args.columns[i].cno,
});
if (args.columns[i].altered & 8) {

4
packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts

@ -4,7 +4,7 @@ import knex from 'knex';
import KnexClient from '../KnexClient';
import Debug from '../../../util/Debug';
import Result from '../../../util/Result';
import lodash from 'lodash';
import find from 'lodash/find';
const log = new Debug('MssqlClient');
@ -1964,7 +1964,7 @@ class MssqlClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
const oldColumn = lodash.find(originalColumns, {
const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});

32
packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts

@ -1,6 +1,8 @@
import knex from 'knex';
import lodash from 'lodash';
import isEmpty from 'lodash/isEmpty';
import mapKeys from 'lodash/mapKeys';
import find from 'lodash/find';
import Debug from '../../../util/Debug';
import Emit from '../../../util/emit';
import Result from '../../../util/Result';
@ -551,7 +553,7 @@ class MysqlClient extends KnexClient {
);
if (response.length === 2) {
result.data.list = response[0].map((v) =>
lodash.mapKeys(v, (_, k) => k.toLowerCase())
mapKeys(v, (_, k) => k.toLowerCase())
);
} else {
log.debug('Unknown response for schemaList:', result.data.list.length);
@ -620,7 +622,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
const column: any = {};
response[0][i] = lodash.mapKeys(response[0][i], (_v, k) =>
response[0][i] = mapKeys(response[0][i], (_v, k) =>
k.toLowerCase()
);
@ -753,7 +755,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let index = response[0][i];
index = lodash.mapKeys(index, function (_v, k) {
index = mapKeys(index, function (_v, k) {
return k.toLowerCase();
});
index.cn = index.column_name;
@ -810,7 +812,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let index = response[0][i];
index = lodash.mapKeys(index, function (_v, k) {
index = mapKeys(index, function (_v, k) {
return k.toLowerCase();
});
indexes.push(index);
@ -868,7 +870,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let relation = response[0][i];
relation = lodash.mapKeys(relation, function (_v, k) {
relation = mapKeys(relation, function (_v, k) {
return k.toLowerCase();
});
relations.push(relation);
@ -923,7 +925,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let relation = response[0][i];
relation = lodash.mapKeys(relation, function (_v, k) {
relation = mapKeys(relation, function (_v, k) {
return k.toLowerCase();
});
relations.push(relation);
@ -985,7 +987,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let trigger = response[0][i];
trigger = lodash.mapKeys(trigger, function (_v, k) {
trigger = mapKeys(trigger, function (_v, k) {
return k.toLowerCase();
});
trigger.trigger_name = trigger.trigger;
@ -1040,7 +1042,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let fn = response[0][i];
fn = lodash.mapKeys(fn, function (_v, k) {
fn = mapKeys(fn, function (_v, k) {
return k.toLowerCase();
});
fn.function_name = fn.name;
@ -1099,7 +1101,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
procedure = lodash.mapKeys(procedure, function (_v, k) {
procedure = mapKeys(procedure, function (_v, k) {
return k.toLowerCase();
});
procedure.procedure_name = procedure.name;
@ -1205,7 +1207,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let _function = response[0][i];
_function = lodash.mapKeys(_function, function (_v, k) {
_function = mapKeys(_function, function (_v, k) {
return k.toLowerCase();
});
@ -1259,7 +1261,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
procedure = lodash.mapKeys(procedure, function (_v, k) {
procedure = mapKeys(procedure, function (_v, k) {
return k.toLowerCase();
});
@ -1311,7 +1313,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let view = response[0][i];
view = lodash.mapKeys(view, function (_v, k) {
view = mapKeys(view, function (_v, k) {
return k.toLowerCase();
});
@ -1847,7 +1849,7 @@ class MysqlClient extends KnexClient {
*/
async _getQuery(args) {
try {
if (lodash.isEmpty(this._version)) {
if (isEmpty(this._version)) {
const result = await this.version();
this._version = result.data.object;
log.debug(
@ -2085,7 +2087,7 @@ class MysqlClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
const oldColumn = lodash.find(originalColumns, {
const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});

38
packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts

@ -1,9 +1,9 @@
import knex from 'knex';
import _ from 'lodash';
import KnexClient from '../KnexClient';
import Debug from '../../../util/Debug';
import Result from '../../../util/Result';
import lodash from 'lodash';
import mapKeys from 'lodash/mapKeys';
import find from 'lodash/find';
const log = new Debug('OracleClient');
@ -127,7 +127,7 @@ class OracleClient extends KnexClient {
result.data.object = {};
let versionDetails = rows[0];
versionDetails = _.mapKeys(versionDetails, (_v, k) => k.toLowerCase());
versionDetails = mapKeys(versionDetails, (_v, k) => k.toLowerCase());
const version = versionDetails.version.split('.');
result.data.object.version = versionDetails.version;
result.data.object.primary = version[0];
@ -399,7 +399,7 @@ class OracleClient extends KnexClient {
);
for (let i = 0; i < rows.length; i++) {
let el = rows[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
rows[i] = el;
}
@ -431,7 +431,7 @@ class OracleClient extends KnexClient {
);
for (let i = 0; i < rows.length; i++) {
let el = rows[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
rows[i] = el;
}
@ -567,7 +567,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.np = el.data_precision;
el.pk = el.ck === 'P';
el.nrqd = el.nrqd === 'Y';
@ -639,7 +639,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.table = el.tn;
el.non_unique = el.uniqueness === 'NONUNIQUE' ? 1 : 0;
el.non_unique_original = el.uniqueness === 'NONUNIQUE' ? 1 : 0;
@ -686,7 +686,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.table = el.tn;
if (el.cst === 'P') el.cst = 'Primary Key';
if (el.cst === 'U') el.cst = 'Unique';
@ -758,7 +758,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.rtn = el.r_table_name;
el.rcn = el.r_column_name;
el.non_unique = el.uniqueness === 'NONUNIQUE';
@ -811,7 +811,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.rtn = el.r_table_name;
el.rcn = el.r_column_name;
el.non_unique = el.uniqueness === 'NONUNIQUE';
@ -862,7 +862,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.trigger = el.trigger_name;
el.table = el.object_name;
el.event = el.triggering_event;
@ -910,7 +910,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.function_name = el.object_name;
el.type = el.object_type;
response[i] = el;
@ -956,7 +956,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.procedure_name = el.object_name;
el.type = el.object_type;
response[i] = el;
@ -996,7 +996,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.view_name = el.object_name;
response[i] = el;
}
@ -1038,7 +1038,7 @@ class OracleClient extends KnexClient {
let script = '';
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.function_name = el.name;
response[i] = el;
script += el.text;
@ -1084,7 +1084,7 @@ class OracleClient extends KnexClient {
let script = '';
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.procedure_name = el.name;
response[i] = el;
script += el.text;
@ -1124,7 +1124,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.view_name = el.object_name;
el.view_definition = el.text;
response[i] = el;
@ -1157,7 +1157,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
el = _.mapKeys(el, (_v, k) => k.toLowerCase());
el = mapKeys(el, (_v, k) => k.toLowerCase());
el.trigger = el.trigger_name;
el.table = el.object_name;
el.event = el.triggering_event;
@ -1622,7 +1622,7 @@ class OracleClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
const oldColumn = lodash.find(originalColumns, {
const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});

11
packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts

@ -1,12 +1,13 @@
import { nanoid } from 'nanoid';
import knex from 'knex';
import _ from 'lodash';
import KnexClient from '../KnexClient';
import Debug from '../../../util/Debug';
import Result from '../../../util/Result';
import queries from './pg.queries';
import lodash from 'lodash';
import isEmpty from 'lodash/isEmpty';
import mapKeys from 'lodash/mapKeys';
import find from 'lodash/find';
const log = new Debug('PGClient');
class PGClient extends KnexClient {
@ -1429,7 +1430,7 @@ class PGClient extends KnexClient {
if (response.length === 2) {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
procedure = _.mapKeys(procedure, (_v, k) => k.toLowerCase());
procedure = mapKeys(procedure, (_v, k) => k.toLowerCase());
procedure.create_procedure = procedure['create procedure'];
rows.push(procedure);
}
@ -1642,7 +1643,7 @@ class PGClient extends KnexClient {
*/
async _getQuery(args) {
try {
if (_.isEmpty(this._version)) {
if (isEmpty(this._version)) {
const result = await this.version();
this._version = result.data.object;
log.debug(
@ -2204,7 +2205,7 @@ class PGClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
const oldColumn = lodash.find(originalColumns, {
const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});

169
packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts

@ -5,8 +5,12 @@ import KnexClient from '../KnexClient';
import Debug from '../../../util/Debug';
import Result from '../../../util/Result';
import queries from './sqlite.queries';
import lodash from 'lodash';
import _ from 'lodash';
import isEmpty from 'lodash/isEmpty';
import mapKeys from 'lodash/mapKeys';
import find from 'lodash/find';
import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz_', 6);
const log = new Debug('SqliteClient');
@ -678,7 +682,7 @@ class SqliteClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let fn = response[0][i];
fn = _.mapKeys(fn, function (_v, k) {
fn = mapKeys(fn, function (_v, k) {
return k.toLowerCase();
});
fn.function_name = fn.name;
@ -732,7 +736,7 @@ class SqliteClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
procedure = _.mapKeys(procedure, function (_v, k) {
procedure = mapKeys(procedure, function (_v, k) {
return k.toLowerCase();
});
procedure.procedure_name = procedure.name;
@ -816,7 +820,7 @@ class SqliteClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let _function = response[0][i];
_function = _.mapKeys(_function, function (_v, k) {
_function = mapKeys(_function, function (_v, k) {
return k.toLowerCase();
});
@ -868,7 +872,7 @@ class SqliteClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
procedure = _.mapKeys(procedure, function (_v, k) {
procedure = mapKeys(procedure, function (_v, k) {
return k.toLowerCase();
});
@ -1031,7 +1035,7 @@ class SqliteClient extends KnexClient {
*/
async _getQuery(args) {
try {
if (_.isEmpty(this._version)) {
if (isEmpty(this._version)) {
const result = await this.version();
this._version = result.data.object;
log.debug(
@ -1491,11 +1495,11 @@ class SqliteClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
const oldColumn = lodash.find(originalColumns, {
const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});
if (args.columns[i].altered & 4) {
if (!args.columns[i].pk && args.columns[i].altered & 4) {
// col remove
upQuery += this.alterTableRemoveColumn(
args.table,
@ -1544,15 +1548,46 @@ class SqliteClient extends KnexClient {
}
}
upQuery += this.alterTablePK(
args.columns,
args.originalColumns,
upQuery,
this.sqlClient
);
//downQuery += alterTablePK(args.originalColumns, args.columns, downQuery);
const pkQuery = this.alterTablePK(args.columns, args.originalColumns, upQuery);
await this.sqlClient.raw(upQuery);
await this.sqlClient.raw('PRAGMA foreign_keys = OFF;');
await this.sqlClient.raw('PRAGMA legacy_alter_table = ON;');
const trx = await this.sqlClient.transaction();
try {
const queries = upQuery.split(';');
for (let i = 0; i < queries.length; i++) {
if (queries[i].trim() !== '') {
await trx.raw(queries[i]);
}
}
if (pkQuery) {
await trx.schema.alterTable(args.table, (table) => {
for (const pk of pkQuery.oldPks.filter((el) => !pkQuery.newPks.includes(el))) {
table.dropPrimary(pk);
}
for (const pk of pkQuery.dropPks) {
table.dropColumn(pk);
}
if (pkQuery.newPks.length) {
table.primary(pkQuery.newPks);
}
});
}
await trx.commit();
} catch (e) {
await trx.rollback();
log.ppe(e, _func);
throw e;
} finally {
await this.sqlClient.raw('PRAGMA foreign_keys = ON;');
await this.sqlClient.raw('PRAGMA legacy_alter_table = OFF;');
}
console.log(upQuery);
@ -1861,50 +1896,61 @@ class SqliteClient extends KnexClient {
return result;
}
alterTablePK(n, o, _existingQuery, createTable = false) {
const numOfPksInOriginal = [];
const numOfPksInNew = [];
let pksChanged = 0;
createTablePK(n, _existingQuery) {
const newPks = [];
for (let i = 0; i < n.length; ++i) {
if (n[i].pk) {
if (n[i].altered !== 4) newPks.push(n[i].cn);
}
}
let query = '';
if (newPks.length) {
query += this.genQuery(`, PRIMARY KEY(??)`, [newPks]);
}
return query;
}
alterTablePK(n, o, _existingQuery) {
const newPks = [];
const oldPks = [];
const dropPks = [];
let pksChanged = false;
for (let i = 0; i < n.length; ++i) {
if (n[i].pk) {
if (n[i].altered !== 4) numOfPksInNew.push(n[i].cn);
if (n[i].altered !== 4) {
newPks.push(n[i].cn);
} else {
dropPks.push(n[i].cn);
}
pksChanged = true;
}
}
for (let i = 0; i < o.length; ++i) {
if (o[i].pk) {
numOfPksInOriginal.push(o[i].cn);
oldPks.push(o[i].cn);
}
}
if (numOfPksInNew.length === numOfPksInOriginal.length) {
for (let i = 0; i < numOfPksInNew.length; ++i) {
if (numOfPksInOriginal[i] !== numOfPksInNew[i]) {
pksChanged = 1;
break;
}
if (newPks.length === oldPks.length) {
if (newPks.every((pk) => oldPks.includes(pk)) && dropPks.length === 0) {
pksChanged = false;
}
} else {
pksChanged = numOfPksInNew.length - numOfPksInOriginal.length;
}
let query = '';
if (!numOfPksInNew.length && !numOfPksInOriginal.length) {
// do nothing
} else if (pksChanged) {
query += numOfPksInOriginal.length ? ',DROP PRIMARY KEY' : '';
if (numOfPksInNew.length) {
if (createTable) {
query += this.genQuery(`, PRIMARY KEY(??)`, [numOfPksInNew]);
} else {
query += this.genQuery(`, ADD PRIMARY KEY(??)`, [numOfPksInNew]);
}
if (pksChanged) {
return {
newPks,
oldPks,
dropPks,
}
} else {
return false;
}
return query;
}
alterTableRemoveColumn(t, n, _o, existingQuery) {
@ -1937,7 +1983,7 @@ class SqliteClient extends KnexClient {
query += this.createTableColumn(table, args.columns[i], null, query);
}
query += this.alterTablePK(args.columns, [], query, true);
query += this.createTablePK(args.columns, query);
query = this.genQuery(`CREATE TABLE ?? (${query});`, [args.tn]);
@ -1950,19 +1996,32 @@ class SqliteClient extends KnexClient {
const defaultValue = getDefaultValue(n);
let shouldSanitize = true;
if (change === 2) {
query += this.genQuery(
`ALTER TABLE ?? RENAME COLUMN ?? TO ??`,
[t, o.cn, n.cn],
const suffix = nanoid();
let backupOldColumnQuery = this.genQuery(
`ALTER TABLE ?? RENAME COLUMN ?? TO ??;`,
[t, o.cn, `${o.cno}_nc_${suffix}`],
shouldSanitize
);
let addNewColumnQuery = ''
addNewColumnQuery += this.genQuery(` ADD ?? ${n.dt}`, [n.cn], shouldSanitize);
addNewColumnQuery += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : '';
addNewColumnQuery += n.cdf ? ` DEFAULT ${n.cdf}` : !n.rqd ? ' ' : ` DEFAULT ''`;
addNewColumnQuery += n.rqd ? ` NOT NULL` : ' ';
addNewColumnQuery = this.genQuery(`ALTER TABLE ?? ${addNewColumnQuery};`, [t], shouldSanitize);
let updateNewColumnQuery = this.genQuery(`UPDATE ?? SET ?? = ??;`, [t, n.cn, `${o.cno}_nc_${suffix}`], shouldSanitize);
let dropOldColumnQuery = this.genQuery(`ALTER TABLE ?? DROP COLUMN ??;`, [t, `${o.cno}_nc_${suffix}`], shouldSanitize);
query = `${backupOldColumnQuery}${addNewColumnQuery}${updateNewColumnQuery}${dropOldColumnQuery}`;
} else if (change === 0) {
query = existingQuery ? ',' : '';
query += this.genQuery(`?? ${n.dt}`, [n.cn], shouldSanitize);
query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : '';
query += n.cdf
? n.cdf.includes(',')
? ` DEFAULT ('${n.cdf}')`
: ` DEFAULT ${n.cdf}`
? ` DEFAULT ${n.cdf}`
: ' ';
query += n.rqd ? ` NOT NULL` : ' ';
} else if (change === 1) {
@ -1970,10 +2029,8 @@ class SqliteClient extends KnexClient {
query += this.genQuery(` ADD ?? ${n.dt}`, [n.cn], shouldSanitize);
query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : '';
query += n.cdf
? n.cdf.includes(',')
? ` DEFAULT ('${n.cdf}')`
: ` DEFAULT ${n.cdf}`
: ' ';
? ` DEFAULT ${n.cdf}`
: !n.rqd ? ' ' : ` DEFAULT ''`;
query += n.rqd ? ` NOT NULL` : ' ';
query = this.genQuery(`ALTER TABLE ?? ${query};`, [t], shouldSanitize);
} else {

5
tests/playwright/scripts/stressTestNewlyAddedTest.js

@ -7,7 +7,10 @@ const exec = util.promisify(require('child_process').exec);
void (async () => {
const { stdout: allFileNames } = await exec('git diff --name-only origin/develop');
// return if no changed file ends with .js
const testFilesInChangedFiles = allFileNames.split('\n').filter(fileName => fileName.endsWith('.spec.ts'));
const testFilesInChangedFiles = allFileNames
.split('\n')
.filter(fileName => fileName.endsWith('.spec.ts'))
.filter(fileName => fileName.startsWith('+')); // Only get newly added files
if (testFilesInChangedFiles.length === 0) {
console.log('No test file changed, skipping stress test');
return;

4
tests/playwright/tests/viewKanban.spec.ts

@ -19,6 +19,10 @@ test.describe('View', () => {
// close 'Team & Auth' tab
await dashboard.closeTab({ title: 'Team & Auth' });
await dashboard.treeView.openTable({ title: 'Film' });
if (isSqlite(context)) {
await dashboard.treeView.deleteTable({ title: 'FilmList' });
}
if (isPg(context)) {
// Since these view depend on the Ratings column of the Film table

Loading…
Cancel
Save