说啥都队-喻诗媛个人总结

我是来自广西师范大学说啥都队伍的队员喻诗媛,从参赛开始至比赛结束我一直致力于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分析(二)
说啥都队-喻诗媛个人总结

【说啥都队-喻诗媛个人总结】相关推荐

  1. 对于‘敲什么都队’自主开发的《校园服务》软件的使用体验

    信1805-1     边信哲     20183694 在六月十三日我系组织的2017级软件工程交流大会中,我为第十一组敲什么都队'自主开发的<校园服务>软件投出了我的一票,在为数众多的 ...

  2. 陆家嘴vs静安寺,谁站在魔都职场名媛鄙视链顶端?

    来源:DT财经 作者:赵玮雯 本文长度为5000字,建议阅读5分钟 本文为你分析一些有意思的上海城市数据. 试问哪一只陆家嘴的金融狗,不想在静安寺拥有一套大平层?而静安职场名媛呢,又真能在下班后从容地 ...

  3. 乌镇现场 | 微软沈向洋:机器可以有情感和情商 都可以写诗了

    ▼ 大型年度AI人物评选--2017中国AI英雄风云榜,评分工作已结束,12月4日乌镇张榜! 奖项设置:技术创新人物TOP 10,商业创新人物TOP 10 表彰人物:华人科学家.学者.企业家.创业者 ...

  4. “问天号”已就位!喻京川2013年畅想的《中国空间站》,即将启航星辰大海!...

    你是否曾震撼于<星际迷航>中恢弘的太空场景?是否曾在曲折而唯美的光线中想象过黑洞的模样?或许你还未曾深入了解过太空美术,但它离我们从不遥远. 太空美术,描绘了人类对太空最真实的畅想. 20 ...

  5. 疫情阴影下的中国大学生,还需不需要诗和远方?

    疫情阴影下的中国大学生,还需不需要诗和远方? 原作者姓名:陈大夫** 原出处::大学声公众号 原文链接:https://mp.weixin.qq.com/s/sfbct9fX1YDDeVSOToAu6 ...

  6. 清华团队让 AI 写诗“更上一层楼”,诗歌图灵测试迷惑近半数玩家

    作者 | 黄珊 来源 | 数据实战派 比特币 外挖无穷洞,机神犹未休. 卡中窥币影,池里验沙流. 屡载吸金主,孤深渍盗求. 方知区块链,本是古来游. 这首诗歌来自一支清华团队开发的古诗 AI.它的创作 ...

  7. 数学家与诗人,都是这个世界上先知先觉的预言家

    数学家和诗人都是作为先知先觉的预言家存在我们的世界上.只不过诗人由于天性孤傲被认为狂妄自大,而数学家由于超凡脱俗为人们敬而远之.因此在文学艺术团体里诗人往往受制于小说家,正如在科学技术协会里物理学家领 ...

  8. 团队作业1---团队展示

    一.团队展示 1.团队名称 爸爸说的都队 2.团队博客:http://www.cnblogs.com/hhh2333/ 3.团队项目简述 这是一个基于web或手机APP的四则运算的软件,包含的功能有: ...

  9. 开源云开发流量主小程序-AI写诗-CitizenFour

    项目名称:AI写诗 项目背景:每个人心目中都住着一个文艺青年,诗歌是人们的一种自然表达,它没有门槛,人人都是徐志摩 应用场景:可以写押韵自由诗.藏头诗.给定若干字作为主题的诗.生活中任何一件事都可以用 ...

最新文章

  1. 两台计算机通过传统电话网络,计算机网络的复习题.doc
  2. 用SC命令 添加或删除windows服务提示OpenSCManager 失败5
  3. vscode 开发常用
  4. Dojo笔记(较旧)
  5. 一种基于复制粘贴的cam350邮票孔拼版教程(二)导出gerber
  6. 飞翔(风吹)的flash文字
  7. 惠普m128fn中文说明书_惠普M128fw使用说明书
  8. 2019蓝桥杯 - 迷宫
  9. 苹果safari浏览器video视频无法播放
  10. 关于运行项目时 vue-pdf 插件依赖报错的问题及解决办法
  11. charles抓取移动端的htpps
  12. Botler.ai为美国和加拿大推出性骚扰检测机器人
  13. 运动竞技类图文展示片头fcpx插件
  14. c++倒序输出一个四位整数
  15. 华为ensp模拟器设备启动失败解决合集
  16. Python笔记:利用pygame模块实现三原色颜色滚动条效果
  17. SQL SERVER 发邮箱
  18. facebook faiss的安装测试
  19. 西方经济学的十大原理
  20. 华为云fusionsphere 6.1组件功能

热门文章

  1. html把图片设为5边形,用div+css轻松绘制正3、4、5、6、7、8边形
  2. 全球电话号码正则验证封装
  3. matlab linspace多个区间,linspace分为100区间却得到200个区间
  4. Windows mobile 从SIM卡获得手机本机号码
  5. 简单说说我理解的图像的腐蚀和膨胀
  6. Mac使用Homebrew安装MySQL
  7. 神墓部分楼盘价格已比周边低出近千元
  8. 网页中flash 如何下载
  9. linux命令行执行mysql语句_linux命令行中直接执行mysql语句
  10. 【容器底层技术】cgroup v2使用与测试