Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
MySQLÄÚºËÔ´Âë½â¶Á-SQL½âÎö
 
  2317  次浏览      28
 2019-8-20
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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;}

 

   
2317 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