最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

openGauss內(nèi)核分析(三):SQL解析

2022-06-13 14:30 作者:Gauss松鼠會  | 我要投稿

在傳統(tǒng)數(shù)據(jù)庫中SQL引擎一般指對用戶輸入的SQL語句進行解析、優(yōu)化的軟件模塊

SQL的解析過程主要分為:

  • 詞法分析Lexical Analysis:將用戶輸入的SQL語句拆解成單詞(Token)序列,并識別出關(guān)鍵字、標(biāo)識、常量等。

  • 語法分析Syntax Analysis:分析器對詞法分析器解析出來的單詞(Token)序列在語法上是否滿足SQL語法規(guī)則。

  • 語義分析Semantic Analysis:語義分析是SQL解析過程的一個邏輯階段,主要任務(wù)是在語法正確的基礎(chǔ)上進行上下文有關(guān)性質(zhì)的審查,在SQL解析過程中該階段完成表名、操作符、類型等元素的合法性判斷,同時檢測語義上的二義性。

openGauss在pg_parse_query中調(diào)用raw_parser函數(shù)對用戶輸入的SQL命令進行詞法分析和語法分析,生成語法樹添加到鏈表parsetree_list中。完成語法分析后,對于parsetree_list中的每一顆語法樹parsetree,會調(diào)用parse_Analyze函數(shù)進行語義分析,根據(jù)SQL命令的不同,執(zhí)行對應(yīng)的入口函數(shù),最終生成查詢樹

詞法分析Lexical Analysis

openGauss使用flex工具進行詞法分析。flex工具通過對已經(jīng)定義好的詞法文件進行編譯,生成詞法分析的代碼。詞法文件是scan.l,它根據(jù)SQL語言標(biāo)準(zhǔn)對SQL語言中的關(guān)鍵字、標(biāo)識符、操作符、常量、終結(jié)符進行了定義和識別。在kwlist.h中定義了大量的關(guān)鍵字,按照字母的順序排列,方便在查找關(guān)鍵字時通過二分法進行查找。 在scan.l中處理“標(biāo)識符”時,會到關(guān)鍵字列表中進行匹配,如果一個標(biāo)識符匹配到關(guān)鍵字,則認為是關(guān)鍵字,否則才是標(biāo)識符,即關(guān)鍵字優(yōu)先.?以“select a, b from item”為例說明詞法分析結(jié)果

語法分析Syntax Analysis

openGauss中定義了bison工具能夠識別的語法文件gram.y,根據(jù)SQL語言的不同定義了一系列表達Statement的結(jié)構(gòu)體(這些結(jié)構(gòu)體通常以Stmt作為命名后綴),用來保存語法分析結(jié)果。以SELECT查詢?yōu)槔?,它對?yīng)的Statement結(jié)構(gòu)體如下。

這個結(jié)構(gòu)體可以看作一個多叉樹,每個葉子節(jié)點都表達了SELECT查詢語句中的一個語法結(jié)構(gòu),對應(yīng)到gram.y中,它會有一個SelectStmt。代碼如下:

從simple_select語法分析結(jié)構(gòu)可以看出,一條簡單的查詢語句由以下子句組成:去除行重復(fù)的distinctClause、目標(biāo)屬性targetList、SELECT INTO子句intoClause、FROM子句fromClause、WHERE子句whereClause、GROUP BY子句groupClause、HAVING子句havingClause、窗口子句windowClause和plan_hint子句。在成功匹配simple_select語法結(jié)構(gòu)后,將會創(chuàng)建一個Statement結(jié)構(gòu)體,將各個子句進行相應(yīng)的賦值。對simple_select而言,目標(biāo)屬性、FROM子句、WHERE子句是最重要的組成部分。SelectStmt與其他結(jié)構(gòu)體的關(guān)系如下

下面以“select a, b from item”為例說明簡單select語句的解析過程,函數(shù)exec_simple_query調(diào)用pg_parse_query執(zhí)行解析,解析樹中只有一個元素

List中的節(jié)點類型為T_SelectStmt

查看SelectStmt結(jié)構(gòu)體,targetList 和fromClause非空

查看SelectStmt的targetlist,有兩個ResTarget

查看SelectStmt的fromClause,有一個RangeVar

綜合以上分析可以得到語法樹結(jié)構(gòu)

語義分析Semantic Analysis

在完成詞法分析和語法分析后,parse_Analyze函數(shù)會根據(jù)語法樹的類型,調(diào)用transformSelectStmt將parseTree改寫為查詢樹

得到的查詢樹結(jié)構(gòu)如下:

完成詞法、語法和語義分析后,SQL解析過程完成,SQL引擎開始執(zhí)行查詢優(yōu)化,在下一期中再具體分析。


openGauss內(nèi)核分析(三):SQL解析的評論 (共 條)

分享到微博請遵守國家法律
韩城市| 商都县| 金昌市| 吉水县| 长丰县| 鹿泉市| 抚顺县| 宜君县| 四会市| 彭泽县| 富平县| 合作市| 台山市| 佳木斯市| 治多县| 丰都县| 潜山县| 台州市| 石柱| 海伦市| 中江县| 镇赉县| 股票| 花莲市| 汾阳市| 普洱| 庆云县| 阿瓦提县| 潮州市| 棋牌| 腾冲县| 稷山县| 太白县| 盐城市| 南阳市| 若尔盖县| 井陉县| 白河县| 玉田县| 韶山市| 龙里县|