diff --git a/src/test/java/io/ebean/EbeanServer_eqlTest.java b/src/test/java/io/ebean/EbeanServer_eqlTest.java index 360b3e941..a31f87a03 100644 --- a/src/test/java/io/ebean/EbeanServer_eqlTest.java +++ b/src/test/java/io/ebean/EbeanServer_eqlTest.java @@ -1,8 +1,8 @@ package io.ebean; +import org.junit.Test; import org.tests.model.basic.Customer; import org.tests.model.basic.ResetBasicData; -import org.junit.Test; import javax.persistence.PersistenceException; @@ -23,6 +23,8 @@ public class EbeanServer_eqlTest extends BaseTestCase { if (isSqlServer()) { assertThat(query.getGeneratedSql()).startsWith("select top 100 "); assertThat(query.getGeneratedSql()).endsWith("order by t0.id"); + } else if (isOracle()) { + assertThat(query.getGeneratedSql()).contains("where rownum <= 100"); } else { assertThat(query.getGeneratedSql()).endsWith("order by t0.id limit 100"); } @@ -39,6 +41,8 @@ public class EbeanServer_eqlTest extends BaseTestCase { if (isSqlServer()) { assertThat(query.getGeneratedSql()).startsWith("select top 10 "); assertThat(query.getGeneratedSql()).endsWith("order by t0.id"); + } else if (isOracle()) { + assertThat(query.getGeneratedSql()).contains("where rownum <= 10"); } else { assertThat(query.getGeneratedSql()).endsWith("order by t0.id limit 10"); } @@ -54,6 +58,9 @@ public class EbeanServer_eqlTest extends BaseTestCase { if (isSqlServer()) { assertThat(query.getGeneratedSql()).endsWith("order by t0.id offset 3 rows fetch next 10 rows only"); + } else if (isOracle()) { + assertThat(query.getGeneratedSql()).contains("where rownum <= 13"); + assertThat(query.getGeneratedSql()).contains("where rn_ > 3"); } else { assertThat(query.getGeneratedSql()).endsWith("order by t0.id limit 10 offset 3"); } @@ -72,6 +79,9 @@ public class EbeanServer_eqlTest extends BaseTestCase { if (isSqlServer()) { assertThat(query.getGeneratedSql()).endsWith("order by t0.name, t0.id offset 3 rows fetch next 10 rows only"); + } else if (isOracle()) { + assertThat(query.getGeneratedSql()).contains("where rownum <= 13"); + assertThat(query.getGeneratedSql()).contains("where rn_ > 3"); } else { assertThat(query.getGeneratedSql()).endsWith("order by t0.name, t0.id limit 10 offset 3"); } @@ -89,6 +99,9 @@ public class EbeanServer_eqlTest extends BaseTestCase { if (isSqlServer()) { assertThat(query.getGeneratedSql()).endsWith("order by t0.id offset 3 rows fetch next 10 rows only"); + } else if (isOracle()) { + assertThat(query.getGeneratedSql()).contains("where rownum <= 13"); + assertThat(query.getGeneratedSql()).contains("where rn_ > 3"); } else { assertThat(query.getGeneratedSql()).endsWith("order by t0.id limit 10 offset 3"); } @@ -106,6 +119,9 @@ public class EbeanServer_eqlTest extends BaseTestCase { if (isSqlServer()) { assertThat(query.getGeneratedSql()).startsWith("select top 10 "); assertThat(query.getGeneratedSql()).endsWith("order by t0.id"); + } else if (isOracle()) { + assertThat(query.getGeneratedSql()).contains("t0 order by t0.id"); + assertThat(query.getGeneratedSql()).contains(" a where rownum <= 10"); } else { assertThat(query.getGeneratedSql()).endsWith("order by t0.id limit 10"); } diff --git a/src/test/java/io/ebeaninternal/server/grammer/EqlParserTest.java b/src/test/java/io/ebeaninternal/server/grammer/EqlParserTest.java index ad13e69c8..d4c569262 100644 --- a/src/test/java/io/ebeaninternal/server/grammer/EqlParserTest.java +++ b/src/test/java/io/ebeaninternal/server/grammer/EqlParserTest.java @@ -340,7 +340,7 @@ public class EqlParserTest extends BaseTestCase { public void fetch_lazy50_asHint() throws Exception { ResetBasicData.reset(); - Query query = parse("fetch billingAddress (+lazy(50),city)"); + Query query = parse("fetch billingAddress (+lazy(50),city) order by id"); List list = query.findList(); assertThat(query.getGeneratedSql()).doesNotContain(", t1.city"); diff --git a/src/test/java/org/tests/basic/TestQueryForUpdate.java b/src/test/java/org/tests/basic/TestQueryForUpdate.java index 38bb46161..a35359c06 100644 --- a/src/test/java/org/tests/basic/TestQueryForUpdate.java +++ b/src/test/java/org/tests/basic/TestQueryForUpdate.java @@ -4,11 +4,10 @@ import io.ebean.AcquireLockException; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.EbeanServer; -import io.ebean.annotation.Platform; import io.ebean.Query; import io.ebean.Transaction; import io.ebean.annotation.ForPlatform; - +import io.ebean.annotation.Platform; import org.junit.Test; import org.tests.model.basic.Customer; import org.tests.model.basic.ResetBasicData; @@ -31,7 +30,6 @@ public class TestQueryForUpdate extends BaseTestCase { Query query = Ebean.find(Customer.class) .forUpdate() - .setMaxRows(1) .order().desc("id"); query.findList(); @@ -44,13 +42,41 @@ public class TestQueryForUpdate extends BaseTestCase { @Test @ForPlatform({ - Platform.H2, Platform.ORACLE, Platform.POSTGRES, Platform.SQLSERVER + Platform.H2, Platform.POSTGRES, Platform.SQLSERVER, Platform.ORACLE + }) + public void testForUpdate_noWait_noMaxRows() { + + ResetBasicData.reset(); + + Ebean.beginTransaction(); + + try { + Query query = Ebean.find(Customer.class) + .forUpdateNoWait() + .order().desc("id"); + + query.findList(); + if (isOracle()) { + assertThat(sqlOf(query)).contains("for update nowait"); + } else if (isSqlServer()) { + assertThat(sqlOf(query)).contains("with (updlock,nowait)"); + } else { + assertThat(sqlOf(query)).contains("for update nowait"); + } + + } finally { + Ebean.endTransaction(); + } + } + + @Test + @ForPlatform({ + Platform.H2, Platform.POSTGRES, Platform.SQLSERVER }) public void testForUpdate_noWait() { ResetBasicData.reset(); - EbeanServer server = Ebean.getDefaultServer(); Ebean.beginTransaction(); diff --git a/src/test/java/org/tests/family/TestInheritance.java b/src/test/java/org/tests/family/TestInheritance.java index 72dcb386e..3246d2d0c 100644 --- a/src/test/java/org/tests/family/TestInheritance.java +++ b/src/test/java/org/tests/family/TestInheritance.java @@ -1,16 +1,21 @@ package org.tests.family; import io.ebean.BaseTestCase; +import io.ebean.annotation.IgnorePlatform; +import io.ebean.annotation.Platform; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; +import org.junit.Test; import org.tests.model.basic.EBasic; import org.tests.model.family.ChildPerson; import org.tests.model.family.GrandParentPerson; import org.tests.model.family.ParentPerson; -import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; public class TestInheritance extends BaseTestCase { @@ -37,6 +42,7 @@ public class TestInheritance extends BaseTestCase { * +- parent3 Michael(60) * */ + @IgnorePlatform(Platform.ORACLE) @Test public void testInheritance() { // create some other beans diff --git a/src/test/java/org/tests/model/history/TestHistoryExclude.java b/src/test/java/org/tests/model/history/TestHistoryExclude.java index 21a045515..b7b11bbb3 100644 --- a/src/test/java/org/tests/model/history/TestHistoryExclude.java +++ b/src/test/java/org/tests/model/history/TestHistoryExclude.java @@ -2,6 +2,8 @@ package org.tests.model.history; import io.ebean.BaseTestCase; import io.ebean.Ebean; +import io.ebean.annotation.IgnorePlatform; +import io.ebean.annotation.Platform; import org.junit.Test; import java.sql.Timestamp; @@ -35,6 +37,7 @@ public class TestHistoryExclude extends BaseTestCase { linkFound.getDocs().size(); } + @IgnorePlatform(Platform.ORACLE) @Test public void testAsOfThenLazy() { diff --git a/src/test/java/org/tests/model/history/TestHistoryInclude.java b/src/test/java/org/tests/model/history/TestHistoryInclude.java index d747d5587..f556ad7d0 100644 --- a/src/test/java/org/tests/model/history/TestHistoryInclude.java +++ b/src/test/java/org/tests/model/history/TestHistoryInclude.java @@ -2,6 +2,8 @@ package org.tests.model.history; import io.ebean.BaseTestCase; import io.ebean.Ebean; +import io.ebean.annotation.IgnorePlatform; +import io.ebean.annotation.Platform; import org.junit.Test; import java.sql.Timestamp; @@ -35,6 +37,7 @@ public class TestHistoryInclude extends BaseTestCase { assertThat(linkFound.getDocs().size()).isEqualTo(2); } + @IgnorePlatform(Platform.ORACLE) @Test public void testAsOfThenLazy() { diff --git a/src/test/java/org/tests/model/m2o/TestManyToOneAsOne.java b/src/test/java/org/tests/model/m2o/TestManyToOneAsOne.java index d67223ccf..b7d1cc7b6 100644 --- a/src/test/java/org/tests/model/m2o/TestManyToOneAsOne.java +++ b/src/test/java/org/tests/model/m2o/TestManyToOneAsOne.java @@ -18,7 +18,7 @@ public class TestManyToOneAsOne extends BaseTestCase { @Transactional(batchSize = 20) @Test - @IgnorePlatform(Platform.SQLSERVER) // probably due the use of sequences - Empl has already an ID and Addr refers to it. + @IgnorePlatform({Platform.SQLSERVER, Platform.ORACLE}) // probably due the use of sequences - Empl has already an ID and Addr refers to it. public void test_when_jdbcBatch() { runInserts(); } diff --git a/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java b/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java index dc071c428..125c01373 100644 --- a/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java +++ b/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java @@ -3,15 +3,14 @@ package org.tests.query.other; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Query; - -import org.tests.model.basic.Contact; -import org.tests.model.basic.Customer; -import org.tests.model.basic.ResetBasicData; +import org.junit.Ignore; +import org.junit.Test; import org.tests.inherit.ChildA; import org.tests.inherit.Data; import org.tests.inherit.EUncle; -import org.junit.Ignore; -import org.junit.Test; +import org.tests.model.basic.Contact; +import org.tests.model.basic.Customer; +import org.tests.model.basic.ResetBasicData; import java.sql.Date; import java.util.List; @@ -169,6 +168,9 @@ public class TestQuerySingleAttribute extends BaseTestCase { List ids = query.findSingleAttributeList(); if (isSqlServer()) { assertThat(sqlOf(query)).contains("select distinct top 100 t0.id from o_customer t0"); + } else if (isOracle()) { + assertThat(sqlOf(query)).contains("from ( select distinct t0.id from o_customer t0"); + assertThat(sqlOf(query)).contains("where rownum <= 100"); } else { assertThat(sqlOf(query)).contains("select distinct t0.id from o_customer t0 limit 100"); } @@ -243,6 +245,8 @@ public class TestQuerySingleAttribute extends BaseTestCase { List ids = query.findSingleAttributeList(); if (isSqlServer()) { assertThat(sqlOf(query)).contains("select top 100 t0.id from o_customer t0"); + } else if (isOracle()) { + assertThat(sqlOf(query)).contains("where rownum <= 100"); } else { assertThat(sqlOf(query)).contains("select t0.id from o_customer t0 limit 100"); } diff --git a/src/test/java/org/tests/query/other/TestWhereAnnotation.java b/src/test/java/org/tests/query/other/TestWhereAnnotation.java index 7acdff642..c3ad40ce6 100644 --- a/src/test/java/org/tests/query/other/TestWhereAnnotation.java +++ b/src/test/java/org/tests/query/other/TestWhereAnnotation.java @@ -2,12 +2,12 @@ package org.tests.query.other; import io.ebean.BaseTestCase; import io.ebean.Ebean; -import org.tests.model.basic.Customer; -import org.tests.model.basic.Order; -import org.tests.model.basic.ResetBasicData; import org.ebeantest.LoggedSqlCollector; import org.junit.Assert; import org.junit.Test; +import org.tests.model.basic.Customer; +import org.tests.model.basic.Order; +import org.tests.model.basic.ResetBasicData; import java.util.List; @@ -44,6 +44,7 @@ public class TestWhereAnnotation extends BaseTestCase { LoggedSqlCollector.start(); List customers = Ebean.find(Customer.class) + .order().asc("id") .findList(); List orders = customers.get(0).getOrders(); diff --git a/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java b/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java index 1b3c49bc2..39d71a2d3 100644 --- a/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java +++ b/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java @@ -4,10 +4,10 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.SqlQuery; import io.ebean.SqlRow; -import org.tests.model.basic.Order; -import org.tests.model.basic.ResetBasicData; import org.ebeantest.LoggedSqlCollector; import org.junit.Test; +import org.tests.model.basic.Order; +import org.tests.model.basic.ResetBasicData; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -62,6 +62,8 @@ public class SqlQueryTests extends BaseTestCase { // explicit order is specified. In postgres this leads to strange scrolling // artifacts. assertThat(sql.get(0)).contains("order by 1 offset 3 rows fetch next 10 rows only"); + } else if (isOracle()) { + assertThat(sql.get(0)).contains("from o_order offset 3 rows fetch next 10 rows only"); } else { assertThat(sql.get(0)).contains("Select * from o_order limit 10 offset 3; --bind()"); } @@ -100,6 +102,8 @@ public class SqlQueryTests extends BaseTestCase { if (isSqlServer()) { assertThat(sql.get(0)).contains("Select * from o_order order by id offset 0 rows fetch next 10 rows only;"); + } else if (isOracle()) { + assertThat(sql.get(0)).contains("from o_order order by id fetch next 10 rows only;"); } else { assertThat(sql.get(0)).contains("Select * from o_order order by id limit 10"); } @@ -120,6 +124,8 @@ public class SqlQueryTests extends BaseTestCase { 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;"); + } else if (isOracle()) { + assertThat(sql.get(0)).contains("order by id fetch next 10 rows only"); } else { assertThat(sql.get(0)).contains("select * from o_order where o_order.id > ? order by id limit 10;"); } @@ -139,6 +145,8 @@ public class SqlQueryTests extends BaseTestCase { if (isSqlServer()) { assertThat(sql.get(0)).contains("offset 0 rows fetch next 10 rows only"); + } else if (isOracle()) { + assertThat(sql.get(0)).contains("fetch next 10 rows only"); } else { assertThat(sql.get(0)).contains("limit 10"); } diff --git a/src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java b/src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java index 03a64a71e..8023476b1 100644 --- a/src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java +++ b/src/test/java/org/tests/rawsql/TestRawSqlOrmQuery.java @@ -10,11 +10,11 @@ import io.ebean.RawSql; import io.ebean.RawSqlBuilder; import io.ebean.annotation.IgnorePlatform; import io.ebean.annotation.Platform; +import org.junit.Assert; +import org.junit.Test; import org.tests.model.basic.Customer; import org.tests.model.basic.Order; import org.tests.model.basic.ResetBasicData; -import org.junit.Assert; -import org.junit.Test; import java.util.List; import java.util.concurrent.ExecutionException; @@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class TestRawSqlOrmQuery extends BaseTestCase { + @IgnorePlatform(Platform.ORACLE) @Test public void testNamed() { @@ -168,11 +169,14 @@ public class TestRawSqlOrmQuery extends BaseTestCase { if (isSqlServer()) { assertThat(query.getGeneratedSql()).contains("top 100 "); assertThat(query.getGeneratedSql()).contains("order by o.ship_date desc, o.id"); + } else if (isOracle()) { + assertThat(query.getGeneratedSql()).contains("a where rownum <= 100 )"); } else { assertThat(query.getGeneratedSql()).contains("order by o.ship_date desc, o.id limit 100"); } } + @IgnorePlatform(Platform.ORACLE) @Test public void testPaging_when_setOrderBy_expect_id_appendToOrderBy() { @@ -227,6 +231,8 @@ public class TestRawSqlOrmQuery extends BaseTestCase { if (isSqlServer()) { assertThat(sqlOf(query)).contains("select top 100 "); assertThat(sqlOf(query)).contains("order by o.id desc"); + } else if (isOracle()) { + assertThat(sqlOf(query)).contains("a where rownum <= 100 )"); } else { assertThat(sqlOf(query)).contains("order by o.id desc limit 100"); } diff --git a/src/test/java/org/tests/rawsql/nativesql/TestNativeSqlBasic.java b/src/test/java/org/tests/rawsql/nativesql/TestNativeSqlBasic.java index 56bae88a6..77ceba129 100644 --- a/src/test/java/org/tests/rawsql/nativesql/TestNativeSqlBasic.java +++ b/src/test/java/org/tests/rawsql/nativesql/TestNativeSqlBasic.java @@ -7,6 +7,7 @@ import io.ebean.EbeanServer; import io.ebean.Query; import io.ebean.annotation.IgnorePlatform; import io.ebean.annotation.Platform; +import org.ebeantest.LoggedSqlCollector; import org.junit.Test; import org.tests.model.basic.Customer; import org.tests.model.basic.Order; @@ -107,8 +108,11 @@ public class TestNativeSqlBasic extends BaseTestCase { } } + /** + * Oracle does not support getTableName() via JDBC resultSet meta data + */ @Test - @IgnorePlatform(Platform.SQLSERVER) // does only work in 'cursor' mode! + @IgnorePlatform({Platform.SQLSERVER, Platform.ORACLE}) // does only work in 'cursor' mode! public void partialAssoc() { ResetBasicData.reset(); @@ -126,6 +130,36 @@ public class TestNativeSqlBasic extends BaseTestCase { } } + @Test + public void partialAssocIncludingOracle() { + + ResetBasicData.reset(); + + EbeanServer server = Ebean.getDefaultServer(); + + String nativeSql = "select o.id, o.status, o.kcustomer_id from o_order o"; + + List orders = server.findNative(Order.class, nativeSql) + .findList(); + + LoggedSqlCollector.start(); + + for (Order order : orders) { + order.getStatus(); + } + + List sql = LoggedSqlCollector.current(); + assertThat(sql).isEmpty(); + + for (Order order : orders) { + order.getCustomer().getName(); + } + + sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains(" from o_customer t0 where "); + } + @Test public void fetchQuery() {