From 58eb49617bf1c29d5d3ddd0f9ed16c180a0a5d57 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 7 Sep 2017 00:36:52 +1200 Subject: [PATCH] #1113 - SqlUpdate with leading spaces leads to Invalid event detection (which table was update for L2 cache invalidation etc) --- .../server/core/DefaultServer.java | 6 +++--- .../server/core/PersistRequestUpdateSql.java | 2 ++ .../server/persist/ExeUpdateSql.java | 13 +----------- .../tests/query/sqlquery/SqlQueryTests.java | 6 +++--- .../tests/rawsql/TestInsertSqlLogging.java | 20 +++++++++++++++++++ 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index e86a2d4ad..1e1747ec1 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -1034,17 +1034,17 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { @Override public SqlQuery createSqlQuery(String sql) { - return new DefaultRelationalQuery(this, sql); + return new DefaultRelationalQuery(this, sql.trim()); } @Override public SqlUpdate createSqlUpdate(String sql) { - return new DefaultSqlUpdate(this, sql); + return new DefaultSqlUpdate(this, sql.trim()); } @Override public CallableSql createCallableSql(String sql) { - return new DefaultCallableSql(this, sql); + return new DefaultCallableSql(this, sql.trim()); } @Override diff --git a/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java b/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java index 6e863cdfe..80488c48e 100644 --- a/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java +++ b/src/main/java/io/ebeaninternal/server/core/PersistRequestUpdateSql.java @@ -111,6 +111,8 @@ public final class PersistRequestUpdateSql extends PersistRequest { case SQL_DELETE: transaction.getEvent().add(tableName, false, false, true); break; + case SQL_UNKNOWN: + transaction.markNotQueryOnly(); default: break; diff --git a/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java b/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java index d54d9b7f8..ba2b09cf2 100644 --- a/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java +++ b/src/main/java/io/ebeaninternal/server/persist/ExeUpdateSql.java @@ -128,13 +128,11 @@ public class ExeUpdateSql { private void parseUpdate(String sql, PersistRequestUpdateSql request) { - int start = leadingTrim(sql); - int[] pos = new int[3]; int spaceCount = 0; int len = sql.length(); - for (int i = start; i < len; i++) { + for (int i = 0; i < len; i++) { char c = sql.charAt(i); if (Character.isWhitespace(c)) { pos[spaceCount] = i; @@ -158,13 +156,4 @@ public class ExeUpdateSql { determineType(firstWord, secWord, thirdWord, request); } - private int leadingTrim(String s) { - int len = s.length(); - for (int i = 0; i < len; i++) { - if (!Character.isWhitespace(s.charAt(i))) { - return i; - } - } - return 0; - } } diff --git a/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java b/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java index c0c496dab..837a83dbe 100644 --- a/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java +++ b/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java @@ -84,7 +84,7 @@ public class SqlQueryTests extends BaseTestCase { ResetBasicData.reset(); - SqlQuery sqlQuery = Ebean.createSqlQuery("select * from o_order where o_order.id > :id order by id "); + SqlQuery sqlQuery = Ebean.createSqlQuery("select * from o_order where o_order.id > :id order by id"); sqlQuery.setParameter("id", 3); sqlQuery.setMaxRows(10); @@ -93,9 +93,9 @@ public class SqlQueryTests extends BaseTestCase { List sql = LoggedSqlCollector.stop(); if (isSqlServer()) { - assertThat(sql.get(0)).contains("select * from o_order where o_order.id > ? order by id offset 0 rows fetch next 10 rows only;"); + assertThat(sql.get(0)).contains("select * from o_order where o_order.id > ? order by id offset 0 rows fetch next 10 rows only;"); } else { - assertThat(sql.get(0)).contains("select * from o_order where o_order.id > ? order by id limit 10;"); + assertThat(sql.get(0)).contains("select * from o_order where o_order.id > ? order by id limit 10;"); } } diff --git a/src/test/java/org/tests/rawsql/TestInsertSqlLogging.java b/src/test/java/org/tests/rawsql/TestInsertSqlLogging.java index 1fe95ea42..0d0c1824b 100644 --- a/src/test/java/org/tests/rawsql/TestInsertSqlLogging.java +++ b/src/test/java/org/tests/rawsql/TestInsertSqlLogging.java @@ -3,9 +3,13 @@ package org.tests.rawsql; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.SqlUpdate; +import io.ebean.Transaction; +import io.ebeaninternal.api.SpiTransaction; import org.tests.idkeys.db.AuditLog; import org.junit.Test; +import static org.junit.Assert.assertFalse; + public class TestInsertSqlLogging extends BaseTestCase { @Test @@ -20,6 +24,22 @@ public class TestInsertSqlLogging extends BaseTestCase { sqlUpdate.setParameter(3, "rob"); sqlUpdate.execute(); + } + @Test + public void test_trim_leadingSpaces_eventFound() { + + Transaction transaction = Ebean.beginTransaction(); + try { + String upd = " update audit_log set description='junk' where id = 10001"; + SqlUpdate update = Ebean.createSqlUpdate(upd); + update.execute(); + transaction.commit(); + + assertFalse(((SpiTransaction) transaction).getEvent().getEventTables().isEmpty()); + + } finally { + transaction.end(); + } } }