From c880f86bb6cf01f7669390e27a7262f39fdc0931 Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Mon, 5 Oct 2015 02:11:23 +0200 Subject: [PATCH] Fix user defined casting rules. Commit 598c860cf5013d52399c07c7f18f1daf0227d305 broke user defined casting rules by interning "precision" and "scale" in the pgloader.user-symbols package: those symbols need to be found in the pgloader.transforms package instead. Luckily enough the infrastructure to do that was already in place for cl:nil. --- src/package.lisp | 9 +++++++-- src/parsers/command-csv.lisp | 6 +++++- src/sources/common/casting-rules.lisp | 7 ------- src/utils/transforms.lisp | 8 ++++++++ 4 files changed, 20 insertions(+), 10 deletions(-) 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