2025年9月25日: PostgreSQL 18 釋出!
支援的版本:當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

51.3. 解析器階段 #

解析器階段包含兩個部分

  • gram.yscan.l中定義的解析器是使用 Unix 工具bisonflex構建的。

  • 轉換過程對解析器返回的資料結構進行修改和增強。

51.3.1. 解析器 #

解析器必須檢查查詢字串(以純文字形式傳入)的語法是否有效。如果語法正確,則會構建一個解析樹並返回;否則,將返回錯誤。解析器和詞法分析器是使用廣為人知的 Unix 工具bisonflex實現的。

詞法分析器定義在檔案scan.l中,負責識別識別符號SQL 關鍵字等。對於找到的每個關鍵字或識別符號,都會生成一個標記並將其傳遞給解析器。

解析器定義在檔案gram.y中,包含一組語法規則和在規則觸發時執行的操作。操作的程式碼(實際上是 C 程式碼)用於構建解析樹。

檔案scan.l使用flex程式轉換為 C 原始檔scan.c,而gram.y使用bison程式轉換為gram.c。在這些轉換完成後,可以使用普通的 C 編譯器來建立解析器。切勿對生成的 C 檔案進行任何修改,因為它們將在下次呼叫flexbison時被覆蓋。

注意

提到的轉換和編譯通常使用PostgreSQL源分發包中附帶的Makefile自動完成。

bisongram.y中給出的語法規則進行詳細描述將超出了本手冊的範圍。有許多書籍和文件涉及flexbison。在開始研究gram.y中的語法之前,您應該熟悉bison,否則您將無法理解那裡發生了什麼。

51.3.2. 轉換過程 #

解析器階段僅使用關於 SQL 語法結構的固定規則來建立解析樹。它不進行任何系統目錄查詢,因此無法理解所請求操作的詳細語義。解析器完成後,轉換過程將解析器返回的樹作為輸入,並進行必要的語義解釋,以理解查詢引用的表、函式和運算子。用於表示此資訊的構建的資料結構稱為查詢樹

將原始解析與語義分析分開的原因是,系統目錄查詢只能在事務內進行,而我們不希望在接收到查詢字串後立即啟動事務。原始解析階段足以識別事務控制命令(如BEGINROLLBACK等),這些命令可以正確執行而無需進一步分析。一旦我們知道正在處理實際查詢(如SELECTUPDATE),就可以在尚未處於事務中的情況下啟動事務。只有這樣,才能呼叫轉換過程。

轉換過程建立的查詢樹在大多數地方在結構上與原始解析樹相似,但在細節上有很多差異。例如,解析樹中的FuncCall節點代表看起來像函式呼叫的內容。這可能會根據引用的名稱被轉換為FuncExprAggref節點,具體取決於引用名稱是普通函式還是聚合函式。此外,有關列和表示式結果的實際資料型別的資訊也會新增到查詢樹中。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的使用經驗不符或需要進一步闡明的內容,請使用此表格報告文件問題。