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