Created
June 16, 2021 00:28
-
-
Save camsaul/a7f2b7b40286f15b2c7a9bb3b1e36189 to your computer and use it in GitHub Desktop.
Testing Presto JDBC Timezone Support
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defn- unwrap-connection ^PrestoConnection [^C3P0ProxyConnection conn] | |
(.unwrap conn PrestoConnection)) | |
(defn set-timezone! [conn ^String zone-id] | |
(.setTimeZoneId (unwrap-connection conn) zone-id)) | |
(defn get-timestamp-utc [^com.facebook.presto.jdbc.PrestoResultSet rset ^Integer index] | |
(let [method (doto (.getDeclaredMethod com.facebook.presto.jdbc.PrestoResultSet | |
"getTimestamp" | |
(into-array Class [Integer/TYPE com.facebook.presto.jdbc.internal.joda.time.DateTimeZone])) | |
(.setAccessible true)) | |
zone (com.facebook.presto.jdbc.internal.joda.time.DateTimeZone/UTC)] | |
(.invoke method rset (object-array [(int index) zone])))) | |
(defn x [] | |
(into {} (for [timezone ["UTC" "US/Pacific"]] | |
[timezone | |
(with-open [conn (doto (java.sql.DriverManager/getConnection "jdbc:presto://localhost:8080/test_data/default?user=metabase") | |
(set-timezone! timezone)) | |
stmt (.prepareStatement conn (str "SELECT" | |
" TIMESTAMP '2021-06-15 06:54:00.000 America/Los_Angeles' AS tz," | |
" TIMESTAMP '2021-06-15 06:54:00.000' AS no_tz")) | |
rset (.executeQuery stmt)] | |
(let [session-timezone (.getTimeZoneId (unwrap-connection conn))] | |
(assert (= session-timezone timezone)) | |
(when (.next rset) | |
{:tz {:default (.getObject rset 1) | |
:java-sql-timestamp (.getTimestamp rset 1) | |
:java-sql-timestamp-utc (get-timestamp-utc rset 1) | |
:string (.getString rset 1) | |
:parsed (some-> (.getString rset 1) u.date/parse)} | |
:no-tz {:default (.getObject rset 2) | |
:java-sql-timestamp (.getTimestamp rset 2) | |
:java-sql-timestamp-utc (get-timestamp-utc rset 2) | |
:string (.getString rset 2) | |
:parsed (some-> (.getString rset 2) u.date/parse) | |
:parsed-in-session-zone (some-> (.getString rset 2) | |
u.date/parse | |
(u.date/with-time-zone-same-instant session-timezone))}})))]))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment