diff --git a/clojure/src/pgloader/load_file/ast.clj b/clojure/src/pgloader/load_file/ast.clj index 4f9b1ef7..7b06f26a 100644 --- a/clojure/src/pgloader/load_file/ast.clj +++ b/clojure/src/pgloader/load_file/ast.clj @@ -3,9 +3,12 @@ [clojure.string :as str] [clojure.tools.logging :as log] [pgloader.pg-service :as pg-service] - [pgloader.mysql-options :as mysql-opts]) + [pgloader.mysql-options :as mysql-opts] + [pgloader.transforms :refer [compile-using-expr]]) (:import [java.net URI])) +(declare s-expr-content) + (set! *warn-on-reflection* true) (defrecord LoadCommand @@ -295,8 +298,18 @@ (clojure.string/join " " (map second (filter #(= :word-part (first %)) (rest target-inner))))))) using-fn (some (fn [n] (when (and (vector? n) (= :using-fn (first n))) - (keyword (second (some #(when (and (vector? %) (= :fn-name (first %))) %) - (rest n)))))) + (let [expr-node (some #(when (and (vector? %) + (or (= :fn-name (first %)) + (= :s-expr (first %)) + (= :reader-fn (first %)))) + %) + (rest n))] + (case (first expr-node) + :fn-name (keyword (second expr-node)) + :s-expr (compile-using-expr + (str "(" (s-expr-content expr-node) ")")) + :reader-fn (compile-using-expr + (str "#(" (s-expr-content (second expr-node)) ")")))))) flat-cast-opts) when-node (first (filter #(= :when-or-unsigned (first %)) inner-children)) when-cond (when when-node diff --git a/clojure/src/pgloader/load_file/grammar.clj b/clojure/src/pgloader/load_file/grammar.clj index bd19f1c1..e45e61c3 100644 --- a/clojure/src/pgloader/load_file/grammar.clj +++ b/clojure/src/pgloader/load_file/grammar.clj @@ -266,7 +266,7 @@ keep-not-null = <'keep'> <'not'> <'null'> drop-typemod = <'drop'> <'typemod'> keep-typemod = <'keep'> <'typemod'> - using-fn = <'using'> fn-name + using-fn = <'using'> (s-expr | reader-fn | fn-name) fn-name = #'[a-zA-Z][a-zA-Z0-9_-]*' when-or-unsigned = <'when'> (when-expr | <'unsigned'> | <'default'> when-default-val) ( when-not-null)? when-not-null = <'and'> <'not'> <'null'>