|
19 | 19 | [metabase.util |
20 | 20 | [honeysql-extensions :as hx] |
21 | 21 | [ssh :as ssh]]) |
22 | | - (:import [java.sql DatabaseMetaData ResultSet])) |
| 22 | + (:import [java.sql DatabaseMetaData ResultSet ResultSetMetaData Time Types] |
| 23 | + [java.time LocalDate LocalDateTime LocalTime OffsetDateTime OffsetTime ZonedDateTime])) |
23 | 24 |
|
24 | 25 | (driver/register! :teradata, :parent :sql-jdbc) |
25 | 26 |
|
|
60 | 61 | :SMALLINT :type/Integer |
61 | 62 | :SMALLSERIAL :type/Integer |
62 | 63 | :TIME :type/Time |
63 | | - :TIMETZ :type/Time |
| 64 | + (keyword "TIME WITH TIME ZONE") :type/Time |
64 | 65 | :TIMESTAMP :type/DateTime |
65 | | - :TIMESTAMPTZ :type/DateTime |
66 | 66 | (keyword "TIMESTAMP WITH TIME ZONE") :type/DateTime |
67 | 67 | :TSQUERY :type/* |
68 | 68 | :TSVECTOR :type/* |
|
228 | 228 | (jdbc/with-db-metadata [metadata (sql-jdbc.conn/db->pooled-connection-spec database)] |
229 | 229 | {:tables (fast-active-tables, driver, ^DatabaseMetaData metadata, database)})) |
230 | 230 |
|
| 231 | +;; We can't use getObject(int, Class) as the underlying Resultset used by the Teradata jdbc driver is based on jdk6. |
| 232 | +(defmethod sql-jdbc.execute/read-column [:teradata Types/TIMESTAMP] |
| 233 | + [_ _ rs _ i] |
| 234 | + (.toLocalDateTime (.getTimestamp rs i))) |
| 235 | + |
| 236 | +(defmethod sql-jdbc.execute/read-column [:teradata Types/TIMESTAMP_WITH_TIMEZONE] |
| 237 | + [_ _ rs _ i] |
| 238 | + (OffsetDateTime/parse (.getString rs i))) |
| 239 | + |
| 240 | +(defmethod sql-jdbc.execute/read-column [:teradata Types/DATE] |
| 241 | + [_ _ rs _ i] |
| 242 | + (.toLocalDate (.getDate rs i))) |
| 243 | + |
| 244 | +(defmethod sql-jdbc.execute/read-column [:teradata Types/TIME] |
| 245 | + [_ _ rs _ i] |
| 246 | + (.toLocalTime (.getTime rs i))) |
| 247 | + |
| 248 | +(defmethod sql-jdbc.execute/read-column [:teradata Types/TIME_WITH_TIMEZONE] |
| 249 | + [_ _ rs _ i] |
| 250 | + (OffsetTime/parse (.getTime rs i))) |
| 251 | + |
231 | 252 | (defn- run-query |
232 | 253 | "Run the query itself without setting the timezone connection parameter as this must not be changed on a Teradata connection. |
233 | 254 | Setting connection attributes like timezone would make subsequent queries behave unexpectedly." |
234 | | - [{sql :query, params :params, remark :remark} timezone connection] |
235 | | - (let [sql (s/replace (s/replace (str "-- " remark "\n" sql) "OFFSET" "") "test_data" "test-data") ;; temporary hack |
236 | | - statement (into [sql] params) |
237 | | - [columns & rows] (jdbc/query connection statement {:identifiers identity, :as-arrays? true |
238 | | - :read-columns (#'metabase.driver.sql-jdbc.execute/read-columns :teradata timezone)})] |
| 255 | + [{sql :query, :keys [params remark max-rows]} connection] |
| 256 | + (let [sql (s/replace (str "-- " remark "\n" sql) "OFFSET" "") |
| 257 | + [columns & rows] (jdbc/query |
| 258 | + connection (into [sql] params) |
| 259 | + {:identifiers identity |
| 260 | + :as-arrays? true |
| 261 | + :read-columns (partial #'metabase.driver.sql-jdbc.execute/read-columns :teradata) |
| 262 | + :set-parameters (partial #'metabase.driver.sql-jdbc.execute/set-parameters :teradata) |
| 263 | + :max-rows max-rows})] |
239 | 264 | {:rows (or rows []) |
240 | | - :columns columns})) |
| 265 | + :columns (map u/qualified-name columns)})) |
241 | 266 |
|
242 | 267 | (defn- run-query-without-timezone [driver settings connection query] |
243 | | - (#'metabase.driver.sql-jdbc.execute/do-in-transaction connection (partial run-query query nil))) |
| 268 | + (#'metabase.driver.sql-jdbc.execute/do-in-transaction connection (partial run-query query))) |
244 | 269 |
|
245 | 270 | (defmethod driver/execute-query :teradata |
246 | 271 | [driver {:keys [database settings], query :native, :as outer-query}] |
|
0 commit comments