Skip to content
Snippets Groups Projects
Unverified Commit b0676bf3 authored by Cam Saul's avatar Cam Saul
Browse files

Lots of tweaks [ci skip]

parent 35b11276
No related branches found
No related tags found
No related merge requests found
......@@ -85,7 +85,7 @@
:exclusions [com.github.wendykierp/JTransforms]]
[net.sf.cssbox/cssbox "4.12" ; HTML / CSS rendering
:exclusions [org.slf4j/slf4j-api]]
[net.snowflake/snowflake-jdbc "3.5.5"] ; Snowflake JDBC Client Library
[net.snowflake/snowflake-jdbc "3.6.9"] ; Snowflake JDBC Client Library
[org.clojars.pntblnk/clj-ldap "0.0.12"] ; LDAP client
[org.liquibase/liquibase-core "3.6.2" ; migration management (Java lib)
:exclusions [ch.qos.logback/logback-classic]]
......
......@@ -413,8 +413,9 @@
(catch Exception e
(throw
(Exception.
(tru "Unable to parse date string ''{0}'' for database engine ''{1}''"
time-str (-> database :engine name)) e)))))))
(str
(tru "Unable to parse date string ''{0}'' for database engine ''{1}''"
time-str (-> database :engine name))) e)))))))
(defn class->base-type
"Return the `Field.base_type` that corresponds to a given class returned by the DB.
......
......@@ -293,8 +293,8 @@
(defn- get-tables
"Fetch a JDBC Metadata ResultSet of tables in the DB, optionally limited to ones belonging to a given schema."
^ResultSet [^DatabaseMetaData metadata, ^String schema-or-nil]
(with-resultset-open [rs-seq (.getTables metadata nil schema-or-nil "%" ; tablePattern "%" = match all tables
^ResultSet [^DatabaseMetaData metadata, ^String schema-or-nil, ^String database-name-or-nil]
(with-resultset-open [rs-seq (.getTables metadata database-name-or-nil schema-or-nil "%" ; tablePattern "%" = match all tables
(into-array String ["TABLE", "VIEW", "FOREIGN TABLE", "MATERIALIZED VIEW"]))]
;; Ensure we read all rows before exiting
(doall rs-seq)))
......@@ -306,12 +306,12 @@
This is as much as 15x faster for Databases with lots of system tables than `post-filtered-active-tables` (4
seconds vs 60)."
[driver, ^DatabaseMetaData metadata]
[driver, ^DatabaseMetaData metadata, & [database-name-or-nil]]
(with-resultset-open [rs-seq (.getSchemas metadata)]
(let [all-schemas (set (map :table_schem rs-seq))
schemas (set/difference all-schemas (excluded-schemas driver))]
(set (for [schema schemas
table-name (mapv :table_name (get-tables metadata schema))]
table-name (mapv :table_name (get-tables metadata schema database-name-or-nil))]
{:name table-name
:schema schema})))))
......@@ -320,7 +320,7 @@
Fetch *all* Tables, then filter out ones whose schema is in `excluded-schemas` Clojure-side."
[driver, ^DatabaseMetaData metadata]
(set (for [table (filter #(not (contains? (excluded-schemas driver) (:table_schem %)))
(get-tables metadata nil))]
(get-tables metadata nil nil))]
{:name (:table_name table)
:schema (:table_schem table)})))
......
......@@ -21,6 +21,7 @@
:subname (str "//" host ".snowflakecomputing.com/")
:db dbname
:client_metadata_request_use_connection_ctx true
:week_start 7
:ssl true}
(dissoc opts :host :port :dbname))))
......@@ -29,10 +30,10 @@
clojure.lang.Named
(getName [_] "Snowflake"))
(def ^:private snowflake-date-formatter
(def ^:private snowflake-date-formatters
"The default timestamp format for Snowflake.
See https://docs.snowflake.net/manuals/sql-reference/data-types-datetime.html#timestamp."
(driver/create-db-time-formatters "EEE, dd MMM yyyy HH:mm:ss Z"))
(driver/create-db-time-formatters "yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z"))
(def ^:private snowflake-db-time-query
"Snowflake current database time, with hour and minute timezone offset."
......@@ -109,6 +110,10 @@
(defn- string-length-fn [field-key]
(hsql/call :length (hx/cast :VARCHAR field-key)))
(defn- describe-database [driver database]
(sql/with-metadata [metadata driver database]
{:tables (sql/fast-active-tables driver metadata (:name database))}))
(u/strict-extend SnowflakeDriver
driver/IDriver
(merge (sql/IDriverSQLDefaultsMixin)
......@@ -144,8 +149,9 @@
:placeholder "my_role"}]))
:format-custom-field-name (u/drop-first-arg str/lower-case)
:current-db-time (driver/make-current-db-time-fn
snowflake-date-formatter
snowflake-db-time-query)})
snowflake-db-time-query
snowflake-date-formatters)
:describe-database describe-database})
sql/ISQLDriver
(merge (sql/ISQLDriverDefaultsMixin)
......
(ns metabase.test.data.snowflake
(:require [clojure.java.jdbc :as jdbc]
[clojure.string :as s]
[clojure.string :as str]
[metabase.test.data
[generic-sql :as generic]
[interface :as i]]
......@@ -40,13 +40,15 @@
(defn- create-db-sql [driver {:keys [database-name]}]
(let [db (generic/qualify+quote-name driver database-name)
schema-name (generic/qualify+quote-name driver schema-name)]
(format "CREATE DATABASE %s; USE DATABASE %s;" db db)))
(format "CREATE DATABASE %s; USE DATABASE %s; ALTER SESSION SET TIMEZONE = 'UTC';" db db)))
(defn- load-data! [driver {:keys [database-name], :as dbdef} {:keys [table-name], :as tabledef}]
(jdbc/with-db-connection [conn (generic/database->spec driver :db dbdef)]
(.setAutoCommit (jdbc/get-connection conn) false)
(let [table (format "\"%s\".\"public\".\"%s\"" database-name table-name)
rows (generic/load-data-get-rows driver dbdef tabledef)
rows (keep-indexed (fn [i row]
(assoc row :id (inc i)))
(generic/load-data-get-rows driver dbdef tabledef))
cols (keys (first rows))
vals (for [row rows]
(map row cols))]
......@@ -66,6 +68,6 @@
i/IDriverTestExtensions
(merge generic/IDriverTestExtensionsMixin
{:database->connection-details (u/drop-first-arg database->connection-details)
:format-name (u/drop-first-arg s/upper-case)
:format-name (u/drop-first-arg str/upper-case)
:default-schema (constantly "public")
:engine (constantly :snowflake)}))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment