《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于PostgreSQL解析器模塊的底層研究與分析
基于PostgreSQL解析器模塊的底層研究與分析
來(lái)源:微型機(jī)與應(yīng)用2011年第21期
曹 陽(yáng)1,張 冰2
(1.同濟(jì)大學(xué) 電子信息與工程學(xué)院,上海 201804; 2.煤炭科學(xué)研究總院經(jīng)濟(jì)與信息研究分院,北
摘要: 介紹了PostgreSQL的整體架構(gòu),著重針對(duì)其解析器模塊進(jìn)行底層研究,分析查詢請(qǐng)求在解析器模塊中的查詢處理過(guò)程和其內(nèi)部各種函數(shù)的調(diào)用關(guān)系,最后就其解析器模塊的開(kāi)源代碼做出的剖析以全面理解該模塊的運(yùn)作,并通過(guò)一個(gè)子查詢程序調(diào)試實(shí)現(xiàn)了一個(gè)基本的查詢請(qǐng)求。
Abstract:
Key words :

摘  要: 介紹了PostgreSQL的整體架構(gòu),著重針對(duì)其解析器模塊進(jìn)行底層研究,分析查詢請(qǐng)求在解析器模塊中的查詢處理過(guò)程和其內(nèi)部各種函數(shù)的調(diào)用關(guān)系,最后就其解析器模塊的開(kāi)源代碼做出的剖析以全面理解該模塊的運(yùn)作,并通過(guò)一個(gè)子查詢程序調(diào)試實(shí)現(xiàn)了一個(gè)基本的查詢請(qǐng)求。
關(guān)鍵詞: 數(shù)據(jù)庫(kù);解析器;查詢處理;轉(zhuǎn)換處理

 PostgreSQL[1]始自于美國(guó)加州大學(xué)伯克利分校的數(shù)據(jù)庫(kù)研究計(jì)劃“Ingres項(xiàng)目”,最早被命名為Postgres。歷經(jīng)多年的改善和發(fā)展,于2006年成立了EnterpriseDB公司,其目的為了讓PostgreSQL能更好更方便地為企業(yè)級(jí)用戶服務(wù)。現(xiàn)在,PostgreSQL數(shù)據(jù)庫(kù)已經(jīng)成為當(dāng)今世界上特色最鮮明、功能最強(qiáng)大、內(nèi)容最豐富和開(kāi)發(fā)人員最多的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)之一,是一種復(fù)雜的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(ORDBMS)。它的很多特性正是當(dāng)今許多商業(yè)數(shù)據(jù)庫(kù)的前身。
 PostgreSQL數(shù)據(jù)庫(kù)支持多版本并發(fā)控制,可以支持所有廣為使用的SQL結(jié)構(gòu),并且兼容時(shí)下最流行的計(jì)算機(jī)開(kāi)發(fā)語(yǔ)言,如C、C++、Java、Perl等。與其他主流數(shù)據(jù)庫(kù)一樣,PostgreSQL擁有諸多現(xiàn)代數(shù)據(jù)庫(kù)特征,其特征特性涵蓋了SQL-2/SQL-92和SQL-3/SQL-99。作為一款開(kāi)源軟件,PostgreSQL數(shù)據(jù)庫(kù)不斷被完善,擁有如下諸多優(yōu)勢(shì):
 (1)事務(wù)支持更徹底。對(duì)擁有海量存儲(chǔ)的數(shù)據(jù)庫(kù),若一個(gè)查詢請(qǐng)求長(zhǎng)時(shí)間運(yùn)行無(wú)果,就很可能會(huì)導(dǎo)致阻礙表的更新。MySQL對(duì)于無(wú)事務(wù)的MyISAM表所采取的處理方式為“表鎖定”,而PostgreSQL則根本不存在這類問(wèn)題。
 (2)完美支持存儲(chǔ)過(guò)程。通過(guò)存儲(chǔ)過(guò)程,PostgreSQL便能輕松完成商業(yè)邏輯封裝,極大減少了服務(wù)器的運(yùn)轉(zhuǎn)負(fù)荷。獨(dú)有的內(nèi)在機(jī)制會(huì)自行優(yōu)化設(shè)計(jì)原存儲(chǔ)過(guò)程,最大限度地避免傳輸大量原始查詢語(yǔ)句,從而提高運(yùn)行效率。
 (3)支持子查詢和觸發(fā)器。使用子查詢語(yǔ)句使得PostgreSQL在高效運(yùn)行的同時(shí),擁有更高的程序可讀性;而觸發(fā)器則更有利于其商業(yè)邏輯封裝,可減少應(yīng)用程序?qū)ν簧虡I(yè)邏輯的重復(fù)控制,從而保證數(shù)據(jù)的完整性。
 (4)支持多種特殊數(shù)據(jù)類型和自定義擴(kuò)展需求。一般來(lái)說(shuō),特殊行業(yè)的數(shù)據(jù)會(huì)比商業(yè)數(shù)據(jù)更為復(fù)雜多變,而PostgreSQL將多維數(shù)據(jù)的集合體描述成一個(gè)對(duì)象類型,并作為屬性存儲(chǔ)在表中。這樣能保證用戶自定義數(shù)據(jù)類型與原有操作符運(yùn)算規(guī)則一致,并兼容現(xiàn)有數(shù)據(jù)類型。
 盡管PostgreSQL有著無(wú)可比擬的優(yōu)勢(shì),但仍不可避免地存在缺點(diǎn)。如其穩(wěn)定性和效能上有待提高;欠缺一些高端數(shù)據(jù)庫(kù)管理系統(tǒng)所需要的特性(如聯(lián)機(jī)熱備份、數(shù)據(jù)庫(kù)集群等)。
