SQLite中SQL的解析執行:Lemon與VDBE的作用解析

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

在 SQLite 的內部實現中,SQL 語句的解析與執行是一個精妙的過程,涉及詞法分析、語法分析、中間代碼生成與執行等多個環節。其中,Lemon 工具和 VDBE(Virtual Database Engine,虛擬數據庫引擎)扮演了關鍵角色。

一、SQL 解析執行的整體流程:從文本到結果的轉化

SQL 作為一種聲明式語言,其解析執行流程復用了編譯原理的經典邏輯,但最終目標并非生成機器碼,而是直接執行中間代碼以返回結果。具體流程可概括為:

詞法分析 → 語法分析 → 語義分析 → 中間代碼生成 → 中間代碼執行

這一流程與傳統編程語言的編譯過程(詞法→語法→語義→中間代碼→機器碼生成)既有相似之處,也存在顯著差異:前四步(詞法到中間代碼生成)與編譯原理的 “前端” 邏輯一致,但后續步驟并非生成機器語言,而是通過專門的引擎直接執行中間代碼,最終返回 SQL 的執行結果。

二、Lemon 的核心作用:語法分析與語義分析的驅動者

Lemon 是 SQLite 依賴的LALR (1) 語法分析器生成器,其核心功能是將 SQL 語法規則轉化為可執行的語法分析代碼。在 SQLite 的解析流程中,Lemon 的具體作用如下:

1. 從語法規則到代碼生成

SQLite 通過parse.y文件定義了 SQL 的語法規則(如CREATE TABLESELECT等語句的結構)。Lemon 根據parse.y中的規則,自動生成parse.c文件 —— 這是 SQLite 語法分析的核心代碼。

2. 語法分析與語義分析的銜接

parse.c的主要工作包括兩部分:

  • 語法分析:接收詞法分析器產生的 Token 序列(如TK_CREATETK_TABLE等),檢查其是否符合parse.y定義的語法規則(例如CREATE TABLE語句必須包含表名和字段列表),若存在語法錯誤則直接報錯。

  • 觸發語義分析:在語法分析通過后,parse.c會調用 SQLite 內置的語義分析函數(如檢查表名是否重復、字段類型是否合法、約束是否有效等),確保 SQL 語句在邏輯上可執行。

注意:詞法分析的獨立實現

需要明確的是,Lemon 不負責詞法分析。SQLite 的詞法分析由tokenize.c單獨實現,其功能是將原始 SQL 字符串拆分為一個個語義明確的 Token(對應TokenType枚舉,如TK_ID表示標識符、TK_LP表示左括號),并將 Token 序列傳遞給parse.c作為語法分析的輸入。例如,對于CREATE TABLE student(id INT),詞法分析會生成如下 Token 序列:

TK_CREATE → TK_SPACE → TK_TABLE → TK_SPACE → TK_ID(student)→ TK_LP → ...

三、VDBE:SQL 中間代碼的執行引擎

在語法分析和語義分析完成后,SQLite 會生成中間代碼(字節碼),而 VDBE 正是負責執行這些中間代碼的核心組件。

1. 中間代碼的本質

SQLite 的中間代碼是一組操作碼(Opcode)序列,每個操作碼對應一個具體的數據庫操作(如打開表、插入記錄、讀取數據等)。這些操作碼類似 Java 字節碼,是跨平臺的中間表示,例如:

  • OP_OpenTbl:打開指定數據表;

  • OP_String:將字符串常量壓入棧;

  • OP_MakeRecord:將棧中的字段值組合成一條記錄;

  • OP_Put:將記錄寫入數據表。

CREATE TABLE student(...)為例,生成的中間代碼包含 16 個操作碼,完整描述了創建表的全過程:從打開系統表(sqlite_master)、生成表元數據記錄,到最終寫入數據并關閉表。

2. VDBE 的執行邏輯

VDBE 是一個棧式虛擬機器,其執行過程依賴棧來傳遞數據和結果,核心特性包括:

  • 順序執行:默認按操作碼序列依次執行,完成基礎數據庫操作;

  • 分支與循環:支持操作碼跳轉(類似匯編語言的jmp指令),可實現條件判斷(如WHERE過濾)、循環遍歷(如掃描表中所有記錄)等復雜邏輯;

  • 狀態管理:維護數據庫連接、事務狀態、表緩存等上下文信息,確保操作的原子性和一致性。

簡言之,VDBE 通過 “解釋執行” 中間代碼,將 SQL 的聲明式邏輯轉化為具體的數據庫操作(如 B 樹讀寫、索引查詢、事務控制等),最終返回執行結果。

