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

一文解讀 SQL 生成工具

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

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

01 工具使用

語法文件預處理

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

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

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

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

SQL 語句生成

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

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

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

•-R:隨機生成模式,可選,默認為枚舉模式

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

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

02 工具實現(xiàn)

該工具包含兩個 package:yacc_parser和sql_generator,分別負責完成 Token 解析和 SQL 生成。

產生式的表示方法

type SeqInfo struct {
    Items []string
}
type Production struct {
    Head  string    // 產生式頭部
    Alter []SeqInfo     // 產生式 body
}

Token 解析

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

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

SQL 生成

SQL 生成有兩種模式:

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

2、隨機選擇 Production 中指定產生式的 body 列表,隨機生成 SQL 語句。

1、枚舉

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

另一方面使用了兩個數(shù)組記錄當前所取的子表達式的下標(choice)和當前最大子表達式下標(max)進行記錄,以便下一次自增 choice 取下一個表達式。

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

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

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

生成過程則是通過遞歸實現(xià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 值,選擇產生式的第 choice 條子表達式,直到生成一條 SQL。然后再將choice數(shù)組進位,繼續(xù)下一輪選擇。

2、隨機

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

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

您可能感興趣的文章:

相關文章

最新評論

汝州市| 通渭县| 微山县| 长沙市| 湘西| 渝北区| 玉门市| 巴东县| 黔江区| 红桥区| 固阳县| 突泉县| 都兰县| 阿克陶县| 马鞍山市| 铜鼓县| 丘北县| 元阳县| 十堰市| 邳州市| 澄城县| 南雄市| 福鼎市| 博湖县| 民丰县| 巫山县| 巴彦淖尔市| 富顺县| 盐山县| 宁夏| 昌黎县| 阿克苏市| 南澳县| 石柱| 彰武县| 淮滨县| 芦溪县| 平定县| 奉贤区| 黄石市| 紫金县|