1 PostgreSQL開(kāi)源數(shù)據(jù)庫(kù)的體系架構(gòu)
 就架構(gòu)技術(shù)而言,PostgreSQL數(shù)據(jù)庫(kù)采用了經(jīng)典的客戶端/服務(wù)器(Client/Server)模型,其客戶端進(jìn)程與服務(wù)器端進(jìn)程一一對(duì)應(yīng)。很多工作經(jīng)由客戶端處理后再提交給服務(wù)器,極大地提高了客戶端的響應(yīng)速度,從而充分發(fā)揮客戶端的處理能力。
 PostgreSQL查詢語(yǔ)句的執(zhí)行流程如圖1所示。當(dāng)出現(xiàn)查詢連接請(qǐng)求時(shí),主進(jìn)程(Main)派生一個(gè)服務(wù)器監(jiān)聽(tīng)進(jìn)程(Postmaster),以等待從TCP/IP端口送入的連接請(qǐng)求。客戶應(yīng)用端通過(guò)調(diào)用庫(kù)函數(shù)(Libpq)發(fā)出連接請(qǐng)求,并把用戶請(qǐng)求反饋給Postmaster,后者派生出后臺(tái)服務(wù)進(jìn)程(Postgres),使其與客戶端進(jìn)程直接對(duì)接(Libpq僅支持一個(gè)客戶端進(jìn)程對(duì)接多個(gè)后臺(tái)服務(wù)進(jìn)程)。隨后,客戶端進(jìn)程和后臺(tái)服務(wù)進(jìn)程不通過(guò)Postmaster而直接通信。Postmaster和Postgres運(yùn)行在數(shù)據(jù)庫(kù)服務(wù)器中,而客戶端應(yīng)用則可運(yùn)行在任何機(jī)器上。服務(wù)器進(jìn)程之間利用信號(hào)標(biāo)志和共享內(nèi)存進(jìn)行通信,確保并發(fā)數(shù)據(jù)訪問(wèn)過(guò)程的數(shù)據(jù)完整性。一個(gè)查詢請(qǐng)求經(jīng)歷的完整過(guò)程可分為5個(gè)階段:

 (1)連接階段:客戶端向服務(wù)器發(fā)出查詢請(qǐng)求,通過(guò)Postmaster與Postgres建立通信對(duì)接。
 (2)解析階段:解析器分析查詢請(qǐng)求,核對(duì)語(yǔ)法無(wú)誤后創(chuàng)建一個(gè)查詢樹(shù)。
 (3)重寫(xiě)階段:在系統(tǒng)目錄(pg_rewrite)中匹配重寫(xiě)規(guī)則,重寫(xiě)系統(tǒng)根據(jù)規(guī)則體進(jìn)行重寫(xiě)轉(zhuǎn)換,隨后創(chuàng)建解析樹(shù)作為結(jié)果輸出。
 (4)優(yōu)化階段:優(yōu)化器根據(jù)解析樹(shù)創(chuàng)建查詢規(guī)劃。首先確定同一查詢結(jié)果的所有查詢路徑,然后計(jì)算不同查詢路徑的執(zhí)行成本并選擇最優(yōu)路徑,最后將其拓展為完整查詢規(guī)劃樹(shù)。
 (5)執(zhí)行階段:執(zhí)行器對(duì)查詢規(guī)劃樹(shù)進(jìn)行遞歸掃描,按其指定的執(zhí)行方式檢索數(shù)據(jù)記錄。在掃描關(guān)系時(shí),使用存儲(chǔ)系統(tǒng)執(zhí)行排序和連接操作,計(jì)算條件后反饋?zhàn)罱K查詢結(jié)果[2]。
2 PostgreSQL解析器模塊的內(nèi)部結(jié)構(gòu)

 


 PostgreSQL數(shù)據(jù)庫(kù)的解析器模塊由解析器和轉(zhuǎn)換處理器組成。解析器又分為詞法分析器和語(yǔ)法分析器兩部分,分別由lex和yacc創(chuàng)建,定義在scan.l和gram.y中。解析器生成原始解析樹(shù)(即為一種數(shù)據(jù)結(jié)構(gòu))后,轉(zhuǎn)換處理器再對(duì)其進(jìn)行修正和增補(bǔ),最終生成查尋樹(shù)。
 詞法分析器(yylex())的主要功能是做查詢語(yǔ)句詞法檢測(cè),用來(lái)識(shí)別其中的標(biāo)識(shí)符、SQL關(guān)鍵字等。它對(duì)每個(gè)關(guān)鍵字或標(biāo)識(shí)符都會(huì)生成一個(gè)標(biāo)記符號(hào)并將該標(biāo)記結(jié)果反饋至語(yǔ)法分析器。語(yǔ)法分析器(yyparse())主要功能是對(duì)查詢語(yǔ)句做語(yǔ)法檢測(cè)。它由一套語(yǔ)法規(guī)則和觸發(fā)規(guī)則組成,當(dāng)任意一條規(guī)則被觸發(fā)時(shí),兩者將被執(zhí)行。
 所謂語(yǔ)法語(yǔ)義解析,即將來(lái)自庫(kù)函數(shù)的SQL查詢請(qǐng)求轉(zhuǎn)化為解析樹(shù),供優(yōu)化器/執(zhí)行器或指令集使用。在解析階段,當(dāng)以ASCII碼組成的查詢字符串到達(dá)解析器后,首先對(duì)其執(zhí)行詞法分析,將其轉(zhuǎn)換為解析器所能識(shí)別的關(guān)鍵字、標(biāo)識(shí)符和常量;再執(zhí)行語(yǔ)法分析,檢查該查詢字符串的語(yǔ)法的有效性,并生成命令形式的查詢結(jié)構(gòu)(即解析樹(shù))。若語(yǔ)法正確,解析器將會(huì)反饋生成的解析樹(shù);若語(yǔ)法錯(cuò)誤,則返回一個(gè)錯(cuò)誤標(biāo)志或空值;隨后,解析樹(shù)被分離、檢查和傳送到指令集中的處理函數(shù),或轉(zhuǎn)換為結(jié)點(diǎn)鏈表供優(yōu)化器/執(zhí)行器處理。
 在解析器階段,解析器只依據(jù)與SQL語(yǔ)法結(jié)構(gòu)相關(guān)的固定規(guī)則創(chuàng)建解析樹(shù)。由于自身不會(huì)自動(dòng)查詢?nèi)魏蜗到y(tǒng)目錄,因此就不能理解查詢語(yǔ)句的詳細(xì)語(yǔ)義。故查詢語(yǔ)句被轉(zhuǎn)換為解析樹(shù)后,轉(zhuǎn)換處理器將對(duì)其做進(jìn)一步處理,分析查詢語(yǔ)句所引用的表、函數(shù)和操作符的語(yǔ)義,然后生成查詢樹(shù)(Query Tree),用來(lái)表示解析樹(shù)具體信息的數(shù)據(jù)結(jié)構(gòu)。把原始解析(僅包含查詢語(yǔ)句的原始信息)和語(yǔ)義分析分成兩個(gè)過(guò)程是因?yàn)橄到y(tǒng)目錄查詢操作只能在一個(gè)事務(wù)中執(zhí)行,并且無(wú)法在接收到查詢字符串后就立即發(fā)起一個(gè)事務(wù)。服務(wù)器一旦確認(rèn)正在處理一個(gè)查詢操作,那么就可以發(fā)起一個(gè)事務(wù)。此時(shí),轉(zhuǎn)換處理器才能被順利調(diào)用。
 從數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō),轉(zhuǎn)換處理器生成的查詢樹(shù)與原始解析樹(shù)十分類似,但是結(jié)構(gòu)細(xì)節(jié)上仍有差異。例如:在一個(gè)解析樹(shù)中,一個(gè)FuncCall節(jié)點(diǎn)可能在語(yǔ)句構(gòu)成上被理解為函數(shù)調(diào)用功能,也可能根據(jù)引用名是普通函數(shù)還是聚合函數(shù)被轉(zhuǎn)換成FuncExpr節(jié)點(diǎn)或Aggref節(jié)點(diǎn)。類似地,查尋樹(shù)也可能添加了具體數(shù)據(jù)類型的信息(如相關(guān)字段或表達(dá)式)。本文以transformFuncCall調(diào)用為例:
 (1)對(duì)每一個(gè)參數(shù)調(diào)用transformExpr;
 (2)調(diào)用ParseFuncOrColumn:
 ①調(diào)用ParseComplexProjection辨別Column Projection函數(shù):關(guān)系型參數(shù)和復(fù)合類型參數(shù)。
 ②調(diào)用func_get_detail(普通函數(shù)):
 調(diào)用FuncnameGetCandidates,在Cache PROCNAME-ARGSNSP中找到符合查詢條件的候選函數(shù)列表FuncCandidateList;
 返回?zé)o需做參數(shù)類型轉(zhuǎn)換的項(xiàng);
 若只有一個(gè)參數(shù),則嘗試對(duì)系統(tǒng)未定義的類型轉(zhuǎn)換型函數(shù)做二進(jìn)制兼容的強(qiáng)制轉(zhuǎn)換;
 若為一般函數(shù),則在候選函數(shù)中找最匹配函數(shù)func_match_argtypes;
 嘗試解決存在的沖突調(diào)用func_select_candidate;
 返回值。
 ③依據(jù)返回值采取相應(yīng)措施;
 ④生成相應(yīng)節(jié)點(diǎn)并返回:FuncExpr節(jié)點(diǎn)或Aggref節(jié)點(diǎn)[1]。
