分佈式 | DBLE 之 SQL 解析

作者:路路

熱愛技術、樂於分享的技術人,目前主要從事數據庫相關技術的研究。

本文來源:原創投稿

*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。

數據庫中間件與數據庫有什麼區別?

個人認為除了沒做數據存儲,其他的功能數據庫中間件幾乎一樣不少,比如 SQL 解析、結果集處理、協議實現等。


SQL 解析的定義

今天我們主要來談談 SQL 解析,SQL 的全稱為 Structured Query Language,即結構化查詢語言,既然定義為語言,那其實它和任何其他語言都是平等的。所以對 SQL 的解析完全等同於對任何一門語言的解析,對編程語言的解析這就涉及到編譯原理相關知識了。

想要解析一門語言,通常需要具備以下工具:

  • 詞法分析器(Lexer):負責解析基本的詞法,也就是將字符序列轉換為單詞(Token)序列的過程。
  • 語法分析器(Parser):將詞法分析器解析出的單詞(Token)序列,進一步構建成有語義的數據結構,比如抽象語法樹。
  • 訪問器(Visitor):能夠對語法分析器生成的抽象語法樹進行遍歷,獲取需要的信息。

上面的定義可能大家看完還有點懵懂,這裡我通過一個實際的例子來讓大家有個更具體的認識。


案例解析

原始 SQL 如下:

<code>SELECT id, name FROM test WHERE ID > 2 LIMIT 2;/<code>

下面我們來解析這個 SQL:

1. 詞法分析

詞法分析是將字符序列轉換為單詞(Token)序列的過程,所以上面的 SQL 經過詞法分析後,將會變成這樣一串序列:

分佈式 | DBLE 之 SQL 解析

是的,大家也許看出來了,詞法分析就是拆分字符序列(是的,沒錯,我們都能自己寫個詞法分析器)。

2. 語法分析

語法分析是將詞法分析器解析出的單詞(Token)序列,進一步構建成有語義的抽象語法樹(為什麼是“抽象”的,是因為這裡的語法並不會表示出真實語法中出現的每個細節,比如上面拆分出來的“,”就不需要再數據結構中展現了)。

經過語法分析,上述序列將呈現如下結構:

分佈式 | DBLE 之 SQL 解析

同學們看到這裡,應該知道語法分析器的作用了吧,其實就是把單詞(TOKEN)序列轉換成相應的數據結構,因為是樹形的,又是“抽象”的,所以就叫抽象語法樹了,看起來高端,其實大家也能自己寫個語法分析器。

完成了上面兩步,SQL 語法解析就已經完成了,至於遍歷器,其實就是訪問抽象語法樹中的結構的。


結論

對於 SQL 解析,難道我們真的要手寫嗎?答案是當然不用啦,畢竟我們不是第一個吃螃蟹的人,DRUID 已經幫我們實現了 SQL 解析的功能,所以我們可以直接拿來用。DRUID 中的詞法分析器以及語法分析器都是純手寫的,效率也很快。這裡同學們可能會問,難道還有不用手寫的嗎?答案是肯定的,ANLTR 就可以幫你生成相應的解析器,不過還是需要你定義規則的。

DBLE 中 SQL 解析用的是 DRUID 實現,其實 SQL 解析說白了就是理解 SQL,理解了 SQL 就知道它要幹嘛了,所以 DBLE 中的 SQL 解析是為後面的路由、結果集處理等功能服務的。


分享到:


相關文章: