### Question:
OracleUndoUpdateExecutor extends AbstractUndoExecutor { @Override protected String buildUndoSQL() { TableRecords beforeImage = sqlUndoLog.getBeforeImage(); List<Row> beforeImageRows = beforeImage.getRows(); if (CollectionUtils.isEmpty(beforeImageRows)) { throw new ShouldNeverHappenException("Invalid UNDO LOG"); } Row row = beforeImageRows.get(0); List<Field> nonPkFields = row.nonPrimaryKeys(); String updateColumns = nonPkFields.stream().map( field -> ColumnUtils.addEscape(field.getName(), JdbcConstants.ORACLE) + " = ?").collect( Collectors.joining(", ")); List<String> pkNameList = getOrderedPkList(beforeImage, row, JdbcConstants.ORACLE).stream().map( e -> e.getName()).collect(Collectors.toList()); String whereSql = SqlGenerateUtils.buildWhereConditionByPKs(pkNameList, JdbcConstants.ORACLE); return String.format(UPDATE_SQL_TEMPLATE, sqlUndoLog.getTableName(), updateColumns, whereSql); } OracleUndoUpdateExecutor(SQLUndoLog sqlUndoLog);   }### Answer:
@Test public void buildUndoSQLByUpperCase() { OracleUndoUpdateExecutor executor = upperCaseSQL(); String sql = executor.buildUndoSQL(); Assertions.assertNotNull(sql); Assertions.assertTrue(sql.contains("UPDATE")); Assertions.assertTrue(sql.contains("ID")); Assertions.assertTrue(sql.contains("AGE")); Assertions.assertTrue(sql.contains("TABLE_NAME")); }