diff --git a/src/metabase/driver/generic_sql.clj b/src/metabase/driver/generic_sql.clj index 4bb363b7e60e40d4188e0bf6404e23843bba6f3c..6bc3a104dab0ffec395532778c8bbeb6f837f1fb 100644 --- a/src/metabase/driver/generic_sql.clj +++ b/src/metabase/driver/generic_sql.clj @@ -72,12 +72,6 @@ Return `nil` to prevent FIELD from being aliased.") - ;; TODO This is only used by unit tests, I think; confirm this and move to `metabase.test.data.generic-sql` - (prepare-identifier [this, ^String identifier] - "*OPTIONAL*. Prepare an identifier, such as a Table or Field name, when it is used in a SQL query. - This is used by drivers like H2 to transform names to upper-case. - The default implementation is `identity`.") - (prepare-value [this, ^Value value] "*OPTIONAL*. Prepare a value (e.g. a `String` or `Integer`) that will be used in a korma form. By default, this returns VALUE's `:value` as-is, which is eventually passed as a parameter in a prepared statement. Drivers such as BigQuery that don't support prepared statements can skip this @@ -406,7 +400,6 @@ :excluded-schemas (constantly nil) :field->alias (u/drop-first-arg name) :field-percent-urls fast-field-percent-urls - :prepare-identifier (u/drop-first-arg identity) :prepare-value (u/drop-first-arg :value) :quote-style (constantly :ansi) :set-timezone-sql (constantly nil) diff --git a/src/metabase/driver/h2.clj b/src/metabase/driver/h2.clj index c444f12438c31c917711a42a10136f956caf9348..e5ab944ffd27ba3617558e58911227488c538bc2 100644 --- a/src/metabase/driver/h2.clj +++ b/src/metabase/driver/h2.clj @@ -217,7 +217,6 @@ :column->base-type column->base-type :connection-details->spec connection-details->spec :date date - :prepare-identifier (u/drop-first-arg s/upper-case) :string-length-fn (u/drop-first-arg string-length-fn) :unix-timestamp->timestamp unix-timestamp->timestamp})) diff --git a/test/metabase/driver/generic_sql_test.clj b/test/metabase/driver/generic_sql_test.clj index f3175493349390429ccff9dcd64f01645cea163b..6b1f89c9972726bc4959272be1432e75a2fe87b5 100644 --- a/test/metabase/driver/generic_sql_test.clj +++ b/test/metabase/driver/generic_sql_test.clj @@ -17,12 +17,12 @@ (def ^:private users-name-field (delay (Field (id :users :name)))) (def ^:private generic-sql-engines - (set (for [engine datasets/all-valid-engines - :let [driver (driver/engine->driver engine)] - :when (not= engine :bigquery) ; bigquery doesn't use the generic sql implementations of things like `field-avg-length` - :when (extends? ISQLDriver (class driver))] - (do (require (symbol (str "metabase.test.data." (name engine))) :reload) ; otherwise it gets all snippy if you try to do `lein test metabase.driver.generic-sql-test` - engine)))) + (delay (set (for [engine datasets/all-valid-engines + :let [driver (driver/engine->driver engine)] + :when (not= engine :bigquery) ; bigquery doesn't use the generic sql implementations of things like `field-avg-length` + :when (extends? ISQLDriver (class driver))] + (do (require (symbol (str "metabase.test.data." (name engine))) :reload) ; otherwise it gets all snippy if you try to do `lein test metabase.driver.generic-sql-test` + engine))))) ;; DESCRIBE-DATABASE @@ -82,7 +82,7 @@ (resolve-private-fns metabase.driver.generic-sql field-avg-length field-values-lazy-seq table-rows-seq) ;;; FIELD-AVG-LENGTH -(datasets/expect-with-engines generic-sql-engines +(datasets/expect-with-engines @generic-sql-engines ;; Not sure why some databases give different values for this but they're close enough that I'll allow them (if (contains? #{:redshift :sqlserver} datasets/*engine*) 15 @@ -90,7 +90,7 @@ (field-avg-length datasets/*driver* (db/select-one 'Field :id (id :venues :name)))) ;;; FIELD-VALUES-LAZY-SEQ -(datasets/expect-with-engines generic-sql-engines +(datasets/expect-with-engines @generic-sql-engines ["Red Medicine" "Stout Burgers & Beers" "The Apple Pan" @@ -100,7 +100,7 @@ ;;; TABLE-ROWS-SEQ -(datasets/expect-with-engines generic-sql-engines +(datasets/expect-with-engines @generic-sql-engines [{:name "Red Medicine", :price 3, :category_id 4, :id 1} {:name "Stout Burgers & Beers", :price 2, :category_id 11, :id 2} {:name "The Apple Pan", :price 2, :category_id 11, :id 3} @@ -112,7 +112,7 @@ (dissoc row :latitude :longitude))) ; different DBs use different precisions for these ;;; FIELD-PERCENT-URLS -(datasets/expect-with-engines generic-sql-engines +(datasets/expect-with-engines @generic-sql-engines 0.5 (dataset half-valid-urls (field-percent-urls datasets/*driver* (db/select-one 'Field :id (id :urls :url))))) diff --git a/test/metabase/test/data/generic_sql.clj b/test/metabase/test/data/generic_sql.clj index 89ca9551ead53b2e4374f43e1e868d004b15668c..e9bec764bb30f7b5921582ff9887fec14001cb56 100644 --- a/test/metabase/test/data/generic_sql.clj +++ b/test/metabase/test/data/generic_sql.clj @@ -54,6 +54,11 @@ (korma-entity [this, ^DatabaseDefinition dbdef, ^TableDefinition tabledef] "*Optional* Return a korma-entity for TABLEDEF.") + (prepare-identifier [this, ^String identifier] + "*OPTIONAL*. Prepare an identifier, such as a Table or Field name, when it is used in a SQL query. + This is used by drivers like H2 to transform names to upper-case. + The default implementation is `identity`.") + (pk-field-name ^String [this] "*Optional* Name of a PK field. Defaults to `\"id\"`.") @@ -208,7 +213,7 @@ (defn- do-insert! "Insert ROWS-OR-ROWS into TABLE-NAME for the DRIVER database defined by SPEC." [driver spec table-name row-or-rows] - (let [prepare-key (comp keyword (partial sql/prepare-identifier driver) name) + (let [prepare-key (comp keyword (partial prepare-identifier driver) name) rows (if (sequential? row-or-rows) row-or-rows [row-or-rows]) @@ -280,6 +285,7 @@ :korma-entity default-korma-entity :load-data! load-data-chunked! :pk-field-name (constantly "id") + :prepare-identifier (u/drop-first-arg identity) :qualified-name-components default-qualified-name-components :qualify+quote-name default-qualify+quote-name :quote-name default-quote-name}) diff --git a/test/metabase/test/data/h2.clj b/test/metabase/test/data/h2.clj index 3b5e2ba0b9aaf9e6a523d6bce59b381c878b0e24..d142c46e6f6935eb8280d23d86ded7a87587bd11 100644 --- a/test/metabase/test/data/h2.clj +++ b/test/metabase/test/data/h2.clj @@ -1,5 +1,6 @@ (ns metabase.test.data.h2 "Code for creating / destroying an H2 database from a `DatabaseDefinition`." + ;; TODO - rework this namespace to use `u/drop-first-arg` where appropriate (:require [clojure.core.reducers :as r] [clojure.string :as s] (korma [core :as k] @@ -77,12 +78,12 @@ ;; we always want to use 'server' context when execute-sql! is called ;; (never try connect as GUEST, since we're not giving them priviledges to create tables / etc) (execute-sql! this :server dbdef sql)) - :field-base-type->sql-type (fn [_ base-type] - (field-base-type->sql-type base-type)) + :field-base-type->sql-type (u/drop-first-arg field-base-type->sql-type) :korma-entity korma-entity :load-data! generic/load-data-all-at-once! :pk-field-name (constantly "ID") :pk-sql-type (constantly "BIGINT AUTO_INCREMENT") + :prepare-identifier (u/drop-first-arg s/upper-case) :quote-name quote-name})) i/IDatasetLoader @@ -90,7 +91,6 @@ {:database->connection-details database->connection-details :default-schema (constantly "PUBLIC") :engine (constantly :h2) - :format-name (fn [_ table-or-field-name] - (s/upper-case table-or-field-name)) + :format-name (u/drop-first-arg s/upper-case) :has-questionable-timezone-support? (constantly true) :id-field-type (constantly :BigIntegerField)}))