最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文解讀 SQL 生成工具

 更新時(shí)間:2026年02月15日 14:38:56   作者:KaiwuDB  
SQL生成工具用于測試數(shù)據(jù)庫產(chǎn)品的兼容性,通過解析YACC語法文件生成SQL語句,并執(zhí)行以判斷與其他數(shù)據(jù)庫語法的兼容性,工具首先使用預(yù)處理腳本去除語法文件中的非必要內(nèi)容,保留產(chǎn)生式,然后,根據(jù)參數(shù)使用工具生成SQL語句,

SQL 生成工具可用于測試 Parser 與其他數(shù)據(jù)庫產(chǎn)品的兼容性,通過解析 YACC 語法文件中的產(chǎn)生式,生成對應(yīng)的 SQL 語句,再使用數(shù)據(jù)庫執(zhí)行該 SQL,根據(jù)結(jié)果判斷語句是否與其他數(shù)據(jù)庫語法兼容。

01 工具使用

語法文件預(yù)處理

預(yù)處理目的是將語法文件中無關(guān)的內(nèi)容去除,只保留各個(gè)語句的產(chǎn)生式,可以通過命令 bison -v sql.y 獲取語法文件中的語法規(guī)則(不帶 Action),然后再去除生成文件中的無用部分,如終結(jié)符列表、非終結(jié)符列表、狀態(tài)轉(zhuǎn)換表等,如下所示:

生成的 sql.output 文件內(nèi)容如下,我們僅保留其“語法”一節(jié)

注:對于保留的“語法” 一節(jié),還需要去除其序號。

對于上述過程,我們通過預(yù)處理腳本 preprocess.sh 進(jìn)行封裝,使處理后的文件滿足工具的要求。生成的文件形式如下,輸出的 .output 文件即為預(yù)處理后的語法文件。

SQL 語句生成

生成符合條件的語法文件后,即可使用工具生成 SQL。工具支持如下參數(shù):

•-b:指定語法文件,必選。語法文件為 preprocess.sh 腳本處理后的產(chǎn)生的文件

•-n:指定待生成的產(chǎn)生式名稱,必選

•-R:隨機(jī)生成模式,可選,默認(rèn)為枚舉模式

•-o:指定生成 SQL 語句的保存文件,可選,默認(rèn)為 report.csv

•-N:限制生成 SQL 條數(shù),可選,默認(rèn)不限制

02 工具實(shí)現(xiàn)

該工具包含兩個(gè) package:yacc_parser和sql_generator,分別負(fù)責(zé)完成 Token 解析和 SQL 生成。

產(chǎn)生式的表示方法

type SeqInfo struct {
    Items []string
}
type Production struct {
    Head  string    // 產(chǎn)生式頭部
    Alter []SeqInfo     // 產(chǎn)生式 body
}

Token 解析

函數(shù) Tokenize 用于將讀取的語法文件中的字符 Token 化,每次調(diào)用將返回一個(gè) Token。該函數(shù)僅處理了簡單的分隔符和引號,并未實(shí)現(xiàn)標(biāo)準(zhǔn)詞法分析器的正則匹配。

Parse 函數(shù)調(diào)用 Tokenize 函數(shù),每次返回一個(gè) Token,返回后 Parse 函數(shù)根據(jù)當(dāng)前狀態(tài)和 Token 類型,將一連串的 Token 組裝成 Production。

SQL 生成

SQL 生成有兩種模式:

1、是遍歷 Production 中指定產(chǎn)生式的 body 列表,枚舉生成 SQL 語句;

2、隨機(jī)選擇 Production 中指定產(chǎn)生式的 body 列表,隨機(jī)生成 SQL 語句。

1、枚舉

枚舉的實(shí)現(xiàn)方式是使用一個(gè)鏈表保存待 resolve 的Token,每次從鏈表頭取一個(gè) Token,并自增該 Token出現(xiàn)的次數(shù),再根據(jù)其每個(gè)子表達(dá)式中 Token 在記錄中出現(xiàn)次數(shù)是否大于指定次數(shù),篩選可以繼續(xù)推導(dǎo)的子表達(dá)式。

另一方面使用了兩個(gè)數(shù)組記錄當(dāng)前所取的子表達(dá)式的下標(biāo)(choice)和當(dāng)前最大子表達(dá)式下標(biāo)(max)進(jìn)行記錄,以便下一次自增 choice 取下一個(gè)表達(dá)式。

經(jīng)過篩選后,選取 choice 位置的產(chǎn)生式右部子表達(dá)式并將其全部 Token 插入鏈表頭部,然后判斷頭部是否為 literal 或 keyword,如果是則取出頭部放入 SQL 數(shù)組,如果不是則繼續(xù)循環(huán)處理鏈表。

當(dāng)處理到當(dāng)前產(chǎn)生式末尾時(shí)(判斷方式為 choice>max),此時(shí)將嘗試“進(jìn)位”,即記錄的當(dāng)前所取的位置數(shù)組最后一位自增。

比如:max 數(shù)組為 1 2 1 3,choice 數(shù)組為 0 0 0 3,則進(jìn)位后 choice 數(shù)組為 0 0 1 0,表示最后一個(gè)位置已全部遍歷,現(xiàn)在要將倒數(shù)第二位自增,最后一位置零,繼續(xù)下一次排列組合的讀取。

生成過程則是通過遞歸實(shí)現(xiàn),例如針對以下這條產(chǎn)生式,處理邏輯如圖所示:

show_tables_stmt: SHOW TABLES FROM name '.' name with_comment
??????????????? * SHOW TABLES FROM name with_comment
??????????????? * SHOW TABLES with_comment

with_comment: WITH COMMENT
??????????? * %empty

name: IDENT

根據(jù)記錄的 choice 值,選擇產(chǎn)生式的第 choice 條子表達(dá)式,直到生成一條 SQL。然后再將choice數(shù)組進(jìn)位,繼續(xù)下一輪選擇。

2、隨機(jī)

隨機(jī)生成模式與枚舉生成模式類似,區(qū)別在于其并不會順序遍歷產(chǎn)生式 body 列表中每個(gè) Token,而是隨機(jī)選擇一個(gè) Token 作為組成 SQL 的一部分。

到此這篇關(guān)于一文解讀 SQL 生成工具的文章就介紹到這了,更多相關(guān)SQL 生成工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

长垣县| 玉门市| 西青区| 始兴县| 琼中| 连南| 舒城县| 庆安县| 姜堰市| 乌什县| 广水市| 永春县| 北安市| 平安县| 道孚县| 松滋市| 淳安县| 宝鸡市| 泗水县| 涞源县| 海南省| 长兴县| 腾冲县| 浑源县| 电白县| 镇坪县| 平陆县| 济阳县| 蕉岭县| 西乌珠穆沁旗| 三亚市| 宣化县| 海林市| 泗水县| 衡东县| 扶风县| 安多县| 若羌县| 湖南省| 咸阳市| 泸水县|