[Haskell-cafe] Strange error with HDBC-odbc and MySQL

Justin Bailey jgbailey at gmail.com
Mon Dec 29 16:26:56 EST 2008

I have run into a weird bug with HDBC-odbc that only occurs on my unix
system. When I execute a select which returns more than 435 rows twice
in the same process, the second execution fails with this error

 SQL error: SqlError {seState = "[\"HYT00\"]", seNativeError = -1,
seErrorMsg = "connectODBC/sqlDriverConnect: [\"1045:
[unixODBC][MySQL][ODBC 3.51 Driver]Access denied for user
'dummy'@'localhost' (using password: NO)\"]"}

I think HDBC-odbc is at fault because the same query works fine from
ruby. In both cases the unixODBC library is used. isql (the unixODBC
command line utility) also has no problem. I have these software
packages installed:

 ghc 6.8.3
 HDBC 1.1.5
 unixODBC - 2.2.11
 MySQL - 5.0.38
 Linux - 2.6.16-xenU

The program below demonstrates the problem. It does require a table
with 500+ rows. On most production servers, information_schema.columns
will usually do the trick.

import System.Environment
import Database.HDBC
import Database.HDBC.ODBC
import System.IO (hPutStrLn, stderr)
import qualified Data.ByteString.Lazy.Char8 as L

-- Execute with DNS name as only argument. E.g.:
--   ./TestMain localdb
main = do
 [dsn] <- getArgs
 testMatches dsn
 testMatches dsn

testMatches dsn = do
 let handler e = do
       hPutStrLn stderr ("SQL error: " ++ show e)

     -- Execute a statement and return all the rows
     getAllRows conn sql = do
       stmt <- prepare conn sql
       _ <- execute stmt []
       fetchAllRows' stmt

 handleSql handler $ do
   conn <- connectODBC $ "dsn=" ++ dsn
     -- 435 rows works fine, but not 445.
   rows <- getAllRows conn "select 1 from information_schema.columns limit 445"
   let evaledRows = filter (\[id] -> (fromSql id) /= (-1 :: Int)) rows
   putStrLn $ "Got " ++ show (length evaledRows)

More information about the Haskell-Cafe mailing list