diff --git a/src/package.lisp b/src/package.lisp index ddb298d..0fcdffa 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -6,7 +6,8 @@ (:use #:cl) (:export #:precision #:scale - #:intern-symbol)) + #:intern-symbol + #:typemod-expr-to-function)) (defpackage #:pgloader.logs (:use #:cl #:pgloader.params) @@ -176,7 +177,11 @@ (:use #:cl #:pgloader.params #:pgloader.utils #:pgloader.connection #:pgloader.schema) - (:import-from #:pgloader.transforms #:precision #:scale #:intern-symbol) + (:import-from #:pgloader.transforms + #:precision + #:scale + #:intern-symbol + #:typemod-expr-to-function) (:import-from #:pgloader.parse-date #:parse-date-string #:parse-date-format) diff --git a/src/parsers/command-csv.lisp b/src/parsers/command-csv.lisp index a672c19..564412f 100644 --- a/src/parsers/command-csv.lisp +++ b/src/parsers/command-csv.lisp @@ -266,7 +266,11 @@ (defrule sexp-symbol (and (symbol-first-character-p character) (* (symbol-character-p character))) (:lambda (schars) - (pgloader.transforms:intern-symbol (text schars) '(("nil" . cl:nil))))) + (pgloader.transforms:intern-symbol + (text schars) + '(("nil" . cl:nil) + ("precision" . pgloader.transforms::precision) + ("scale" . pgloader.transforms::scale))))) (defrule sexp-string-char (or (not-doublequote character) (and #\\ #\"))) diff --git a/src/sources/common/casting-rules.lisp b/src/sources/common/casting-rules.lisp index 5a228c6..73c0be3 100644 --- a/src/sources/common/casting-rules.lisp +++ b/src/sources/common/casting-rules.lisp @@ -29,13 +29,6 @@ :start (+ 1 start-1) :end end)) (cons a b)))))) -(defun typemod-expr-to-function (expr) - "Transform given EXPR into a callable function object." - `(lambda (typemod) - (destructuring-bind (precision &optional (scale 0)) typemod - (declare (ignorable precision scale)) - ,expr))) - (defun typemod-expr-matches-p (rule-typemod-expr typemod) "Check if an expression such as (< 10) matches given typemod." (funcall (compile nil (typemod-expr-to-function rule-typemod-expr)) typemod)) diff --git a/src/utils/transforms.lisp b/src/utils/transforms.lisp index 27b6edc..fd6ae9b 100644 --- a/src/utils/transforms.lisp +++ b/src/utils/transforms.lisp @@ -41,6 +41,14 @@ (intern (string-upcase symbol-name) (find-package "PGLOADER.USER-SYMBOLS")))))))) +(defun typemod-expr-to-function (expr) + "Transform given EXPR into a callable function object." + `(lambda (typemod) + (destructuring-bind (precision &optional (scale 0)) + typemod + (declare (ignorable precision scale)) + ,expr))) + ;;; ;;; Some optimisation stanza