3 PostgresSQL解析器模塊的源碼剖析
 PostgreSQL開(kāi)源數(shù)據(jù)庫(kù)的源代碼相對(duì)路徑為Postgresql\source\src\backend,其代碼整體編譯流程大致如下:PostgresSQL在exec_simple_query函數(shù)中處理與用戶交互的簡(jiǎn)單查詢請(qǐng)求,其查詢操作使用兩種協(xié)議:Simple query protocol和Extended query protocol。Extended query protocol包含Parse、Bind、Execute三個(gè)步驟,并定義了Prepared Statement和Portal兩種重要數(shù)據(jù)結(jié)構(gòu)。Prepared Statement用來(lái)表示詞法解析、查詢規(guī)劃等結(jié)果,Portal用來(lái)表示可以被執(zhí)行或已部分執(zhí)行完畢的語(yǔ)句。由于本文側(cè)重研究解析階段,故只對(duì)Simple query protocol協(xié)議進(jìn)行具體分析,第三步生成物理查詢規(guī)劃和第四步執(zhí)行物理規(guī)劃由于不是本文的側(cè)重點(diǎn)在此不贅述。
 (1)編譯查詢
 通過(guò)pg_parse_query函數(shù)返回一系列查詢解析樹(shù),并生成列表文件parsetree_list。具體工作由raw_parse函數(shù)通過(guò)調(diào)用base_yyparse函數(shù)對(duì)查詢語(yǔ)句進(jìn)行詞法分析完成。
 (2)生成邏輯規(guī)劃與查詢重寫(xiě)(QueryRewrite)
 通過(guò)語(yǔ)義分析將已有解析樹(shù)轉(zhuǎn)化為所需查詢規(guī)劃,建立最優(yōu)查詢規(guī)劃。具體由pg_analyze_and_rewrite函數(shù)調(diào)用parse_analyze函數(shù)轉(zhuǎn)換完成。部分代碼如下:
foreach(parsetree_item,parsetree_list)
 {
 Node*parsetree=(Node*)lfirst
     (parsetree_item);
 …
}
 再執(zhí)行parse_analyze函數(shù)中的query=transformStmt(pstate,parseTree);最后,通過(guò)調(diào)用語(yǔ)句querytree_list= pg_rewrite_query(query);完成查詢重寫(xiě)。pg_rewrite_query函數(shù)通過(guò)調(diào)用查詢重寫(xiě)器的入口函數(shù)QueryRewrite來(lái)完成操作,而查詢重寫(xiě)的作用就是根據(jù)系統(tǒng)或用戶自定義規(guī)則來(lái)重寫(xiě)規(guī)劃。
PostgreSQL解析器模塊所接受的查詢請(qǐng)求表現(xiàn)形式為查詢字符串,經(jīng)過(guò)解析生成原始解析樹(shù),并返回列表文件(parsetree_list),其每一個(gè)節(jié)點(diǎn)都是一個(gè)完整的語(yǔ)法解析樹(shù)。一個(gè)原始解析樹(shù)由多個(gè)節(jié)點(diǎn)構(gòu)成,一個(gè)節(jié)點(diǎn)表示一個(gè)類型(由NodeTag定義)。PostgreSQL解析器模塊內(nèi)部函數(shù)調(diào)用關(guān)系如圖2所示。


 解析器模塊有3個(gè)主要函數(shù),分別是:raw_parser()、free_parser()和filtered_base_yylex(),可以在.\Parser\Parser.c文件中找到其定義。下面就其主要源碼進(jìn)行剖析和理解:
