From 219d6d18b356c7d7f0a198c375f4d92ec90ebcc9 Mon Sep 17 00:00:00 2001 From: evan-miller-jumpmind <70151986+evan-miller-jumpmind@users.noreply.github.com> Date: Tue, 13 Dec 2022 13:56:05 -0500 Subject: [PATCH] 0005630: Added query for parent row when deleting FK child rows during conflict resolution and old_data is null --- ...DefaultDatabaseWriterConflictResolver.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriterConflictResolver.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriterConflictResolver.java index eb9bc78ca9..84f776d244 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriterConflictResolver.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/writer/DefaultDatabaseWriterConflictResolver.java @@ -29,6 +29,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import org.apache.commons.lang3.ArrayUtils; @@ -52,6 +53,7 @@ import org.jumpmind.db.sql.Row; import org.jumpmind.db.sql.SqlException; import org.jumpmind.db.sql.mapper.NumberMapper; +import org.jumpmind.db.util.BinaryEncoding; import org.jumpmind.db.util.DatabaseConstants; import org.jumpmind.db.util.TableRow; import org.jumpmind.exception.ParseException; @@ -581,16 +583,44 @@ protected boolean checkForForeignKeyChildExistsViolation(AbstractDatabaseWriter protected boolean deleteForeignKeyChildren(IDatabasePlatform platform, ISqlTemplate sqlTemplate, DefaultDatabaseWriter databaseWriter, Table targetTable, CsvData data) { Map values = null; + List tableRows = new ArrayList(); if (data.getDataEventType() == DataEventType.INSERT) { values = data.toColumnNameValuePairs(databaseWriter.getSourceTable().getColumnNames(), CsvData.ROW_DATA); } else { values = data.toColumnNameValuePairs(databaseWriter.getSourceTable().getColumnNames(), CsvData.OLD_DATA); if (values == null || values.size() == 0) { values = data.toColumnNameValuePairs(databaseWriter.getSourceTable().getPrimaryKeyColumnNames(), CsvData.PK_DATA); + Row whereRow = new Row(values.size()); + boolean[] nullValues = new boolean[values.size()]; + int index = 0; + for (Entry entry : values.entrySet()) { + nullValues[index++] = entry.getValue() == null; + whereRow.put(entry.getKey(), entry.getValue()); + } + DmlStatement whereSt = platform.createDmlStatement(DmlType.WHERE, targetTable.getCatalog(), + targetTable.getSchema(), targetTable.getName(), targetTable.getPrimaryKeyColumns(), + targetTable.getColumns(), nullValues, null); + String whereSql = whereSt.buildDynamicSql(BinaryEncoding.HEX, whereRow, false, true, + targetTable.getPrimaryKeyColumns()).substring(6); + String delimiter = platform.getDatabaseInfo().getSqlCommandDelimiter(); + if (delimiter != null && delimiter.length() > 0) { + whereSql = whereSql.substring(0, whereSql.length() - delimiter.length()); + } + DmlStatement selectSt = platform.createDmlStatement(DmlType.SELECT, targetTable, null); + Object[] keys = whereRow.toArray(targetTable.getPrimaryKeyColumnNames()); + Row targetRow = doInTransaction(platform, databaseWriter, new ITransactionCallback() { + public Row execute(ISqlTransaction transaction) { + return transaction.queryForRow(selectSt.getSql(), keys); + } + }); + if (targetRow != null) { + tableRows.add(new TableRow(targetTable, targetRow, null, null, null)); + } } } - List tableRows = new ArrayList(); - tableRows.add(new TableRow(targetTable, values, null, null, null)); + if (tableRows.isEmpty()) { + tableRows.add(new TableRow(targetTable, values, null, null, null)); + } List foreignTableRows = doInTransaction(platform, databaseWriter, new ITransactionCallback>() { public List execute(ISqlTransaction transaction) { return platform.getDdlReader().getExportedForeignTableRows(transaction, tableRows, new HashSet(), databaseWriter.getBatch()