diff --git a/client/trino-jdbc/src/main/java/io/trino/jdbc/ConnectionProperties.java b/client/trino-jdbc/src/main/java/io/trino/jdbc/ConnectionProperties.java index c3db9662374b..243523e425a9 100644 --- a/client/trino-jdbc/src/main/java/io/trino/jdbc/ConnectionProperties.java +++ b/client/trino-jdbc/src/main/java/io/trino/jdbc/ConnectionProperties.java @@ -71,6 +71,7 @@ enum SslVerificationMode public static final ConnectionProperty KERBEROS_KEYTAB_PATH = new KerberosKeytabPath(); public static final ConnectionProperty KERBEROS_CREDENTIAL_CACHE_PATH = new KerberosCredentialCachePath(); public static final ConnectionProperty ACCESS_TOKEN = new AccessToken(); + public static final ConnectionProperty TIMEZONE_ID = new TimeZoneID(); public static final ConnectionProperty EXTERNAL_AUTHENTICATION = new ExternalAuthentication(); public static final ConnectionProperty EXTERNAL_AUTHENTICATION_TIMEOUT = new ExternalAuthenticationTimeout(); public static final ConnectionProperty> EXTRA_CREDENTIALS = new ExtraCredentials(); @@ -105,6 +106,7 @@ enum SslVerificationMode .add(KERBEROS_KEYTAB_PATH) .add(KERBEROS_CREDENTIAL_CACHE_PATH) .add(ACCESS_TOKEN) + .add(TIMEZONE_ID) .add(EXTRA_CREDENTIALS) .add(CLIENT_INFO) .add(CLIENT_TAGS) @@ -440,6 +442,15 @@ public AccessToken() } } + private static class TimeZoneID + extends AbstractConnectionProperty + { + public TimeZoneID() + { + super("TimeZoneID", NOT_REQUIRED, ALLOWED, STRING_CONVERTER); + } + } + private static class ExternalAuthentication extends AbstractConnectionProperty { diff --git a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoConnection.java b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoConnection.java index 81c2b8cc148a..47126f5622a5 100644 --- a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoConnection.java +++ b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoConnection.java @@ -121,7 +121,8 @@ public class TrinoConnection uri.getTraceToken().ifPresent(tags -> clientInfo.put(TRACE_TOKEN, tags)); roles.putAll(uri.getRoles()); - timeZoneId.set(ZoneId.systemDefault()); + timeZoneId.set(uri.getTimeZoneID().isPresent() ? + ZoneId.of(uri.getTimeZoneID().get()) : ZoneId.systemDefault()); locale.set(Locale.getDefault()); sessionProperties.putAll(uri.getSessionProperties()); } diff --git a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDriverUri.java b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDriverUri.java index af837da905d2..108cc0982c6e 100644 --- a/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDriverUri.java +++ b/client/trino-jdbc/src/main/java/io/trino/jdbc/TrinoDriverUri.java @@ -32,6 +32,7 @@ import java.net.URISyntaxException; import java.sql.SQLException; import java.time.Duration; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -84,6 +85,7 @@ import static io.trino.jdbc.ConnectionProperties.SslVerificationMode.CA; import static io.trino.jdbc.ConnectionProperties.SslVerificationMode.FULL; import static io.trino.jdbc.ConnectionProperties.SslVerificationMode.NONE; +import static io.trino.jdbc.ConnectionProperties.TIMEZONE_ID; import static io.trino.jdbc.ConnectionProperties.TRACE_TOKEN; import static io.trino.jdbc.ConnectionProperties.USER; import static java.lang.String.format; @@ -193,6 +195,21 @@ public Properties getProperties() return properties; } + public Optional getTimeZoneID() + throws SQLException + { + Optional tzId = TIMEZONE_ID.getValue(properties); + + if (tzId.isPresent()) { + List ids = Arrays.asList(java.util.TimeZone.getAvailableIDs()); + if (ids.contains(tzId.get())) { + return tzId; + } + throw new SQLException("Specified TimeZoneID is not supported"); + } + return tzId; + } + public Map getExtraCredentials() throws SQLException {