diff --git a/src/test/java/oracle/r2dbc/impl/OracleStatementImplTest.java b/src/test/java/oracle/r2dbc/impl/OracleStatementImplTest.java index e6dfe1c..eac9a04 100644 --- a/src/test/java/oracle/r2dbc/impl/OracleStatementImplTest.java +++ b/src/test/java/oracle/r2dbc/impl/OracleStatementImplTest.java @@ -36,6 +36,7 @@ import oracle.r2dbc.OracleR2dbcTypes; import oracle.r2dbc.OracleR2dbcWarning; import oracle.r2dbc.test.DatabaseConfig; +import oracle.r2dbc.test.TestUtils; import oracle.sql.json.OracleJsonFactory; import oracle.sql.json.OracleJsonObject; import org.junit.jupiter.api.Test; @@ -3092,6 +3093,78 @@ public void testReturnParameterJsonDualityView() { } } + /** + * Verifies inserts and queries with a JSON Duality View. + */ + @Test + public void testJsonDualityView() { + // JSON Duality Views were introduced in Oracle Database version 23c, so + // this test is skipped if the version is older than 23c. + assumeTrue(databaseVersion() >= 23, + "JSON Duality Views are not supported by database versions older than" + + " 23"); + + Connection connection = awaitOne(sharedConnection()); + try { + awaitExecution(connection.createStatement( + "CREATE TABLE testJsonDualityViewTable (" + + "id NUMBER PRIMARY KEY, value VARCHAR(1000))")); + awaitExecution(connection.createStatement( + "CREATE JSON DUALITY VIEW testJsonDualityView AS" + + " SELECT JSON {'id' : t.id, 'value' : t.value}" + + " FROM testJsonDualityViewTable t" + + " WITH INSERT UPDATE DELETE")); + + // Verify an insert + OracleJsonObject insertObject = new OracleJsonFactory().createObject(); + insertObject.put("id", 1); + insertObject.put("value", "a"); + Statement insert = connection.createStatement( + "INSERT INTO testJsonDualityView VALUES (?)") + .bind(0, insertObject); + awaitUpdate(1, insert); + + // Verify a query + Statement query = connection.createStatement( + "SELECT data FROM testJsonDualityView"); + Result queryResult = awaitOne(query.execute()); + OracleJsonObject queryObject = + awaitOne(queryResult.map(row -> row.get(0, OracleJsonObject.class))); + queryObject = + new OracleJsonFactory().createObject(queryObject); + queryObject.remove("_metadata"); // Remove this field for assertEquals + assertEquals(insertObject, queryObject); + + // Verify an update that returns generated keys + OracleJsonObject updateObject = new OracleJsonFactory().createObject(); + updateObject.put("id", 1); + updateObject.put("value", "b"); + Statement update = connection.createStatement( + "UPDATE testJsonDualityView v" + + " SET data = ?" + + " WHERE v.data.id = ?"); + update.bind(0, updateObject); + update.bind(1, 1); + update.returnGeneratedValues("data"); + Result updateResult = awaitOne(update.execute()); + OracleJsonObject generatedUpdateObject = + awaitOne(updateResult.map(row -> row.get(0, OracleJsonObject.class))); + generatedUpdateObject = + new OracleJsonFactory().createObject(generatedUpdateObject); + generatedUpdateObject.remove("_metadata"); // Remove this field for assertEquals + assertEquals(updateObject, generatedUpdateObject); + + } + finally { + tryAwaitExecution(connection.createStatement( + "DROP VIEW testJsonDualityView")); + tryAwaitExecution(connection.createStatement( + "DROP TABLE testJsonDualityViewTable")); + tryAwaitNone(connection.close()); + } + + } + /** * Connect to the database configured by {@link DatabaseConfig}, with a * the connection configured to use a given {@code executor} for async