四、存儲層:從 B 樹到物理存儲

SQL 的執行最終需要與物理存儲交互,SQLite 的存儲層設計經歷了兩個階段的演進:

  • v1.0 版本:依賴外部的 GDBM(GNU 數據庫管理器)作為物理存儲引擎,通過調用 GDBM 的 API 實現數據讀寫。

  • v2.0 及以后版本:采用自研的存儲架構,核心是分頁管理B + 樹結構

    • 分頁管理將磁盤文件劃分為固定大小的頁(默認 4KB),通過頁緩存減少磁盤 IO;

    • B + 樹用于組織表數據和索引,確保高效的插入、查詢和刪除操作(所有數據通過葉子節點有序連接,支持范圍查詢)。

VDBE 的操作碼最終會映射為對 B 樹的具體操作(如OP_Put對應向 B 樹插入記錄),而分頁管理則負責 B 樹節點與磁盤文件的交互。

總結

SQLite 對 SQL 的解析執行流程可概括為:

  1. 詞法分析tokenize.c):生成 Token 序列;

  2. 語法與語義分析(Lemon 生成的parse.c):檢查語法合法性并驗證語義;

  3. 中間代碼生成:將 SQL 轉化為 Opcode 序列;

  4. 中間代碼執行(VDBE):解釋執行 Opcode,完成數據庫操作;

  5. 存儲交互:通過 B + 樹和分頁管理實現數據的物理存儲。

Lemon 和 VDBE 作為核心組件,分別解決了 “如何解析 SQL” 和 “如何執行 SQL” 的問題,共同支撐了 SQLite 輕量高效的數據庫功能。

(注:文檔部分內容由 AI 潤色生成)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90554.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++學習筆記(十:類與對象基礎)

往篇內容: C學習筆記(一) 一、C編譯階段※ 二、入門案例解析 三、命名空間詳解 四、C程序結構 C學習筆記(二) 五、函數基礎 六、標識符 七、數據類型 補充:二進制相關的概念 sizeof 運算符簡介 補…

圖片查重從設計到實現(4)圖片向量化存儲-Milvus 單機版部署

Milvus 單機版部署 在 Docker 環境下安裝、應用和配置 Milvus 向量數據庫可以按照以下步驟進行,涵蓋從安裝到基礎應用的完整流程: 1. 部署前準備 服務器:建議測試環境配置 2 核 CPU、8GB 內存;處理 100 萬組向量數據,…

前端版本更新檢測機制

📌 一、為什么需要前端版本更新檢測機制?在現代 Web 項目中,我們通常會通過 CDN 或緩存策略來加快頁面加載速度,但這也帶來了一個問題:用戶可能訪問的是舊版本的頁面或資源,而不會自動更新到最新版本。這在…

Python(09)正則表達式

特殊字符 1. 基本元字符 .:匹配除換行符以外的任意單個字符。 *:匹配前面的元素零次或多次。 :匹配前面的元素一次或多次。 ?:匹配前面的元素零次或一次。 2. 定量符 {n}:匹配前面的元素恰好 n 次。 {n,}:…

k8s容器放開鎖內存限制

參考:https://access.redhat.com/solutions/1257953 問題 nccl-test容器docker.io/library/nccl-tests:24.12中跑mpirun,buff設置為NCCL_BUFFSIZE503316480 提示out of memory: pod-1:78:91 [0] include/alloc.h:114 NCCL WARN Cuda failure …

基于Zigee的溫度數據采集系統

大家好,本文帶來的是單片機課設-基于Zigee的溫度數據采集系統。 一、設計內容和要求 基于Zigbee的數據采集系統 1.1設計內容 (1)分析對比Bluetooth、Zigbee、Lora方式組網的基本原理和性能差異,撰寫分析報告; &#xf…

ATH12K 驅動框架分析

文章目錄 Linux Wireless 驅動框架深入分析 **1. 核心框架層次結構** **1.1 cfg80211 子系統 (`net/wireless/`)** **1.2 mac80211 子系統 (`net/mac80211/`)** **2. ath12k 驅動架構分析** **2.1 核心管理文件** **2.2 數據路徑文件** **2.3 平臺接口文件** **2.4 功能模塊文件…

OSPF路由協議單區域

RIP的不足 以跳數評估的路由并非最優路徑 如果RTA選擇S0/0傳輸,傳輸需時會大大縮短為3sRIP協議限制網絡直徑不能超過16跳 收斂速度慢 RIP定期路由更新 – 更新計時器:定期路由更新的時間間隔,默認30秒。 – 失效計時器:失效計時器…

