Bug 579327: Test bug on Derby & DB2z
Signed-off-by: Will Dazey <dazeydev.3@gmail.com>
diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQueryIsNull.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQueryIsNull.java
index f0eea2a..794cea2 100644
--- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQueryIsNull.java
+++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQueryIsNull.java
@@ -25,12 +25,15 @@
import jakarta.persistence.criteria.ParameterExpression;
import jakarta.persistence.criteria.Root;
+import org.eclipse.persistence.internal.databaseaccess.Platform;
+import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;
import org.eclipse.persistence.jpa.test.framework.DDLGen;
import org.eclipse.persistence.jpa.test.framework.Emf;
import org.eclipse.persistence.jpa.test.framework.EmfRunner;
import org.eclipse.persistence.jpa.test.framework.Property;
import org.eclipse.persistence.jpa.test.query.model.EntityTbl01;
import org.eclipse.persistence.jpa.test.query.model.EntityTbl01_;
+import org.eclipse.persistence.platform.database.DatabasePlatform;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -97,6 +100,67 @@
}
@Test
+ public void testQueryIsNullLiterals2() {
+ if (emf == null)
+ return;
+
+ if(!POPULATED)
+ populate();
+
+ Platform platform = getPlatform(emf);
+ EntityManager em = emf.createEntityManager();
+
+ // DB2 on z and Derby does not support null literal values in 'IS NULL' function
+ // ie. "... WHERE (NULL IS NULL)"
+ if(platform.isDB2Z() || platform.isDerby()) {
+ return;
+ }
+
+ try {
+ TypedQuery<String> query = em.createQuery(""
+ + "SELECT t.itemString1 FROM EntityTbl01 t "
+ + "WHERE NULL IS NULL", String.class);
+
+ List<String> dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(4, dto01.size());
+
+ // equivalent CriteriaBuilder
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery<String> cquery = cb.createQuery(String.class);
+ Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
+ cquery.multiselect(root.get(EntityTbl01_.itemString1));
+
+ cquery.where(cb.isNull(cb.nullLiteral(String.class)));
+
+ query = em.createQuery(cquery);
+ dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(4, dto01.size());
+
+ // equivalent, alternative CriteriaBuilder
+ CriteriaBuilder cb2 = em.getCriteriaBuilder();
+ CriteriaQuery<String> cquery2 = cb2.createQuery(String.class);
+ Root<EntityTbl01> root2 = cquery2.from(EntityTbl01.class);
+ cquery2.multiselect(root2.get(EntityTbl01_.itemString1));
+
+ cquery2.where(cb2.nullLiteral(String.class).isNull());
+
+ query = em.createQuery(cquery2);
+ dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(4, dto01.size());
+ } finally {
+ if (em.getTransaction().isActive()) {
+ em.getTransaction().rollback();
+ }
+ if(em.isOpen()) {
+ em.close();
+ }
+ }
+ }
+
+ @Test
public void testQueryIsNotNullLiterals1() {
if (emf == null)
return;
@@ -151,6 +215,67 @@
}
@Test
+ public void testQueryIsNotNullLiterals2() {
+ if (emf == null)
+ return;
+
+ if(!POPULATED)
+ populate();
+
+ Platform platform = getPlatform(emf);
+ EntityManager em = emf.createEntityManager();
+
+ // DB2 on z and Derby does not support null literal values in 'IS NOT NULL' function
+ // ie. "... WHERE (NULL IS NOT NULL)"
+ if(platform.isDB2Z() || platform.isDerby()) {
+ return;
+ }
+
+ try {
+ TypedQuery<String> query = em.createQuery(""
+ + "SELECT t.itemString1 FROM EntityTbl01 t "
+ + "WHERE NULL IS NOT NULL", String.class);
+
+ List<String> dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(0, dto01.size());
+
+ // equivalent CriteriaBuilder
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery<String> cquery = cb.createQuery(String.class);
+ Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
+ cquery.multiselect(root.get(EntityTbl01_.itemString1));
+
+ cquery.where(cb.isNotNull(cb.nullLiteral(String.class)));
+
+ query = em.createQuery(cquery);
+ dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(0, dto01.size());
+
+ // equivalent, alternative CriteriaBuilder
+ CriteriaBuilder cb2 = em.getCriteriaBuilder();
+ CriteriaQuery<String> cquery2 = cb2.createQuery(String.class);
+ Root<EntityTbl01> root2 = cquery2.from(EntityTbl01.class);
+ cquery2.multiselect(root2.get(EntityTbl01_.itemString1));
+
+ cquery2.where(cb2.nullLiteral(String.class).isNotNull());
+
+ query = em.createQuery(cquery2);
+ dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(0, dto01.size());
+ } finally {
+ if (em.getTransaction().isActive()) {
+ em.getTransaction().rollback();
+ }
+ if(em.isOpen()) {
+ em.close();
+ }
+ }
+ }
+
+ @Test
public void testQueryIsNullParameters1() {
if (emf == null)
return;
@@ -164,6 +289,72 @@
TypedQuery<String> query = em.createQuery(""
+ "SELECT t.itemString1 FROM EntityTbl01 t "
+ "WHERE ?1 IS NULL", String.class);
+ query.setParameter(1, "HELLO");
+
+ List<String> dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(0, dto01.size());
+
+ // equivalent CriteriaBuilder
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery<String> cquery = cb.createQuery(String.class);
+ Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
+ cquery.multiselect(root.get(EntityTbl01_.itemString1));
+
+ ParameterExpression<String> strParam1 = cb.parameter(String.class);
+ cquery.where(cb.isNull(strParam1));
+
+ query = em.createQuery(cquery);
+ query.setParameter(strParam1, "HELLO");
+ dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(0, dto01.size());
+
+ // equivalent, alternative CriteriaBuilder
+ CriteriaBuilder cb2 = em.getCriteriaBuilder();
+ CriteriaQuery<String> cquery2 = cb2.createQuery(String.class);
+ Root<EntityTbl01> root2 = cquery2.from(EntityTbl01.class);
+ cquery2.multiselect(root2.get(EntityTbl01_.itemString1));
+
+ ParameterExpression<String> strParam2 = cb.parameter(String.class);
+ cquery2.where(strParam2.isNull());
+
+ query = em.createQuery(cquery2);
+ query.setParameter(strParam2, "HELLO");
+ dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(0, dto01.size());
+ } finally {
+ if (em.getTransaction().isActive()) {
+ em.getTransaction().rollback();
+ }
+ if(em.isOpen()) {
+ em.close();
+ }
+ }
+ }
+
+ @Test
+ public void testQueryIsNullParameters2() {
+ if (emf == null)
+ return;
+
+ if(!POPULATED)
+ populate();
+
+ Platform platform = getPlatform(emf);
+ EntityManager em = emf.createEntityManager();
+
+ // DB2 on z and Derby does not support null literal values in 'IS NULL' function
+ // ie. "... WHERE (NULL IS NULL)"
+ if(platform.isDB2Z() || platform.isDerby()) {
+ return;
+ }
+
+ try {
+ TypedQuery<String> query = em.createQuery(""
+ + "SELECT t.itemString1 FROM EntityTbl01 t "
+ + "WHERE ?1 IS NULL", String.class);
query.setParameter(1, null);
List<String> dto01 = query.getResultList();
@@ -223,6 +414,72 @@
TypedQuery<String> query = em.createQuery(""
+ "SELECT t.itemString1 FROM EntityTbl01 t "
+ "WHERE ?1 IS NOT NULL", String.class);
+ query.setParameter(1, "HELLO");
+
+ List<String> dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(4, dto01.size());
+
+ // equivalent CriteriaBuilder
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery<String> cquery = cb.createQuery(String.class);
+ Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
+ cquery.multiselect(root.get(EntityTbl01_.itemString1));
+
+ ParameterExpression<String> strParam1 = cb.parameter(String.class);
+ cquery.where(cb.isNotNull(strParam1));
+
+ query = em.createQuery(cquery);
+ query.setParameter(strParam1, "HELLO");
+ dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(4, dto01.size());
+
+ // equivalent, alternative CriteriaBuilder
+ CriteriaBuilder cb2 = em.getCriteriaBuilder();
+ CriteriaQuery<String> cquery2 = cb2.createQuery(String.class);
+ Root<EntityTbl01> root2 = cquery2.from(EntityTbl01.class);
+ cquery2.multiselect(root2.get(EntityTbl01_.itemString1));
+
+ ParameterExpression<String> strParam2 = cb.parameter(String.class);
+ cquery2.where(strParam2.isNotNull());
+
+ query = em.createQuery(cquery2);
+ query.setParameter(strParam2, "HELLO");
+ dto01 = query.getResultList();
+ assertNotNull(dto01);
+ assertEquals(4, dto01.size());
+ } finally {
+ if (em.getTransaction().isActive()) {
+ em.getTransaction().rollback();
+ }
+ if(em.isOpen()) {
+ em.close();
+ }
+ }
+ }
+
+ @Test
+ public void testQueryIsNotNullParameters2() {
+ if (emf == null)
+ return;
+
+ if(!POPULATED)
+ populate();
+
+ Platform platform = getPlatform(emf);
+ EntityManager em = emf.createEntityManager();
+
+ // DB2 on z and Derby does not support null literal values in 'IS NOT NULL' function
+ // ie. "... WHERE (NULL IS NOT NULL)"
+ if(platform.isDB2Z() || platform.isDerby()) {
+ return;
+ }
+
+ try {
+ TypedQuery<String> query = em.createQuery(""
+ + "SELECT t.itemString1 FROM EntityTbl01 t "
+ + "WHERE ?1 IS NOT NULL", String.class);
query.setParameter(1, null);
List<String> dto01 = query.getResultList();
@@ -318,4 +575,8 @@
}
}
}
+
+ private DatabasePlatform getPlatform(EntityManagerFactory emf) {
+ return ((EntityManagerFactoryImpl)emf).getServerSession().getPlatform();
+ }
}
\ No newline at end of file