【说啥都队-喻诗媛个人总结】
说啥都队-喻诗媛个人总结
我是来自广西师范大学说啥都队伍的队员喻诗媛,从参赛开始至比赛结束我一直致力于SQL引擎中的查询解析部分的解读与赏析,即 parser 文件夹。比赛期间,围绕analyze.cpp、parser.cpp、parse_type.cpp等代码细节撰写了十余篇代码解读与赏析博客。
以下是我学习的一些总结
SQL基本形式
SQL语句基本可以分解成下面7大块:(5)SELECT (6)DISTINCT < select list >
(1)FROM < table source >
(2)WHERE < condition >
(3)GROUP BY < group by list >
(4)HAVING < having condition >
(7) ORDER BY < order by list >
(一)词法分析:字符串分割
(1)Token分类
注释。
关键字(SELECT、CREATE)。
操作符(+、-、>=)。
开闭合标志((、CASE)。
占位符(?)。
空格。
引号包裹的文本、数字、字段。
方言语法(${variable})。在词法分析阶段,我们的 Tokens 不需要关心关键词是什么,只要识别是不是关键词即可,只要切分即可。因此,在语法分析阶段,才辨别Token是什么关键词;涉及到语义处理时要考虑上下文。
(2)常见分词方法: 正则表达式分词
争对不同方言或Tokens,会有不同的分词函数。因此整体流程如下:
while (sqlStr) {//这里的函数每取一次 Token,都将取到的 Token 按长度丢掉,继续匹配剩下的字符串,直到字符串被切分完为止token = getTokenWhitespace(sqlStr, token) | getTokenBlockComment(sqlStr, token);sqlStr = sqlStr.substring(token.value.length);tokens.push(token);
}/** 使用普通的 strcmp() 比较进行二分搜索。*/
low = keywords;
high = keywords + (num_keywords - 1);
while (low <= high) { /* 二分搜索 */const ScanKeyword* middle = NULL;int difference;middle = low + (high - low) / 2; /* 取关键词中值 */difference => strcmp(middle-name, word);if (difference == 0) { /* 找到则返回 middle */return middle;} else if (difference < 0) {low = middle + 1;} else {high = middle - 1;}
}
return NULL; /* 未找到则返回空值,说明该文本中不含关键词 */
(二)语法分析
分析器对词法分析器解析出来的单词(Token)序列在语法上是否满足SQL语法规则。
openGauss中定义了bison工具能够识别的语法文件gram.y,根据SQL语言的不同定义了一系列表达Statement的结构体(这些结构体通常以Stmt作为命名后缀),用来保存语法分析结果。以SELECT查询为例,它对应的Statement结构体如下。
typedef struct SelectStmt
{NodeTag type;List *distinctClause; /* NULL, list of DISTINCT ON exprs, or* lcons(NIL,NIL) for all (SELECT DISTINCT) */IntoClause *intoClause; /* target for SELECT INTO */List *targetList; /* the target list (of ResTarget) */List *fromClause; /* the FROM clause */Node *whereClause; /* WHERE qualification */List *groupClause; /* GROUP BY clauses */Node *havingClause; /* HAVING conditional-expression */List *windowClause; /* WINDOW window_name AS (...), ... */WithClause *withClause; /* WITH clause */List *valuesLists; /* untransformed list of expression lists */List *sortClause; /* sort clause (a list of SortBy's) */Node *limitOffset; /* # of result tuples to skip */Node *limitCount; /* # of result tuples to return */……
} SelectStmt;
(三)语义分析
在完成词法分析和语法分析后,parse_Ana lyze函数会根据语法树的类型,调用transformSelectStmt将parseTree改写为查询树。负责语义分析的是位于 analyze.cpp 下的 parse_analyze 函数。parse_analyze 会根据词法分析和语法分析得到的语法树,生成一个 ParseState 结构体用于记录语义分析的状态。ParseState 顾名思义-解析状态,保存了语义分析的状态信息,ParseState 结构体的具体定义如下:
struct ParseState {struct ParseState* parentParseState; /* 指向外层查询 */ const char* p_sourcetext; /* 原始SQL命令 */List* p_rtable; /* 范围表 */List* p_joinexprs; /* 连接表达式 */List* p_joinlist; /* 连接项 */List* p_relnamespace; /* 表名集合 */List* p_varnamespace; /* 属性名集合 */bool p_lateral_active;List* p_ctenamespace; /* 公共表达式名集合 */List* p_future_ctes; /* 不在p_ctenamespace中的公共表达式 */CommonTableExpr* p_parent_cte;List* p_windowdefs; /* WINDOW子句的原始定义 */int p_next_resno; /* 下一个分配给目标属性的资源号 */List* p_locking_clause; /* 原始的FOR UPDATE/FOR SHARE信息 */Node* p_value_substitute;bool p_hasAggs; /* 是否有聚集函数 */bool p_hasWindowFuncs; /* 是否有窗口函数 */bool p_hasSubLinks; /* 是否有子链接 */bool p_hasModifyingCTE; bool p_is_insert; /* 是否为INSERT语句 */bool p_locked_from_parent;bool p_resolve_unknowns;bool p_hasSynonyms;Relation p_target_relation; /* 目标表 */RangeTblEntry* p_target_rangetblentry; /* 目标表在RangeTable对应的项 */......
};
个人心得
此次比赛是我的一次难忘经历,极大地提升了我的学习分析能力。万事开头难,最开始比赛有点难以下手,不过经过调整静下心来阅读和学习,终于有所收获。收获很多,开心就行
相关博客链接
SQL引擎概览
openGauss:SQL引擎之查询解析中analyze.cpp解读
SQL引擎 - analyze.cpp分析
SQL引擎 - analyze.cpp分析(二)
SQL引擎 - analyze.cpp分析(三)
SQL引擎 - analyze.cpp分析(四)
SQL引擎 - parser.cpp分析
SQL引擎 - parser.cpp分析(二)
SQL引擎 - parse_type.cpp分析(一)
SQL引擎 - parse_type.cpp分析(二)
说啥都队-喻诗媛个人总结
【说啥都队-喻诗媛个人总结】相关推荐
- 对于‘敲什么都队’自主开发的《校园服务》软件的使用体验
信1805-1 边信哲 20183694 在六月十三日我系组织的2017级软件工程交流大会中,我为第十一组敲什么都队'自主开发的<校园服务>软件投出了我的一票,在为数众多的 ...
- 陆家嘴vs静安寺,谁站在魔都职场名媛鄙视链顶端?
来源:DT财经 作者:赵玮雯 本文长度为5000字,建议阅读5分钟 本文为你分析一些有意思的上海城市数据. 试问哪一只陆家嘴的金融狗,不想在静安寺拥有一套大平层?而静安职场名媛呢,又真能在下班后从容地 ...
- 乌镇现场 | 微软沈向洋:机器可以有情感和情商 都可以写诗了
▼ 大型年度AI人物评选--2017中国AI英雄风云榜,评分工作已结束,12月4日乌镇张榜! 奖项设置:技术创新人物TOP 10,商业创新人物TOP 10 表彰人物:华人科学家.学者.企业家.创业者 ...
- “问天号”已就位!喻京川2013年畅想的《中国空间站》,即将启航星辰大海!...
你是否曾震撼于<星际迷航>中恢弘的太空场景?是否曾在曲折而唯美的光线中想象过黑洞的模样?或许你还未曾深入了解过太空美术,但它离我们从不遥远. 太空美术,描绘了人类对太空最真实的畅想. 20 ...
- 疫情阴影下的中国大学生,还需不需要诗和远方?
疫情阴影下的中国大学生,还需不需要诗和远方? 原作者姓名:陈大夫** 原出处::大学声公众号 原文链接:https://mp.weixin.qq.com/s/sfbct9fX1YDDeVSOToAu6 ...
- 清华团队让 AI 写诗“更上一层楼”,诗歌图灵测试迷惑近半数玩家
作者 | 黄珊 来源 | 数据实战派 比特币 外挖无穷洞,机神犹未休. 卡中窥币影,池里验沙流. 屡载吸金主,孤深渍盗求. 方知区块链,本是古来游. 这首诗歌来自一支清华团队开发的古诗 AI.它的创作 ...
- 数学家与诗人,都是这个世界上先知先觉的预言家
数学家和诗人都是作为先知先觉的预言家存在我们的世界上.只不过诗人由于天性孤傲被认为狂妄自大,而数学家由于超凡脱俗为人们敬而远之.因此在文学艺术团体里诗人往往受制于小说家,正如在科学技术协会里物理学家领 ...
- 团队作业1---团队展示
一.团队展示 1.团队名称 爸爸说的都队 2.团队博客:http://www.cnblogs.com/hhh2333/ 3.团队项目简述 这是一个基于web或手机APP的四则运算的软件,包含的功能有: ...
- 开源云开发流量主小程序-AI写诗-CitizenFour
项目名称:AI写诗 项目背景:每个人心目中都住着一个文艺青年,诗歌是人们的一种自然表达,它没有门槛,人人都是徐志摩 应用场景:可以写押韵自由诗.藏头诗.给定若干字作为主题的诗.生活中任何一件事都可以用 ...
最新文章
- 两台计算机通过传统电话网络,计算机网络的复习题.doc
- 用SC命令 添加或删除windows服务提示OpenSCManager 失败5
- vscode 开发常用
- Dojo笔记(较旧)
- 一种基于复制粘贴的cam350邮票孔拼版教程(二)导出gerber
- 飞翔(风吹)的flash文字
- 惠普m128fn中文说明书_惠普M128fw使用说明书
- 2019蓝桥杯 - 迷宫
- 苹果safari浏览器video视频无法播放
- 关于运行项目时 vue-pdf 插件依赖报错的问题及解决办法
- charles抓取移动端的htpps
- Botler.ai为美国和加拿大推出性骚扰检测机器人
- 运动竞技类图文展示片头fcpx插件
- c++倒序输出一个四位整数
- 华为ensp模拟器设备启动失败解决合集
- Python笔记:利用pygame模块实现三原色颜色滚动条效果
- SQL SERVER 发邮箱
- facebook faiss的安装测试
- 西方经济学的十大原理
- 华为云fusionsphere 6.1组件功能