fukamachi / mito

An ORM for Common Lisp with migrations, relationships and PostgreSQL support
292 stars 31 forks source link

Boolean type not handling T value correctly when inserting #130

Open dannyob opened 1 year ago

dannyob commented 1 year ago

The SQL generator appears to fall over when given a DAO with a boolean column type set to T. Here's my minimal testcase:

  (asdf:load-system "mito")
  (mito:connect-toplevel :sqlite3 :database-name #P":memory:")
  (mito:deftable foo () ((bar :col-type (:boolean))))
  (mito:ensure-table-exists 'foo)
  (mito:insert-dao (make-instance 'foo :bar T))

Backtrace on my machine:

;; CREATE TABLE "foo" (
;;     "id" INTEGER PRIMARY KEY AUTOINCREMENT,
;;     "bar" BOOLEAN NOT NULL,
;;     "created_at" TIMESTAMP,
;;     "updated_at" TIMESTAMP
;; ) () [0 rows]
;; CREATE TABLE "foo" (
;;     "id" INTEGER PRIMARY KEY AUTOINCREMENT,
;;     "bar" BOOLEAN NOT NULL,
;;     "created_at" TIMESTAMP,
;;     "updated_at" TIMESTAMP
;; ) () [0 rows]
While evaluating the form starting at line 5, column 2
  of #P"/home/danny/tmp/testcase.lisp":
Unhandled TYPE-ERROR in thread #<SB-THREAD:THREAD tid=560023 "main thread" RUNNING
                                  {100AEF81B3}>:
  The value
    (#S(SXQL.SQL-TYPE:SQL-SYMBOL :NAME "bar") T
     #S(SXQL.SQL-TYPE:SQL-SYMBOL :NAME "created_at")
     #S(SXQL.SQL-TYPE:SQL-VARIABLE :VALUE "2023-09-17 21:27:02.989690Z")
     #S(SXQL.SQL-TYPE:SQL-SYMBOL :NAME "updated_at")
     #S(SXQL.SQL-TYPE:SQL-VARIABLE :VALUE "2023-09-17 21:27:02.989690Z"))

  is not of type
    (OR
     (AND (SATISFIES SXQL.SQL-TYPE:SQL-EXPRESSION-LIST-P)
          (SATISFIES TRIVIAL-TYPES:PROPER-LIST-P) CONS)
     (AND (SATISFIES SXQL.SQL-TYPE:SQL-EXPRESSION-LIST-P)
          (SATISFIES TRIVIAL-TYPES:PROPER-LIST-P) NULL))

Backtrace for: #<SB-THREAD:THREAD tid=560023 "main thread" RUNNING {100AEF81B3}>
0: (SXQL.CLAUSE::%MAKE-SET=-CLAUSE #S(SXQL.SQL-TYPE:SQL-SYMBOL :NAME "bar") T #S(SXQL.SQL-TYPE:SQL-SYMBOL :NAME "created_at") #S(SXQL.SQL-TYPE:SQL-VARIABLE :VALUE "2023-09-17 21:27:02.989690Z") #S(SXQL.SQL-TYPE:SQL-SYMBOL :NAME "updated_at") #S(SXQL.SQL-TYPE:SQL-VARIABLE :VALUE "2023-09-17 21:27:02.989690Z"))
1: ((:METHOD MITO.DAO:INSERT-DAO (MITO.DAO.MIXIN:DAO-CLASS)) #<FOO {10078594B3}>) [fast-method]
2: ((SB-PCL::EMF MITO.DAO:INSERT-DAO) #<unused argument> #<unused argument> #<FOO {10078594B3}>)
3: (SB-INT:SIMPLE-EVAL-IN-LEXENV (MITO.DAO:INSERT-DAO (MAKE-INSTANCE (QUOTE FOO) :BAR T)) #<NULL-LEXENV>)
4: (EVAL-TLF (MITO.DAO:INSERT-DAO (MAKE-INSTANCE (QUOTE FOO) :BAR T)) 4 NIL)
5: ((LABELS SB-FASL::EVAL-FORM :IN SB-INT:LOAD-AS-SOURCE) (MITO.DAO:INSERT-DAO (MAKE-INSTANCE (QUOTE FOO) :BAR T)) 4)
6: ((LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) (MITO.DAO:INSERT-DAO (MAKE-INSTANCE (QUOTE FOO) :BAR T)) :CURRENT-INDEX 4)
7: (SB-C::%DO-FORMS-FROM-INFO #<FUNCTION (LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) {1006FB5A9B}> #<SB-C::SOURCE-INFO {1006FBC423}> SB-C::INPUT-ERROR-IN-LOAD)
8: (SB-INT:LOAD-AS-SOURCE #<SB-INT:FORM-TRACKING-STREAM for "file /home/danny/tmp/testcase.lisp" {1006FB4B43}> :VERBOSE NIL :PRINT NIL :CONTEXT "loading")
9: ((LABELS SB-FASL::LOAD-STREAM-1 :IN LOAD) #<SB-INT:FORM-TRACKING-STREAM for "file /home/danny/tmp/testcase.lisp" {1006FB4B43}> NIL)
10: (SB-FASL::CALL-WITH-LOAD-BINDINGS #<FUNCTION (LABELS SB-FASL::LOAD-STREAM-1 :IN LOAD) {7F58A1F5F88B}> #<SB-INT:FORM-TRACKING-STREAM for "file /home/danny/tmp/testcase.lisp" {1006FB4B43}> NIL #<SB-INT:FORM-TRACKING-STREAM for "file /home/danny/tmp/testcase.lisp" {1006FB4B43}>)
11: (LOAD #P"testcase.lisp" :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST :ERROR :EXTERNAL-FORMAT :DEFAULT)
12: (SB-IMPL::PROCESS-EVAL/LOAD-OPTIONS ((:LOAD . "testcase.lisp")))
13: (SB-IMPL::TOPLEVEL-INIT)
14: ((FLET SB-UNIX::BODY :IN SB-IMPL::START-LISP))
15: ((FLET "WITHOUT-INTERRUPTS-BODY-3" :IN SB-IMPL::START-LISP))
16: (SB-IMPL::%START-LISP)

Machine: Linux 6.1.0-10-amd64 (Debian) Lisp: SBCL 2.3.5 ASDF: 3.3.5 Quicklisp: 2023-06-18 (latest) sqlite3; 3.42.0 2023-05-16 12:36:15 831d0fb2836b71c9bc51067c49fee4b8f18047814f2ff22d817d25195cf350b0

fukamachi commented 1 year ago

Thank you for reporting.

It's because Mito uses SxQL for an SQL builder, and SxQL doesn't care about the type of columns. I suppose it will be a little bit of hard work to implement, but it's great to add.

For now, (set= :column "true") can be used for it.