diff --git a/src/metabase/driver/ddl/postgres.clj b/src/metabase/driver/ddl/postgres.clj
index a13675d9441c400b7dc14b562585cb998cf7046f..f7b787cd20d8752d0d8e67580adef8c2eb711dc6 100644
--- a/src/metabase/driver/ddl/postgres.clj
+++ b/src/metabase/driver/ddl/postgres.clj
@@ -1,6 +1,5 @@
 (ns metabase.driver.ddl.postgres
   (:require [clojure.java.jdbc :as jdbc]
-            [clojure.string :as str]
             [clojure.tools.logging :as log]
             [metabase.driver.ddl.interface :as ddl.i]
             [metabase.driver.sql-jdbc.connection :as sql-jdbc.conn]
@@ -20,17 +19,12 @@
     (format "create schema %s"
             (q :table (ddl.i/schema-name database (public-settings/site-uuid))))))
 
-(defn- create-table-sql [{driver :engine :as database} definition]
+(defn- create-table-sql [{driver :engine :as database} definition query]
   (let [q (quote-fn driver)]
-    (format "create table %s.%s (%s);"
+    (format "create table %s.%s as %s"
             (q :table (ddl.i/schema-name database (public-settings/site-uuid)))
             (q :table (:table-name definition))
-            (str/join
-             ", "
-             (for [{:keys [field-name base-type]} (:field-definitions definition)]
-               (format "%s %s"
-                       (q :field field-name)
-                       (ddl.i/field-base-type->sql-type driver base-type)))))))
+            query)))
 
 (defn- drop-table-sql [{driver :engine :as database} table-name]
   (let [q (quote-fn driver)]
@@ -38,26 +32,13 @@
             (q :table (ddl.i/schema-name database (public-settings/site-uuid)))
             (q :table table-name))))
 
-(defn- populate-table-sql [{driver :engine :as database} definition query]
-  (let [q (quote-fn driver)]
-   (format "insert into %s.%s (%s) %s"
-           (q :table (ddl.i/schema-name database (public-settings/site-uuid)))
-           (q :table (:table-name definition))
-           (str/join
-            ", "
-            (for [{:keys [field-name]} (:field-definitions definition)]
-              (q :field field-name)))
-           query)))
-
 (defmethod ddl.i/refresh! :postgres [_driver database definition dataset-query]
   (try
-    (jdbc/with-db-connection [conn (sql-jdbc.conn/db->pooled-connection-spec database)]
-      (jdbc/execute! conn [(drop-table-sql database (:table-name definition))])
-      (jdbc/execute! conn [(create-table-sql database definition)])
-      (jdbc/execute! conn [(populate-table-sql database definition (-> dataset-query
-                                                                       qp/compile
-                                                                       :query))])
-      {:state :success})
+    (let [{:keys [query params]} (qp/compile dataset-query)]
+      (jdbc/with-db-connection [conn (sql-jdbc.conn/db->pooled-connection-spec database)]
+        (jdbc/execute! conn [(drop-table-sql database (:table-name definition))])
+        (jdbc/execute! conn (into [(create-table-sql database definition query)] params))
+        {:state :success}))
     (catch Exception e
       {:state :error :error (ex-message e)})))
 
@@ -87,7 +68,8 @@
                                        (create-table-sql database
                                                          {:table-name table-name
                                                           :field-definitions [{:field-name "field"
-                                                                               :base-type :type/Text}]})))]
+                                                                               :base-type :type/Text}]}
+                                                         "values (1)")))]
                      [:persist.check/read-table
                       (fn read-table [conn]
                         (jdbc/query conn [(format "select * from %s.%s"
diff --git a/src/metabase/query_processor/middleware/fetch_source_query.clj b/src/metabase/query_processor/middleware/fetch_source_query.clj
index cb849088fd568f4f177554ec311078ed301af961..32c741cf9e20eedffb96e8317ee738b2987e617f 100644
--- a/src/metabase/query_processor/middleware/fetch_source_query.clj
+++ b/src/metabase/query_processor/middleware/fetch_source_query.clj
@@ -25,7 +25,10 @@
             [clojure.string :as str]
             [clojure.tools.logging :as log]
             [medley.core :as m]
+            [metabase.driver :as driver]
             [metabase.driver.ddl.interface :as ddl.i]
+            [metabase.driver.sql.util :as sql.u]
+            [metabase.driver.util :as driver.u]
             [metabase.mbql.normalize :as mbql.normalize]
             [metabase.mbql.schema :as mbql.s]
             [metabase.mbql.util :as mbql.u]
@@ -105,6 +108,23 @@
          (assoc m :field_ref [:field (:name m) {:base-type (:base_type m)}]))
        metadata))
 
+(defn- persisted-info-native-query [card database-id]
+  (let [driver (or driver/*driver* (driver.u/database->driver database-id))]
+    (format "select %s from %s.%s"
+            (str/join ", " (map #(sql.u/quote-name
+                                   driver
+                                   :field
+                                   (:field-name %))
+                                (get-in card [:definition :field-definitions])))
+            (sql.u/quote-name
+              driver
+              :table
+              (ddl.i/schema-name {:id database-id} (public-settings/site-uuid)))
+            (sql.u/quote-name
+              driver
+              :table
+              (:table_name card)))))
+
 (s/defn card-id->source-query-and-metadata :- SourceQueryAndMetadata
   "Return the source query info for Card with `card-id`. Pass true as the optional second arg `log?` to enable
   logging. (The circularity check calls this and will print more than desired)"
@@ -170,10 +190,7 @@
 
      (cond-> {:source-query    (cond-> source-query
                                  ;; This will be applied, if still appropriate, by the peristence middleware
-                                 persisted? (assoc :persisted-info/native (format "select %s from %s.%s"
-                                                                                  (str/join ", " (map :field-name (get-in card [:definition :field-definitions])))
-                                                                                  (ddl.i/schema-name {:id database-id} (public-settings/site-uuid))
-                                                                                  (:table_name card))))
+                                 persisted? (assoc :persisted-info/native (persisted-info-native-query card database-id)))
               :database        database-id
               :source-metadata (cond-> (seq (map mbql.normalize/normalize-source-metadata result-metadata))
                                  persisted? sub-cached-field-refs)}