Skip to content

Commit

Permalink
0004609: Postgres Conflict Resolution fails to resolve
Browse files Browse the repository at this point in the history
# Conflicts:
#	symmetric-io/src/integrationTest/java/org/jumpmind/symmetric/io/data/writer/DatabaseWriterConflictTest.java
  • Loading branch information
Philip Marzullo committed Oct 29, 2020
1 parent a13767a commit e40411d
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 17 deletions.
Expand Up @@ -6,6 +6,8 @@
import org.jumpmind.db.platform.DatabaseInfo;

public class PostgreSqlDmlStatement95 extends PostgreSqlDmlStatement {

public static final String ON_CONFLICT_DO_NOTHING = "on conflict do nothing";

public PostgreSqlDmlStatement95(DmlType type, String catalogName, String schemaName, String tableName,
Column[] keysColumns, Column[] columns, boolean[] nullKeyValues, DatabaseInfo databaseInfo,
Expand All @@ -20,9 +22,18 @@ public String buildInsertSql(String tableName, Column[] keys, Column[] columns)
appendColumns(sql, columns, false);
sql.append(") values (");
appendColumnParameters(sql, columns);
sql.append(") on conflict do nothing");
sql.append(") ").append(ON_CONFLICT_DO_NOTHING);
return sql.toString();
}

@Override
public String getSql(boolean allowIgnoreOnConflict) {
if (allowIgnoreOnConflict) {
return sql;
} else {
return sql.replace(ON_CONFLICT_DO_NOTHING, "");
}
}

@Override
public Column[] getMetaData() {
Expand Down
Expand Up @@ -375,6 +375,10 @@ public String getColumnsSql(Column[] columns) {
public String getSql() {
return sql;
}

public String getSql(boolean allowIgnoreOnConflict) {
return sql;
}

public DmlType getDmlType() {
return dmlType;
Expand Down
Expand Up @@ -87,12 +87,12 @@ public void testInsertUkViolation() throws Exception {

@Test
public void testInsertUkViolationDeleteFkViolation() throws Exception {
String firstId = insert(getNextId(), "twin", null);
String firstId = insert(getNextId(), "twin2", null);
String secondId = insert(getNextId(), "depends1", firstId);
String thirdId = insert(getNextId(), "depends2", firstId);
insert(getNextId(), "depends3", secondId);
insert(getNextId(), "depends4", thirdId);
insert(getNextId(), "twin", null);
insert(getNextId(), "twin2", null);
}

@Test
Expand Down Expand Up @@ -190,16 +190,16 @@ public void testUpdatePkViolation() throws Exception {

@Test
public void testUpdatePkViolationDeleteFkViolationBlockingSelf() throws Exception {
String firstId = insert(getNextId(), "update-pk1", null);
String secondId = insert(getNextId(), "update-pk2", firstId);
update(secondId, firstId, "update-pk2", null);
String firstId = insert(getNextId(), "update2-pk1", null);
String secondId = insert(getNextId(), "update2-pk2", firstId);
update(secondId, firstId, "update2-pk2", null);
}

@Test
public void testUpdateUkViolationDeleteFkViolationBlockingSelf() throws Exception {
String firstId = insert(getNextId(), "update-pk1", null);
String secondId = insert(getNextId(), "update-pk2", firstId);
update(secondId, secondId, "update-pk1", null);
String firstId = insert(getNextId(), "update3-pk1", null);
String secondId = insert(getNextId(), "update3-pk2", firstId);
update(secondId, secondId, "update3-pk1", null);
}

@Test
Expand Down
Expand Up @@ -104,11 +104,7 @@ public void needsResolved(AbstractDatabaseWriter writer, CsvData data, LoadStatu
}

if (isWinner) {
try {
performFallbackToUpdate(writer, data, conflict, false);
} catch (ConflictException e) {
performChainedFallbackForUpdate(writer, data, conflict, true);
}
performChainedFallbackForUpdate(writer, data, conflict, true);
} else if (!conflict.isResolveRowOnly()) {
throw new IgnoreBatchException();
}
Expand Down
Expand Up @@ -24,7 +24,6 @@
import java.io.StringReader;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -243,7 +242,7 @@ protected LoadStatus insert(CsvData data) {
return LoadStatus.SUCCESS;
} else {
context.put(CUR_DATA,getCurData(getTransaction()));
context.setLastError(new SQLIntegrityConstraintViolationException("duplicate", "23000"));
context.setLastError(getInsertException2(data, values));
return LoadStatus.CONFLICT;
}
} catch (SqlException ex) {
Expand All @@ -269,7 +268,21 @@ protected LoadStatus insert(CsvData data) {
}
}

private boolean isUniqueIndexViolation(Throwable ex, Table targetTable) {
private SqlException getInsertException2(CsvData data, String[] values) {
SqlException ret = null;
String sql = currentDmlStatement.getSql(false);
Object[] dmlValues = getPlatform().getObjectValues(batch.getBinaryEncoding(), values,
currentDmlStatement.getMetaData(), false, writerSettings.isFitToColumn());
try {
getPlatform().getSqlTemplate().update(sql, dmlValues);
} catch(SqlException ex) {
ret = ex;
}

return ret;
}

private boolean isUniqueIndexViolation(Throwable ex, Table targetTable) {
String violatedIndexName = getPlatform().getSqlTemplate().getUniqueKeyViolationIndexName(ex);
for (IIndex index : targetTable.getIndices()) {
if (index.isUnique() && (index.getName().equals(violatedIndexName))) {
Expand Down

0 comments on commit e40411d

Please sign in to comment.