±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎĽéÉÜÁË»ùÓÚMySQL5.7.22µÄSQL×ÜÌåÖ´ÐÐÁ÷³Ìͼ£¬Ïà¹Ø¸ÅÄÒÔ¼°sql_yacc.yyÎļþ½âÎöµÈ£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£ |
|
±¾ÎÄÊÇ»ùÓÚMySQL5.7.22½øÐзÖÎö
1. SQL×ÜÌåÖ´ÐÐÁ÷³Ìͼ

ͨ¹ýÉÏÃæÍ¼,¿ÉÒÔ´ÓÈ«¾ÖÉÏÁ˽âSQLÓï¾äÖ´ÐÐÁ÷³ÌÒÔ¼°ÓëÆäËûÄ£¿é½»»¥
1.1 SQL²éѯִÐÐÁ÷³Ì


2. Óï·¨½âÎö
2.1 ±à³ÌÓïÑÔ֪ʶ»Ø¹Ë
ÔÚ½éÉܾßÌåµÄMySQLÊý¾Ý¿â½âÎöSQL֮ǰ,ÏÈÀ´»Ø¹éһϱà³ÌÓïÑÔµÄ֪ʶµã
ÐÎʽÓïÑÔ(Formal language)
ÐÎʽÓïÑÔÊÇÓþ«È·µÄÊýѧ»ò»úÆ÷¿É´¦ÀíµÄ¹«Ê½¶¨ÒåµÄÓïÑÔ,¸öÈËÀí½âÐÎʽÓïÑÔ¾ÍÊÇ·ûºÅ»¯µÄÓïÑÔ,±ÈÈç±à³ÌÓïÑÔ(C
C++ JAVA PYTHON),¶¼ÊǶ¨ÒåÒ»×é·ûºÅÀ´ÃèÊöÓ³ÉäÈ˵Ä˼άÂß¼µÄ,·ûºÅ»¯µÄÓïÑԵĺô¦¾ÍÊÇÄܹ»×¼È·±í´ï,²»»á²úÉú¶þÒåÐÔ.
ÎÄ·¨(grammar)
µ±ÎÒÃÇÒªÃèÊöÒ»ÖÖÓïÑÔʱ£¬ÐèÒª¸ø³öÕâÖÖÓïÑÔµÄËùÓоä×Ó£¬µ±¾ä×ÓµÄÊýÄ¿ÊÇÓÐÏÞ¿ÉÊýʱ£¬¾ÍÒª¶¼ÁгöÀ´£»µ±¾ä×ÓÊÇÒ»¸öÎÞÇ£¬Ò²¾ÍÊÇÎÞÏÞ²»¿ÉÊýʱ£¬¾ÍÒª¸ø³ö¿ÉÒÔ±íʾËüÃǵĽṹµÄÃèÊö·½·¨»òÕß˵£¬¾ä×ÓµÄ×é³É¹æÔò¡£ÕâÖÖ¹æÔò¾ÍÊÇÎÄ·¨¡£¼´´ÓÐÎʽÉÏÓÃÓÚÃèÊöºÍ¹æ¶¨½á¹¹µÄ³ÆÎªÎÄ·¨£¨»òÕß˵Óï·¨£©,
Ò²¿ÉÒÔÀí½âΪָÔõôÓÉÒ»¶Ñ·ûºÅ×é³ÉÒ»¸öÓк¬ÒåµÄ¾ä×ӵĹæÔòºÍÐÒé
ÉÏÏÂÎÄÎÞ¹ØÎÄ·¨(context-free grammar)(ÊýѧÃèÊö)
Ò»¸öËÄÔªÊý×éG=(VN,VT,S,P):
VN:·Ç¿ÕÓÐÏ޵ķÇÖÕ½á·û¼¯ºÏVT:·Ç¿ÕÓÐÏÞµÄÖÕ½á·û¼¯
S:¿ªÊ¼·ûºÅP:²úÉúʽ¼¯ºÏ
ÆäÖУ¬VN¡ÉVT=?£¬S¡ÊVN
PÖвúÉúʽһ°ãÐÎʽΪA¡ú¦Á|¦Â£¬ÆäÖÐA¡ÊVN£¬¦Á£¬¦Â¡Ê(VN¡ÈVT)*
´óд×Öĸ±íʾ·ÇÖÕ½á·û£¬Ð¡Ð´×Öĸ±íʾÖÕ½á·û£¬¦Á¡¢¦Â¡¢¦ÃµÈ´ú±íÓÉ ÖÕ½á·ûºÍ·ÇÖÕ½á·ûºÅµÄ²¢¼¯µÄ±Õ°ü ÖеÄÔªËØ
×é³ÉµÄ·ûºÅ´®
ÉÏÏÂÎÄÎÞ¹ØÎÄ·¨È¡ÃûΪ¡°ÉÏÏÂÎÄÎ޹ء±µÄÔÒò¾ÍÊÇÒòΪ×Ö·ûA×Ü¿ÉÒÔ±»×Ö´®¦Á»ò¦Â×ÔÓÉÌæ»»£¬¶øÎÞÐ迼ÂÇ×Ö·ûA³öÏÖµÄÉÏÏÂÎÄ
ÖÕ½á·û(terminal symbol )
ÖÕ½á·ûÊÇÒ»¸öÐÎʽÓïÑԵĻù±¾·ûºÅ¡£¾ÍÊÇ˵£¬ËüÃÇÄÜÔÚÒ»¸öÐÎʽÓï·¨µÄÍÆµ¼¹æÔòµÄÊäÈë»òÊä³ö×Ö·û´®´æÔÚ£¬¶øÇÒËüÃDz»Äܱ»·Ö½â³É¸üСµÄµ¥Î»¡£¿ÉÒÔÀí½âΪ²úÉúÊ½ÍÆµ¼µ½Ê²Ã´Ê±ºòÍ£Ö¹ÄØ£¬ÍƵ¼µ½ÖÕÖ¹·ûΪֹ.
·ÇÖÕ½á·û(nonterminal symbol)
·ÇÖÕ½á·ûÊÇ¿ÉÒÔ±»È¡´úµÄ·ûºÅ¡£Ò»¸öÐÎʽÎÄ·¨ÖбØÐëÓÐÒ»¸öÆðʼ·ûºÅ£»Õâ¸öÆðʼ·ûºÅÊôÓÚ·ÇÖÕ½á·ûµÄ¼¯ºÏ¡£ÔÚÉÏÏÂÎÄÎÞ¹ØÎÄ·¨ÖУ¬Ã¿¸öÍÆµ¼¹æÔòµÄ×ó±ßÖ»ÄÜÓÐÒ»¸ö·ÇÖÕ½á·û¶ø²»ÄÜÓÐÁ½¸öÒÔÉϵķÇÖÕ½á·û»òÖÕ½á·û¡£
°Í¿ÆË¹·¶Ê½(BNF: Backus-Naur Form)
ÒÔÃÀ¹úÈ˰ͿÆË¹(Backus)ºÍµ¤ÂóÈËŵ¶û(Naur)µÄÃû×ÖÃüÃûµÄÒ»ÖÖÐÎʽ»¯µÄÓï·¨±íʾ·½·¨£¬ÓÃÀ´ÃèÊöÓï·¨µÄÒ»ÖÖÐÎʽÌåϵ£¬ÊÇÒ»ÖÖµäÐ͵ÄÔªÓïÑÔ¡£ÓֳưͿÆË¹-ŵ¶ûÐÎʽ(Backus-Naur
form)¡£Ëü²»½öÄÜÑϸñµØ±íʾÓï·¨¹æÔò£¬¶øÇÒËùÃèÊöµÄÓï·¨ÊÇÓëÉÏÏÂÎÄÎ޹صġ£Ëü¾ßÓÐÓï·¨¼òµ¥£¬±íʾÃ÷È·£¬±ãÓÚÓï·¨·ÖÎöºÍ±àÒëµÄÌØµã¡£
±à³ÌÓïÑÔµÄÎÄ·¨³ýÁËÊýѧ»¯µÄÃèÊö£¬»¹ÐèÒªÔÚÔÚʵ¼ÊÉú²úÖÐÒ×ÓÚÃèÊöµÄ·ûºÅ»¯ÓïÑÔ£¬BNF¾ÍÊÇÓÃÀ´ÃèÊöÉÏÏÂÎÄÎÞ¹ØÎÄ·¨µÄ·ûºÅ»¯µÄÓïÑÔ.
2.2 ¸ÅÄîÓëbison
2.1Õ½Ú˵Ã÷µÄ¸ÅÄî¸úbisonÓÖÊÇÒ»ÖÖʲô¹ØÏµÄØ£¿
bisonÊÇÊôÓÚ GNU ÏîÄ¿µÄÒ»¸öÓï·¨·ÖÎöÆ÷Éú³ÉÆ÷¡£
bisonÄܹ»½«ÉÏÏÂÎÄÎÞÎÄ·¨½âÊͳÉÓï·¨·ÖÎö±í£¬ÓÉÓÚ¼æÈÝyacc£¬¶øyaccÊÇBNF½øÐÐÃèÊöÎÄ·¨¹æÔòµÄ,
ËùÒÔ¿ÉÒÔÀí½âΪbisonÄܹ»½âÎöÒÔBNFÃèÊöÉÏÏÂÎÄÎÞ¹ØÎÄ·¨µÄÓï·¨·ÖÎöÆ÷Éú³ÉÆ÷.
2.3 MySQLÓëbison
MySQLʹÓÃbison×÷ΪÆä½âÎöSQLÓï¾äµÄÓï·¨·ÖÎöÆ÷.
2.4 SQL½âÎöÏà¹ØÎļþ¼°¹ØÁª
(1) Ïà¹ØÎļþ
SQL´Ê·¨½âÎöÎļþ:
sql/sql_lex.h¡¢sql/lex_token.h¡¢sql/lex.h¡¢sql/lex_symbol.h
sql/gen_lex_token.cc¡¢sql/sql_lex.cc
SQLÓï·¨½âÎöÎļþ:
sql/sql_yacc.yy¡¢sql/sql_yacc.cc¡¢sql/sql_yacc.h
SQLÓï¾äµÄhintÓï·¨½âÎöÎļþ:
sql/sql_hints.yy¡¢sql/sql_hints.yy.cc
(2) Óï·¨½âÎö

