Fredrik Karlsson wrote:

> package require sqlite3
> sqlite3 db :memory:
> db eval {create table a (id INTEGER);}
> db eval {insert into a values (1);}
> db eval {insert into a values (2);}
> db eval {select * from a where id in (1,3);} vals {parray vals}
> vals(*)  = id
> vals(id) = 1
> set alist [list 1 3]
> 1 3
> db eval {select * from a where id in $alist;} vals {parray vals}
> near "$alist": syntax error
> --------------

This implies that the manner in which $alist gets expanded should be
sensitive to the SQL context in which the expansion happens (and also,
for the purposes of backward compatibility, to the value of the
variable iteslf).  

Unless I'm mistaken that would require pushing the expansion logic down 
much further into sqlite, and probably would still fail in a number of 
cases.

So I doubt you'll get much traction there, especially since this can be 
pretty easily done from your application.

Here's an option off the top of my head:

proc qSqlList {alistname} {
  set magic_array_name _qSql_${alistname}_arr
  upvar $alistname alist $magic_array_name alist_arr
  #assert {[string is list $alist]} ;# or whatever your infra provides
  array unset alist_arr
  set i 0
  set out [list]
  foreach item $alist {
    set alist_arr($i) $item
    lappend out \$${magic_array_name}($i)
    incr i
  }
  return ([join $out ,])
}

So your call becomes:

db eval "select * from a where id in [qSqlList alist]" vals {parray vals}

SQLite does the expansion on the underlying list values with the proper 
sqlite3_bind_* calls etc.

The proc isn't 100% ideal because:

1. it creates this magic array in the caller's scope (not the prettiest
   thing in the world), and

2. for that reason it disallows dumb copies of the return value to float
   around.  You need to make the sqlite call close to where you do the
   quoting.

Still, it might be good enough for your purposes.  Or maybe you can 
expand on the idea, wrap it up into a cleaner interface, and go from there.

Eric

--
Eric A. Smith

Money is the root of all wealth.
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to