2026-09-24 21:28:49 +08:00
|
|
|
module ChuSQL.Syntax.AST (Statement (..), FromClause (..), Expr (..), SortDir (..), makeSelect) where
|
2026-09-19 19:22:50 +08:00
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
import ChuSQL.Model (Column (..))
|
2026-09-24 15:37:55 +08:00
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- 语法树:语句、数据来源、条件表达式、排序方向。
|
|
|
|
|
|
|
|
|
|
-- * 语句
|
2026-09-24 23:56:07 +08:00
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- | 一条语句:查 / 加 / 删 / 改 / 建表 / 删表
|
|
|
|
|
data Statement
|
2026-09-19 19:22:50 +08:00
|
|
|
= Select
|
|
|
|
|
{ selectCols :: [String]
|
2026-09-19 22:42:22 +08:00
|
|
|
, selectFrom :: FromClause
|
2026-09-19 19:22:50 +08:00
|
|
|
, selectWhere :: Maybe Expr
|
|
|
|
|
, selectOrderBy :: [(String, SortDir)]
|
|
|
|
|
, selectLimit :: Maybe Int
|
|
|
|
|
}
|
|
|
|
|
| Insert String [String] [Expr]
|
|
|
|
|
| Delete String (Maybe Expr)
|
|
|
|
|
| Update String [(String, Expr)] (Maybe Expr)
|
2026-09-24 21:28:49 +08:00
|
|
|
| CreateTable String [(String, Column)]
|
|
|
|
|
| DropTable String
|
2026-09-19 19:22:50 +08:00
|
|
|
deriving (Show, Eq)
|
|
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- | 数据来源:单表,或两表拼接
|
2026-09-19 22:42:22 +08:00
|
|
|
data FromClause
|
|
|
|
|
= FromTable (Maybe String) String
|
|
|
|
|
| FromJoin FromClause (Maybe String) String Expr
|
|
|
|
|
deriving (Show, Eq)
|
|
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- * 表达式
|
2026-09-24 23:56:07 +08:00
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- | 条件表达式
|
2026-09-19 19:22:50 +08:00
|
|
|
data Expr
|
|
|
|
|
= Col String
|
|
|
|
|
| LitInt Int
|
|
|
|
|
| LitStr String
|
2026-09-21 23:44:37 +08:00
|
|
|
| LitBool Bool
|
2026-09-19 19:22:50 +08:00
|
|
|
| Gt Expr Expr
|
|
|
|
|
| Lt Expr Expr
|
|
|
|
|
| Eq Expr Expr
|
|
|
|
|
| And Expr Expr
|
|
|
|
|
| Or Expr Expr
|
|
|
|
|
deriving (Show, Eq)
|
|
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- * 排序
|
2026-09-24 23:56:07 +08:00
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- | 排序方向
|
2026-09-19 19:22:50 +08:00
|
|
|
data SortDir
|
|
|
|
|
= Asc
|
|
|
|
|
| Desc
|
|
|
|
|
deriving (Show, Eq)
|
|
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- * 构造
|
2026-09-24 23:56:07 +08:00
|
|
|
|
2026-09-24 21:28:49 +08:00
|
|
|
-- | 造一个最简单的 SELECT
|
|
|
|
|
makeSelect :: [String] -> String -> Maybe Expr -> Statement
|
2026-09-19 19:22:50 +08:00
|
|
|
makeSelect cols tbl w =
|
|
|
|
|
Select
|
|
|
|
|
{ selectCols = cols
|
2026-09-19 22:42:22 +08:00
|
|
|
, selectFrom = FromTable Nothing tbl
|
2026-09-19 19:22:50 +08:00
|
|
|
, selectWhere = w
|
|
|
|
|
, selectOrderBy = []
|
|
|
|
|
, selectLimit = Nothing
|
|
|
|
|
}
|