完成Haskell部分的SQL词法分析器
This commit is contained in:
commit
a9ef1ef3e2
21 files changed
+1547
No files matched your search
@@ -0,0 +1,52 @@
|
||||
module Main where
|
||||
|
||||
import ChuSQL.Eval.Executor
|
||||
import ChuSQL.Model
|
||||
import ChuSQL.Syntax.Ast
|
||||
import ChuSQL.Syntax.Parser
|
||||
|
||||
users :: Table
|
||||
users =
|
||||
Table
|
||||
{ tableName = "users"
|
||||
, tableCols = ["name", "age"]
|
||||
, tableRows =
|
||||
[ [("name", VStr "Alice"), ("age", VInt 25)]
|
||||
, [("name", VStr "Bob"), ("age", VInt 17)]
|
||||
, [("name", VStr "Carol"), ("age", VInt 30)]
|
||||
]
|
||||
}
|
||||
|
||||
db :: Database
|
||||
db = [("users", users)]
|
||||
|
||||
-- runQuery 返回 (更新后的数据库, 结果行);演示只关心结果行
|
||||
rowsOf :: Either String (Database, [Row]) -> Either String [Row]
|
||||
rowsOf = fmap snd
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
let q1 = makeSelect ["name"] "users" (Just (Gt (Col "age") (LitInt 18)))
|
||||
print (rowsOf (runQuery db q1))
|
||||
|
||||
let q2 = makeSelect ["*"] "users" Nothing
|
||||
print (rowsOf (runQuery db q2))
|
||||
|
||||
let q3 = makeSelect ["name"] "nonexistent" Nothing
|
||||
print (rowsOf (runQuery db q3))
|
||||
|
||||
let q4 =
|
||||
makeSelect
|
||||
["name"]
|
||||
"users"
|
||||
( Just
|
||||
( Or
|
||||
(Lt (Col "age") (LitInt 18))
|
||||
(Gt (Col "age") (LitInt 30))
|
||||
)
|
||||
)
|
||||
print (rowsOf (runQuery db q4))
|
||||
|
||||
-- 解析 SQL 文本,再交给执行引擎
|
||||
let parsed = parseQuery "SELECT name FROM users WHERE age > 18 AND name = 'Alice'"
|
||||
print (rowsOf (parsed >>= runQuery db))
|
||||
Reference in new issue
Block a user