diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcRecordCursor.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcRecordCursor.java index cd184f676bba..6710951fe93a 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcRecordCursor.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcRecordCursor.java @@ -32,6 +32,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicLong; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; @@ -57,6 +58,7 @@ public class JdbcRecordCursor private final JdbcClient jdbcClient; private final Connection connection; private final PreparedStatement statement; + private final AtomicLong readTimeNanos = new AtomicLong(0); @Nullable private ResultSet resultSet; private boolean closed; @@ -117,7 +119,7 @@ else if (javaType == Slice.class) { @Override public long getReadTimeNanos() { - return 0; + return readTimeNanos.get(); } @Override @@ -141,6 +143,7 @@ public boolean advanceNextPosition() try { if (resultSet == null) { + long start = System.nanoTime(); Future resultSetFuture = executor.submit(() -> { log.debug("Executing: %s", statement); return statement.executeQuery(); @@ -166,6 +169,9 @@ public boolean advanceNextPosition() resultSetFuture.cancel(true); throw new RuntimeException(e); } + finally { + readTimeNanos.addAndGet(System.nanoTime() - start); + } } return resultSet.next(); } diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/BaseJdbcConnectorTest.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/BaseJdbcConnectorTest.java index 51080e7efe83..e0ae3144af99 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/BaseJdbcConnectorTest.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/BaseJdbcConnectorTest.java @@ -1273,6 +1273,14 @@ public void testJoinPushdown() } } + @Test + public void testExplainAnalyzePhysicalReadWallTime() + { + assertExplainAnalyze( + "EXPLAIN ANALYZE VERBOSE SELECT * FROM nation a", + "'Physical input read time' = \\{duration=.*}"); + } + protected QueryAssert assertConditionallyPushedDown( Session session, @Language("SQL") String query, diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcRecordSet.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcRecordSet.java index 9154b8cabe46..6988983d5491 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcRecordSet.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcRecordSet.java @@ -35,6 +35,7 @@ import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.spi.type.VarcharType.createVarcharType; import static io.trino.testing.TestingConnectorSession.SESSION; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; @@ -122,6 +123,8 @@ public void testCursorSimple() .put("eleven", 11L) .put("twelve", 12L) .buildOrThrow()); + + assertThat(cursor.getReadTimeNanos()).isGreaterThan(0); } } @@ -152,6 +155,8 @@ public void testCursorMixedOrder() .put("eleven", 11L) .put("twelve", 12L) .buildOrThrow()); + + assertThat(cursor.getReadTimeNanos()).isGreaterThan(0); } }