diff --git a/src/parsers/command-cast-rules.lisp b/src/parsers/command-cast-rules.lisp index 75fa7cb..eb200b3 100644 --- a/src/parsers/command-cast-rules.lisp +++ b/src/parsers/command-cast-rules.lisp @@ -141,7 +141,12 @@ (string (intern (string-upcase fname) :pgloader.transforms)) (symbol fname)))) -(defrule cast-function (and kw-using maybe-qualified-function-name) +(defrule transform-expression sexp + (:lambda (sexp) + (eval sexp))) + +(defrule cast-function (and kw-using (or maybe-qualified-function-name + transform-expression)) (:destructure (using symbol) (declare (ignore using)) symbol)) (defun fix-target-type (source target) diff --git a/src/utils/transforms.lisp b/src/utils/transforms.lisp index a87614f..65e9d0d 100644 --- a/src/utils/transforms.lisp +++ b/src/utils/transforms.lisp @@ -104,6 +104,7 @@ logical-to-boolean db3-trim-string db3-numeric-to-pgsql-numeric + db3-numeric-to-pgsql-integer db3-date-to-pgsql-date)) @@ -505,10 +506,17 @@ (defun db3-numeric-to-pgsql-numeric (value) "DB3 numerics should be good to go, but might contain spaces." - (let ((trimmed-string (string-right-trim '(#\Space) value))) + (let ((trimmed-string (string-trim '(#\Space) value))) (unless (string= "" trimmed-string) trimmed-string))) +(defun db3-numeric-to-pgsql-integer (value) + "DB3 numerics should be good to go, but might contain spaces." + (when value + (let ((integer-or-nil (parse-integer value :junk-allowed t))) + (when integer-or-nil + (write-to-string integer-or-nil))))) + (defun db3-date-to-pgsql-date (value) "Convert a DB3 date to a PostgreSQL date." (when (and value (string/= "" value) (= 8 (length value))) diff --git a/test/data/DNORDOC.DBF b/test/data/DNORDOC.DBF new file mode 100644 index 0000000..5e080f4 Binary files /dev/null and b/test/data/DNORDOC.DBF differ diff --git a/test/data/DNORDOC.DBT b/test/data/DNORDOC.DBT new file mode 100644 index 0000000..fe16592 Binary files /dev/null and b/test/data/DNORDOC.DBT differ diff --git a/test/dbf-memo.load b/test/dbf-memo.load new file mode 100644 index 0000000..497b7ca --- /dev/null +++ b/test/dbf-memo.load @@ -0,0 +1,12 @@ +LOAD DBF + FROM data/DNORDOC.DBF with encoding cp866 + INTO postgresql:///pgloader + TARGET TABLE public.dnordoc + WITH truncate, create table, disable triggers + + cast + column dnordoc.normdocid + to uuid + using (lambda (normdocid) + (empty-string-to-null (right-trim normdocid))), + column dnordoc.doctype to integer using db3-numeric-to-pgsql-integer;