diff --git a/symmetric-sqlexplorer/src/main/java/org/jumpmind/vaadin/ui/sqlexplorer/TabularResultLayout.java b/symmetric-sqlexplorer/src/main/java/org/jumpmind/vaadin/ui/sqlexplorer/TabularResultLayout.java index 8875c86200..94317d2588 100644 --- a/symmetric-sqlexplorer/src/main/java/org/jumpmind/vaadin/ui/sqlexplorer/TabularResultLayout.java +++ b/symmetric-sqlexplorer/src/main/java/org/jumpmind/vaadin/ui/sqlexplorer/TabularResultLayout.java @@ -46,6 +46,7 @@ import org.jumpmind.db.model.Reference; import org.jumpmind.db.model.Table; import org.jumpmind.db.platform.DatabaseInfo; +import org.jumpmind.db.platform.IDatabasePlatform; import org.jumpmind.db.platform.IDdlReader; import org.jumpmind.db.sql.SqlException; import org.jumpmind.properties.TypedProperties; @@ -282,13 +283,31 @@ public void menuSelected(MenuItem selectedItem) { } String sql = buildUpdate(resultTable, colNames, resultTable.getPrimaryKeyColumnNames()); log.warn(sql); - Object[] allParams = ArrayUtils.addAll(params.toArray(), pkParams); - int[] allTypes = ArrayUtils.addAll(types.stream().mapToInt(val -> val).toArray(), pkTypes); - for (int k = 0; k < allTypes.length; k++) { - if (allTypes[k] == Types.DATE && db.getPlatform().getDdlBuilder().getDatabaseInfo() - .isDateOverridesToTimestamp()) { - allTypes[k] = Types.TIMESTAMP; + Object[] allParams; + int[] allTypes; + if (pkParams.length > 0) { + allParams = ArrayUtils.addAll(params.toArray(), pkParams); + allTypes = ArrayUtils.addAll(types.stream().mapToInt(val -> val).toArray(), pkTypes); + for (int k = 0; k < allTypes.length; k++) { + if (allTypes[k] == Types.DATE && db.getPlatform().getDdlBuilder().getDatabaseInfo() + .isDateOverridesToTimestamp()) { + allTypes[k] = Types.TIMESTAMP; + } + } + } else { + List requiredColParams = new ArrayList(); + List requiredColTypes = new ArrayList(); + for (int k = 0; k < unchangedValue[0].size(); k++) { + Object val = unchangedValue[0].get(k); + Column col = resultTable.getColumn(k); + if (col.isRequired() && db.getPlatform().canColumnBeUsedInWhereClause(col)) { + requiredColParams.add(val); + requiredColTypes.add(col.getMappedTypeCode()); + } } + allParams = ArrayUtils.addAll(params.toArray(), requiredColParams.toArray()); + allTypes = ArrayUtils.addAll(types.stream().mapToInt(val -> val).toArray(), + requiredColTypes.stream().mapToInt(l -> l).toArray()); } try { db.getPlatform().getSqlTemplate().update(sql, allParams, allTypes); @@ -783,8 +802,9 @@ protected String[] getColumnsToExclude() { protected String buildUpdate(Table table, List columnNames, String[] pkColumnNames) { StringBuilder sql = new StringBuilder("update "); - DatabaseInfo dbInfo = db.getPlatform().getDatabaseInfo(); - String quote = db.getPlatform().getDdlBuilder().isDelimitedIdentifierModeOn() ? dbInfo.getDelimiterToken() : ""; + IDatabasePlatform platform = db.getPlatform(); + DatabaseInfo dbInfo = platform.getDatabaseInfo(); + String quote = platform.getDdlBuilder().isDelimitedIdentifierModeOn() ? dbInfo.getDelimiterToken() : ""; sql.append(table.getQualifiedTableName(quote, dbInfo.getCatalogSeparator(), dbInfo.getSchemaSeparator())); sql.append(" set "); for (String col : columnNames) { @@ -795,11 +815,22 @@ protected String buildUpdate(Table table, List columnNames, String[] pkC } sql.delete(sql.length() - 2, sql.length()); sql.append(" where "); - for (String col : pkColumnNames) { - sql.append(quote); - sql.append(col); - sql.append(quote); - sql.append("=? and "); + if (pkColumnNames.length > 0) { + for (String col : pkColumnNames) { + sql.append(quote); + sql.append(col); + sql.append(quote); + sql.append("=? and "); + } + } else { + for (Column col : table.getColumns()) { + if (col.isRequired() && platform.canColumnBeUsedInWhereClause(col)) { + sql.append(quote); + sql.append(col.getName()); + sql.append(quote); + sql.append("=? and "); + } + } } sql.delete(sql.length() - 5, sql.length()); return sql.toString();