PostgreSQL 分析器階段

2021-09-14 09:33 更新
50.3.1. 分析器
50.3.2. 轉(zhuǎn)換處理

分析器階段由兩部分組成:

  • 分析器定義在gram.yscan.l中,它使用Unix工具bisonflex構(gòu)建。

  • 轉(zhuǎn)換處理將對分析器返回的數(shù)據(jù)結(jié)構(gòu)進行修改和增加。

50.3.1. 分析器

分析器必須檢查查詢字符串(以純文本形式到達)是否為合法語法。如果語法正確將建立一個分析樹并返回之,否則將返回一個錯誤。 語法分析器和詞法分析器使用著名的Unix工具bisonflex實現(xiàn)。

詞法分析器定義在文件scan.l中,并負責(zé)識別標識符、SQL關(guān)鍵詞等。對于找到的每一個關(guān)鍵詞或標識符將生成一個記號并返回給語法分析器。

語法分析器定義在gram.y文件中,它由一組語法規(guī)則動作,動作將在規(guī)則被觸發(fā)時被執(zhí)行。動作的代碼(實際上是C代碼)將被用于構(gòu)建分析樹。

程序flex把文件scan.l轉(zhuǎn)換成C源文件scan.c, 程序bison把文件gram.y轉(zhuǎn)換為gram.c。在這些轉(zhuǎn)換結(jié)束后,一個正規(guī)的C編譯器就可以用于創(chuàng)建分析器。絕不要對生成的C文件做任何修改,因為每次 flexbison被調(diào)用都會重寫它們。

注意

前面提到的轉(zhuǎn)換和編譯通常是由隨PostgreSQL源代碼發(fā)布的makefiles自動完成。

對于bison的詳細介紹或者gram.y中的語法規(guī)則超出了本文的范圍。有很多書籍和文檔介紹flexbison。在學(xué)習(xí)gram.y中的語法之前你應(yīng)該先熟悉bison,否則你將無法理解發(fā)生了什么。

50.3.2. 轉(zhuǎn)換處理

分析階段根據(jù)SQL的語法結(jié)構(gòu)的固定規(guī)則創(chuàng)建一個分析樹。它不會在系統(tǒng)目錄做任何查找,這樣它不可能了解所請求的操作的詳細語義。在分析器完成之后,轉(zhuǎn)換處理接手分析器返還的樹,并進行語義解釋來理解該查詢引用了哪些表、函數(shù)和操作符。用于表示該信息的數(shù)據(jù)結(jié)構(gòu)被稱為查詢樹

將原始分析從語義分析中分離出來的原因是系統(tǒng)目錄的查找只能在一個事務(wù)中完成,而我們不希望在收到一個查詢字符串時立即開始一個事務(wù)。原始分析階段足以識別事務(wù)控制命令(BEGIN、ROLLBACK等),并且這些可以在沒有任何進一步分析之前正確地被執(zhí)行。一旦我們知道我們正在處理一個確切的查詢(例如SELECTUPDATE),就可以開始一個事務(wù)(如果我們還不在其中)。只有到這時轉(zhuǎn)換處理才能被調(diào)用。

由轉(zhuǎn)換處理創(chuàng)建的查詢樹在結(jié)構(gòu)上和原始分析樹有很多地方相似,但是在細節(jié)上有很多不同之處。例如,分析樹中的一個FuncCall節(jié)點表示某些在語法上看起來像一個函數(shù)調(diào)用的東西。它可能被轉(zhuǎn)換成一個FuncExprAggref節(jié)點,取決于被引用的名字是一個普通函數(shù)或是一個聚集函數(shù)。此外,關(guān)于列和表達式結(jié)果的實際數(shù)據(jù)類型的信息被加入到了查詢樹中。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號