haskelldb-0.12: src/Database/HaskellDB/Sql/MySQL.hs
-----------------------------------------------------------
-- |
-- 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)