From edadd2d84ba3d1da099c06a20c511a7a1b52d7ce Mon Sep 17 00:00:00 2001 From: Chris Truter Date: Tue, 28 May 2024 14:39:36 +0200 Subject: [PATCH] Fix schema case insensitivity --- src/macaw/collect.clj | 2 +- src/macaw/rewrite.clj | 16 ++++++++++------ test/macaw/core_test.clj | 9 ++++++++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/macaw/collect.clj b/src/macaw/collect.clj index fe8f636..18f5791 100644 --- a/src/macaw/collect.clj +++ b/src/macaw/collect.clj @@ -52,7 +52,7 @@ (subs s 1 (dec (count s)))) (defn normalize-reference - "Normalize a schema, table, column, etc references so that we can match them regardless of syntactic differences." + "Normalize a schema, table, column, etc. references so that we can match them regardless of syntactic differences." [s {:keys [case-insensitive? quotes-preserve-case?]}] (when s (let [quoted (quoted? s) diff --git a/src/macaw/rewrite.clj b/src/macaw/rewrite.clj index 44767fb..7883e36 100644 --- a/src/macaw/rewrite.clj +++ b/src/macaw/rewrite.clj @@ -73,13 +73,14 @@ [])))) (defn- rename-table - [updated-nodes table-renames schema-renames known-tables ^Table t opts] + [updated-nodes table-renames schema-renames known-tables opts ^Table t _ctx] (when-let [rename (u/find-relevant table-renames (get known-tables t) [:table :schema])] (vswap! updated-nodes conj [t rename]) (.setName t (val rename))) - (let [schema-name (collect/normalize-reference (.getSchemaName t) opts)] + (let [raw-schema-name (.getSchemaName t) + schema-name (collect/normalize-reference raw-schema-name opts)] (when-let [schema-rename (find schema-renames schema-name)] - (vswap! updated-nodes conj [schema-name schema-rename]) + (vswap! updated-nodes conj [raw-schema-name schema-rename]) (.setSchemaName t (val schema-rename))))) (defn- rename-column @@ -110,13 +111,16 @@ comps (collect/query->components parsed-ast (assoc opts :with-instance true)) columns (index-by-instances (:columns comps)) tables (index-by-instances (:tables comps)) + schemas (index-by-instances (:schemas comps)) ;; execute rename updated-nodes (volatile! []) + rename-table* (partial rename-table updated-nodes table-renames schema-renames tables opts) + rename-column* (partial rename-column updated-nodes column-renames columns) res (-> parsed-ast (mw/walk-query - {:table (partial rename-table updated-nodes table-renames schema-renames tables) - :column-qualifier (partial rename-table updated-nodes table-renames schema-renames tables) - :column (partial rename-column updated-nodes column-renames columns)}) + {:table rename-table* + :column-qualifier rename-table* + :column rename-column*}) (update-query @updated-nodes sql opts))] (alert-unused! @updated-nodes renames) res)) diff --git a/test/macaw/core_test.clj b/test/macaw/core_test.clj index c4bdd34..576882c 100644 --- a/test/macaw/core_test.clj +++ b/test/macaw/core_test.clj @@ -125,7 +125,14 @@ (m/replace-names "SELECT DOGS.BaRk FROM dOGS" {:tables {{:table "dogs"} "cats"} :columns {{:table "dogs" :column "bark"} "meow"}} - :case-insensitive? true)))) + {:case-insensitive? true}))) + + (is (= "SELECT meow FROM private.cats" + (m/replace-names "SELECT bark FROM PUBLIC.dogs" + {:schemas {"public" "private"} + :tables {{:schema "public" :table "dogs"} "cats"} + :columns {{:schema "public" :table "dogs" :column "bark"} "meow"}} + {:case-insensitive? true})))) (def ^:private heavily-quoted-query-mixed-case "SELECT RAW, \"Foo\", \"dong\".\"bAr\", `ding`.`dong`.`feE` FROM `ding`.dong")