3. sql/sql_yacc.yy
3.1 sql_yacc.yyÃèÊö
sql_yacc.cc¹æ¶¨ÁËSQLÓï¾äÓï·¨¹æÔò,¶¨ÒåÁËSQLÓï¾äµÄ¹Ø¼ü×Ö.
3.2 sql_yacc.yyÎļþ½á¹¹
%{
Prologue
%}
Bison declarations
%%
Grammar rules
%%
Epilogue |
Prologue²¿·Ö°üÀ¨ºê¶¨ÒåºÍÔÚÓï·¨¹æÔò¶¯×÷ÖÐʹÓõĺ¯ÊýºÍ±äÁ¿µÄÉùÃ÷. ÕâЩ½«¸´ÖƵ½·ÖÎöÆ÷ÎļþµÄ¿ªÍ·ÒÔ±ãÏÈÓÚyyparseµÄ¶¨Òå.
Äã¿ÉÒÔʹÓÃ#include'À´´ÓÍ·Îļþ»ñÈ¡ÉùÃ÷. Èç¹ûÄã²»ÐèÒªÈκεÄCÉùÃ÷, ¿ÉÒÔÊ¡ÂÔÕâ¸ö²¿·ÖµÄÀ¨ºÅ·Ö¸ô·û%{'ºÍ`%}',
Õⲿ·Ö±»BISONÔ·â²»¶¯µØ¸´ÖƵ½Êä³öµÄ.CÎļþÖÐ
Bison declatations²¿·Ö°üº¬Á˶¨ÒåÖÕ½á·ûºÍ·ÇÖÕ½á·ûµÄÉùÃ÷,ÓÅÏȼ¶µÈµÈ
Grammar Rules²¿·Ö°üº¬ÁËÒ»¸ö»ò¶à¸öBisonÓï·¨¹æÔò, ÔÚÕâÀïÖÁÉÙÓ¦¸ÃÓÐÒ»¸öÓï·¨¹æÔò,²¢ÇÒµÚÒ»¸ö%%,
¾ø¶Ô²»ÄÜÊ¡ÂÔ,½âÊÍËüÔÚÎļþµÄ×ͷ.
¾ÍÏñPrologue²¿·Ö±»¸´ÖƵ½¿ªÍ·Ò»Ñù,Epilogue²¿·Ö±»Öð×ֵظ´ÖƵ½·ÖÎöÆ÷ÎļþµÄ½áβ. Èç¹ûÄãÏë·ÅһЩ´úÂëȴû±ØÒª·ÅÔÚyyparseµÄ¶¨Òå֮ǰ,ÕâÀïÊÇ×î·½±ãµÄµØ·½.
Èç¹û×îºóÒ»²¿·ÖΪ¿Õ,Äã¿ÉÒÔÊ¡ÂÔ·Ö¸ôËüµÄ·Ö¸ô·û%%.
3.2 sql_yacc.yyÎļþ½âÎö
3.2.1 Prologue²¿·Ö
¸Ã²¿·Ö°üº¬ÁËCÓïÑÔµÄÍ·Îļþ£¬ºê¶¨Ò壬¸Ã²¿·ÖÖ÷ÒªÉùÃ÷ºÍ¶¨ÒåÁË2¸ö¹Ø¼üº¯Êý£¬ÈçÏÂ:
int yylex(void yylval, void yythd);´Ê·¨½âÎöº¯ÊýµÄÉùÃ÷
void MYSQLerror(YYLTYPE , THD thd, const char *s);Óï·¨·ÖÎö´íÎóº¯ÊýµÄ¶¨Òå¡£
3.2.2 Bison declatations²¿·Ö
±¾²¿·ÖÓëprologue²¿·ÖʹÓà %% ½øÐзָô


