v0.2.6 质量加固: - 修复 AriaEngine 二级索引 SSTable 互相覆盖(命名空间隔离) - 修复 LSM 多版本读取顺序错误 + MergeIterator 取最新来源 - 重写 LZ4 压缩器(往返一致性 + 缓冲区溢出) - sstableCache LRU 上限 + 预加载兜底(BufferPool 配置生效) - 修复 React/Vue 集成 import type 运行时 bug + exports 子路径 - 新增 38 个测试(LZ4往返/Crypto/集成), 删除伪测试 v0.3.0 SQL 功能扩展: - 多语句 parseAll + 事务语句 BEGIN/COMMIT/ROLLBACK - INSERT INTO ... SELECT + UNION/UNION ALL + EXISTS 关联子查询 - CREATE/DROP INDEX 五引擎实现 + 别名 WHERE 修复 - benchmark 页面 + 36 个新测试 v0.3.1 表达式与性能: - CASE WHEN 表达式(SELECT 列/WHERE/聚合) - JOIN + 关联子查询逐行绑定 - WAL 批量组提交(写放大 O(N)→O(1)) - 修复 pending frozen 可见性 + flush 缓存竞争 v0.3.2 并发: - CASE WHEN 用于 WHERE/聚合 + JOIN 哈希连接 - 多标签页同步(multiTabSync + BroadcastChannel) - IndexedDB schema 持久化(reopen 后表结构恢复) - 修复 where-matcher 顶层 $not - 修复 CJS 产物 .js 被 ESM 解析(exports 空) — .cjs 后缀 + exports 修正 - 836 测试 / 44 套件 / 81.0% 覆盖率
199 lines
4.2 KiB
TypeScript
199 lines
4.2 KiB
TypeScript
/**
|
|
* metona-sqlark SQL Token Types — 词法单元定义
|
|
* @module sql/tokens
|
|
*/
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Token 类型枚举
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export enum TokenType {
|
|
// 关键字
|
|
SELECT = 'SELECT',
|
|
FROM = 'FROM',
|
|
WHERE = 'WHERE',
|
|
INSERT = 'INSERT',
|
|
INTO = 'INTO',
|
|
VALUES = 'VALUES',
|
|
UPDATE = 'UPDATE',
|
|
SET = 'SET',
|
|
DELETE = 'DELETE',
|
|
CREATE = 'CREATE',
|
|
TABLE = 'TABLE',
|
|
DROP = 'DROP',
|
|
ORDER = 'ORDER',
|
|
BY = 'BY',
|
|
ASC = 'ASC',
|
|
DESC = 'DESC',
|
|
LIMIT = 'LIMIT',
|
|
OFFSET = 'OFFSET',
|
|
AND = 'AND',
|
|
OR = 'OR',
|
|
NOT = 'NOT',
|
|
LIKE = 'LIKE',
|
|
IN = 'IN',
|
|
PRIMARY = 'PRIMARY',
|
|
KEY = 'KEY',
|
|
UNIQUE = 'UNIQUE',
|
|
DEFAULT = 'DEFAULT',
|
|
NULL = 'NULL',
|
|
TRUE = 'TRUE',
|
|
REFERENCES = 'REFERENCES',
|
|
CASCADE = 'CASCADE',
|
|
BETWEEN = 'BETWEEN',
|
|
IF = 'IF',
|
|
EXISTS = 'EXISTS',
|
|
FALSE = 'FALSE',
|
|
ALTER = 'ALTER',
|
|
ADD = 'ADD',
|
|
TRUNCATE = 'TRUNCATE',
|
|
|
|
// JOIN 相关
|
|
INNER = 'INNER',
|
|
LEFT = 'LEFT',
|
|
RIGHT = 'RIGHT',
|
|
CROSS = 'CROSS',
|
|
JOIN = 'JOIN',
|
|
ON = 'ON',
|
|
AS = 'AS',
|
|
OUTER = 'OUTER',
|
|
|
|
// 聚合
|
|
GROUP = 'GROUP',
|
|
HAVING = 'HAVING',
|
|
COUNT = 'COUNT',
|
|
SUM = 'SUM',
|
|
AVG = 'AVG',
|
|
MIN = 'MIN',
|
|
MAX = 'MAX',
|
|
DISTINCT = 'DISTINCT',
|
|
|
|
// v0.3.0: 事务 / UNION / EXISTS / 动态索引
|
|
BEGIN = 'BEGIN',
|
|
COMMIT = 'COMMIT',
|
|
ROLLBACK = 'ROLLBACK',
|
|
UNION = 'UNION',
|
|
ALL = 'ALL',
|
|
INDEX = 'INDEX',
|
|
|
|
// v0.3.1: CASE WHEN 表达式
|
|
CASE = 'CASE',
|
|
WHEN = 'WHEN',
|
|
THEN = 'THEN',
|
|
ELSE = 'ELSE',
|
|
END = 'END',
|
|
|
|
// 标识符 & 字面量
|
|
IDENTIFIER = 'IDENTIFIER',
|
|
STRING = 'STRING',
|
|
NUMBER = 'NUMBER',
|
|
|
|
// 运算符 & 分隔符
|
|
COMMA = 'COMMA',
|
|
LPAREN = 'LPAREN',
|
|
RPAREN = 'RPAREN',
|
|
SEMICOLON = 'SEMICOLON',
|
|
EQ = 'EQ',
|
|
NEQ = 'NEQ',
|
|
GT = 'GT',
|
|
GTE = 'GTE',
|
|
LT = 'LT',
|
|
LTE = 'LTE',
|
|
STAR = 'STAR',
|
|
DOT = 'DOT',
|
|
|
|
// 特殊
|
|
EOF = 'EOF',
|
|
ILLEGAL = 'ILLEGAL',
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Token
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export interface Token {
|
|
type: TokenType;
|
|
value: string;
|
|
position: number; // 在源码中的位置
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// 关键字映射
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export const KEYWORDS: Record<string, TokenType> = {
|
|
'SELECT': TokenType.SELECT,
|
|
'FROM': TokenType.FROM,
|
|
'WHERE': TokenType.WHERE,
|
|
'INSERT': TokenType.INSERT,
|
|
'INTO': TokenType.INTO,
|
|
'VALUES': TokenType.VALUES,
|
|
'UPDATE': TokenType.UPDATE,
|
|
'SET': TokenType.SET,
|
|
'DELETE': TokenType.DELETE,
|
|
'CREATE': TokenType.CREATE,
|
|
'TABLE': TokenType.TABLE,
|
|
'DROP': TokenType.DROP,
|
|
'ORDER': TokenType.ORDER,
|
|
'BY': TokenType.BY,
|
|
'ASC': TokenType.ASC,
|
|
'DESC': TokenType.DESC,
|
|
'LIMIT': TokenType.LIMIT,
|
|
'OFFSET': TokenType.OFFSET,
|
|
'AND': TokenType.AND,
|
|
'OR': TokenType.OR,
|
|
'NOT': TokenType.NOT,
|
|
'LIKE': TokenType.LIKE,
|
|
'IN': TokenType.IN,
|
|
'PRIMARY': TokenType.PRIMARY,
|
|
'KEY': TokenType.KEY,
|
|
'UNIQUE': TokenType.UNIQUE,
|
|
'DEFAULT': TokenType.DEFAULT,
|
|
'NULL': TokenType.NULL,
|
|
'TRUE': TokenType.TRUE,
|
|
'FALSE': TokenType.FALSE,
|
|
'REFERENCES': TokenType.REFERENCES,
|
|
'CASCADE': TokenType.CASCADE,
|
|
'BETWEEN': TokenType.BETWEEN,
|
|
'IF': TokenType.IF,
|
|
'EXISTS': TokenType.EXISTS,
|
|
'ALTER': TokenType.ALTER,
|
|
'ADD': TokenType.ADD,
|
|
'TRUNCATE': TokenType.TRUNCATE,
|
|
|
|
// JOIN
|
|
'INNER': TokenType.INNER,
|
|
'LEFT': TokenType.LEFT,
|
|
'RIGHT': TokenType.RIGHT,
|
|
'CROSS': TokenType.CROSS,
|
|
'JOIN': TokenType.JOIN,
|
|
'ON': TokenType.ON,
|
|
'AS': TokenType.AS,
|
|
'OUTER': TokenType.OUTER,
|
|
|
|
// 聚合
|
|
'GROUP': TokenType.GROUP,
|
|
'HAVING': TokenType.HAVING,
|
|
'COUNT': TokenType.COUNT,
|
|
'SUM': TokenType.SUM,
|
|
'AVG': TokenType.AVG,
|
|
'MIN': TokenType.MIN,
|
|
'MAX': TokenType.MAX,
|
|
'DISTINCT': TokenType.DISTINCT,
|
|
|
|
// v0.3.0
|
|
'BEGIN': TokenType.BEGIN,
|
|
'COMMIT': TokenType.COMMIT,
|
|
'ROLLBACK': TokenType.ROLLBACK,
|
|
'UNION': TokenType.UNION,
|
|
'ALL': TokenType.ALL,
|
|
'INDEX': TokenType.INDEX,
|
|
|
|
// v0.3.1
|
|
'CASE': TokenType.CASE,
|
|
'WHEN': TokenType.WHEN,
|
|
'THEN': TokenType.THEN,
|
|
'ELSE': TokenType.ELSE,
|
|
'END': TokenType.END,
|
|
};
|