Kubernetes部署與管理Scrapy爬蟲:企業級分布式爬蟲平臺構建指南

引言:Kubernetes在爬蟲領域的戰略價值在大規模數據采集場景中,??容器化爬蟲管理??已成為企業級解決方案的核心。根據2023年爬蟲技術調查報告:采用Kubernetes的爬蟲系統平均資源利用率提升??65%??故障恢復時間從小時級縮短至??秒級?…

Web-Machine-N7靶機攻略

一.環境準備(VBox,kali虛擬機,靶機) 1.1Vbox下載地址: Downloads – Oracle VirtualBox 1.2將N7導入到這個虛擬機中 1.3將kali和Vbox都設置成橋接模式 1.4開啟靶機 若鼠標出不來可以使用組合技,CtrlAltDelete強制退出 二.信息…

用毫秒級視頻回傳打造穩定操控閉環之遠程平衡控制系統技術實踐

在工業自動化、遠程機器人、無人裝備等復雜作業場景中,遠程實時操控正逐步取代傳統“監控指令”模式,成為提升效率與保障安全的關鍵能力。尤其在高風險、高精度的應用環境中,操作者不僅要“能控”,更要“看得準、反應快”。 真正…

瑞薩電子RA-T MCU系列新成員RA2T1——電機控制專家

RA2T1系列微控制器基于64MHz ArmCortex-M23內核設計,專為單電機控制應用而優化。RA2T1集成PWM定時器,以及配備3個采樣保持電路的A/D轉換器等先進的模擬功能,適用于電動工具,風扇和家用電器等高效的低端電機控制方案。RA2T1支持1.6…

Java排序算法之<選擇排序>

目錄 1、選擇排序 1.1、介紹 1.2、穩定性 2、執行流程 3、java實現 4、優缺點 總結:Java 排序算法進階路線 O(n) 算法(適合學習原理) 冒泡排序(最慢)→ 選擇排序 → 插入排序(推薦先學) …

ESP8266 http收發數據

1.先修改基礎配置 make menuconfig 打開配置菜單 選擇component config 然后選擇 修改波特率為115200 保存退出 2.修改彩色日志打印的 在component config目錄下找到log output 選中點擊空格關掉彩色日志輸出,這樣正常串口打印就沒有亂碼了 然后保存退出 3…

ZLMediaKit 源代碼入門

ZLMediaKit 是一個基于 C11 開發的高性能流媒體服務器框架,支持 RTSP、RTMP、HLS、HTTP-FLV 等協議。以下是源代碼入門的詳細指南: 1. 源碼結構概覽 主要目錄結構: text ZLMediaKit/ ├── cmake/ # CMake 構建配置 ├── …

智能Agent場景實戰指南 Day 21:Agent自主學習與改進機制

【智能Agent場景實戰指南 Day 21】Agent自主學習與改進機制 文章內容 開篇 歡迎來到"智能Agent場景實戰指南"系列的第21天!今天我們將深入探討智能Agent的自主學習與改進機制——這是使Agent能夠持續提升性能、適應動態環境的核心能力。在真實業務場景…

微信小程序中英文切換miniprogram-i18n-plus

原生微信小程序使用 miniprogram-i18n-plus第一步:npm install miniprogram-i18n-plus -S安裝完成后,會在項目文件文件夾 node_modules文件里生成 miniprogram-i18n-plus, 然后在工具欄-工具-構建npm,然后看到miniprogram_npm里面…

LeetCode 127:單詞接龍

LeetCode 127:單詞接龍問題本質:最短轉換序列的長度 給定兩個單詞 beginWord 和 endWord,以及字典 wordList,要求找到從 beginWord 到 endWord 的最短轉換序列(每次轉換僅改變一個字母,且中間單詞必須在 wo…

docker搭建ray集群

1. 安裝docker 已安裝過docker 沒安裝流程 啟動 Docker 服務: sudo systemctl start docker sudo systemctl enable docker # 設置開機即啟動docker驗證 Docker 是否安裝成功: docker --version2. 部署ray # 先停止docker服務 systemctl stop docker…

【iOS】SideTable

文章目錄前言1??Side Table 的核心作用:擴展對象元數據存儲1.1 傳統對象的內存限制1.2 Side Table 的定位:集中式元數據倉庫2??Side Table 的底層結構與關聯2.1 Side Table 與 isa 指針的關系2.2 Side Table 的存儲結構2.3 SideTable 的工作流程3??…