----------------------------------------------------------- -- | -- Module : Database.HaskellDB.Sql.MySQL -- Copyright : Bjorn Bringert 2006 -- License : BSD-style -- -- Maintainer : haskelldb-users@lists.sourceforge.net -- Stability : experimental -- Portability : non-portable -- -- SQL generation for MySQL. -- ----------------------------------------------------------- module Database.HaskellDB.Sql.MySQL (generator) where import Database.HaskellDB.Sql import Database.HaskellDB.Sql.Default import Database.HaskellDB.Sql.Generate import Database.HaskellDB.PrimQuery generator :: SqlGenerator generator = (mkSqlGenerator generator) { sqlBinary = mySqlBinary } mySqlBinary :: RelOp -> SqlSelect -> SqlSelect -> SqlSelect mySqlBinary Difference = mySqlDifference mySqlBinary op = defaultSqlBinary generator op {- Hack around the lack of "EXCEPT" in MySql -} mySqlDifference :: SqlSelect -> SqlSelect -> SqlSelect mySqlDifference sel1 sel2 = (toSqlSelect sel1) { criteria = [PrefixSqlExpr "NOT" $ ExistsSqlExpr existsSql] } where existsSql = (toSqlSelect ((toSqlSelect sel2) { attrs = zipWith mkAttr names renames })) { criteria = zipWith mkCond names renames } names = map fst $ attrs sel2 -- attrs sel1 should be the same, but it turned out to -- be undefined in the case I tried renames = map (++"_local") names mkAttr name rename = (rename, ColumnSqlExpr name) mkCond name rename = BinSqlExpr "=" (ColumnSqlExpr name) (ColumnSqlExpr rename)