Param substitution for native queries. The Basics:
Native parameter parsing and substution logic shared by multiple drivers lives in
The different steps of this process, are similar between existing driver implementations, and are as follows:
| (ns metabase.query-processor.middleware.parameters.native (:require [clojure.set :as set] [metabase.driver :as driver] [metabase.driver.util :as driver.u] [metabase.lib.metadata :as lib.metadata] [metabase.query-processor.store :as qp.store])) |
Expand parameters inside an inner native | (defn expand-inner
[inner-query]
(if-not (driver.u/supports? driver/*driver* :native-parameters (lib.metadata/database (qp.store/metadata-provider)))
inner-query
;; Totally ridiculous, but top-level native queries use the key `:query` for SQL or equivalent, while native
;; source queries use `:native`. So we need to handle either case.
(let [source-query? (:native inner-query)
substituted-inner-query (driver/substitute-native-parameters driver/*driver*
(set/rename-keys inner-query {:native :query}))]
(cond-> (dissoc substituted-inner-query :parameters :template-tags)
source-query? (set/rename-keys {:query :native}))))) |