# sqllexparser **Repository Path**: gilbertwang/sqllexparser ## Basic Information - **Project Name**: sqllexparser - **Description**: SQL词法解析器,从mysql-proxy裁剪出来的版本 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-12-27 - **Last Updated**: 2026-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: C语言, MySQL ## README # sqllexparser 一个基于 GNU flex 的 MySQL SQL 词法分析器(Tokenizer),用于将 SQL 字符串拆分为结构化的 Token 序列。 ## 特性 - **MySQL 方言支持**:完整覆盖 MySQL 保留关键字、数据类型及专用注释语法 - **丰富的 Token 类型**:支持比较符、字符串、字面量、注释、数字、函数名、运算符等 - **引号与转义处理**:正确处理单引号、双引号字符串以及反引号标识符的转义规则 - **线程安全**:使用互斥锁保护 flex 扫描器状态,可在多线程环境下安全调用 - **二进制关键字查找**:通过预排序关键字表实现高效的 `O(log n)` Token ID 查询 ## 项目结构 ``` . ├── Makefile # 顶层 Makefile ├── src/ # 源码目录 │ ├── sql-tokenizer.h # 对外 API 头文件 │ ├── sql-tokenizer.l # flex 词法规则源文件 │ ├── sql-tokenizer.c # flex 生成的词法分析器(已预生成) │ ├── sql-tokenizer-tokens.c # Token ID 与名称映射表 │ ├── sql-tokenizer-keywords.c/h # MySQL 关键字查找表 │ ├── glib-ext.c/h # glib 辅助扩展函数 │ ├── chassis-exports.h # 库导出宏 │ └── Makefile # 编译共享库 libsqlparser.so └── test/ # 测试目录 ├── sqlparsertest.c # 示例测试程序 └── Makefile ``` ## 依赖 - `gcc` - `glib-2.0` 开发库 - `flex`(如需从 `.l` 重新生成 `.c`,否则可直接使用预生成的 `sql-tokenizer.c`) 在 CentOS/RHEL 上安装依赖示例: ```bash sudo yum install gcc glib2-devel flex ``` 在 Debian/Ubuntu 上: ```bash sudo apt-get install gcc libglib2.0-dev flex ``` ## 编译 ```bash make ``` 执行后会: 1. 在 `src/` 目录编译生成共享库 `libsqlparser.so` 2. 在 `test/` 目录编译生成测试程序 `sqlparsertest` 清理编译产物: ```bash make clean ``` ## 使用示例 ```c #include "sql-tokenizer.h" #include int main() { GPtrArray *tokens = sql_tokens_new(); const char *sql = "SELECT username FROM customer WHERE userid = 1"; if (0 == sql_tokenizer(tokens, sql, strlen(sql))) { for (guint i = 0; i < tokens->len; i++) { sql_token *token = tokens->pdata[i]; g_print("Token: %s, Text: %s\n", sql_token_get_name(token->token_id, NULL), token->text->str); } } sql_tokens_free(tokens); return 0; } ``` 编译示例程序: ```bash gcc -o myapp myapp.c -I./src -L./src -lsqlparser $(pkg-config --cflags --libs glib-2.0) export LD_LIBRARY_PATH=./src:$LD_LIBRARY_PATH ./myapp ``` ## 核心 API | 函数 | 说明 | |---|---| | `GPtrArray *sql_tokens_new(void)` | 创建空的 Token 列表 | | `void sql_tokens_free(GPtrArray *tokens)` | 释放 Token 列表及其所有元素 | | `int sql_tokenizer(GPtrArray *tokens, const gchar *str, gsize len)` | 将 SQL 字符串解析为 Token 序列 | | `const gchar *sql_token_get_name(sql_token_id token_id, size_t *name_len)` | 根据 Token ID 获取名称字符串 | | `sql_token_id sql_token_get_id_len(const gchar *name, size_t name_len)` | 根据字符串查找对应的 Token ID(关键字或 `TK_LITERAL`) | ## 支持的 Token 类型 - **比较运算符**:`<=`, `>=`, `<`, `>`, `=`, `<>`, `!=` - **字符串**:`'...'`, `"..."` → `TK_STRING` - **标识符字面量**:`` `...` `` → `TK_LITERAL` - **注释**:`--`, `/* */`, `/*! ... */`(MySQL 条件注释)→ `TK_COMMENT` / `TK_COMMENT_MYSQL` - **数字**:整数 `TK_INTEGER`、浮点数 `TK_FLOAT`(支持科学计数法) - **函数名**:后接 `(` 的标识符 → `TK_FUNCTION` - **标点**:`.`, `,`, `;`, `(`, `)` - **运算符**:`+`, `-`, `*`, `/`, `&`, `|`, `^`, `&&`, `||` - **赋值**:`:=` - **MySQL 关键字**:涵盖 `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `CREATE`, `DROP` 等全部 MySQL 保留字 ## 测试 进入 `test` 目录并运行测试程序: ```bash cd test make ./sqlparsertest ``` ## 许可证 本项目基于开源许可证发布,详见源代码中的授权声明。