diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index f5100ec3c..912569e4e 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -1047,24 +1047,17 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { @Override public SqlQuery createSqlQuery(String sql) { - return new DefaultRelationalQuery(this, trimSql(sql)); + return new DefaultRelationalQuery(this, sql.trim()); } @Override public SqlUpdate createSqlUpdate(String sql) { - return new DefaultSqlUpdate(this, trimSql(sql)); + return new DefaultSqlUpdate(this, sql.trim()); } @Override public CallableSql createCallableSql(String sql) { - return new DefaultCallableSql(this, trimSql(sql)); - } - - /** - * Trim and remove new line chars for better support in multi-line sql strings (logging etc). - */ - private String trimSql(String sql) { - return sql.trim().replace('\n',' '); + return new DefaultCallableSql(this, sql.trim()); } @Override diff --git a/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java index e8e12aec0..7e91b0051 100644 --- a/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java @@ -10,6 +10,7 @@ import io.ebeaninternal.api.SpiSqlQuery; import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.server.lib.util.Str; import io.ebeaninternal.server.persist.Binder; +import io.ebeaninternal.server.persist.TrimLogSql; import io.ebeaninternal.server.query.DefaultSqlRow; import io.ebeaninternal.server.transaction.TransactionManager; import io.ebeaninternal.server.util.BindParamsParser; @@ -247,7 +248,7 @@ public final class RelationalQueryRequest { } if (isLogSql()) { - String logSql = sql; + String logSql = TrimLogSql.trim(sql); if (TransactionManager.SQL_LOGGER.isTraceEnabled()) { logSql = Str.add(logSql, "; --bind(", bindLog, ")"); } diff --git a/src/main/java/io/ebeaninternal/server/persist/ExeCallableSql.java b/src/main/java/io/ebeaninternal/server/persist/ExeCallableSql.java index 842541160..dde0be020 100644 --- a/src/main/java/io/ebeaninternal/server/persist/ExeCallableSql.java +++ b/src/main/java/io/ebeaninternal/server/persist/ExeCallableSql.java @@ -84,7 +84,7 @@ public class ExeCallableSql { cstmt = pstmtFactory.getCstmt(t, logSql, sql, request); } else { if (logSql) { - t.logSql(sql); + t.logSql(TrimLogSql.trim(sql)); } cstmt = pstmtFactory.getCstmt(t, sql); } diff --git a/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java b/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java index ba2b09cf2..51fc4a35e 100644 --- a/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java +++ b/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java @@ -88,7 +88,7 @@ public class ExeUpdateSql { pstmt = pstmtFactory.getPstmt(t, logSql, sql, request); } else { if (logSql) { - t.logSql(sql); + t.logSql(TrimLogSql.trim(sql)); } pstmt = pstmtFactory.getPstmt(t, sql); } diff --git a/src/main/java/io/ebeaninternal/server/persist/TrimLogSql.java b/src/main/java/io/ebeaninternal/server/persist/TrimLogSql.java new file mode 100644 index 000000000..bfcb2012d --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/persist/TrimLogSql.java @@ -0,0 +1,14 @@ +package io.ebeaninternal.server.persist; + +/** + * Utility to improve logging of raw SQL that contains new line characters. + */ +public class TrimLogSql { + + /** + * Replace new line chars for nicer logging of multi-line sql strings. + */ + public static String trim(String sql) { + return sql.replace("\n", "\\n "); + } +} diff --git a/src/test/java/io/ebeaninternal/server/persist/TrimLogSqlTest.java b/src/test/java/io/ebeaninternal/server/persist/TrimLogSqlTest.java new file mode 100644 index 000000000..d10971ec5 --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/persist/TrimLogSqlTest.java @@ -0,0 +1,16 @@ +package io.ebeaninternal.server.persist; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TrimLogSqlTest { + + @Test + public void trim() throws Exception { + + assertThat(TrimLogSql.trim("hello")).isEqualTo("hello"); + assertThat(TrimLogSql.trim("hello\nthere")).isEqualTo("hello\\n there"); + } + +} diff --git a/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java b/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java index 837a83dbe..1b3c49bc2 100644 --- a/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java +++ b/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java @@ -17,6 +17,32 @@ import static org.junit.Assert.assertEquals; public class SqlQueryTests extends BaseTestCase { + @Test + public void newline_replacedInLogsOnly() { + + ResetBasicData.reset(); + + String sql = "select * -- \n from o_customer"; + SqlQuery sqlQuery = Ebean.createSqlQuery(sql); + + List list = sqlQuery.findList(); + assertThat(list).isNotEmpty(); + } + + @Test + public void newLineLiteral_replacedInLogsOnly() { + + ResetBasicData.reset(); + + String sql = "select 'hello\nthere' as hello from o_customer"; + SqlQuery sqlQuery = Ebean.createSqlQuery(sql); + + List list = sqlQuery.findList(); + assertThat(list).isNotEmpty(); + + assertThat(list.get(0).getString("hello")).isEqualTo("hello\nthere"); + } + @Test public void firstRowMaxRows() { diff --git a/src/test/java/org/tests/update/TestSqlUpdateInTxn.java b/src/test/java/org/tests/update/TestSqlUpdateInTxn.java index ee6dfdfd9..017ea8b2e 100644 --- a/src/test/java/org/tests/update/TestSqlUpdateInTxn.java +++ b/src/test/java/org/tests/update/TestSqlUpdateInTxn.java @@ -17,7 +17,7 @@ public class TestSqlUpdateInTxn extends BaseTestCase { String sql = " this\nis\ntrimmed "; SqlUpdate sqlUpdate = Ebean.createSqlUpdate(sql); - assertThat(sqlUpdate.getSql()).isEqualTo("this is trimmed"); + assertThat(sqlUpdate.getSql()).isEqualTo(sql.trim()); } @Test @@ -28,8 +28,8 @@ public class TestSqlUpdateInTxn extends BaseTestCase { SqlUpdate sqlUpdate = Ebean.createSqlUpdate(sql); sqlUpdate.execute(); - assertThat(sqlUpdate.getSql()).isEqualTo("update audit_log set description = description where id = id"); - assertThat(sqlUpdate.getGeneratedSql()).isEqualTo("update audit_log set description = description where id = id"); + assertThat(sqlUpdate.getSql()).isEqualTo(sql.trim()); + assertThat(sqlUpdate.getGeneratedSql()).isEqualTo(sql.trim()); } @Test