PostgreSOL解析器内部调用原理解析

PostgreSQL解析器包括词法解析器语法解析器

若将PostgreSQL源码安装在/usr/src/pgsq 1 /postgresq 1/src,可用一个环境变量PGROOT代替上述目录。PostgreSQL的解析器定义在$PGROOT/backend/parser目录下。其工作是分析用户前端发送来的SQL语句或PostgreSQL命令,建立Query树。此目录所有函数集成为一个函数List*parser (char*str, Oid*typer, int nargs),它是解析器的入口函数(放在parser. c中),对用户命令或查询语句的分析从此函数开始。因此,parser函数实际上就是PostgreSQL的解析器。

词法解析器定义在scan. 1转换分解成tokens. scan. 1使用Unix/Linux工具Lex制作。用lex可把scan.1转换成scan. CPostreSQL的语法解析器定义在gram.c,其中定义了一个重要的函数yyparse( )

yyparse()调用sran.c中的yylex()分析用户的查询,然后建立Query树。解析器(parser函数)必须检查以纯ASCII文本方式的查询字串的语法。如果语法正确,则创建一个Parse树回,否则,返回一个错误。词法解析器(yylex函数)在文件scan.1里定义,负责识别标识符,SQL关键字等。对于发现的每个关键字或者标识符,yylex()都会生成一个记号并且通过变量yylval传递给语法解析器。yylvar是由yaccgram.y转换成gram.c后自动定义的YYSTYPE类型的变量a YYSTYPE是在gram. y中定义的联接体。经过yacc转换后,YYSTYPE定义在parse. h中。语法解析器(yyparse函数)在文件gram. y里包含了一套语法规则和触发规则时执行的动作。动作代码(实际上是C代码)用于建立分析树(parse tree[1]

PostgreSQL解析器内部调用顺序如图2所示。

 

      在理清PostgreSQL 解析器功能和内部调用工作原理后,接下来,我将逐步开始分析解析器入口函数parser.c等的工作。

[1] 郭龙江, 李金宝. PostgreSQL的分析器研究

姓名:曹阳    主题:解析器

posted @ 2010-01-17 15:04  电信415实验室  阅读(1144)  评论(1编辑  收藏  举报