Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,18 @@
import java.sql.Struct;
import java.sql.Timestamp;
import java.sql.Types;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Random;
import java.util.TimeZone;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("disable_tpc")
public class ITJdbcTimestampPicosTest extends ITBase {

private static final Random RANDOM = new Random();
Expand All @@ -62,6 +67,9 @@ public class ITJdbcTimestampPicosTest extends ITBase {
private static final String TIMESTAMP_BOUNDARY_STANDARD = "2025-06-15 10:20:30.999999";
private static final String TIMESTAMP_BOUNDARY_PICOS = "2025-06-15 10:20:30.999999999999";

private static final DateTimeFormatter JVM_ZONE_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");

private static final String DDL_CREATE_PICOS_TABLE =
"CREATE OR REPLACE TABLE `%1$s.%2$s.%3$s` (\n"
+ " id INT64,\n"
Expand Down Expand Up @@ -157,6 +165,18 @@ private static String getPicosConnectionUrl(boolean picosEnabled, boolean arrowE
+ (arrowEnabled ? ITBase.FORCE_READ_API_PROPERTIES : "EnableHighThroughputAPI=0;");
}

/**
* Renders a UTC wall-clock literal in the JVM default time zone, with the fixed microsecond
* precision that {@code getString} applies to a plain {@code TIMESTAMP} column. Those values are
* zone dependent, whereas {@code TIMESTAMP(12)} values are returned as verbatim UTC strings.
*/
private static String atJvmZone(String utcLiteral) {
return LocalDateTime.parse(utcLiteral.replace(' ', 'T'))
.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(ZoneId.systemDefault())
.format(JVM_ZONE_FORMATTER);
}
Comment thread
keshavdandeva marked this conversation as resolved.

@Test
public void testDefaultBehavior_picosDisabled_returnsMicrosecondsAndTimestampType()
throws SQLException {
Expand All @@ -171,9 +191,9 @@ public void testDefaultBehavior_picosDisabled_returnsMicrosecondsAndTimestampTyp
ResultSet rs = stmt.executeQuery(query)) {

assertTrue(rs.next());
assertEquals(TIMESTAMP_MODERN_STANDARD, rs.getString("ts_standard"));
assertEquals(atJvmZone(TIMESTAMP_MODERN_STANDARD), rs.getString("ts_standard"));
// When EnableTimestampPicos is false, picosecond columns truncate to 6 digits
assertEquals(TIMESTAMP_MODERN_STANDARD, rs.getString("ts_picos"));
assertEquals(atJvmZone(TIMESTAMP_MODERN_STANDARD), rs.getString("ts_picos"));

Object obj = rs.getObject("ts_picos");
assertTrue(obj instanceof Timestamp, "getObject must return java.sql.Timestamp by default");
Expand Down Expand Up @@ -209,7 +229,7 @@ public void testPicosecondsEnabled_arrowPath_preserves12Digits() throws SQLExcep
// Row 1: Modern timestamp
assertTrue(rs.next());
assertEquals(1, rs.getInt("id"));
assertEquals(TIMESTAMP_MODERN_STANDARD, rs.getString("ts_standard"));
assertEquals(atJvmZone(TIMESTAMP_MODERN_STANDARD), rs.getString("ts_standard"));
assertEquals(TIMESTAMP_MODERN_PICOS, rs.getString("ts_picos"));
Object obj1 = rs.getObject("ts_picos");
assertTrue(obj1 instanceof String, "getObject must return String for TIMESTAMP(12)");
Expand Down Expand Up @@ -250,7 +270,7 @@ public void testPicosecondsEnabled_restJsonPath_preserves12Digits() throws SQLEx
// Row 1
assertTrue(rs.next());
assertEquals(1, rs.getInt("id"));
assertEquals(TIMESTAMP_MODERN_STANDARD, rs.getString("ts_standard"));
assertEquals(atJvmZone(TIMESTAMP_MODERN_STANDARD), rs.getString("ts_standard"));
assertEquals(TIMESTAMP_MODERN_PICOS, rs.getString("ts_picos"));
assertEquals(TIMESTAMP_MODERN_PICOS, rs.getObject("ts_picos"));

Expand Down
Loading