(defvar *report-stream* *standard-output* "Stream to send text report.")
(defvar *sexp-report-stream* nil "Stream to send sexp report.")
-(defvar *rt-connection*)
+(defvar *rt-internal*)
(defvar *rt-basic*)
+(defvar *rt-connection*)
(defvar *rt-fddl*)
(defvar *rt-fdml*)
(defvar *rt-ooddl*)
(defvar *test-database-type* nil)
(defvar *test-database-underlying-type* nil)
(defvar *test-database-user* nil)
+(defvar *test-start-utime* nil)
(defclass thing ()
((extraterrestrial :initform nil :initarg :extraterrestrial)))
(married :db-kind :base :accessor married :type boolean
:initarg :married)
(birthday :type clsql:wall-time :initarg :birthday)
+ (bd-utime :type clsql:universal-time :initarg :bd-utime)
(hobby :db-kind :virtual :initarg :hobby :initform nil)))
(def-view-class employee (person)
((emplid
:db-kind :key
- :db-constraints :not-null
+ :db-constraints (:not-null :unique)
:type integer
:initarg :emplid)
(groupid
:initarg :groupid)
(first-name
:accessor first-name
- :type (string 30)
+ :type (varchar 30)
:initarg :first-name)
(last-name
:accessor last-name
- :type (string 30)
+ :type (varchar 30)
:initarg :last-name)
(email
:accessor employee-email
- :type (string 100)
+ :type (varchar 100)
:initarg :email)
(ecompanyid
:type integer
:type integer
:initarg :groupid)
(name
- :type (string 100)
+ :type (varchar 100)
:initarg :name)
(presidentid
:type integer
:type integer
:initarg :street-number)
(street-name
- :type (string 30)
+ :type (varchar 30)
:void-value ""
:initarg :street-name)
(city
:column "city_field"
:void-value "no city"
- :type (string 30)
+ :type (varchar 30)
:initarg :city)
(postal-code
:column zip
:db-info (:join-class address
:home-key aaddressid
:foreign-key addressid
+ :retrieval :immediate))
+ (employee :db-kind :join
+ :db-info (:join-class employee
+ :home-key aemplid
+ :foreign-key emplid
:retrieval :immediate)))
(:base-table "ea_join"))
:set nil)))
(:base-table "ea_join"))
+(def-view-class big ()
+ ((i :type integer :initarg :i)
+ (bi :type bigint :initarg :bi)))
+
(defun test-connect-to-database (db-type spec)
(when (clsql-sys:db-backend-has-create/destroy-db? db-type)
(ignore-errors (destroy-database spec :database-type db-type))
(clsql:create-view-from-class 'employee)
(clsql:create-view-from-class 'company)
(clsql:create-view-from-class 'address)
- (clsql:create-view-from-class 'employee-address))
+ (clsql:create-view-from-class 'employee-address)
+ (clsql:create-view-from-class 'big))
- (let ((*db-auto-sync* t))
+ (setq *test-start-utime* (get-universal-time))
+ (let* ((*db-auto-sync* t)
+ (now-time (clsql:utime->time *test-start-utime*)))
(setf company1 (make-instance 'company
:presidentid 1
:companyid 1
:groupid 1
:married t
:height (1+ (random 1.00))
- :birthday (clsql:get-time)
- :first-name "Vladamir"
+ :bd-utime *test-start-utime*
+ :birthday now-time
+ :first-name "Vladimir"
:last-name "Lenin"
:email "lenin@soviet.org"
:companyid 1)
:groupid 1
:height (1+ (random 1.00))
:married t
- :birthday (clsql:get-time)
+ :bd-utime *test-start-utime*
+ :birthday now-time
:first-name "Josef"
:last-name "Stalin"
:email "stalin@soviet.org"
:groupid 1
:height (1+ (random 1.00))
:married t
- :birthday (clsql:get-time)
+ :bd-utime *test-start-utime*
+ :birthday now-time
:first-name "Leon"
:last-name "Trotsky"
:email "trotsky@soviet.org"
:groupid 1
:height (1+ (random 1.00))
:married nil
- :birthday (clsql:get-time)
+ :bd-utime *test-start-utime*
+ :birthday now-time
:first-name "Nikita"
:last-name "Kruschev"
:email "kruschev@soviet.org"
:groupid 1
:married nil
:height (1+ (random 1.00))
- :birthday (clsql:get-time)
+ :bd-utime *test-start-utime*
+ :birthday now-time
:first-name "Leonid"
:last-name "Brezhnev"
:email "brezhnev@soviet.org"
:groupid 1
:married nil
:height (1+ (random 1.00))
- :birthday (clsql:get-time)
+ :bd-utime *test-start-utime*
+ :birthday now-time
:first-name "Yuri"
:last-name "Andropov"
:email "andropov@soviet.org"
:groupid 1
:height (1+ (random 1.00))
:married nil
- :birthday (clsql:get-time)
+ :bd-utime *test-start-utime*
+ :birthday now-time
:first-name "Konstantin"
:last-name "Chernenko"
:email "chernenko@soviet.org"
:groupid 1
:height (1+ (random 1.00))
:married nil
- :birthday (clsql:get-time)
+ :bd-utime *test-start-utime*
+ :birthday now-time
:first-name "Mikhail"
:last-name "Gorbachev"
:email "gorbachev@soviet.org"
:groupid 1
:married nil
:height (1+ (random 1.00))
- :birthday (clsql:get-time)
+ :bd-utime *test-start-utime*
+ :birthday now-time
:first-name "Boris"
:last-name "Yeltsin"
:email "yeltsin@soviet.org"
:groupid 1
:married nil
:height (1+ (random 1.00))
- :birthday (clsql:get-time)
- :first-name "Vladamir"
+ :bd-utime *test-start-utime*
+ :birthday now-time
+ :first-name "Vladimir"
:last-name "Putin"
:email "putin@soviet.org"
:managerid 1
:verified nil)
employee-address5 (make-instance 'employee-address
:emplid 3
- :addressid 2)
- ))
+ :addressid 2))
+
+ (let ((max (expt 2 60)))
+ (dotimes (i 555)
+ (make-instance 'big :i (1+ i) :bi (truncate max (1+ i))))))
;; sleep to ensure birthdays are no longer at current time
(sleep 1)
(defun compute-tests-for-backend (db-type db-underlying-type)
(let ((test-forms '())
(skip-tests '()))
- (dolist (test-form (append *rt-connection* *rt-basic* *rt-fddl* *rt-fdml*
+ (dolist (test-form (append *rt-internal* *rt-connection* *rt-basic* *rt-fddl* *rt-fdml*
*rt-ooddl* *rt-oodml* *rt-syntax*))
(let ((test (second test-form)))
(cond
:fdml/select/21 :fdml/select/32
:fdml/select/33))
(push (cons test "not supported by sqlite") skip-tests))
+ ((and (eql *test-database-type* :sqlite3)
+ (clsql-sys:in test :fddl/view/4 :fdml/select/10
+ :fdml/select/21 :fdml/select/32
+ :fdml/select/33))
+ (push (cons test "not supported by sqlite3") skip-tests))
((and (not (clsql-sys:db-type-has-bigint? db-type))
(clsql-sys:in test :basic/bigint/1))
(push (cons test "bigint not supported") skip-tests))
(clsql-sys:in test :fdml/query/6 :fdml/select/31))
(push (cons test "union not supported") skip-tests))
((and (eq *test-database-type* :oracle)
- (clsql-sys:in test :fdml/query/8 :fdml/select/21))
+ (clsql-sys:in test :fdml/query/8 :fdml/select/21
+ :fddl/table/6))
(push (cons test "syntax not supported") skip-tests))
+ ((and (eq *test-database-type* :odbc)
+ (eq *test-database-underlying-type* :postgresql)
+ (clsql-sys:in test :fddl/owner/1))
+ (push (cons test "table ownership not supported by postgresql odbc driver") skip-tests))
+ ((and (not (member *test-database-underlying-type*
+ '(:postgresql :oracle)))
+ (clsql-sys:in test :fddl/owner/1))
+ (push (cons test "table ownership not supported") skip-tests))
+ ((and (null (clsql-sys:db-type-has-intersect? db-underlying-type))
+ (clsql-sys:in test :fdml/query/7))
+ (push (cons test "intersect not supported") skip-tests))
+ ((and (null (clsql-sys:db-type-has-except? db-underlying-type))
+ (clsql-sys:in test :fdml/query/8))
+ (push (cons test "except not supported") skip-tests))
+ ((and (eq *test-database-underlying-type* :mssql)
+ (clsql-sys:in test :fdml/select/9))
+ (push (cons test "mssql uses integer math for AVG") skip-tests))
+ ((and (not (member *test-database-underlying-type*
+ '(:postgresql :mysql :sqlite3)))
+ (clsql-sys:in test :fdml/select/37 :fdml/select/38))
+ (push (cons test "LIMIT keyword not supported in SELECT") skip-tests))
(t
(push test-form test-forms)))))
(values (nreverse test-forms) (nreverse skip-tests))))
-
(defun rapid-load (type &optional (position 0))
"Rapid load for interactive testing."
(when *default-database*