標籤:
大牛那海藍藍
MySQL提供了較為豐富的SQL語句,用以支援MySQL提供的主要功能。在資料庫內部,MySQL又是怎麼知道自己能夠處理哪些對象、處理哪些事情的?
如果我們輸入一條SQL語句,MySQL可能報告語法錯誤或對象不存在等錯誤提示,這些提示,大致可以分為2類,一類是針對解析使用者命令的如語法錯誤,一類是針對語義檢查如說對象不存在的。其實還有其他類型如許可權等檢查,只是這些與本文無關,且簡單故忽略莫執著於此處。
這2類錯誤提示,其實可以對應到MySQL的2個重要檔案上,這是從源碼的角度來看的。
首先,sql_yacc.yy檔案,幫MySQL解決了怎麼知道處理哪些事情。
其次,item.h這個檔案,幫MySQL解決了怎麼知道處理哪些對象。
本文從代碼的角度,簡單解析item.h這個檔案。
一 從檔案名稱看MySQL可以處理的對象
MySQL可以處理的各種對象、以及對象間的關係,可以從如下檔案認識。
1 item.h: 總的對象定義類,定義了‘Item‘類作為總的對象類,此後,本檔案中定義了許多子類,來豐富和發展MySQL可以處理的對象。但此類繼承自‘Parse_tree_node‘類,使得對象和詞法文法解析關聯起來,這個不細述。
2 item_cmpfunc.h:定義了‘Item_bool_func‘類,繼承自‘Item_int_func‘類,而Item_int_func繼承自Item_func,Item_func類繼承自Item類。‘Item_bool_func‘類主要用於支援比較操作,如等於、大於、小於、IN、BETWEEN、是否為NULL等。
3 item_create.h:使用者自訂函數的建立介面。
4 item_func.h:定義了 Item_func類,繼承自Item類,用以支援各種函數操作。如求絕對值、求長度、取餘等等。本檔案中也定義了許多子類,來豐富和發展MySQL可以處理的對象。
5 item_geofunc.h:空間對象處理相關函數。
6 item_inetfunc.h:定義IPv4、IP6的處理。
7 item_row.h:行值函數定義,用以支援類似如下操作:
(a, b, c) > (10, 10, 30)
(a, b, c) = (select c, d, e, from t1 where x=12)
(a, b, c) IN ((1,2,2), (3,4,5), (6,7,8)
(a, b, c) IN (select c, d, e, from t1)
8 item_strfunc.h:定義了字元類型的處理函數(主要是字元類型, 還有一些其他類型,如make_set函數的處理但傳回值是字元類型)。如一些字元集相關的處理、去左空格、字串替換等。
9 item_subselect.h:儘管子查詢可以被最佳化,即需要對子查詢內部的對象分解,但是,MySQL把子查詢當作一個對象,相關輔助處理子查詢的對象也在這個檔案中定義。
10 item_sum.h:定義聚集合函式的處理。包括MIN和MAX,但通常這2函數個是利用索引進行最佳化的。
11 item_timefunc.h:定義時間和日期的處理函數。
12 item_xmlfunc.h:定義XML類型資料的處理函數。
特別注意,本文中,說“定義時間和日期的處理函數”中的函數一詞,除了有編程中的函數的含義外,更多的指得是“功能”,即資料庫提供處理時間和日期的能力。其他類似。
mysql 函數在源碼中的定義