[Haskell-cafe] Re: Weird behaviour with positional parameters in
HDBC-mysql
Chris Waterson
waterson at maubi.net
Fri Apr 16 22:07:06 EDT 2010
Hi Martijn, I can reproduce the problem and investigate. My guess is that something is getting garbage collected that shouldn't be...
I'll let you know what I figure out.
thanks,
chris
On Apr 7, 2010, at 3:02 PM, Martijn van Steenbergen wrote:
> 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