    -----------------------------------------------------------
    -- |
    -- Module      :  Database.HaskellDB.Sql.PostgreSQL
    -- Copyright   :  Bjorn Bringert 2006
    -- License     :  BSD-style
    --
    -- Maintainer  :  haskelldb-users@lists.sourceforge.net
    -- Stability   :  experimental
    -- Portability :  non-portable
    --
    -- SQL generation for PostgreSQL.
    --
    -----------------------------------------------------------
    module Database.HaskellDB.Sql.PostgreSQL (generator) where

    import Database.HaskellDB.Sql
    import Database.HaskellDB.Sql.Default
    import Database.HaskellDB.Sql.Generate
    import Database.HaskellDB.FieldType
    import Database.HaskellDB.PrimQuery
    import System.Locale
    import System.Time

    generator :: SqlGenerator
    generator = (mkSqlGenerator generator) { sqlSpecial = postgresqlSpecial
                                           , sqlType = postgresqlType
                                           , sqlLiteral = postgresqlLiteral
                                           , sqlExpr = postgresqlExpr
                                           }

    postgresqlSpecial :: SpecialOp -> SqlSelect -> SqlSelect
    postgresqlSpecial op q = defaultSqlSpecial generator op q

    -- Postgres > 7.1 wants a timezone with calendar time.
    postgresqlLiteral :: Literal -> String
    postgresqlLiteral (DateLit d) = defaultSqlQuote generator (formatCalendarTime defaultTimeLocale fmt d)
        where fmt = iso8601DateFormat (Just "%H:%M:%S %Z")
    postgresqlLiteral l = defaultSqlLiteral generator l

    postgresqlType :: FieldType -> SqlType
    postgresqlType BoolT = SqlType "boolean"
    postgresqlType t = defaultSqlType generator t

    postgresqlExpr :: PrimExpr -> SqlExpr
    postgresqlExpr (BinExpr OpMod e1 e2) =
        let e1S = defaultSqlExpr generator e1
            e2S = defaultSqlExpr generator e2
        in BinSqlExpr "%" e1S e2S
    postgresqlExpr e = defaultSqlExpr generator e