Yesterday, David said simple solution of yours. I think I found the case of segfault.
--- sqlite3.scm.old 2012-01-24 00:22:10.000000000 +0900
+++ sqlite3.scm 2012-04-29 10:37:37.999722092 +0900
@@ -284,11 +284,11 @@
(let ((bind-blob (pointer->procedure
int
(dynamic-func "sqlite3_bind_blob" libsqlite3)
- (list '* int '* int '*)))
+ (list '* int '* int int)))
(bind-text (pointer->procedure
int
(dynamic-func "sqlite3_bind_text" libsqlite3)
- (list '* int '* int '*)))
+ (list '* int '* int int)))
(bind-int64 (pointer->procedure
int
(dynamic-func "sqlite3_bind_int64" libsqlite3)
@@ -301,8 +301,7 @@
int
(dynamic-func "sqlite3_bind_null" libsqlite3)
(list '* int)))
- (sqlite-transient (bytevector->pointer
- (make-bytevector (sizeof '*) #xff))))
+ (sqlite-transient -1))
(lambda (stmt key val)
(assert-live-stmt! stmt)
(let ((idx (key->index stmt key))
########## cut here ##########
2012/4/27 Sunjoong Lee
<address@hidden>
Same crash on Guile 2.0.5. It looks like string encoding problem. Suppose name be an integer not a string like 10, it would not crash. sqlite-bind of Guile-SQLite3 will deliver this 10 to sqlite3_bind_int64 of libsqlite3. If a string, it will use sqlite3_bind_text of libsqlite3. Before delivering, it will encoding this string to utf-8 string pointer because sqlite3_bind_text need to know string pointer and it's length. I think you or Andy may look around that.
#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1)
I.e, SQLITE_TRANSIENT is actually -1, not some position of memory. sqlite-bind of Guile-SQLite3 had treated it as a pointer, an address of memory position.
--- ex0.scm.old 2012-04-29 10:57:09.717398060 +0900
+++ ex0.scm 2012-04-29 10:39:20.051261614 +0900
@@ -34,7 +34,7 @@
;; This finalize call in particular seems to break things
(sqlite-finalize stmt)
;; This seems to be never reached.
- (display "finalized\n")))
+ (display "finalized\n"))
(display "closing\n")
(sqlite-close db)
\ No newline at end of file