Skip to content

Instantly share code, notes, and snippets.

@camsaul
Created June 16, 2021 00:28
Show Gist options
  • Save camsaul/a7f2b7b40286f15b2c7a9bb3b1e36189 to your computer and use it in GitHub Desktop.
Save camsaul/a7f2b7b40286f15b2c7a9bb3b1e36189 to your computer and use it in GitHub Desktop.
Testing Presto JDBC Timezone Support
(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