From c1549e7759da5c2659f107243f2a9e6e16f6c578 Mon Sep 17 00:00:00 2001 From: Tomas Sadauskas Date: Tue, 21 Apr 2020 22:52:29 +0200 Subject: [PATCH 1/2] Fix for PreparedStatement parameter setting The Teradata 16.20 JDBC driver is 4.0, but Metabase expects 4.3, so here we are - back in the times before java.time. We will either have to override the relevant set-parameter functions same way as the read-column functions or use the legacy implementation of sql-jdbc.execute. --- project.clj | 2 +- src/metabase/driver/teradata.clj | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/project.clj b/project.clj index b2eb14e..e55b0f2 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject metabase/teradata-driver "1.0.0-metabase-v0.34.1-teradata-jdbc-16.20" +(defproject metabase/teradata-driver "1.0.1-metabase-v0.34.1-teradata-jdbc-16.20" :min-lein-version "2.5.0" :profiles diff --git a/src/metabase/driver/teradata.clj b/src/metabase/driver/teradata.clj index cf8c56e..5779ed2 100644 --- a/src/metabase/driver/teradata.clj +++ b/src/metabase/driver/teradata.clj @@ -4,6 +4,7 @@ [string :as s]] [clojure.java.jdbc :as jdbc] [honeysql.core :as hsql] + [java-time :as t] [metabase [driver :as driver] [util :as u]] @@ -14,13 +15,13 @@ [sync :as sql-jdbc.sync]] [metabase.driver.sql.query-processor :as sql.qp] [metabase.driver.sql.util.deduplicate :as deduplicateutil] - [metabase.models.field :as field] [metabase.query-processor.util :as qputil] [metabase.util - [honeysql-extensions :as hx] - [ssh :as ssh]]) - (:import [java.sql DatabaseMetaData ResultSet ResultSetMetaData Time Types] - [java.time LocalDate LocalDateTime LocalTime OffsetDateTime OffsetTime ZonedDateTime])) + [honeysql-extensions :as hx]]) + (:import [java.sql DatabaseMetaData ResultSet Types] + [java.time OffsetDateTime OffsetTime] + [java.util Calendar TimeZone] + [java.sql PreparedStatement])) (driver/register! :teradata, :parent :sql-jdbc) @@ -249,6 +250,13 @@ [_ _ rs _ i] (OffsetTime/parse (.getTime rs i))) +;; TODO: use metabase.driver.sql-jdbc.execute.legacy-impl instead of re-implementing everything here +(defmethod sql-jdbc.execute/set-parameter [:teradata OffsetDateTime] + [_ ^PreparedStatement ps ^Integer i t] + (let [cal (Calendar/getInstance (TimeZone/getTimeZone (t/zone-id t))) + t (t/sql-timestamp t)] + (.setTimestamp ps i t cal))) + (defn- run-query "Run the query itself without setting the timezone connection parameter as this must not be changed on a Teradata connection. Setting connection attributes like timezone would make subsequent queries behave unexpectedly." From 13210eaffc2f8f45ebf2ae9f781242e977de37c6 Mon Sep 17 00:00:00 2001 From: Tomas Sadauskas Date: Wed, 22 Apr 2020 12:11:21 +0200 Subject: [PATCH 2/2] Rearranged imports --- src/metabase/driver/teradata.clj | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/metabase/driver/teradata.clj b/src/metabase/driver/teradata.clj index 5779ed2..5c0c796 100644 --- a/src/metabase/driver/teradata.clj +++ b/src/metabase/driver/teradata.clj @@ -18,10 +18,9 @@ [metabase.query-processor.util :as qputil] [metabase.util [honeysql-extensions :as hx]]) - (:import [java.sql DatabaseMetaData ResultSet Types] + (:import [java.sql DatabaseMetaData ResultSet Types PreparedStatement] [java.time OffsetDateTime OffsetTime] - [java.util Calendar TimeZone] - [java.sql PreparedStatement])) + [java.util Calendar TimeZone])) (driver/register! :teradata, :parent :sql-jdbc)