[MLton] SQLite3 MLton binding
Wesley W. Terpstra
terpstra at gkec.tu-darmstadt.de
Sat Feb 10 05:15:58 PST 2007
On Feb 9, 2007, at 2:17 PM, Vesa Karvonen wrote:
> Quoting "Wesley W. Terpstra" <terpstra at gkec.tu-darmstadt.de>:
> Just a quick note (I don't have time right now to take a closer
> look at this). Are you familiar with the following article?
> Domain Specific Embedded Compilers
> Daan Leijen, Erik Meijer
> IOW, instead of ad hoc strings of SQL or parameterized SQL templates,
> introduce a (typed) combinator library to express queries.
I've read it now. I'm not particularly convinced. Though it's harsh,
I think it is a lot of dubious work for the developer in order to
make the library harder to use.
1. Despite their effort at making queries safe, the queries still
aren't safe: table structure can be changed by another program after
compilation. eg: "select * from table where x*y=$z" only works if x
and y can be multiplied. If the schema for table changes x to a
string, the binding doesn't do anything but give the user a false
sense of security.
2. Returned columns are only superficially type-safe. The real output
columns might have different types. The staticly compiled expression
has no way of knowing the type of the columns output by the SQL
engine to stop this error---it depends on the schema which the
binding doesn't know.
3. They need to use an inelegant fetch method for each column. My
library asks you the types, and gives you a convenient reader that
converts a row at a time for you.
4. The user has to learn a new set of keywords/meta-language when he
already knows SQL. Their binding also makes queries harder to read,
despite being longer.
5. With such a meta-language you can't allow extensible query results
or user-specified queries.
6. Even if they figured out how to make input and output columns type
safe, the table can be altered and thus breaks any guarantees they
thought they had.
In summary, it seems to me that the only benefit of their proposal is
not having to write the string down. Instead, you use arcane, binding-
specific keywords that eventually create the string you wanted. You
already know SQL, so you knew what string you wanted, so you might as
well have just written it down. Any safety the authors claim to have
added is illusionary, due to the nature of SQL. I guess the compiler
can catch typos in SQL keywords in the string, but so will even
superficial testing. They can't detect logical mistakes due to schema
abuse/changes, and those are exactly the bugs that are hard to track
More information about the MLton