From 33f0767f62250a8753c0d6e25c6e900eba74a3cf Mon Sep 17 00:00:00 2001 From: Will Dazey Date: Mon, 16 Jan 2023 10:37:42 -0600 Subject: [PATCH] Issue 1779: Add DB2zOS support for UNICODE Timestamps Signed-off-by: Will Dazey --- .../platform/database/DB2ZPlatform.java | 24 +++++++++++++++++-- .../query/TestQuerySyntaxFunctionTests.java | 2 +- .../TestStoredProceduresCursors.java | 2 +- .../jpa/test/version/TestVersioning.java | 4 +++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java index a701227ce44..aa345e98c7f 100644 --- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java +++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2015, 2022 Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2015, 2022 IBM Corporation. All rights reserved. + * Copyright (c) 2015, 2023 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2023 IBM Corporation. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -56,6 +56,7 @@ import org.eclipse.persistence.mappings.structures.ObjectRelationalDatabaseField; import org.eclipse.persistence.platform.database.converters.StructConverter; import org.eclipse.persistence.queries.StoredProcedureCall; +import org.eclipse.persistence.queries.ValueReadQuery; /** * Purpose: Provides DB2 z/OS specific behavior. @@ -112,6 +113,25 @@ public String getProcedureOptionList() { return " DISABLE DEBUG MODE "; } + /** + * INTERNAL: + * This method returns the query to select the timestamp from the server for + * DB2. + */ + @Override + public ValueReadQuery getTimestampQuery() { + if (timestampQuery == null) { + if (getUseNationalCharacterVaryingTypeForString()) { + timestampQuery = new ValueReadQuery(); + timestampQuery.setSQLString("SELECT CAST (CURRENT TIMESTAMP AS TIMESTAMP CCSID UNICODE) FROM SYSIBM.SYSDUMMY1"); + timestampQuery.setAllowNativeSQLQuery(true); + } else { + timestampQuery = super.getTimestampQuery(); + } + } + return timestampQuery; + } + /** * INTERNAL: * Initialize any platform-specific operators diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQuerySyntaxFunctionTests.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQuerySyntaxFunctionTests.java index 05f3a334a7d..a674fc4d5d1 100644 --- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQuerySyntaxFunctionTests.java +++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQuerySyntaxFunctionTests.java @@ -3191,7 +3191,7 @@ public void testLocate1_PartialBind() { query.getResultList(); Assert.assertEquals(1, _sql2.size()); if(platform.isDB2Z()) { - Assert.assertEquals("SELECT INTVAL1 FROM QUERYSYNTAXENTITY WHERE (INTVAL1 = LOCATE('HI', 'ABCDEFGHIJKLMNOP'))", _sql.remove(0)); + Assert.assertEquals("SELECT INTVAL1 FROM QUERYSYNTAXENTITY WHERE (INTVAL1 = LOCATE('HI', 'ABCDEFGHIJKLMNOP'))", _sql2.remove(0)); } else if(platform.isDB2() || platform.isDerby()) { Assert.assertEquals("SELECT INTVAL1 FROM QUERYSYNTAXENTITY WHERE (INTVAL1 = LOCATE('HI', 'ABCDEFGHIJKLMNOP'))", _sql2.remove(0)); } else if(platform.isOracle()) { diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/storedproc/TestStoredProceduresCursors.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/storedproc/TestStoredProceduresCursors.java index 13f230393c6..29f9153a16a 100644 --- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/storedproc/TestStoredProceduresCursors.java +++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/storedproc/TestStoredProceduresCursors.java @@ -156,7 +156,7 @@ private static boolean createCursorStoredProcedure(EntityManagerFactory emf) { if(platform.isOracle()) { proc.addOutputArgument("out_cursor_one", "SYS_REFCURSOR"); proc.addStatement("OPEN out_cursor_one FOR SELECT ITEM_STRING1 FROM STORED_PROCEDURE_ENTITY WHERE ITEM_INTEGER1 = in_param_one"); - } else if (platform.isDB2()) { + } else if (platform.isDB2() && !platform.isDB2Z()) { proc.addOutputArgument("out_cursor_one", "CURSOR"); proc.addStatement("SET out_cursor_one = CURSOR FOR SELECT ITEM_STRING1 FROM STORED_PROCEDURE_ENTITY WHERE ITEM_INTEGER1 = in_param_one; OPEN out_cursor_one"); } else { diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/version/TestVersioning.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/version/TestVersioning.java index d53bd319f22..2e48287c4b4 100644 --- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/version/TestVersioning.java +++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/version/TestVersioning.java @@ -38,7 +38,9 @@ public class TestVersioning { @Emf(createTables = DDLGen.DROP_CREATE, classes = { TemporalVersionedEntity.class, TemporalVersionedEntity2.class, IntegerVersionedEntity.class}, properties = { @Property(name="eclipselink.logging.level", value="FINE"), - @Property(name="eclipselink.logging.parameters", value="true")}) + @Property(name="eclipselink.logging.parameters", value="true"), + @Property(name = "eclipselink.target-database-properties", + value = "UseNationalCharacterVaryingTypeForString=true")}) private EntityManagerFactory emf; private final static String qStr1 = "UPDATE TemporalVersionedEntity " +