(1)raw_parser()
raw_parser(const char *str)
    {
 Int yyresult;
 …
 return parsetree;
}
 輸入:為輸入的查詢字符串定義一個(gè)指向字符常數(shù)的指針。
 功能:掃描查詢字符串并返回相應(yīng)值。
 返回值:若無(wú)語(yǔ)法錯(cuò)誤,則建立解析樹(shù)(Parser Tree),并將查詢語(yǔ)句存儲(chǔ)在該解析樹(shù)中;否則,向解析器返回空指針(NIL)。
 所調(diào)用函數(shù):pool_memory_create(); scanner_init(); parser_init(); base_yyparse()
 (2)pg_parse_string_token()
pg_parse_string_token(const char *token)
{
 Int ctoken;
 …
 return base_yylval.str;
}
 輸入:為所給字符串定義一個(gè)指向字符常數(shù)的指針。
 功能:獲取所給字符串的值。
 返回值:base_yylval.str;
 調(diào)用函數(shù):scanner_init(); base_yylex(); scanner_finish()。
 (3)filtered_base_yylex()
filtered_base_yylex(void)
{
 Int cur_token;
 …
 return cur_token;
}
 輸入:無(wú)輸入值。
 功能:作為解析器的中間件,對(duì)查詢語(yǔ)句執(zhí)行優(yōu)化處理,過(guò)濾部分累贅語(yǔ)句。例如:當(dāng)查詢語(yǔ)句存在多個(gè)空字符時(shí),該函數(shù)會(huì)自動(dòng)將其合并。
 返回值:無(wú)返回值。
 調(diào)用函數(shù):base_yylex()。
 (4)free_parser(void)
 輸入:無(wú)輸入值。
 功能:釋放已生成的語(yǔ)法解析樹(shù)所占用的內(nèi)存空間。
 返回值:無(wú)返回值。
 調(diào)用函數(shù):pool_memory_delete()。
 對(duì)查詢語(yǔ)句做轉(zhuǎn)換處理是為了把生成的解析樹(shù)都轉(zhuǎn)換成根為Query型節(jié)點(diǎn)的查尋樹(shù)。轉(zhuǎn)換處理工作在parse_analyze函數(shù)中進(jìn)行:首先定義ParseState *pstate函數(shù),用以記錄轉(zhuǎn)換處理過(guò)程中的狀態(tài)信息,然后調(diào)用transformStmt函數(shù)進(jìn)行正式的轉(zhuǎn)換處理工作,它會(huì)根據(jù)解析樹(shù)不同類型的根節(jié)點(diǎn)調(diào)用相應(yīng)的函數(shù)。部分代碼如下:
SelectStmt*n=(SelectStmt*)parseTree;
 if(n->valuesLists)
  result=transformValuesClause(pstate,n);
  else if(n->op==SETOP_NONE)
  result=transformSelectStmt(pstate,n);
 else
  result=transformSetOperationStmt(pstate,n);
 Select statement分為簡(jiǎn)單型和復(fù)合型。復(fù)合型內(nèi)含集合操作符,在這種語(yǔ)法樹(shù)中,Select語(yǔ)句都處于葉節(jié)點(diǎn)位置,而內(nèi)部節(jié)點(diǎn)則表示集合操作符。簡(jiǎn)單型也可分為兩類:一類有VALUES,一類無(wú)VALUES。
把原始解析樹(shù)轉(zhuǎn)換處理到查尋樹(shù)的目標(biāo)就是為了從系統(tǒng)關(guān)系表中得到相關(guān)信息并據(jù)此進(jìn)行相關(guān)節(jié)點(diǎn)的轉(zhuǎn)換和信息添加。得到了查尋樹(shù)后,它將被執(zhí)行重寫(xiě)、優(yōu)化、執(zhí)行等操作,至此完成了一次完整的查詢請(qǐng)求。
4 PostgreSQL子查詢調(diào)試
由于PostgreSQL是個(gè)開(kāi)源數(shù)據(jù)庫(kù),可以支持多種操作系統(tǒng)的編譯與執(zhí)行。本文選用以Linux為內(nèi)核的Ubuntu v11.04作為調(diào)試環(huán)境,其內(nèi)核版本為2.6.38-8-generic。操作系統(tǒng)加載的PostgreSQL版本為v8.4.8。搭建系統(tǒng)中,所選用的調(diào)試工具為DDD,其版本號(hào)為v3.3.12。所選用編譯器為gcc,其版本為v4.4.5,庫(kù)版本為GNU libc v2.12。
 執(zhí)行子查詢調(diào)試步驟如下:
 首先,在PostgreSQL數(shù)據(jù)庫(kù)中建立一張新表,表名為“film”,該表中存放電影相關(guān)信息字段:
Create table "film"
(
 "id" Serial NOT NULL UNIQUE,
 "filmname" Varchar(20)NOT NULL,
 "director" Varchar(10)NOT NULL,
 "actor" Varchar(10)NOT NULL,
 "production" Varchar(40)NOT NULL,
 "description" Varchar(255),
 UNIQUE(filmname),
 PRIMARY KEY("id")
);
 Create index "film_index" on "film" using btree("id","filmname");
 然后,再在數(shù)據(jù)庫(kù)中建立第二張表,表名為“cinema”,該表中存放有某一部電影的放映信息:
Create table "cinema"
(
 "id" Serial NOT NULL UNIQUE,
 "cinema" Varchar(40)NOT NULL,
 "releasedate" Timestamp Default now(),
 UNIQUE (cinema),
 PRIMARY KEY ("id")
);
 Create index "cinema_index" on "cinema" using btree ("id","cinema");
 在所建的兩張表中,同時(shí)建立了B-tree類型的索引。B-tree索引主要處理那些按照某種順序存儲(chǔ)的數(shù)據(jù)查詢,它能為索引的每個(gè)列(字段)聲明一個(gè)操作符表。PostgreSQL的create index語(yǔ)句一般都默認(rèn)使用B-tree索引類型。
 最后,再新建一張鏈接表,表名為“announcement”。該表通過(guò)建立外部關(guān)鍵字(foreign key)鏈接生成,主要用來(lái)顯示所需要查詢的某部電影的相關(guān)信息:
