rust部分推进:进程间通信(Windows平台命名管线)、内存页表、B+树、WAL恢复系统、动态配置

This commit is contained in:
LIm1tZz7 committed 2026-09-24 15:37:55 +08:00
1 parent 91ce26d7f0
commit e428265357
41 files changed
+4546 -159

No files matched your search

+20 -19
View File
@@ -1,10 +1,5 @@
{-# LANGUAGE ImportQualifiedPost #-}
{- | SQL 语法分析器:把 SQL 文本解析为 'ChuSQL.Syntax.AST.Query'。
词法层负责空白、关键字、标识符、字面量与符号;语法层按
优先级 比较 > AND > OR 自底向上组装表达式。
-}
module ChuSQL.Syntax.Parser (parseQuery) where
import ChuSQL.Syntax.AST
@@ -17,6 +12,9 @@ import Text.Megaparsec
import Text.Megaparsec.Char
import Text.Megaparsec.Char.Lexer qualified as Lxr
-- SQL 解析器:把 SQL 文本解析成 AST。词法层管空白、关键字、标识符、字面量与符号;
-- 语法层按优先级 比较 > AND > OR 自底向上组装表达式。
type Parser = Parsec Void String
-- * 词法层
@@ -29,12 +27,12 @@ sc = Lxr.space space1 empty empty
lexeme :: Parser a -> Parser a
lexeme = Lxr.lexeme sc
-- | 匹配一个符号(如 ","、"("),并吃掉其后的空白。
symbol :: String -> Parser String
symbol = Lxr.symbol sc
{- | 大小写不敏感的关键字;其后不能紧跟标识符字符,避免把 @selection@ 读成 @select@。
整体用 'try' 包住:否则 @ORDER@ 会被 @keyword "or"@ 吃掉前缀 @OR@ 再报错,导致无法回溯。
-}
-- | 大小写不敏感的关键字;其后不能紧跟标识符字符,避免把 @selection@ 读成 @select@。
-- 整体用 'try' 包住:否则 @ORDER@ 会被 @keyword "or"@ 吃掉前缀 @OR@ 再报错,导致无法回溯。
keyword :: String -> Parser ()
keyword k = lexeme $ try $ do
_ <- string' k
@@ -47,6 +45,7 @@ identifier = lexeme $ do
rest <- many (satisfy isIdentChar)
return (first : rest)
-- | 标识符允许的字符:字母、数字或下划线。
isIdentChar :: Char -> Bool
isIdentChar ch = isAlphaNum ch || ch == '_'
@@ -62,9 +61,8 @@ stringLit = lexeme $ do
_ <- char '\''
return s
{- | 字符串内的一个字符:@''@ 折叠成一个单引号,其余字符(含反斜杠)原样保留。
两个分支都不会在失败时消耗输入,因此可以安全地放进 'many'。
-}
-- | 字符串内的一个字符:@''@ 折叠成一个单引号,其余字符(含反斜杠)原样保留。
-- 两个分支都不会在失败时消耗输入,因此可以安全地放进 'many'。
stringChar :: Parser Char
stringChar =
choice
@@ -95,9 +93,8 @@ qualifiedName = do
expr :: Parser Expr
expr = makeExprParser atom operatorTable
{- | 运算符表。注意 'makeExprParser' 要求各层 **按优先级从高到低** 排列:
比较运算符绑定最紧,'AND' 次之,'OR' 最松。
-}
-- | 运算符表。注意 'makeExprParser' 要求各层按优先级从高到低排列:
-- 比较运算符绑定最紧,'AND' 次之,'OR' 最松。
operatorTable :: [[Operator Parser Expr]]
operatorTable =
[
@@ -128,12 +125,14 @@ orderItem = do
dir <- sortDir
return (col, dir)
-- | @ORDER BY col [ASC|DESC], ...@。
orderByClause :: Parser [(String, SortDir)]
orderByClause = do
keyword "order"
keyword "by"
sepBy1 orderItem (symbol ",")
-- | @col = expr@,用于 UPDATE 的 SET 子句。
assignment :: Parser (String, Expr)
assignment = do
col <- identifier
@@ -141,7 +140,7 @@ assignment = do
e <- expr
return (col, e)
-- | 从句语法
-- * 从句层
-- | SQL 保留字,不能用作表别名
reservedWords :: [String]
@@ -166,21 +165,22 @@ reservedWords =
, "set"
]
{- | 表别名。别名不能是保留字:否则 @FROM users WHERE age > 18@ 会把 @WHERE@
当成 @users@ 的别名吃掉,后面真正的 WHERE 子句就再也解析不到。
用 'try' 包住,一旦命中保留字就整体回溯,让 'optional' 正常返回 'Nothing'。
-}
-- | 表别名。别名不能是保留字:否则 @FROM users WHERE age > 18@ 会把 @WHERE@
-- 当成 @users@ 的别名吃掉,后面真正的 WHERE 子句就再也解析不到。
-- 用 'try' 包住,一旦命中保留字就整体回溯,让 'optional' 正常返回 'Nothing'。
aliasName :: Parser String
aliasName = try $ do
name <- identifier
if map toLower name `elem` reservedWords then empty else return name
-- | @表名 [别名]@。
tableRef :: Parser (Maybe String, String)
tableRef = do
tbl <- identifier
mAlias <- optional aliasName
return (mAlias, tbl)
-- | @JOIN 表 [别名] ON 条件@。
joinClause :: Parser (Maybe String, String, Expr)
joinClause = do
keyword "join"
@@ -189,6 +189,7 @@ joinClause = do
cond <- expr
return (mAlias, tbl, cond)
-- | FROM 从句:一张表 + 任意多个 JOIN。
fromClause :: Parser FromClause
fromClause = do
(mAlias, tbl) <- tableRef