alex取了個號,客戶經理小張負責辦理alex的服務。
1)服務清單
小張:「先生,我可以為你服務什麼麼?」
alex:「厄,我要一碗紅燒肉。」
小張:「沒有」
alex:「厄,那來碗拉麵」
小張:「沒有」
alex:「那有些啥?」
小張:「可以檢視sql目錄下sql_yacc.yy檔案,不過你用的這個5.1.7沒有該檔案,只有相對應的sql_yacc.cpp檔案。你可以使用5.1的其它版本的該檔案,比如5.1.34。這裡有個6.0.4的sql_yacc.yy檔案,你先看下。」
alex:「啊?那不是要先看lex與yacc。」
小張:「推薦你不必看lex與yacc,我大概給你說說,只要看語法規則就可以了。
每條語法規則包括乙個左部和乙個右部,左右部之間用冒號』:』來分隔,規則結尾處要用分號」;」標記,所以一條語法規則的格式如下:
nonterminal : body;
其中nonterminal是乙個非終結符,右部的body是乙個由終結符和非終結符組成的串、可以為空,請看幾個例子,語法1:
1create: create opt_table_options table_sym opt_if_not_exists table_ident create2
語法2:
create: create database opt_if_not_exists ident opt_create_database_options
從中,我
1create: create database opt_if_not_exists ident opt_create_database_options
們可以看出語法1是建立表的,語法是建立資料庫的。正常情況下,小寫字母表示非終結符,用大寫字母表示終結符,終結符是前面定義的。
%token create /* sql-2003-r */
這兩個create語法可以合併成乙個,中間用『|』分割,表示』或』:
create: create opt_table_options table_sym opt_if_not_exists table_ident create2
| create database opt_if_not_exists ident opt_create_database_options
非終結進一步往下進行擴充套件,比如看下 12
3456
7opt_if_not_exists:
/* empty */
| if not exists;
/*empty*/這一行表示使用者使用者沒有輸入該子句,看下這個語句:
create table t1(idint,varchar(20));
「create」被create語法中的「create」命中,「table」被「table_sym」命中,opt_if_not_exists對應的為空。而下面乙個語句就會命中:
create tableifnot exists t1(idint,varchar(20));
alex:「多謝,也就是說,符合規範的語句就會被識別,從而被執行,是這樣麼。」
小張:「可以勉強這麼講」
2)語言的轉換
alex:「小張,我問你哈,語句後面的大括號是什麼意思啊。」
小張:「括號裡面表示的是觸發了語義動作,設定了ts_cmd_type的值為建立表空間。 12
3456
7create:
//省略了一些內容
| create tablespace tablespace_info
//省略了一些內容
alex:「我看到裡面有$$,$1,這些是什麼含義啊」
小張:「你看下面乙個表示式。
a :b c d
其中a的語義值為$$,b、c、d的語義值依次為$1,$2,$3。為了表達得更清晰,看下面的表示式,左邊的expr的值應該等於右邊的expr的值
expr: '(' expr ')'
alex:「不太對啊,你看下這個表示式,$3從**來的,只有兩個值啊:get_select_lex、derived_table_list。 12
3456
78910
1112
1314
1516
1718
1920
21select_derived:
get_select_lex
derived_table_list};
小張:「這個情況我們要講下,有些語法需要在識別出句型的一部分時就完成一些動作,這裡我們看到了第乙個大括號。yacc會自動設定乙個非終結符$act,該$act解析為空。
select_derived: get_select_lex $act derived_table_list
因此第二個大括號裡面的$3就是derived_table_list
alex:「謝謝,我明白一點了。其實yy檔案產生的作用就是語句串轉化為lex語法結構。然後系統根據lex語法結構進行處理。那麼是不是可以說,只要通過語句,就可以執行。」
小張:「早著呢,還有語義檢查,比如查詢的列名不存在,以及許可權檢查,優化等等。要確保安全,不然你直接來句查了bingxi有多少存款,這可不行。」
3)所謂的5級安全
alex:「這個安全,是不是所謂的5級安全,b1,b2等等啥的。」
小張:「這兩個沒有關聯,不過你提到了,我就給你提提。
1級安全:以前啊,公司老總算了算,就像dba。獨自管著賬本呢,不安全。
2級安全:董事會覺得不安全,就加了個審計員。很多資料庫裡面都有。但是呢,也不安全,老總把審計員搞定了。合謀合謀。
3級安全:搞了個三權分離,所謂的安全員,保衛科。賬本鎖起來。不過也不安全,儲存賬本的安全室不結識,打個洞就進去了。
4級安全:結構化程式設計,於是進不去了。
5級安全:沒有最安全,只有更安全,沒有達到這個的。
alex:「有點意思,小張,我要開個戶,你給講講這個的流程吧。」
小張:「你帶身份證了」
alex:「沒帶」
小張:「那明天吧」
alex:「ok」
思考mysql核心之初級系列3 辦理業務的流程
alex第二天帶了身份到銀行找了小張,要辦理個開戶業務。1 語法結構lex alex 小張,我要開個賬戶。小張 麻煩填寫個開戶申請單。alex 好的,我順便問個問題,開戶要填寫開戶申請單,兌換港幣也要寫申請單,匯款等也需要填寫,這裡面既有共性,又有差異性,是如何管理的。小張 嗯,差不多,都是提供寫一...
思考mysql核心之初級系列3 辦理業務的流程
alex第二天帶了身份到銀行找了小張,要辦理個開戶業務。1 語法結構lex alex 小張,我要開個賬戶。小張 麻煩填寫個開戶申請單。alex 好的,我順便問個問題,開戶要填寫開戶申請單,兌換港幣也要寫申請單,匯款等也需要填寫,這裡面既有共性,又有差異性,是如何管理的。小張 嗯,差不多,都是提供寫一...
mysql之初級學習(一)
mysql資料庫是一種強型別的語言,數字 nt 整數 最大到10位 float 小數 number 數字 decimal 數字 文字 char 字串 2000 定長 varchar 字串 2000 變長 text 大文字型別 幾萬個字是沒有問題的,野史 官網沒有詳細說明 兩億個字 日期 dateti...