SQL JDBC implementation of [[metabase.driver/query-result-metadata]]. | (ns metabase.driver.sql-jdbc.metadata (:require [metabase.driver.sql-jdbc.execute :as sql-jdbc.execute] [metabase.driver.sql-jdbc.sync.interface :as sql-jdbc.sync.interface] [metabase.lib.metadata :as lib.metadata] [metabase.lib.schema.metadata :as lib.schema.metadata] [metabase.query-processor.compile :as qp.compile] [metabase.query-processor.setup :as qp.setup] [metabase.query-processor.store :as qp.store] [metabase.util.malli :as mu])) |
(set! *warn-on-reflection* true) | |
(mu/defn query-result-metadata :- [:sequential ::lib.schema.metadata/column] "Default implementation of [[metabase.driver/query-result-metadata]] for JDBC-based drivers. Gets metadata without actually running a query." ([driver :- :keyword query :- :map] (qp.setup/with-qp-setup [query query] (let [database (lib.metadata/database (qp.store/metadata-provider)) {:keys [query params]} (qp.compile/compile query)] (query-result-metadata driver database query params)))) ([driver :- :keyword database :- ::lib.schema.metadata/database ^String sql :- :string params :- [:maybe [:sequential :any]]] (sql-jdbc.execute/do-with-connection-with-options driver database nil (fn [^java.sql.Connection conn] (with-open [stmt (sql-jdbc.execute/prepared-statement driver conn sql params)] (let [rsmeta (.getMetaData stmt)] (mapv (fn [i] (let [database-type (.getColumnTypeName rsmeta i)] {:lib/type :metadata/column :name (.getColumnLabel rsmeta i) :database-type database-type :base-type (sql-jdbc.sync.interface/database-type->base-type driver (keyword database-type))})) (range 1 (inc (.getColumnCount rsmeta)))))))))) | |