话说查询“selectcname,comp from test1,test2 where test1.id=test2.id;” 发送到服务器端,走查询分支exec_simple_query,先调用start_xact_command初始化了事务管理相关对象和资源,接着调用pg_parse_query,通过Lex和Yacc对传入sql语句进行词法语法解析,生成解析树。@H_403_4@
1@H_403_4@
@H_403_4@
@H_403_4@
Postgres服务进程简查之开始事务调用序列图@H_403_4@
@H_403_4@
上图红色方框中显示了解析sql语句的方法调用过程,在raw_parser方法中对sql语句进行词法、语法解析并返回解析树parsetree的列表,因为传入的sql串(从客户端传入)可能有多个命令。@H_403_4@
@H_403_4@
通过Lex和Yacc对传入sql语句进行词法语法解析,主要是把sql语句里的目前字段、DISTINCT子句、FROM子句、WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句等解析到各自对应的结构中,组织成各自的数据结构,最后组成解析树parsetree。分析完后对应sql语句“selectcname,test2 where test1.id=test2.id;”的解析树结构如下图:@H_403_4@
@H_403_4@
2011-11-2306:57:39 HKT DETAIL: @H_403_4@
{QUERY @H_403_4@
:commandType 1 @H_403_4@
:querySource 0 @H_403_4@
:canSetTag true @H_403_4@
:utilityStmt <> @H_403_4@
:resultRelation 0 @H_403_4@
:intoClause <> @H_403_4@
:hasAggs false @H_403_4@
:hasWindowFuncs false @H_403_4@
:hasSubLinks false @H_403_4@
:hasDistinctOn false @H_403_4@
:hasRecursive false @H_403_4@
:hasModifyingCTE false @H_403_4@
:hasForUpdate false @H_403_4@
:cteList <> @H_403_4@
:rtable (@H_403_4@
{RTE @H_403_4@
:alias <> @H_403_4@
:eref @H_403_4@
{ALIAS @H_403_4@
:aliasname pg_type @H_403_4@
:colnames ("typname" "typnamespace""typowner" "typlen" "typbyval" "t@H_403_4@
yptype" "typcategory" "typispreferred""typisdefined" "typdelim" "typ@H_403_4@
relid" "typelem" "typarray""typinput" "typoutput" "typreceive" "typs@H_403_4@
end" "typmodin" "typmodout""typanalyze" "typalign" "typstorage" "typ@H_403_4@
notnull" "typbasetype" "typtypmod""typndims" "typcollation" "typdefa@H_403_4@
ultbin" "typdefault")@H_403_4@
}@H_403_4@
:rtekind 0 @H_403_4@
:relid 1247 @H_403_4@
:relkind r @H_403_4@
:inh true @H_403_4@
:inFromCl true @H_403_4@
:checkAsUser 0 @H_403_4@
:selectedCols (b 6)@H_403_4@
:modifiedCols (b)@H_403_4@
}@H_403_4@
)@H_403_4@
:jointree @H_403_4@
{FROMEXPR @H_403_4@
:fromlist (@H_403_4@
{RANGETBLREF @H_403_4@
:rtindex 1@H_403_4@
}@H_403_4@
)@H_403_4@
:quals @H_403_4@
{OPEXPR @H_403_4@
:opno 607 @H_403_4@
:opfuncid 184 @H_403_4@
:opresulttype 16 @H_403_4@
:opretset false @H_403_4@
:opcollid 0 @H_403_4@
:inputcollid 0 @H_403_4@
:args (@H_403_4@
{VAR @H_403_4@
:varno 1 @H_403_4@
:varattno -2 @H_403_4@
:vartype 26 @H_403_4@
:vartypmod -1 @H_403_4@
:varcollid 0 @H_403_4@
:varlevelsup 0 @H_403_4@
:varnoold 1 @H_403_4@
:varoattno -2 @H_403_4@
:location 57@H_403_4@
}@H_403_4@
{RELABELTYPE @H_403_4@
:arg @H_403_4@
{CONST @H_403_4@
:consttype 23 @H_403_4@
:consttypmod -1 @H_403_4@
:constcollid 0 @H_403_4@
:constlen 4 @H_403_4@
:constbyval true @H_403_4@
:constisnull false @H_403_4@
:location 63 @H_403_4@
:constvalue 4 [ 19 4 0 0 ]@H_403_4@
}@H_403_4@
:resulttype 26 @H_403_4@
:resulttypmod -1 @H_403_4@
:resultcollid 0 @H_403_4@
:relabelformat 2 @H_403_4@
:location -1@H_403_4@
}@H_403_4@
)@H_403_4@
:location 61@H_403_4@
}@H_403_4@
}@H_403_4@
:targetList (@H_403_4@
{TARGETENTRY @H_403_4@
:expr @H_403_4@
{FUNCEXPR @H_403_4@
:funcid 1081 @H_403_4@
:funcresulttype 25 @H_403_4@
:funcretset false @H_403_4@
:funcformat 0 @H_403_4@
:funccollid 100 @H_403_4@
:inputcollid 0 @H_403_4@
:args (@H_403_4@
{VAR @H_403_4@
:varno 1 @H_403_4@
:varattno -2 @H_403_4@
:vartype 26 @H_403_4@
:vartypmod -1 @H_403_4@
:varcollid 0 @H_403_4@
:varlevelsup 0 @H_403_4@
:varnoold 1 @H_403_4@
:varoattno -2 @H_403_4@
:location 19@H_403_4@
}@H_403_4@
{CONST @H_403_4@
:consttype 23 @H_403_4@
:consttypmod -1 @H_403_4@
:constcollid 0 @H_403_4@
:constlen 4 @H_403_4@
:constbyval true @H_403_4@
:constisnull false @H_403_4@
:location 23 @H_403_4@
:constvalue 4 [ 34 0 0 0 ]@H_403_4@
}@H_403_4@
)@H_403_4@
:location 7@H_403_4@
}@H_403_4@
:resno 1 @H_403_4@
:resname typname @H_403_4@
:ressortgroupref 0 @H_403_4@
:resorigtbl 0 @H_403_4@
:resorigcol 0 @H_403_4@
:resjunk false@H_403_4@
}@H_403_4@
)@H_403_4@
:returningList <> @H_403_4@
:groupClause <> @H_403_4@
:havingQual <> @H_403_4@
:windowClause <> @H_403_4@
:distinctClause <> @H_403_4@
:sortClause <> @H_403_4@
:limitOffset <> @H_403_4@
:limitCount <> @H_403_4@
:rowMarks <> @H_403_4@
:setOperations <> @H_403_4@
:constraintDeps <>@H_403_4@
}@H_403_4@
@H_403_4@
关于进行词法语法分析的Lex和Yacc请参考下面的资料,这些内容引自博客文章《一天之内不再畏惧lex&yacc之必备参考资料》,url是http://blog.sciencenet.cn/blog-419883-309595.html@H_403_4@
- Lex and YACC primer/HOWTO http://tldp.org/HOWTO/Lex-YACC-HOWTO.html ,短短20页,足够让你建立自信,一个上午足够了吧。@H_403_4@
- A Compact Guide to Lex & Yacc http://epaperpress.com/lexandyacc/,修行再提高一步,一个下午搞定。@H_403_4@
- 创始人写的书你得看看吧,Lex and yacc,By John R. Levine,Tony Mason,Doug Brown ,不能下载,没关系,这里有:http://www.filefront.com/16046001/lex--yacc.pdf/ ,第五章Parsing sql你不看一看?晚上吃完饭在教室里摆开架势三个小时敲定这短短30页的第5章,一气呵成,搞定。@H_403_4@
有这三篇文档给你揣在兜里,我想你走路的时候应该“保劲”吧。
@H_403_4@
@H_403_4@
@H_403_4@
@H_403_4@
------------ 转载请注明出处,来自博客: blog.csdn.net/beiigang beigang.iteye.com@H_403_4@