diff --git a/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixClient.java b/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixClient.java index 3c97310c9f7f..7787c1d2a569 100644 --- a/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixClient.java +++ b/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixClient.java @@ -84,12 +84,12 @@ import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.TableProperty; import org.apache.phoenix.schema.types.PDataType; +import org.apache.phoenix.schema.types.PhoenixArray; import org.apache.phoenix.util.SchemaUtil; import javax.inject.Inject; import java.io.IOException; -import java.sql.Array; import java.sql.Connection; import java.sql.JDBCType; import java.sql.PreparedStatement; @@ -762,8 +762,15 @@ private static ObjectReadFunction arrayReadFunction(ConnectorSession session, Ty private static ObjectWriteFunction arrayWriteFunction(ConnectorSession session, Type elementType, String elementJdbcTypeName) { return ObjectWriteFunction.of(Block.class, (statement, index, block) -> { - Array jdbcArray = statement.getConnection().createArrayOf(elementJdbcTypeName, getJdbcObjectArray(session, elementType, block)); - statement.setArray(index, jdbcArray); + Object[] jdbcObjectArray = getJdbcObjectArray(session, elementType, block); + PhoenixArray phoenixArray = (PhoenixArray) statement.getConnection().createArrayOf(elementJdbcTypeName, jdbcObjectArray); + for (int i = 0; i < jdbcObjectArray.length; i++) { + if (jdbcObjectArray[i] == null && phoenixArray.getElement(i) != null) { + // TODO (https://github.com/trinodb/trino/issues/6421) Prevent writing incorrect results due to Phoenix JDBC driver bug + throw new TrinoException(PHOENIX_QUERY_ERROR, format("Phoenix JDBC driver replaced 'null' with '%s' at index %s in %s", phoenixArray.getElement(i), i + 1, phoenixArray)); + } + } + statement.setArray(index, phoenixArray); }); } diff --git a/plugin/trino-phoenix/src/test/java/io/trino/plugin/phoenix/TestPhoenixConnectorTest.java b/plugin/trino-phoenix/src/test/java/io/trino/plugin/phoenix/TestPhoenixConnectorTest.java index 5dc2c7184dc0..8beebcba0f55 100644 --- a/plugin/trino-phoenix/src/test/java/io/trino/plugin/phoenix/TestPhoenixConnectorTest.java +++ b/plugin/trino-phoenix/src/test/java/io/trino/plugin/phoenix/TestPhoenixConnectorTest.java @@ -158,10 +158,7 @@ public void testInsertArray() { assertThatThrownBy(super::testInsertArray) // TODO (https://github.com/trinodb/trino/issues/6421) array with double null stored as array with 0 - .hasMessageContaining("Actual rows (up to 100 of 1 extra rows shown, 2 rows in total):\n" + - " [0.0, null]\n" + - "Expected rows (up to 100 of 1 missing rows shown, 2 rows in total):\n" + - " [null, null]"); + .hasMessage("Phoenix JDBC driver replaced 'null' with '0.0' at index 1 in [0.0]"); } @Override diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java index b6ff2f589e29..5b6e19f982e9 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java @@ -85,12 +85,12 @@ import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.TableProperty; import org.apache.phoenix.schema.types.PDataType; +import org.apache.phoenix.schema.types.PhoenixArray; import org.apache.phoenix.util.SchemaUtil; import javax.inject.Inject; import java.io.IOException; -import java.sql.Array; import java.sql.Connection; import java.sql.JDBCType; import java.sql.PreparedStatement; @@ -754,8 +754,15 @@ private static ObjectReadFunction arrayReadFunction(ConnectorSession session, Ty private static ObjectWriteFunction arrayWriteFunction(ConnectorSession session, Type elementType, String elementJdbcTypeName) { return ObjectWriteFunction.of(Block.class, (statement, index, block) -> { - Array jdbcArray = statement.getConnection().createArrayOf(elementJdbcTypeName, getJdbcObjectArray(session, elementType, block)); - statement.setArray(index, jdbcArray); + Object[] jdbcObjectArray = getJdbcObjectArray(session, elementType, block); + PhoenixArray phoenixArray = (PhoenixArray) statement.getConnection().createArrayOf(elementJdbcTypeName, jdbcObjectArray); + for (int i = 0; i < jdbcObjectArray.length; i++) { + if (jdbcObjectArray[i] == null && phoenixArray.getElement(i) != null) { + // TODO (https://github.com/trinodb/trino/issues/6421) Prevent writing incorrect results due to Phoenix JDBC driver bug + throw new TrinoException(PHOENIX_QUERY_ERROR, format("Phoenix JDBC driver replaced 'null' with '%s' at index %s in %s", phoenixArray.getElement(i), i + 1, phoenixArray)); + } + } + statement.setArray(index, phoenixArray); }); } diff --git a/plugin/trino-phoenix5/src/test/java/io/trino/plugin/phoenix5/TestPhoenixConnectorTest.java b/plugin/trino-phoenix5/src/test/java/io/trino/plugin/phoenix5/TestPhoenixConnectorTest.java index 1840e546c448..d365a081ec8b 100644 --- a/plugin/trino-phoenix5/src/test/java/io/trino/plugin/phoenix5/TestPhoenixConnectorTest.java +++ b/plugin/trino-phoenix5/src/test/java/io/trino/plugin/phoenix5/TestPhoenixConnectorTest.java @@ -176,10 +176,7 @@ public void testInsertArray() { assertThatThrownBy(super::testInsertArray) // TODO (https://github.com/trinodb/trino/issues/6421) array with double null stored as array with 0 - .hasMessageContaining("Actual rows (up to 100 of 1 extra rows shown, 2 rows in total):\n" + - " [0.0, null]\n" + - "Expected rows (up to 100 of 1 missing rows shown, 2 rows in total):\n" + - " [null, null]"); + .hasMessage("Phoenix JDBC driver replaced 'null' with '0.0' at index 1 in [0.0]"); } @Override