From: Russ Tyndall Date: Fri, 9 Oct 2015 15:30:40 +0000 (-0400) Subject: merging in master from kpe.io X-Git-Tag: v6.7.0~7 X-Git-Url: http://git.kpe.io/?p=clsql.git;a=commitdiff_plain;h=eeb36233c9881cd2bb141f7a3241afbe82feda8d;hp=8b84dd8066b5792cdc5b9570a60fb72c278da677 merging in master from kpe.io --- diff --git a/ChangeLog b/ChangeLog index 86362c5..ccc8afc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,33 @@ + 2015-08-12 Kevin Rosenberg * Version 6.6.3 release * db-oracle/oracle-sql.lisp: Patch for PostgreSQL socket interface for unicode characters. Thanks to Jason Melbye. + +2015-06-02 Daniel Kochmański + * clsql.asd, sql/package.lisp: Add ECL compatibility fixes + * sql/db-interface.lisp: Fix declaration typo + +2015-04-06 Russ Tyndall + * sql/operations, sql/expressions: add postgresql E-string + operator / expression. Needed for correct regex handling + EG: [E "some string"]=> E'some string' 2015-03-30 Kevin Rosenberg * Version 6.6.2 release * db-oracle/oracle-sql.lisp: Remove extra hyphen, thanks to Thomas Vossen + +2015-03-24 Russ Tyndall + * sql/oodml.lisp: fixed call-next-method in the base of + read-sql-value and replaced with a continuable + sql-value-conversion-error + * default read-sql-value for list + * tests for sql-value-conversion-errors and list + +2015-03-18 Russ Tyndall + * {uffi,db-mysql}/Makefile: remove -pie build hardening for + which caused load issues for Linux Mint 2015-03-18 Kevin Rosenberg * Version 6.6.1 release @@ -18,14 +39,14 @@ * Version 6.6.0 release * {uffi,db-mysql}/Makefile: Add build hardening for Debian -2014-02-24 Russ Tyndall +2015-02-24 Russ Tyndall * mysql-sql.lisp an error in type declarations generating a compilation warning was being treated as an error in recent SBCLs, fixed the type warning by correcting the type (still a ton of compliation notes) -2014-02-23 Russ Tyndall +2015-02-23 Russ Tyndall * sql/metaclasses.lisp made reinitialize-instance return the instance passed to it as SBCL now expected (mentioned on the SBCL-devel mailing list by diff --git a/LATEST-TEST-RESULTS b/LATEST-TEST-RESULTS index 91103fb..72725ce 100644 --- a/LATEST-TEST-RESULTS +++ b/LATEST-TEST-RESULTS @@ -1,4 +1,4 @@ -Note from Russ Tyndall 2013-01-30 : +Note from Russ Tyndall 2015-03-23 : This is the current results of running the test suite against all the database backends I have accessible, on SBCL / UBUNTU64bit. It would be great to @@ -7,20 +7,24 @@ tests so that all pass. In the interim, I would like know that I am not increasing the number of failing tests :mysql -1 out of 301 total tests failed: :FDDL/CACHE-TABLE-QUERIES/1. +No tests failed. +18 of 310 Tests skipped :odbc MSSQL2000/5 -1 out of 298 total tests failed: :FDDL/CACHE-TABLE-QUERIES/1. +No tests failed. +22 of 306 Tests skipped: :odbc postgres -2 out of 311 total tests failed: :FDML/SELECT/36, :FDDL/CACHE-TABLE-QUERIES/1. +*couldnt get them to run - foreign lib problems* :postgres-socket :postgres-socket-3 -5 out of 300 total tests failed: :TIME/PG/OODML/USEC, :TIME/PG/OODML/NO-USEC, - :TIME/PG/FDML/USEC, :FDML/SELECT/36, :FDDL/CACHE-TABLE-QUERIES/1. +4 out of 308 total tests failed: :TIME/PG/OODML/USEC, :TIME/PG/OODML/NO-USEC, + :TIME/PG/FDML/USEC, :FDML/SELECT/36. +20 of 308 Tests skipped: :sqlite3 -1 out of 300 total tests failed: :FDDL/INDEX/3. +1 out of 308 total tests failed: :FDDL/INDEX/3. +20 of 308 Tests skipped: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/clsql.asd b/clsql.asd index 5d9adf2..74afd3b 100644 --- a/clsql.asd +++ b/clsql.asd @@ -101,7 +101,7 @@ oriented interface." (operate 'test-op 'clsql-tests :force t)) (defmethod perform :after ((o load-op) (c (eql (find-system 'clsql)))) - (let* ((init-var (uffi:getenv "CLSQLINIT")) + (let* ((init-var (uffi::getenv "CLSQLINIT")) (init-file (or (when init-var (probe-file init-var)) (probe-file (concatenate 'string diff --git a/sql/conditions.lisp b/sql/conditions.lisp index 1969b96..e198052 100644 --- a/sql/conditions.lisp +++ b/sql/conditions.lisp @@ -151,8 +151,9 @@ connection is no longer usable.")) (defun error-converting-value (val type &optional (database *default-database*)) (restart-case - (error 'sql-value-conversion-error - :expected-type type :value val :database database) + (error (make-condition + 'sql-value-conversion-error + :expected-type type :value val :database database)) (continue () :report "Continue using the unconverted value" (values val t)) diff --git a/sql/db-interface.lisp b/sql/db-interface.lisp index 5cdb719..3454a84 100644 --- a/sql/db-interface.lisp +++ b/sql/db-interface.lisp @@ -380,8 +380,8 @@ of TYPE_NAME (keyword) PRECISION SCALE NULLABLE.") (defgeneric db-type-has-auto-increment? (db-type) (:method (db-type) - (declare (ignore db-type) - nil)) + (declare (ignore db-type)) + nil) (:documentation "NIL [default] if database-type supports auto-incrementing columns.")) ;;; Large objects support (Marc Battyani) diff --git a/sql/expressions.lisp b/sql/expressions.lisp index 4c57bc3..4f0baf1 100644 --- a/sql/expressions.lisp +++ b/sql/expressions.lisp @@ -450,8 +450,6 @@ (remove-duplicates tabs :test #'database-identifier-equal)) nil))) - - (defmethod output-sql ((expr sql-value-exp) database) (with-slots (modifier components) expr @@ -1234,3 +1232,16 @@ uninclusive, and the args from that keyword to the end." returns nil if there are no children" (clsql-ors clauses)) + +(defclass sql-escape-string-exp (%sql-expression) + ((string + :initarg :string + :initform nil)) + (:documentation + "An escaped string string expression (postgresql E'stuff') .")) + +(defmethod output-sql ((exp sql-escape-string-exp) database) + (with-slots (string) exp + (when string + (write-char #\E *sql-stream*) + (output-sql string database)))) diff --git a/sql/oodml.lisp b/sql/oodml.lisp index 169fa89..0e4810b 100644 --- a/sql/oodml.lisp +++ b/sql/oodml.lisp @@ -600,29 +600,36 @@ (declare (ignore db-type)) (cond ;; null value or type - ((or (equalp "nil" val) (eql 'null val)) nil) - + ((or (null val) + (equalp "nil" val) + (eql 'null val) + (eql 'null type)) + nil) + ;; no specified type or already the right type ((or (null type) (ignore-errors (typep val type))) val) ;; actually convert - (t + (t (let ((res (handler-bind ;; all errors should be converted to sql-value-conversion-error ((error (lambda (c) - (when *debugger-hook* - (invoke-debugger c)) (unless (typep c 'sql-value-conversion-error) + ;; this was blowing up the tests till I + ;; unbound *debugger-hook* not sure the answer, + ;; as this is also imensely useful in actually + ;; finding bugs below this point + (when *debugger-hook* (invoke-debugger c)) (error-converting-value val type database))))) (call-next-method)))) ;; if we didnt get the right type after converting, we should probably ;; error right away - (maybe-error-converting-value - res val type database))))) + (maybe-error-converting-value res val type database))))) (defmethod read-sql-value (val type database db-type) + "read a sql value, from :around read-eval is disabled read numbers in base 10" ;; errors, nulls and preconverted types are already handled in around (typecase type (symbol @@ -644,7 +651,7 @@ (double-float 'double-float)))) (read-from-string val))) ;; maybe wrong type of float - (float val)) + (float val)) (if (eql type 'double-float) 1.0d0 1.0s0))) (number (read-from-string val)) ((boolean generalized-boolean) @@ -657,7 +664,8 @@ (number (not (zerop val)))))) ((wall-time duration) (parse-timestring val)) (date (parse-datestring val)) - (t (call-next-method)))) + (list (read-from-string val)) + (t (error-converting-value val type database)))) (t (typecase val (string (read-from-string val)) (t (error-converting-value val type database)))))) diff --git a/sql/operations.lisp b/sql/operations.lisp index 37d751e..faa22b5 100644 --- a/sql/operations.lisp +++ b/sql/operations.lisp @@ -46,6 +46,9 @@ (make-instance 'sql-function-exp :name 'all :args rest)) +(defsql sql-e-string (:symbol "E") (&rest rest) + (make-instance 'sql-escape-string-exp :string (first rest))) + (defsql sql-not (:symbol "not") (&rest rest) (make-instance 'sql-value-exp :modifier 'not :components rest)) diff --git a/sql/package.lisp b/sql/package.lisp index 470be84..8915b06 100644 --- a/sql/package.lisp +++ b/sql/package.lisp @@ -37,6 +37,7 @@ #+clsql-cmucl-mop #:mop #+allegro #:mop #+clisp #:clos + #+ecl #:mop #+lispworks #:clos #+scl #:clos #+openmcl #:openmcl-mop) diff --git a/tests/test-init.lisp b/tests/test-init.lisp index d1de92e..8312784 100644 --- a/tests/test-init.lisp +++ b/tests/test-init.lisp @@ -216,7 +216,9 @@ (%do-tests test-forms db-type) - (format *report-stream* "~&Tests skipped:") + (format *report-stream* "~&~D of ~D Tests skipped:" + (length skip-tests) + (length test-forms)) (if skip-tests (let ((max-test-name (length (symbol-name (caar skip-tests))))) (dolist (skipped (cdr skip-tests)) diff --git a/tests/test-oodml.lisp b/tests/test-oodml.lisp index 042fd48..6278d73 100644 --- a/tests/test-oodml.lisp +++ b/tests/test-oodml.lisp @@ -17,6 +17,13 @@ (clsql-sys:file-enable-sql-reader-syntax) +(defmacro has-sql-value-conversion-error (() &body body) + `(let (*debugger-hook*) + (handler-case + (progn ,@body nil) + (clsql-sys::sql-value-conversion-error (c) + (declare (ignore c)) + t)))) (setq *rt-oodml* '( @@ -40,13 +47,32 @@ :foo) (deftest :oodml/read-symbol-value/4-keyword-error - (handler-case - (clsql-sys::read-sql-value - (clsql-sys::database-output-sql-as-type 'keyword 'foo nil nil) - 'keyword nil nil) - (clsql-sys::sql-value-conversion-error (c) (declare (ignore c)) - :error)) - :error) + (has-sql-value-conversion-error () + (clsql-sys::read-sql-value + (clsql-sys::database-output-sql-as-type 'keyword 'foo nil nil) + 'keyword nil nil)) + T) + +(deftest :oodml/read-symbol-value/5-unknown-type-error-1 + (has-sql-value-conversion-error () + (clsql-sys::read-sql-value + (clsql-sys::database-output-sql-as-type 'bloop 'foo nil nil) + 'bloop nil nil)) + t) + +(deftest :oodml/read-symbol-value/6-unknown-type-error-2 + (has-sql-value-conversion-error () + (clsql-sys::read-sql-value + (clsql-sys::database-output-sql-as-type 'bloop 'foo nil nil) + '(or integer float) nil nil)) + t) + +(deftest :oodml/read-symbol-value/read-list + (clsql-sys::read-sql-value + (clsql-sys::database-output-sql-as-type + 'list '(("status" "new" "open")) nil nil) + 'list nil nil) + (("status" "new" "open"))) (deftest :oodml/select/1 (with-dataset *ds-employees*