Create table "announcement"
(
"id" Serial NOT NULL UNIQUE,
"fid" integer NOT NULL Default 0,
"cid" integer NOT NULL Default 0,
PRIMARY KEY ("id")
);
 Alter table "announcement" add foreign key("fid")references "film"("id")on update restrict on delete restrict;
 Alter table "announcement" add foreign key("cid")references "cinema"("id")on update restrict on delete restrict;
 在更改好表“announcement”中的相關(guān)字段屬性后,通過(guò)新建視圖表來(lái)完成所查詢請(qǐng)求,并顯示相關(guān)結(jié)果:

 該結(jié)果中,字段fid即為表“film”中的id字段,每一個(gè)id字段值對(duì)應(yīng)唯一一部電影;字段cid即為表“cinema”中的id字段,每一個(gè)字段值所對(duì)應(yīng)的電影都被標(biāo)示著相應(yīng)的放映信息。在本次查詢請(qǐng)求的建立表中,表“cinema”中的字段id=1所對(duì)應(yīng)的cinema=Wanda,即表示所進(jìn)行的查詢請(qǐng)求就是顯示所有在萬(wàn)達(dá)影城播放的電影信息。更多具體電影和放映信息在表中略去,但通過(guò)增加字段來(lái)完整顯示即可。
 PostgresSQL開(kāi)源數(shù)據(jù)庫(kù)目前已被成功應(yīng)用于包括醫(yī)療、電子商務(wù)等在內(nèi)的廣闊領(lǐng)域中。經(jīng)過(guò)二十多年的快速發(fā)展,PostgreSQL的內(nèi)部結(jié)構(gòu)和工作機(jī)制已經(jīng)相當(dāng)成熟,直到今天依然在全球眾多開(kāi)源程序員的努力中不斷地被改進(jìn)和優(yōu)化。
 本文主要對(duì)PostgreSQL開(kāi)源數(shù)據(jù)庫(kù)的解析器做了底層研究并對(duì)該模塊的源碼做了一定分析,并通過(guò)一個(gè)子查詢調(diào)試實(shí)驗(yàn)實(shí)現(xiàn)了一個(gè)基本的查詢請(qǐng)求。針對(duì)PostgreSQL開(kāi)源數(shù)據(jù)庫(kù)的源碼分析在國(guó)內(nèi)尚處起步階段,而源碼分析對(duì)深入理解PostgreSQL開(kāi)源數(shù)據(jù)庫(kù)的開(kāi)發(fā)思想有著里程碑的意義。
