preloaded rows works with autoinc columns (fix for mssql)
Some checks are pending
Run tests / test-runner (push) Waiting to run

This commit is contained in:
SPRINX0\prochazka 2024-08-29 10:53:56 +02:00
parent e982e8cd9b
commit c097e78dd0
5 changed files with 40 additions and 7 deletions

View File

@ -210,7 +210,6 @@ export class SqlDumper implements AlterProcessor {
} else {
this.putRaw(SqlDumper.convertKeywordCase(type));
}
}
columnDefinition(column: ColumnInfo, { includeDefault = true, includeNullable = true, includeCollate = true } = {}) {
@ -653,7 +652,14 @@ export class SqlDumper implements AlterProcessor {
this.putCmd('^drop %s %f', this.getSqlObjectSqlName(obj.objectTypeField), obj);
}
fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) {
fillPreloadedRows(
table: NamedObjectInfo,
oldRows: any[],
newRows: any[],
key: string[],
insertOnly: string[],
autoIncrementColumn: string
) {
let was = false;
for (const row of newRows) {
const old = oldRows?.find(r => key.every(col => r[col] == row[col]));
@ -676,12 +682,15 @@ export class SqlDumper implements AlterProcessor {
} else {
if (was) this.put(';\n');
was = true;
const autoinc = rowKeys.includes(autoIncrementColumn);
if (autoinc) this.allowIdentityInsert(table, true);
this.put(
'^insert ^into %f (%,i) ^values (%,v)',
table,
rowKeys,
rowKeys.map(x => row[x])
);
if (autoinc) this.allowIdentityInsert(table, false);
}
}
if (was) {

View File

@ -94,6 +94,7 @@ interface AlterOperation_FillPreloadedRows {
newRows: any[];
key: string[];
insertOnly: string[];
autoIncrementColumn: string;
}
type AlterOperation =
@ -233,7 +234,14 @@ export class AlterPlan {
this.recreates.tables += 1;
}
fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) {
fillPreloadedRows(
table: NamedObjectInfo,
oldRows: any[],
newRows: any[],
key: string[],
insertOnly: string[],
autoIncrementColumn: string
) {
this.operations.push({
operationType: 'fillPreloadedRows',
table,
@ -241,6 +249,7 @@ export class AlterPlan {
newRows,
key,
insertOnly,
autoIncrementColumn,
});
}
@ -567,7 +576,7 @@ export function runAlterOperation(op: AlterOperation, processor: AlterProcessor)
processor.dropSqlObject(op.oldObject);
break;
case 'fillPreloadedRows':
processor.fillPreloadedRows(op.table, op.oldRows, op.newRows, op.key, op.insertOnly);
processor.fillPreloadedRows(op.table, op.oldRows, op.newRows, op.key, op.insertOnly, op.autoIncrementColumn);
break;
case 'recreateTable':
{

View File

@ -116,7 +116,14 @@ export class DatabaseInfoAlterProcessor {
throw new Error('recreateTable not implemented for DatabaseInfoAlterProcessor');
}
fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) {
fillPreloadedRows(
table: NamedObjectInfo,
oldRows: any[],
newRows: any[],
key: string[],
insertOnly: string[],
autoIncrementColumn: string
) {
const tableInfo = this.db.tables.find(x => x.pureName == table.pureName && x.schemaName == table.schemaName);
tableInfo.preloadedRows = newRows;
tableInfo.preloadedRowsKey = key;

View File

@ -368,7 +368,8 @@ function planTablePreload(plan: AlterPlan, oldTable: TableInfo, newTable: TableI
oldTable?.preloadedRows,
newTable.preloadedRows,
key,
newTable.preloadedRowsInsertOnly
newTable.preloadedRowsInsertOnly,
newTable.columns.find(x => x.autoIncrement)?.columnName
);
}
}

View File

@ -15,5 +15,12 @@ export interface AlterProcessor {
recreateTable(oldTable: TableInfo, newTable: TableInfo);
createSqlObject(obj: SqlObjectInfo);
dropSqlObject(obj: SqlObjectInfo);
fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]);
fillPreloadedRows(
table: NamedObjectInfo,
oldRows: any[],
newRows: any[],
key: string[],
insertOnly: string[],
autoIncrementColumn: string
);
}