diff --git a/packages/tools/src/SqlDumper.ts b/packages/tools/src/SqlDumper.ts index 65d327c1b..768838681 100644 --- a/packages/tools/src/SqlDumper.ts +++ b/packages/tools/src/SqlDumper.ts @@ -606,7 +606,7 @@ export class SqlDumper implements AlterProcessor { this.putCmd('^drop %s %f', this.getSqlObjectSqlName(obj.objectTypeField), obj); } - fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[]) { + fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) { let was = false; for (const row of newRows) { const old = oldRows?.find(r => key.every(col => r[col] == row[col])); @@ -614,7 +614,7 @@ export class SqlDumper implements AlterProcessor { if (old) { const updated = []; for (const col of rowKeys) { - if (row[col] != old[col]) { + if (row[col] != old[col] && !insertOnly?.includes(col)) { updated.push(col); } } diff --git a/packages/tools/src/alterPlan.ts b/packages/tools/src/alterPlan.ts index 858138f89..dae56bf8a 100644 --- a/packages/tools/src/alterPlan.ts +++ b/packages/tools/src/alterPlan.ts @@ -93,6 +93,7 @@ interface AlterOperation_FillPreloadedRows { oldRows: any[]; newRows: any[]; key: string[]; + insertOnly: string[]; } type AlterOperation = @@ -232,13 +233,14 @@ export class AlterPlan { this.recreates.tables += 1; } - fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[]) { + fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) { this.operations.push({ operationType: 'fillPreloadedRows', table, oldRows, newRows, key, + insertOnly, }); } @@ -565,7 +567,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); + processor.fillPreloadedRows(op.table, op.oldRows, op.newRows, op.key, op.insertOnly); break; case 'recreateTable': { diff --git a/packages/tools/src/database-info-alter-processor.ts b/packages/tools/src/database-info-alter-processor.ts index d0e0fdaa4..046b04c08 100644 --- a/packages/tools/src/database-info-alter-processor.ts +++ b/packages/tools/src/database-info-alter-processor.ts @@ -116,9 +116,10 @@ export class DatabaseInfoAlterProcessor { throw new Error('recreateTable not implemented for DatabaseInfoAlterProcessor'); } - fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[]) { + fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]) { const tableInfo = this.db.tables.find(x => x.pureName == table.pureName && x.schemaName == table.schemaName); tableInfo.preloadedRows = newRows; tableInfo.preloadedRowsKey = key; + tableInfo.preloadedRowsInsertOnly = insertOnly; } } diff --git a/packages/tools/src/diffTools.ts b/packages/tools/src/diffTools.ts index b7c218ab6..326a21a36 100644 --- a/packages/tools/src/diffTools.ts +++ b/packages/tools/src/diffTools.ts @@ -328,7 +328,7 @@ function createPairs(oldList, newList, additionalCondition = null) { function planTablePreload(plan: AlterPlan, oldTable: TableInfo, newTable: TableInfo) { const key = newTable.preloadedRowsKey || newTable.primaryKey?.columns?.map(x => x.columnName); if (newTable.preloadedRows?.length > 0 && key?.length > 0) { - plan.fillPreloadedRows(newTable, oldTable?.preloadedRows, newTable.preloadedRows, key); + plan.fillPreloadedRows(newTable, oldTable?.preloadedRows, newTable.preloadedRows, key, newTable.preloadedRowsInsertOnly); } } diff --git a/packages/tools/src/yamlModelConv.ts b/packages/tools/src/yamlModelConv.ts index ad1e2fff9..128122e76 100644 --- a/packages/tools/src/yamlModelConv.ts +++ b/packages/tools/src/yamlModelConv.ts @@ -24,6 +24,7 @@ export interface TableInfoYaml { primaryKey?: string[]; insertKey?: string[]; + insertOnly?: string[]; data?: any[]; } @@ -124,6 +125,7 @@ export function tableInfoFromYaml(table: TableInfoYaml, allTables: TableInfoYaml } res.preloadedRows = table.data; res.preloadedRowsKey = table.insertKey; + res.preloadedRowsInsertOnly = table.insertOnly; return res; } diff --git a/packages/types/alter-processor.d.ts b/packages/types/alter-processor.d.ts index 25de4885d..3e5cd3cc3 100644 --- a/packages/types/alter-processor.d.ts +++ b/packages/types/alter-processor.d.ts @@ -15,5 +15,5 @@ export interface AlterProcessor { recreateTable(oldTable: TableInfo, newTable: TableInfo); createSqlObject(obj: SqlObjectInfo); dropSqlObject(obj: SqlObjectInfo); - fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[]); + fillPreloadedRows(table: NamedObjectInfo, oldRows: any[], newRows: any[], key: string[], insertOnly: string[]); } diff --git a/packages/types/dbinfo.d.ts b/packages/types/dbinfo.d.ts index 0ee59e73d..16a0aec58 100644 --- a/packages/types/dbinfo.d.ts +++ b/packages/types/dbinfo.d.ts @@ -80,6 +80,7 @@ export interface TableInfo extends DatabaseObjectInfo { checks?: CheckInfo[]; preloadedRows?: any[]; preloadedRowsKey?: string[]; + preloadedRowsInsertOnly?: string[]; __isDynamicStructure?: boolean; }