-- Copyright   :  Daan Leijen (c) 1999, daan@cs.uu.nl
--                HWT Group (c) 2003, haskelldb-users@lists.sourceforge.net
-- License     :  BSD-style

module Opaleye.SQLite.Internal.HaskellDB.Sql where


import qualified Data.List.NonEmpty as NEL

-----------------------------------------------------------
-- * SQL data type
-----------------------------------------------------------

newtype SqlTable = SqlTable String deriving Int -> SqlTable -> ShowS
[SqlTable] -> ShowS
SqlTable -> String
(Int -> SqlTable -> ShowS)
-> (SqlTable -> String) -> ([SqlTable] -> ShowS) -> Show SqlTable
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlTable] -> ShowS
$cshowList :: [SqlTable] -> ShowS
show :: SqlTable -> String
$cshow :: SqlTable -> String
showsPrec :: Int -> SqlTable -> ShowS
$cshowsPrec :: Int -> SqlTable -> ShowS
Show

newtype SqlColumn = SqlColumn String deriving Int -> SqlColumn -> ShowS
[SqlColumn] -> ShowS
SqlColumn -> String
(Int -> SqlColumn -> ShowS)
-> (SqlColumn -> String)
-> ([SqlColumn] -> ShowS)
-> Show SqlColumn
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlColumn] -> ShowS
$cshowList :: [SqlColumn] -> ShowS
show :: SqlColumn -> String
$cshow :: SqlColumn -> String
showsPrec :: Int -> SqlColumn -> ShowS
$cshowsPrec :: Int -> SqlColumn -> ShowS
Show

-- | A valid SQL name for a parameter.
type SqlName = String

data SqlOrderNulls = SqlNullsFirst | SqlNullsLast
                   deriving Int -> SqlOrderNulls -> ShowS
[SqlOrderNulls] -> ShowS
SqlOrderNulls -> String
(Int -> SqlOrderNulls -> ShowS)
-> (SqlOrderNulls -> String)
-> ([SqlOrderNulls] -> ShowS)
-> Show SqlOrderNulls
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlOrderNulls] -> ShowS
$cshowList :: [SqlOrderNulls] -> ShowS
show :: SqlOrderNulls -> String
$cshow :: SqlOrderNulls -> String
showsPrec :: Int -> SqlOrderNulls -> ShowS
$cshowsPrec :: Int -> SqlOrderNulls -> ShowS
Show

data SqlOrderDirection = SqlAsc | SqlDesc
                       deriving Int -> SqlOrderDirection -> ShowS
[SqlOrderDirection] -> ShowS
SqlOrderDirection -> String
(Int -> SqlOrderDirection -> ShowS)
-> (SqlOrderDirection -> String)
-> ([SqlOrderDirection] -> ShowS)
-> Show SqlOrderDirection
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlOrderDirection] -> ShowS
$cshowList :: [SqlOrderDirection] -> ShowS
show :: SqlOrderDirection -> String
$cshow :: SqlOrderDirection -> String
showsPrec :: Int -> SqlOrderDirection -> ShowS
$cshowsPrec :: Int -> SqlOrderDirection -> ShowS
Show

data SqlOrder = SqlOrder { SqlOrder -> SqlOrderDirection
sqlOrderDirection :: SqlOrderDirection
                         , SqlOrder -> SqlOrderNulls
sqlOrderNulls     :: SqlOrderNulls }
  deriving Int -> SqlOrder -> ShowS
[SqlOrder] -> ShowS
SqlOrder -> String
(Int -> SqlOrder -> ShowS)
-> (SqlOrder -> String) -> ([SqlOrder] -> ShowS) -> Show SqlOrder
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlOrder] -> ShowS
$cshowList :: [SqlOrder] -> ShowS
show :: SqlOrder -> String
$cshow :: SqlOrder -> String
showsPrec :: Int -> SqlOrder -> ShowS
$cshowsPrec :: Int -> SqlOrder -> ShowS
Show

-- | Expressions in SQL statements.
data SqlExpr = ColumnSqlExpr  SqlColumn
             | BinSqlExpr     String SqlExpr SqlExpr
             | PrefixSqlExpr  String SqlExpr
             | PostfixSqlExpr String SqlExpr
             | FunSqlExpr     String [SqlExpr]
             | AggrFunSqlExpr String [SqlExpr] -- ^ Aggregate functions separate from normal functions.
             | ConstSqlExpr   String
             | CaseSqlExpr    [(SqlExpr,SqlExpr)] SqlExpr
             | ListSqlExpr    [SqlExpr]
             | ParamSqlExpr (Maybe SqlName) SqlExpr
             | PlaceHolderSqlExpr
             | ParensSqlExpr SqlExpr
             | CastSqlExpr String SqlExpr
             | DefaultSqlExpr
  deriving Int -> SqlExpr -> ShowS
[SqlExpr] -> ShowS
SqlExpr -> String
(Int -> SqlExpr -> ShowS)
-> (SqlExpr -> String) -> ([SqlExpr] -> ShowS) -> Show SqlExpr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlExpr] -> ShowS
$cshowList :: [SqlExpr] -> ShowS
show :: SqlExpr -> String
$cshow :: SqlExpr -> String
showsPrec :: Int -> SqlExpr -> ShowS
$cshowsPrec :: Int -> SqlExpr -> ShowS
Show

-- | Data type for SQL UPDATE statements.
data SqlUpdate  = SqlUpdate SqlTable [(SqlColumn,SqlExpr)] [SqlExpr]

-- | Data type for SQL DELETE statements.
data SqlDelete  = SqlDelete SqlTable [SqlExpr]

--- | Data type for SQL INSERT statements.
data SqlInsert  = SqlInsert SqlTable [SqlColumn] (NEL.NonEmpty [SqlExpr])