r10077: * multiple: Apply patch from Joerg Hoehle with multiple
[clsql.git] / tests / test-fdml.lisp
index 0286b2d807a0034efcb6831b7f1a9d98f291f00c..f067e1e48c3465352a7303796fa5cff20068786c 100644 (file)
@@ -1,7 +1,7 @@
 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
 ;;;; ======================================================================
 ;;;; File:    test-fdml.lisp
 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
 ;;;; ======================================================================
 ;;;; File:    test-fdml.lisp
-;;;; Author:  Marcus Pearce <m.t.pearce@city.ac.uk>
+;;;; Author:  Marcus Pearce <m.t.pearce@city.ac.uk>, Kevin Rosenberg
 ;;;; Created: 30/03/2004
 ;;;; Updated: $Id$
 ;;;;
 ;;;; Created: 30/03/2004
 ;;;; Updated: $Id$
 ;;;;
        
 ;; inserts a record using all values only and then deletes it 
 (deftest :fdml/insert/1
        
 ;; inserts a record using all values only and then deletes it 
 (deftest :fdml/insert/1
-    (progn
+    (let ((now (get-universal-time)))
       (clsql:insert-records :into [employee] 
       (clsql:insert-records :into [employee] 
-                           :values `(11 1 "Yuri" "Gagarin" "gagarin@soviet.org"
-                                     1 1 1.85 t ,(clsql:get-time)))
+       :values `(11 1 "Yuri" "Gagarin" "gagarin@soviet.org"
+                   1 1 1.85 t ,(clsql:utime->time now) ,now))
       (values 
        (clsql:select [first-name] [last-name] [email]
                     :from [employee] :where [= [emplid] 11])
       (values 
        (clsql:select [first-name] [last-name] [email]
                     :from [employee] :where [= [emplid] 11])
     (let ((count (caar (clsql:query "SELECT COUNT(*) FROM EMPLOYEE WHERE (EMAIL LIKE '%org')" :field-names nil))))
       (if (stringp count)
          (nth-value 0 (parse-integer count))
     (let ((count (caar (clsql:query "SELECT COUNT(*) FROM EMPLOYEE WHERE (EMAIL LIKE '%org')" :field-names nil))))
       (if (stringp count)
          (nth-value 0 (parse-integer count))
-       count))
+         (nth-value 0 (truncate count))))
   10)
 
 (deftest :fdml/query/2
   10)
 
 (deftest :fdml/query/2
   t)
   
 (deftest :fdml/query/5
   t)
   
 (deftest :fdml/query/5
- (clsql:query (clsql:sql [select [first-name] [sum [emplid]] :from [employee]] 
-                       [group-by [first-name]] [order-by [sum [emplid]]])
-              :field-names nil :result-types nil)
- (("Josef" "2") ("Leon" "3") ("Nikita" "4") ("Leonid" "5") ("Yuri" "6")
-  ("Konstantin" "7") ("Mikhail" "8") ("Boris" "9") ("Vladamir" "11")))
+    (let ((res (clsql:query (clsql:sql [select [first-name] [sum [emplid]] :from [employee]] 
+                                      [group-by [first-name]] [order-by [sum [emplid]]])
+                           :field-names nil :result-types nil)))
+      (mapcar (lambda (p) (list (car p) (truncate (read-from-string (second p)))))
+             res))
+  (("Josef" 2) ("Leon" 3) ("Nikita" 4) ("Leonid" 5) ("Yuri" 6)
+  ("Konstantin" 7) ("Mikhail" 8) ("Boris" 9) ("Vladamir" 11)))
 
 (deftest :fdml/query/6
 
 (deftest :fdml/query/6
- (clsql:query (clsql:sql [union [select [emplid] :from [employee]] 
-                        [select [groupid] :from [company]]])
-              :field-names nil :result-types nil :flatp t)
- ("1" "2" "3" "4" "5" "6" "7" "8" "9" "10"))
+    (let ((res (clsql:query (clsql:sql [union [select [emplid] :from [employee]] 
+                                      [select [groupid] :from [company]]])
+                           :field-names nil :result-types nil :flatp t)))
+      (values (every #'stringp res)
+             (mapcar #'(lambda (f) (truncate (read-from-string f))) res)))
+  t (1 2 3 4 5 6 7 8 9 10))
 
 (deftest :fdml/query/7
 
 (deftest :fdml/query/7
- (clsql:query (clsql:sql [intersect [select [emplid] :from [employee]] 
-                        [select [groupid] :from [company]]])
-              :field-names nil :result-types nil :flatp t)
- ("1"))
+    (let ((res (car (clsql:query (clsql:sql [intersect [select [emplid] :from [employee]] 
+                                           [select [groupid] :from [company]]])
+                                :field-names nil :result-types nil :flatp t))))
+      (values (stringp res)
+             (nth-value 0 (truncate (read-from-string res)))))
+  t 1)
 
 (deftest :fdml/query/8
 
 (deftest :fdml/query/8
- (clsql:query (clsql:sql [except [select [emplid] :from [employee]] 
-                        [select [groupid] :from [company]]])
-              :field-names nil :result-types nil :flatp t)
- ("2" "3" "4" "5" "6" "7" "8" "9" "10")) 
+    (let ((res (clsql:query (clsql:sql [except [select [emplid] :from [employee]] 
+                                      [select [groupid] :from [company]]])
+                           :field-names nil :result-types nil :flatp t)))
+      (values (every #'stringp res)
+             (mapcar #'(lambda (f) (truncate (read-from-string f))) res)))
+  t (2 3 4 5 6 7 8 9 10))
+
 
 (deftest :fdml/execute-command/1
     (values
 
 (deftest :fdml/execute-command/1
     (values
   "Yuri"))
 
 (deftest :fdml/select/3
   "Yuri"))
 
 (deftest :fdml/select/3
-    (clsql:select [first-name] [count [*]] :from [employee]
-                         :result-types nil 
-                         :group-by [first-name]
-                         :order-by [first-name]
-                         :field-names nil)
- (("Boris" "1") ("Josef" "1") ("Konstantin" "1") ("Leon" "1") ("Leonid" "1")
-  ("Mikhail" "1") ("Nikita" "1") ("Vladamir" "2") ("Yuri" "1")))
+    (let ((res (clsql:select [first-name] [count [*]] :from [employee]
+                            :result-types nil 
+                            :group-by [first-name]
+                            :order-by [first-name]
+                            :field-names nil)))
+      (mapcar (lambda (p) (list (car p) (truncate (read-from-string (second p)))))
+             res))
+  (("Boris" 1) ("Josef" 1) ("Konstantin" 1) ("Leon" 1) ("Leonid" 1)
+   ("Mikhail" 1) ("Nikita" 1) ("Vladamir" 2) ("Yuri" 1)))
 
 (deftest :fdml/select/4
     (clsql:select [last-name] :from [employee] 
 
 (deftest :fdml/select/4
     (clsql:select [last-name] :from [employee] 
  (1 1 1 1 1 1 1 1 1 1))
 
 (deftest :fdml/select/7
  (1 1 1 1 1 1 1 1 1 1))
 
 (deftest :fdml/select/7
-    (clsql:select [max [emplid]] :from [employee] :flatp t 
-                 :field-names nil :result-types nil)
-  ("10"))
+    (let ((result (car (clsql:select [max [emplid]] :from [employee] :flatp t 
+                                    :field-names nil :result-types nil))))
+      (values 
+       (stringp result)
+       (nth-value 0 (truncate (read-from-string result)))))
+  t 10)
 
 (deftest :fdml/select/8
 
 (deftest :fdml/select/8
-    (clsql:select [min [emplid]] :from [employee] :flatp t 
-                 :field-names nil :result-types nil)
-  ("1"))
+    (let ((result (car (clsql:select [min [emplid]] :from [employee] :flatp t 
+                                    :field-names nil :result-types nil))))
+      (values
+       (stringp result)
+       (nth-value 0 (truncate (read-from-string result)))))
+  t 1)
 
 (deftest :fdml/select/9
     (subseq 
 
 (deftest :fdml/select/9
     (subseq 
  ("1" "2" "3" "4"))
 
 (deftest :fdml/select/21 
  ("1" "2" "3" "4"))
 
 (deftest :fdml/select/21 
-  (clsql:select [substr [first-name] 1 4] :from [employee] 
+  (clsql:select [substring [first-name] 1 4] :from [employee] 
                 :flatp t :order-by [emplid] :field-names nil)
  ("Vlad" "Jose" "Leon" "Niki" "Leon" "Yuri" "Kons" "Mikh" "Bori" "Vlad"))
 
 (deftest :fdml/select/22 
                 :flatp t :order-by [emplid] :field-names nil)
  ("Vlad" "Jose" "Leon" "Niki" "Leon" "Yuri" "Kons" "Mikh" "Bori" "Vlad"))
 
 (deftest :fdml/select/22 
-  (clsql:select [\|\| [first-name] " " [last-name]] :from [employee]
+  (clsql:select [|| [first-name] " " [last-name]] :from [employee]
                 :flatp t :order-by [emplid] :field-names nil)
  ("Vladamir Lenin" "Josef Stalin" "Leon Trotsky" "Nikita Kruschev"
  "Leonid Brezhnev" "Yuri Andropov" "Konstantin Chernenko" "Mikhail Gorbachev"
                 :flatp t :order-by [emplid] :field-names nil)
  ("Vladamir Lenin" "Josef Stalin" "Leon Trotsky" "Nikita Kruschev"
  "Leonid Brezhnev" "Yuri Andropov" "Konstantin Chernenko" "Mikhail Gorbachev"
  ("Boris" "Josef" "Konstantin" "Leon" "Leonid" "Mikhail" "Nikita" "Vladamir"
   "Yuri"))
 
  ("Boris" "Josef" "Konstantin" "Leon" "Leonid" "Mikhail" "Nikita" "Vladamir"
   "Yuri"))
 
-;(deftest :fdml/select/11
-;    (clsql:select [emplid] :from [employee]
-;                :where [= [emplid] [any [select [companyid] :from [company]]]]
-;                :flatp t)
-;  ("1"))
+(deftest :fdml/select/25
+ (clsql:select [first-name] :from (clsql-sys:convert-to-db-default-case "employee" *default-database*)
+  :flatp t :distinct t
+  :field-names nil 
+  :result-types nil 
+  :order-by [first-name])
+ ("Boris" "Josef" "Konstantin" "Leon" "Leonid" "Mikhail" "Nikita" "Vladamir"
+  "Yuri"))
+
+(deftest :fdml/select/26
+ (clsql:select ["table" first-name] ["table" last-name] 
+  :from '([employee "table"] [employee "join"])
+  :where [and [= ["table" first-name] 
+                 ["join" first-name]]
+              [not [= ["table" emplid] 
+                      ["join" emplid]]]]
+  :order-by '(["table" last-name])
+  :result-types nil :field-names nil)
+ (("Vladamir" "Lenin") ("Vladamir" "Putin")))
+
+(deftest :fdml/select/27 
+    (mapcar
+     (lambda (f) (truncate (read-from-string f)))
+     (clsql:select [coalesce [managerid] 10] :from [employee] :order-by [emplid]
+                  :field-names nil :result-types nil :flatp t))
+  (10 1 1 1 1 1 1 1 1 1))
+  
+(deftest :fdml/select/28 
+    (mapcar
+     (lambda (f) (truncate (read-from-string (car f))))
+     (loop for column in `([*] [emplid]) collect         
+          (clsql:select [count column] :from [employee] 
+                        :flatp t :result-types nil :field-names nil)))
+ (10 10))
+
+(deftest :fdml/select/29 
+ (clsql:select [first-name] [last-name] :from [employee] 
+                       :result-types nil :field-names nil 
+                       :order-by '(([first-name] :asc) ([last-name] :desc)))
+ (("Boris" "Yeltsin") ("Josef" "Stalin") ("Konstantin" "Chernenko")
+  ("Leon" "Trotsky") ("Leonid" "Brezhnev") ("Mikhail" "Gorbachev")
+  ("Nikita" "Kruschev") ("Vladamir" "Putin") ("Vladamir" "Lenin")
+  ("Yuri" "Andropov")))
+
+(deftest :fdml/select/30 
+ (clsql:select [first-name] [last-name] :from [employee] 
+                       :result-types nil :field-names nil 
+                       :order-by '(([first-name] :asc) ([last-name] :asc)))
+ (("Boris" "Yeltsin") ("Josef" "Stalin") ("Konstantin" "Chernenko")
+  ("Leon" "Trotsky") ("Leonid" "Brezhnev") ("Mikhail" "Gorbachev")
+  ("Nikita" "Kruschev") ("Vladamir" "Lenin") ("Vladamir" "Putin")
+  ("Yuri" "Andropov")))
+
+(deftest :fdml/select/31
+ (clsql:select [last-name] :from [employee]                   
+              :set-operation [union [select [first-name] :from [employee]
+                                            :order-by [last-name]]]
+              :flatp t
+              :result-types nil 
+              :field-names nil)
+ ("Andropov" "Boris" "Brezhnev" "Chernenko" "Gorbachev" "Josef" "Konstantin"
+ "Kruschev" "Lenin" "Leon" "Leonid" "Mikhail" "Nikita" "Putin" "Stalin"
+ "Trotsky" "Vladamir" "Yeltsin" "Yuri"))
+
+(deftest :fdml/select/32
+    (clsql:select [emplid] :from [employee]
+                :where [= [emplid] [any [select [companyid] :from [company]]]]
+                :flatp t :result-types nil :field-names nil)
+  ("1"))
+
+(deftest :fdml/select/33
+ (clsql:select [last-name] :from [employee] 
+              :where [> [emplid] [all [select [groupid] :from [employee]]]]
+              :order-by [last-name] 
+              :flatp t :result-types nil :field-names nil)
+("Andropov" "Brezhnev" "Chernenko" "Gorbachev" "Kruschev" "Putin" "Stalin"
+ "Trotsky" "Yeltsin"))
+
+(deftest :fdml/select/34
+  (loop for x from 1 below 5
+   collect
+   (car
+    (clsql:select [last-name] :from [employee] 
+                 :where [= [emplid] x]
+                 :flatp t :result-types nil :field-names nil)))
+  ("Lenin" "Stalin" "Trotsky" "Kruschev"))
+
+;; test escaping of single quotes 
+(deftest :fdml/select/35 
+    (clsql:select "What's up doc?" :from [employee] :flatp t :field-names nil)
+  ("What's up doc?" "What's up doc?" "What's up doc?" "What's up doc?"
+   "What's up doc?" "What's up doc?" "What's up doc?" "What's up doc?"
+   "What's up doc?" "What's up doc?"))
+
+;; test proper treatment of backslash (depending on backend) 
+(deftest :fdml/select/36
+    (clsql:select "foo\\bar\\baz" :from [employee] :flatp t :field-names nil)
+ ("foo\\bar\\baz" "foo\\bar\\baz" "foo\\bar\\baz" "foo\\bar\\baz" 
+  "foo\\bar\\baz"  "foo\\bar\\baz" "foo\\bar\\baz" "foo\\bar\\baz" 
+  "foo\\bar\\baz" "foo\\bar\\baz"))
 
 (deftest :fdml/do-query/1
     (let ((result '()))
 
 (deftest :fdml/do-query/1
     (let ((result '()))
                             :order-by [last-name]])
   #("Andropov" "Brezhnev" "Chernenko" "Gorbachev" "Kruschev" "Lenin" "Putin"
     "Stalin" "Trotsky" "Yeltsin"))
                             :order-by [last-name]])
   #("Andropov" "Brezhnev" "Chernenko" "Gorbachev" "Kruschev" "Lenin" "Putin"
     "Stalin" "Trotsky" "Yeltsin"))
+
+(deftest :fdml/map-query/3 
+ (clsql:map-query 'list #'identity
+                  [select [last-name] :from [employee] :order-by [last-name]])
+ (("Andropov") ("Brezhnev") ("Chernenko") ("Gorbachev") ("Kruschev") ("Lenin")
+  ("Putin") ("Stalin") ("Trotsky") ("Yeltsin")))
+
+(deftest :fdml/map-query/4 
+ (clsql:map-query 'list #'identity
+                  [select [first-name] [last-name] :from [employee] 
+                          :order-by [last-name]])
+ (("Yuri" "Andropov") ("Leonid" "Brezhnev") ("Konstantin" "Chernenko")
+  ("Mikhail" "Gorbachev") ("Nikita" "Kruschev") ("Vladamir" "Lenin")
+  ("Vladamir" "Putin") ("Josef" "Stalin") ("Leon" "Trotsky") 
+  ("Boris" "Yeltsin")))
   
 (deftest :fdml/loop/1
     (loop for (forename surname)
   
 (deftest :fdml/loop/1
     (loop for (forename surname)
                          :flatp t)
             results)
       (apply #'values (nreverse results)))
                          :flatp t)
             results)
       (apply #'values (nreverse results)))
-  nil :committed nil ("lenin-nospam@soviet.org") :committed
-  nil ("lenin@soviet.org"))
+  nil nil nil ("lenin-nospam@soviet.org") nil nil ("lenin@soviet.org"))
 
 ;; runs a valid update and an invalid one within a transaction and checks
 ;; that the valid update is rolled back when the invalid one fails. 
 
 ;; runs a valid update and an invalid one within a transaction and checks
 ;; that the valid update is rolled back when the invalid one fails. 
                                  :av-pairs
                                  '((emale "lenin-nospam@soviet.org"))
                                  :where [= [emplid] 1]))
                                  :av-pairs
                                  '((emale "lenin-nospam@soviet.org"))
                                  :where [= [emplid] 1]))
-        (clsql:clsql-error ()
+        (clsql:sql-database-error ()
           (progn
             ;; check status 
             (push (clsql:in-transaction-p) results)
           (progn
             ;; check status 
             (push (clsql:in-transaction-p) results)
             (apply #'values (nreverse results))))))
   nil nil ("lenin@soviet.org"))
 
             (apply #'values (nreverse results))))))
   nil nil ("lenin@soviet.org"))
 
+
 ))
 
 #.(clsql:restore-sql-reader-syntax-state)
 ))
 
 #.(clsql:restore-sql-reader-syntax-state)