3.2.3 Grammar Rules²¿·Ö
±¾²¿·ÖÓëBison declatations²¿·Ö£¬Ê¹Óà %% ½øÐзָô

Àý×Ó·ÖÎö£º
Bison²úÉúʽ: result: components¡;
ÏÂÃæµÄÀý×Ó¾ÍÊÇÒ»¸ö²úÉúʽ
queryÊDzúÉúʽµÄ×ó¶Ë, ðºÅºóÃæÊDzúÉúʽµÄÓÒ¶Ë, | ´ú±í»òµÄÒâ˼, {}µ±query²úÉúÊ½ÍÆ³öÓÒ¶ËÇé¿öµÄʱºòËùÖ´Ðе͝×÷£¬Ò»¸ö²úÉúʽ½áÊøÒªÊÇ
£»
ÆäÖÐ, query verb_clause ¶¼ÊÇ·ÇÖÕÖ¹·û, END_OF_INPUT ÊÇÖÕÖ¹·û, Ò²¾ÍÊÇ˵²úÉúÊ½ÍÆµ¼µ½ÖÕÖ¹·û¾ÍÍ£Ö¹ÍÆµ¼.
¼´query->END_OF_INPUT | verb_clause | verb_clause
END_OF_INPUT
query:
Hello World!END_OF_INPUT
{ THD *thd= YYTHD;
if (!thd->bootstrap &&!thd->m_parser_state->has_comment())
{
my_message(ER_EMPTY_QUERY, ER(ER_EMPTY_QUERY),
MYF(0));
MYSQL_YYABORT;
}
thd->lex->sql_command= SQLCOM_EMPTY_QUERY;
YYLIP->found_semicolon= NULL;
}
| verb_clause
{ Lex_input_stream *lip = YYLIP;
if (YYTHD->get_protocol()->has_client_capability(CLIENT_MULTI_QUERIE
S)&& lip->multi_statements &&
!lip->eof())
{
lip->next_state= MY_LEX_END;
lip->found_semicolon= lip->get_ptr();
}
else
{ lip->found_semicolon= NULL;}
}
';'
opt_end_of_input
|verb_clause END_OF_INPUT
{YYLIP->found_semicolon= NULL;} |
|