思考mysql核心之初級系列2

2022-04-05 06:57:34 字數 3006 閱讀 4068

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...