in src/main/user-impl/java/com/mysql/cj/jdbc/result/UpdatableResultSet.java [576:704]
protected void generateStatements() throws SQLException {
if (!this.isUpdatable) {
this.doingUpdates = false;
this.onInsertRow = false;
throw new NotUpdatable(this.notUpdatableReason);
}
String quotedId = getQuotedIdChar();
Map<String, String> tableNamesSoFar = null;
if (this.session.getServerSession().isLowerCaseTableNames()) {
tableNamesSoFar = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
this.databasesUsedToTablesUsed = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
} else {
tableNamesSoFar = new TreeMap<>();
this.databasesUsedToTablesUsed = new TreeMap<>();
}
this.primaryKeyIndices = new ArrayList<>();
StringBuilder fieldValues = new StringBuilder();
this.keyValues = new StringBuilder();
StringBuilder columnNames = new StringBuilder();
StringBuilder insertPlaceHolders = new StringBuilder();
StringBuilder allTablesBuf = new StringBuilder();
Map<Integer, String> columnIndicesToTable = new HashMap<>();
Field[] fields = getMetadata().getFields();
for (int i = 0; i < fields.length; i++) {
Map<String, Integer> updColumnNameToIndex = null;
// FIXME: What about no table?
if (fields[i].getOriginalTableName() != null) {
String databaseName = fields[i].getDatabaseName();
String tableOnlyName = fields[i].getOriginalTableName();
String fqTableName = StringUtils.getFullyQualifiedName(databaseName, tableOnlyName, quotedId, this.pedantic);
if (!tableNamesSoFar.containsKey(fqTableName)) {
if (!tableNamesSoFar.isEmpty()) {
allTablesBuf.append(',');
}
allTablesBuf.append(fqTableName);
tableNamesSoFar.put(fqTableName, fqTableName);
}
columnIndicesToTable.put(Integer.valueOf(i), fqTableName);
updColumnNameToIndex = getColumnsToIndexMapForTableAndDB(databaseName, tableOnlyName);
} else {
String tableOnlyName = fields[i].getTableName();
if (tableOnlyName != null) {
String fqTableName = StringUtils.quoteIdentifier(tableOnlyName, quotedId, this.pedantic);
if (!tableNamesSoFar.containsKey(fqTableName)) {
if (!tableNamesSoFar.isEmpty()) {
allTablesBuf.append(',');
}
allTablesBuf.append(fqTableName);
tableNamesSoFar.put(fqTableName, fqTableName);
}
columnIndicesToTable.put(Integer.valueOf(i), fqTableName);
updColumnNameToIndex = getColumnsToIndexMapForTableAndDB(this.db, tableOnlyName);
}
}
String originalColumnName = fields[i].getOriginalName();
String columnName = this.hasLongColumnInfo && originalColumnName != null && originalColumnName.length() > 0 ? originalColumnName
: fields[i].getName();
if (updColumnNameToIndex != null && columnName != null) {
updColumnNameToIndex.put(columnName, Integer.valueOf(i));
}
String originalTableName = fields[i].getOriginalTableName();
String tableName = this.hasLongColumnInfo && originalTableName != null && originalTableName.length() > 0 ? originalTableName
: fields[i].getTableName();
String databaseName = fields[i].getDatabaseName();
String qualifiedColumnName = new StringBuilder() //
.append(StringUtils.getFullyQualifiedName(databaseName, tableName, quotedId, this.pedantic)) //
.append('.') //
.append(StringUtils.quoteIdentifier(columnName, quotedId, this.pedantic)).toString();
if (fields[i].isPrimaryKey()) {
this.primaryKeyIndices.add(Integer.valueOf(i));
if (this.keyValues.length() > 0) {
this.keyValues.append(" AND ");
}
this.keyValues.append(qualifiedColumnName);
this.keyValues.append("<=>");
this.keyValues.append("?");
}
if (fieldValues.length() == 0) {
fieldValues.append("SET ");
} else {
fieldValues.append(",");
columnNames.append(",");
insertPlaceHolders.append(",");
}
insertPlaceHolders.append("?");
columnNames.append(qualifiedColumnName);
this.fieldsToUpdate.add(qualifiedColumnName + "=?");
fieldValues.append(qualifiedColumnName);
fieldValues.append("=?");
}
this.qualifiedAndQuotedTableName = allTablesBuf.toString();
this.insertSQL = "INSERT INTO " + this.qualifiedAndQuotedTableName + " (" + columnNames.toString() + ") VALUES (" + insertPlaceHolders.toString() + ")";
this.refreshSQL = "SELECT " + columnNames.toString() + " FROM " + this.qualifiedAndQuotedTableName + " WHERE " + this.keyValues.toString();
this.deleteSQL = "DELETE FROM " + this.qualifiedAndQuotedTableName + " WHERE " + this.keyValues.toString();
}