[Haskell-cafe] Weird behaviour with positional parameters in
HDBC-mysql
Martijn van Steenbergen
martijn at van.steenbergen.nl
Wed Apr 7 18:02:44 EDT 2010
Dear café (CC John and Chris),
I'm having some trouble with getting positional parameters in HDBC-mysql
to work. Most of the time they work fine, but sometimes (and often
enough that it's a serious bother) the parameters don't reach the server
correctly.
Let me first describe my setup:
* Ubuntu 8.10 intrepid (inside VMWare Fusion on Mac OS X Snow Leopard)
* mysql Ver 14.12 Distrib 5.0.67, for debian-linux-gnu (i486) using
readline 5.2
* ghc 6.10.3
* HDBC-2.2.4
* HDBC-mysql-0.6.1
I have a database with a single, empty table:
> CREATE TABLE `foo` (
> `id` int(11) NOT NULL auto_increment,
> PRIMARY KEY (`id`)
> ) ENGINE=MyISAM AUTO_INCREMENT=1031 DEFAULT CHARSET=latin1
And I have the following Haskell program:
> import Database.HDBC
> import Database.HDBC.MySQL
> import Data.List
> import Data.Traversable
> import Control.Monad
>
> main :: IO ()
> main = do
> conn <- connectMySQL defaultMySQLConnectInfo
> { mysqlUnixSocket = "/var/run/mysqld/mysqld.sock"
> , mysqlUser = "root"
> , mysqlDatabase = "db"
> }
> for [1..1000] $ \n -> do
> let sql = "select id from foo where id in ("
> ++ intercalate "," (replicate (fromInteger n) "?") ++ ")"
> stmt <- prepare conn sql
> execute stmt (map SqlInteger [1..n])
> finish stmt
> return ()
The program produces no output. All 1000 queries that are sent to the
database are expected to return 0 results, since table foo is empty.
This is all fine.
The problem is in the queries that the server receives. If I turn on
full logging, I expect all queries to have a "where id in (...)" where
there is an increasing list of integers within the parentheses. But when
examining the logs, some are small negative numbers, NULLs or just other
numbers:
> 506 Execute [980] select id from foo where id in
> (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,
> 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,824,825,826,827,828,829,
> 830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,
> 848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,
> 866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,
> 884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,
> 902,903,904,905,906,907,908,0,0,34359738368,-5210566582833489576,NULL,
> NULL,0,34359738368,-5210565758199768552,NULL,NULL,0,34359738368,
> -5210564933566047528,NULL,NULL,0,34359738368,-5210564108932326504,NULL,
> NULL,0,34359738368,-5210563284298605480,NULL,NULL,0,34359738368,
> -5210562459664884456,NULL,NULL,158,159,160,161,162,(snip)
The server then faithfully executes the statement and returns the
results expected for the query it reports to have received, which (in a
table with actual data) is not what the Haskell program was expecting.
If I compile the program once, the results vary per run.
If I don't use positional parameters but instead render the full SQL
query myself, there is no problem.
Is this a problem in HDBC or in HDBC-mysql?
What's going on here? How do I fix or work around this?
Many thanks,
Martijn.
More information about the Haskell-Cafe
mailing list