clickhouse的sql解析入口函式:parsequery, 函式原型:
astptr parsequery(
iparser & parser,
const char * begin,
const char * end,
const std::string & query_description,
size_t max_query_size)
具體的功能實現是通過呼叫tryparsequery函式完成。
函式原型:
astptr tryparsequery(
iparser & parser,
const char * & pos,
const char * end,
std::string & out_error_message,
bool hilite,
const std::string & query_description,
bool allow_multi_statements,
size_t max_query_size)
該函式主要實現了兩種功能:詞法分析和語法解析。
詞法解析的主要任務是讀入源程式的輸入字元、將它們組成詞素,生成並輸出乙個詞法單元(token)序列,每個詞法單元對應於乙個詞素。
clickhouse中的每個詞法單元(token)使用乙個struct tocken結構體物件來進行儲存,結構體中儲存了詞法單元的type和value。
clickhouse中token的種類列表:
name
description
whitespace
+comment
bareword
+number
二進位制、八進位制、十進位制、十六進製制等
stringliteral
quotedidentifier
openingroundbracket
closingroundbracket
openingsquarebracket
closingsquarebracket
comma
semicolon
dotasterisk
plus
minus
slash
percent
arrow
questionmark
colon
equals
notequals
less
creater
lessorequals
greaterorequals
concatenation
clickhouse詞法分析器是由tokens和lexer類來實現, db::lexer::nexttokenimpl()函式用來對sql語句進行詞法分析的具體實現。
語法分析器的作用是根據給定的形式文法對由詞法單元(token)序列構成的輸入進行語法檢查、並構建由輸入的詞法單元(token)組成的資料結構(一般是語法分析樹、抽象語法樹等層次化的資料結構)。
clickhouse中定義了不同的parser用來對不同型別的sql語句進行語法分析,例如:parserinsertquery(insert語法分析器)、parsercreatequery(create語法分析器)、parseralterquery(alter語法分析器)等等。
parser首先判斷輸入的token序列是否是該型別的sql,若是該型別的sql,則繼續檢查語法的正確性,正確則生成ast返回,語法錯誤的則丟擲語法錯誤異常,否則直接返回空ast語法樹。
clickhouse語法分析器的入口類:parserquery。該函式接收詞法分析器傳遞的token序列,將其傳遞給具體的parser進行語法分析,並接受parser產生的ast結果。
clickhouse中parser間的呼叫關係如下圖所示:
Clickhouse 原始碼架構
原始碼版本 v20.1 這篇文章主要是從整體上看一下整個專案包含哪些主要模組,明確每個模組的作用,為後續針對性的深挖打個基礎。access 許可權控制 aggregatefunctions functions tablefunctions 聚合函式 普通函式 表函式的定義 client server...
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
思科VPP原始碼分析(dpo機制原始碼分析)
vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...