參考文獻(xiàn)
[1] PostgreSQL中文之家. [2010-05].http://www.pgsqldb.org.
[2] The PostgreSQL Global development Group. PostgreSQL 8.4.8 documentation[S/OL].(2010-05-17)[2011-04-02].  http://www.postgresql.org/docs/8.4/static/index.html.
[3] 陳景峰.PostgreSQL實(shí)用實(shí)例參考[R/OL](2004-5-20). [2011-04-20].
[4] 郭龍江,李金寶.PostgreSQL分析器的研究[J].黑龍江大學(xué)自然科學(xué)學(xué)報(bào),2001,18(4):49-52.
[5] DOUGLAS K, DOUGLAS S. PostgreSQL: the comprehensive guide to building, programming, and administering PostgreSQL databases, second edition[M]. [S.l.]: Sams Publishing,2005.
[6] 陳文星,付繼宗.Linux下數(shù)據(jù)庫(kù)PostgreSQL分析與應(yīng)用[J].電腦開(kāi)發(fā)與應(yīng)用,2006,19(11):56-57.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
主站蜘蛛池模板: 噼里啪啦在线播放 | 久久精品国产99久久久 | 亚洲国产精品久久久久秋霞影院 | 日本一区二区三区高清在线观看 | 日本一本在线观看 | 99午夜 | 淫人网| 黄色av网站在线播放 | 久久久久久久久久久久久久国产 | 久草在线视频资源站 | 国产成人精品久久久 | 欧美一级特黄aa大片 | 夜夜高潮夜夜爽夜夜爱爱 | 欧美福利视频 | 狠狠撸狠狠干 | 污网站在线看 | 国产精久久久 | 日韩你懂的 | 国产高清在线免费视频 | 日本少妇激情舌吻 | 中文字幕二区 | 精品国产欧美一区二区三区不卡 | 男女超爽视频免费播放 | 青娱乐极品在线 | 91伦理在线 | 人人涩| 亚洲欲色| 国产日韩第一页 | 亚洲欧美一二三区 | 日韩精品第一 | 国产成人+亚洲欧洲+综合 | 亚洲国产久 | 久久riav| 全部孕妇毛片丰满孕妇孕交 | 一级做a爱高潮免费视频 | 色欲久久综合亚洲精品蜜桃 | 北条麻妃一区二区免费播放 | 日韩少妇白浆无码系列 | 成人在线黄色 | 欧美综合日韩 | 久久小草亚洲综合 | 在线观看精品黄av片免费 | 日本三级香港三级三级人!妇久 | 无码丰满熟妇juliaann与黑人 | 自拍偷拍综合 | 一本色道88久久加勒比精品 | 岛国裸体写真hd在线 | 国产一级小视频 | 色综合久久88色综合天天免费 | 亚洲v无码一区二区三区四区观看 | 超碰人人草人人干 | 国产免费人成xvideos视频 | 电车痴汉在线观看 | 国产日韩欧美日韩 | 超碰在线99 | 亚洲黄色av网站 | 国产v亚洲 | 国内a∨免费播放 | 久草美女 | 越南性受xxx精品 | 亚洲揄拍窥拍久久国产自揄拍 | 日韩精品在线观看一区 | 亚洲视频一区 | 18禁黄网站禁片免费观看 | 国产又黄又硬又湿又黄 | 99热久久久久久久久久久174 | 字幕网在线观看 | 久久久久亚洲精品男人的天堂 | 草综合| 国产精品永久在线观看 | 999热精品| 女性向小h片资源在线观看 女性隐私黄www网站视频 | 五月天国色天香国语版 | 欧美日韩免费观看视频 | 美女一级片 | 国产欧美日韩精品a在线观看 | 亚洲欧美日韩精品久久 | 久久免费看a级毛毛片 | 日韩视频在线观看免费视频 | 一本色道久久综合亚洲二区三区 | 欧美深性狂猛ⅹxxx深喉 | 国产精品久久久久久久第一福利 | 又色又爽又黄高潮的免费视频 | 国内自拍视频在线播放 | 91美女片黄在线观看成欢阁 | 靠逼在线观看 | 黑人精品一区二区三区 | 欧美日本一区 | 捆绑紧缚一区二区三区在线观看 | 久久综合久久综合久久 | 国产对白videos麻豆高潮 | 中文久久精品 | 77777五月色婷婷丁香视频 | 精品欧美一区二区在线观看 | wwwyoujizzcom中国版 | 精品久久久久久久中文字幕 | 免费人成视频网站在线观看18 | 免费观看成人在线视频 | 日韩在线观看 | 亚洲欧美激情另类校园 | 日本公妇乱偷中文字幕 | 福利视频在线播放 | 亚洲欧洲一区二区三区四区 | 亚洲综合精品伊人久久 | 免费福利在线观看 | 中文字幕一区二区免费 | 亚洲精品一区二区三天美 | 日本人视频69式jzzij | 夜色.com | 黄色av网站免费在线观看 | 最新日韩av | 日韩在线永久免费播放 | 手机免费在线观看av | ww欧美黄色 | 538在线精品视频 | 欧洲做受高潮免费看 | 免费看成人欧美片爱潮app | 一区二区网 | 大吊一区二区三区 | 久久国产精品偷任你爽任你 | 黄色国产网站 | 免费一区在线观看 | 成人深夜在线观看 | 亚洲免费区 | 欧美亚洲国产精品久久蜜芽直播 | www免费av| 怡红院成人av | 日韩在线一区二区三区四区 | 国产视频第二页 | 国产三级在线观看完整版 | 久久99精品久久久久久久青青日本 | 亚洲高清网 | 99久久久久成人国产免费 | 亚洲啪av永久无码精品放毛片 | 一本一道人人妻人人妻αv 自拍日韩亚洲一区在线 | 好吊视频一区二区三区 | 男人添女人囗交做爰高潮 | 亚洲精品黄 | 亚洲精品天堂成人片av在线播放 | 夜夜躁人人爽天天天天大学生 | 天天天色| 国产av午夜精品一区二区入口 | 欧美乱大交xxxxx潮喷l头像 | 成人精品一区二区三区电影 | 情侣呻吟对白精品av | 超碰人人草人人干 | 国产夫妻一区 | 国产福利在线视频观看 | 国产精品视频第一区二区三区 | 欧美伊人| 女人和拘做爰正片视频 | 少妇扒开双腿自慰出白浆 | bt天堂新版中文在线地址 | 懂色av一区 | 日本艹逼视频 | 久久久国产一区二区三区 | 91久久国产综合久久91精品网站 | 国产无套粉嫩白浆内精在线网站 | 一区二区三区国产 | 9色porny自拍视频一区二区 | 欧美毛片在线 | 黄色大片国产 | 久久精品国产精品亚洲蜜月 | 亚洲激情免费视频 | 99re热在线视频 | 日日不卡av | 午夜性视频国产牛牛视频 | 国产精品无码一区二区三区免费 | 粉嫩av一区二区在线播 | 欧美激情福利 | 成人第四色| 欧美亚洲伦理 | 99久久精品费精品国产一区二区 | 精品免费视频一区二区 | av永久免费观看 | 五月婷婷天 | 国产露脸老熟高潮在线 | 成人免费视频视频在线观看 免费 | 久久精品国产99国产精品亚洲 | 日韩三级a | 日本老太做爰xxxx | 国产麻豆a毛片 | 欧洲熟妇色xxxxx视频 | 国产91网址| 叶子楣裸乳照无奶罩视频 | 精品国产一区二区三区四区阿崩 | 国产高清精品在线观看 | 中文字幕一区二区在线观看 | 欧美日韩精选 | av在线中文字幕不卡电影网 | 一级国产精品 | а√中文在线资源库 | 国产乡下妇女三片 | 激情综合婷婷色五月蜜桃 | 精区一品二品星空传媒 | 大尺度做爰床戏呻吟色戒韩国 | 成熟女人毛片www免费版在线 | 欧美精品国产一区二区 | 国产精品嫩草影院精东 | 一区视频在线 | 女同av在线播放 | 亚洲国产成人一区二区精品区 | 伊人网站在线观看 | 成人毛片免费网站 | 国产精品资源网 | 久久婷婷色一区二区三区asmr | 色姑娘av | 87福利视频 | 秋葵视频在线 | 日韩少妇高潮抽搐 | 成人性生交大片免费看 | 波多野吉衣在线观看视频 | 国产精品一v二v在线观看 | 亚洲三级久久 | 精品视频一区在线观看 | 亚洲资源一区 | 日产精品久久久一区二区 | 四虎一区二区三区 | 日韩和欧美一区二区 | 久久免费精彩视频 | 欧美韩国一区二区 | 中文字幕av一区中文字幕天堂 | 天堂亚洲2017在线观看 | 国产乱码精品一区二区三区四川人 | 亚洲激情影院 | 日韩黄色三级视频 | 国产伦精品一区二区三区高清 | 亚洲色无码专区在线观看 | 成人在线观 | 欧洲成人午夜精品无码区久久 | 色婷婷噜噜久久国产精品12p | 中国成人毛片 | 亚洲视频免费在线播放 | 国产亚洲精品一区二区三区 | 国产精品成人免费视频网站 | 日本乳奶水流出来高清xxxx | 成人无码一区二区三区 | 久久激情网站 | 亚洲色图综合在线 | 深夜成人福利视频 | 艳妇av | 日韩欧美在线不卡 | 一本加勒比hezyo黑人 | 中国一级片网站 | 欧美无砖专区免费 | 青青久久av北条麻妃海外网 | 亚洲视频在线看 | 欧美疯狂xxxxxbbbbb| 91精品日韩| 九九九国产视频 | 国产在线麻豆 | 日韩成人无码中文字幕 | 亚洲综合一二三 | 精品国产露脸精彩对白 | 亚洲天堂中文字幕 | 欧美综合自拍亚洲综合图 | 亚洲精品av在线 | 午夜毛片在线 | 亚洲 综合 清纯 丝袜 自拍 | 国产又色又爽又刺激在线观看 | 任你躁国产老女人 | 免费一级毛毛片 | 99爱精品视频 | 亚洲成a∨人片在线观看无码 | 精品久久久久久 | 凸凹人妻人人澡人人添 | 昭和冢本农村中文字幕 | 鲁大师在线视频播放免费观看 | 自拍新婚之夜初交视频1 | 精品国偷自产在线 | www亚洲天堂com | 韩日av在线 | 国精产品一区一区三区mba视频 | 中国肥老太婆高清video | 日韩乱码人妻无码中文字幕视频 | 国产日韩欧美视频在线 | 日韩精品一区二区三区在线视频 | 少妇大叫太大太粗太爽了 | 亚洲区一区 | 欧美一级做 | 操人视频免费 | 免费中文字幕 | 国产第三区 | 欧洲精品一区二区三区 | 亚洲精品一区中文字幕乱码 | 久久五| 妖精色av无码国产在线看 | 免费欧美黄色片 | 久久精品亚洲酒店 | 欧美青草视频 | 亚洲丝袜中文字幕 | 色婷婷5月天 | 东北老头老太国产 | 糟蹋小少妇17p | 国产精品一区二区av不卡 | 久久国精品 | 国产成人无码av片在线观看不卡 | 黄色小说在线免费观看 | 国产精品久久国产精麻豆96堂 | 国产一级免费不卡 | 国产免费又爽又色又粗视频 | jizz欧美大全| 日本三级理论久久人妻电影 | 女同精品一区二区三区在线播放器 | www中文字幕com | 亚洲欧美一级久久精品国产特黄 | 欧美精品v国产精品v日韩精品 | 亚洲精品国精品久久99热 | 狠狠躁天天躁中文字幕 | 一边摸一边添高潮av | 好爽…又高潮了免费毛片 | 精品人妻人人做人人爽夜夜爽 | 精品一区中文字幕 | 三级网站免费观看 | 手机免费av在线 | 国产精品一区二区三区免费视频 | 涩涩的视频在线观看 | 欧美九九九 | 麻豆国产一区二区三区四区 | 国产av综合第一页 | 我色综合 | 久久 国产 尿 小便 嘘嘘 | www婷婷av久久久影片 | 免费国产黄网站在线观看可以下载 | 麻豆国产一区二区三区四区 | 1000部无遮挡拍拍拍免费视频观看 | 亚洲色大成网站www永久在线观看 | 欧美日韩精品人妻狠狠躁免费视频 | 色琪琪久久草在线视频 | 成午夜精品一区二区三区软件 | 伊人免费 | 中文字幕人成人乱码亚洲影视的特点 | 免费观看的vr毛片 | 五月天天丁香婷婷在线中 | 九九热在线免费视频 | 又黄又爽又猛1000部a片 | 欧美亚洲国产另类 | 久久噜噜噜精品国产亚洲综合 | 国产精品13p | 亚洲熟女www一区二区三区 | 精品在线视频一区二区三区 | 成人性做爰av片免费看 | 久久国产成人精品av | 超碰人人草人人干 | 另类小说欧美 | 国产大尺度做爰床 | 夜晚福利视频 | 日本在线 | 中文 | 91精品国产乱码在线观看 | √天堂中文官网8在线 | 超碰97色| av在线一区二区三区 | 国产一级视频在线播放 | 亚洲国产精品久久人人爱 | 日日日日做夜夜夜夜做无码 | 人妻少妇边接电话边娇喘 | 午夜视频福利在线 | 男主和女配啪慎入h闺蜜宋冉 | 69精产国品一二三产区视频 | 最近中文在线观看 | 国产亚洲精品久久久闺蜜 | 黄色片视频| 又长又硬又粗一区二区三区 | av无码av无码专区 | 欧日韩毛片 | 久久性生活 | 91精品国自产在线观看 | 国产免费av片在线观看 | 一二三区视频 | 石原莉奈一区二区三区在线观看 | 欧美性猛交xxxx黑人猛交 | 麻豆网站观看 | 91精品在线免费观看 | 香港澳门三级做爰 | 国产igao为爱做激情在线观看 | 国产精品偷伦视频免费还看的 | 国产亚洲美女精品久久久2020 | 国产美女喷水视频 | 91久久国产综合精品女同国语 | 黄片 毛片www | 99久久婷婷国产精品综合 | 精品黄色av | 操碰视频在线 | 中文字幕亚洲高清 | 国产成人福利在线 | 大肉大捧一进一出好爽视色大师 | 女人的天堂av在线 | 欧美午夜精品一区二区三区 | 99视频在线观看免费 | 久久中文视频 | 国产欧美123 | 婷婷色六月天 | 国产精品国产精品国产专区不蜜 | 日韩无 | 国产老头和老太xxxx视频 | 国产伦精品一区二区三区高清 | 激情亚洲色图 | 久草综合在线视频 | 亚洲熟妇无码一区二区三区 | 青草青草视频 | 亚洲人成手机电影网站 | 少妇看片 | 伊人丁香| 国产午夜精品久久久久久 | 亚洲深夜视频 | 乱h伦h女h在线视频 乱lun合集小可的奶水 | 少妇4p| 中文字幕日韩精品亚洲一区 | 亚洲第一性理论片 | 日本精品人妻无码77777 | 噜噜噜av久久av牛牛 | 性人久久网av | 欧美黄色性生活 | 午夜剧场成人 | 妹子干综合网 | 亚洲激情五月婷婷 | 久久久久久蜜桃一区二区 | 美女无遮挡免费视频网站 | 在线亚欧观看2023 | 视频一区亚洲 | 玩弄中年熟妇正在播放 | 久草最新网址 | 极品少妇露脸一区二区 | 黄色免费av网站 | 亚洲 欧美 中文 日韩aⅴ | 亚洲a在线观看 | 在线日韩中文字幕 | 夜色www国产精品资源站 | 天天操天天操天天 | 国产人妻精品午夜福利免费 | 国产原创中文av | 少妇无码吹潮 | 国产高清一区二区三区视频 | 国产成人高清精品免费 | 人妻三级日本三级日本三级极 | 色中文字幕在线观看 | 国产综合精品 | 凸凹人妻人人澡人人添 | 国产成人在线播放视频 | 亚洲人成电影网站在线观看 | 免费观看一级黄色片 | 精品视频免费 | 亚洲乱码中文字幕久久孕妇黑人 | 久久欧美亚洲另类专区91大神 | 久久国产美女视频 | 天天色综合1 | 偷窥自拍亚洲色图 | 多男一女一级淫片免费播放口 | 欧美野外猛男的大粗鳮台湾同胞 | 超碰在线亚洲 | 色欧美在线视频 | 青青草97国产精品免费观看 | 日韩av网站在线播放 | 久久久久国精品产熟女久色 | 波多野结衣在线视频播放 | 伊人久久大香线 | 亚洲日本视频在线观看 | 免费无码av一区二区 | 操天天操 | 国产看片网站 | 女人的黄 色视频 | 边添小泬边狠狠躁视频 | 亚洲欧美日韩综合久久久 | 伊人狠狠色j香婷婷综合 | 午夜美女裸体福利视频 | 欧美三级少妇高潮 | 刘亦菲三级床视频大全 | 深爱开心激情 | 亚洲国产成人精品激情在线 | 成人性色视频 | 欧美成人性生交大片免费看 | 欧美暧暧视频 | 裸体精品bbbbbbbbb | 四色米奇777狠狠狠me | 欧美高清视频一区二区三区 | 亚洲欧洲久久 | 狠狠狠色丁香婷婷综合久久五月 | 亚洲久久一区 | 欧美一级少妇 | 国产亚洲婷婷香蕉久久精品 | 香蕉视频在线观看视频 | 超碰在线网 | 欧美专区中文字幕 | 国产午夜精品一区二区三区视频 | 成人91免费视频 | 久久久国产精华液 | 关之琳三级全黄做爰在线观看 | 午夜av无码福利免费看网站 | 香港三级日本三级韩国三级 | 婷婷去俺也去 | 射射射综合网 | 少妇性荡欲午夜性开放视频剧场 | 色综合天天综合网国产成人网 | 亚洲精品欧美综合二区 | 亚洲人在线观看 | 国产乱人对白 | 一本大道久久久久精品嫩草 | 日韩美女免费线视频 | 成人男女网24免费 | 久久精国产 | 九九伊在人线 | 欧美不卡一区二区三区 | 超碰伊人 | 香蕉综合在线 | 日韩精品无码中文字幕一区二区 | 高清一区二区 | 天天插天天插 | 日日鲁鲁夜夜狼狼视频 | 一区二区三区日韩视频在线观看 | 国产亚洲精品无码成人 | 亚洲精品欧美综合二区 | 日韩精品中文字幕无码一区 | 勾搭情趣店女老板av | 肉大捧一进一出免费视频 | 亚洲久久一区 | 亚洲图片一区 | 91丨九色丨蝌蚪丨老版 | 香蕉视频久久久 | 亚洲人成人网 | 亚洲精选一区二区三区 | 欧美性折磨bdsm另类 | 国产av无码专区亚洲a√ | 欧美一级片免费 | 国产精品理论在线观看 | 欧美性xxxxxx | 97人人模人人爽人人喊网 | 免费人妻无码不卡中文字幕18禁 | 亚洲欧洲日产国产 最新 | 亚洲乱码国产乱码精品精大量 | 亚洲欧美色图 | 隔壁人妻偷人bd中字 | 国产老女人乱淫免费可以 | 日日热 | 久久亚洲国产精品成人av秋霞 | 日一日干一干 | 亚洲日韩一区二区 | 精品亚洲欧美无人区乱码 | 97av视频| 国产后进极品圆润翘臀在后面玩 | 叼嘿视频在线免费观看 | 亚洲激情视频网站 | www色五月com | 醉酒后少妇被疯狂内射视频 | 成人免费视频久久 | 天天色播 | 亚洲国产精品久久久天堂不卡 | 欧美性猛交xxxx免费看久久 | av网站在线观看不卡 | 天堂成人av| 国产乱子伦精品免费无码专区 | 成年美女黄网站色大免费全看 | 国产男女猛烈无遮挡免费视频网站 | 韩国少妇bbb毛毛片 韩国少妇xxxx搡xxxx搡 | 欧美中日韩在线 | 成年人黄色小视频 | 操操操插插插 | 久久93| 日韩毛片网站 | 精品国产精品久久一区免费式 | h毛片| 免费爱爱网站 | 国产999精品久久久影片官网 | www.天天色| 亚洲日本中文字幕天天更新 | 日本久久久久久久久久久 | 最新日本中文字幕 | 92看片淫黄大片一级 | 中文字幕伊人 | 久久影院午夜理论片无码 | 黄色三级情侣片 | 久久精品成人av | 噜噜噜天天躁狠狠躁夜夜精品 | 精品久久久久中文字幕日本 | 天堂在线视频网站 | 人妻夜夜爽天天爽三区麻豆av网站 | 久久激情影院 | 精品日韩欧美一区二区在线播放 | 中国69av | 国产女人水真多18毛片18精品 | 亚洲精品一区二区三天美 | 好吊色欧美一区二区三区视频 | 国产丶欧美丶日本不卡视频 | 久久99热这里只频精品6学生 | 国产精品午夜福利视频234区 | 狠狠色婷婷久久综合频道毛片 | 亚洲色欲色欲www在线观看 | 免费看成人片 | 污网在线观看 | 天天色成人 | 色爽av| 欧美精品日韩 | 精品偷拍一区二区三区在线看 | 国产精品一区二区久久乐下载 | 国产成人艳妇aa视频在线 | 12一15性xxxx粉嫩国产 | 成人片在线视频 | 亚洲成人观看 | 日本黄页网站免费观看 | 麻豆精品一区二区 | 亚洲网址 | 久久青草费线频观看 | 欧美色图一区二区 | 精品国产国产综合精品 | 国产做爰视频免费播放 | 国产首页 | 日本高清www免费视频大豆 | 美女裸奶100%无遮挡免费网站 | 91精品国产欧美一区二区成人 | 超碰在线影院 | 久草在线在线精品观看 | 午夜精品久久99蜜桃的功能介绍 | 情侣酒店偷拍一区二区在线播放 | 欧美性生交xxxxxdddd | 精品一区二区三区毛片 | 国产一区中文字幕 |