private void handleOnDuplicate(DbException de) { if (de.getErrorCode() != ErrorCode.DUPLICATE_KEY_1) { throw de; } if (duplicateKeyAssignmentMap == null || duplicateKeyAssignmentMap.isEmpty()) { throw de; } ArrayList<String> variableNames = new ArrayList<String>(duplicateKeyAssignmentMap.size()); for (int i = 0; i < columns.length; i++) { String key = session.getCurrentSchemaName() + "." + table.getName() + "." + columns[i].getName(); variableNames.add(key); session.setVariable(key, list.get(getCurrentRowNumber() - 1)[i].getValue(session)); } Update command = new Update(session); command.setTableFilter(new TableFilter(session, table, null, true, null)); for (Column column : duplicateKeyAssignmentMap.keySet()) { command.setAssignment(column, duplicateKeyAssignmentMap.get(column)); } Index foundIndex = searchForUpdateIndex(); if (foundIndex != null) { command.setCondition(prepareUpdateCondition(foundIndex)); } else { throw DbException.getUnsupportedException( "Unable to apply ON DUPLICATE KEY UPDATE, no index found!"); } command.prepare(); command.update(); for (String variableName : variableNames) { session.setVariable(variableName, ValueNull.INSTANCE); } }