- 浏览: 230998 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
- 博客分类:
- PostgreSQL内核
话说 查询“ select cname, comp from test1, test2 where test1.id=test2.id; ” 发送到服务器端, 走查询分支 exec_simple_query ,先调用 start_xact_command 初始化了事务管理相关对象和资源,接着调用 pg_parse_query ,通过 Lex 和 Yacc 对传入 SQL 语句进行词法语法解析,生成解析树。
1
下面是解析 SQL 语句的调用序列图。
Postgres 服务进程简查之开始事务调用序列图
上图红色方框中显示了解析 SQL 语句的方法调用过程,在 raw_parser 方法中对 SQL 语句进行词法、语法解析并返回解析树 parsetree 的列表, 因为传入的 SQL 串(从客户端传入)可能有多个命令 。
通过 Lex 和 Yacc 对传入 SQL 语句进行词法语法解析,主要是把 SQL 语句里的目前字段、 DISTINCT 子句、 FROM 子句、 WHERE 子句、 GROUP BY 子句、 HAVING 子句、 ORDER BY 子句等解析到各自对应的结构中,组织成各自的数据结构,最后组成解析树 parsetree 。分析完后对应 SQL 语句 “ select cname, comp from test1, test2 where test1.id=test2.id; ” 的解析树结构如下图:
例子中 SQL 语句对应的解析树结构
pg 输出的解析树如下:
2011-11-23 06:57:39 HKT DETAIL:
{QUERY
:commandType 1
:querySource 0
:canSetTag true
:utilityStmt <>
:resultRelation 0
:intoClause <>
:hasAggs false
:hasWindowFuncs false
:hasSubLinks false
:hasDistinctOn false
:hasRecursive false
:hasModifyingCTE false
:hasForUpdate false
:cteList <>
:rtable (
{RTE
:alias <>
:eref
{ALIAS
:aliasname pg_type
:colnames ("typname" "typnamespace" "typowner" "typlen" "typbyval" "t
yptype" "typcategory" "typispreferred" "typisdefined" "typdelim" "typ
relid" "typelem" "typarray" "typinput" "typoutput" "typreceive" "typs
end" "typmodin" "typmodout" "typanalyze" "typalign" "typstorage" "typ
notnull" "typbasetype" "typtypmod" "typndims" "typcollation" "typdefa
ultbin" "typdefault")
}
:rtekind 0
:relid 1247
:relkind r
:inh true
:inFromCl true
:requiredPerms 2
:checkAsUser 0
:selectedCols (b 6)
:modifiedCols (b)
}
)
:jointree
{FROMEXPR
:fromlist (
{RANGETBLREF
:rtindex 1
}
)
:quals
{OPEXPR
:opno 607
:opfuncid 184
:opresulttype 16
:opretset false
:opcollid 0
:inputcollid 0
:args (
{VAR
:varno 1
:varattno -2
:vartype 26
:vartypmod -1
:varcollid 0
:varlevelsup 0
:varnoold 1
:varoattno -2
:location 57
}
{RELABELTYPE
:arg
{CONST
:consttype 23
:consttypmod -1
:constcollid 0
:constlen 4
:constbyval true
:constisnull false
:location 63
:constvalue 4 [ 19 4 0 0 ]
}
:resulttype 26
:resulttypmod -1
:resultcollid 0
:relabelformat 2
:location -1
}
)
:location 61
}
}
:targetList (
{TARGETENTRY
:expr
{FUNCEXPR
:funcid 1081
:funcresulttype 25
:funcretset false
:funcformat 0
:funccollid 100
:inputcollid 0
:args (
{VAR
:varno 1
:varattno -2
:vartype 26
:vartypmod -1
:varcollid 0
:varlevelsup 0
:varnoold 1
:varoattno -2
:location 19
}
{CONST
:consttype 23
:consttypmod -1
:constcollid 0
:constlen 4
:constbyval true
:constisnull false
:location 23
:constvalue 4 [ 34 0 0 0 ]
}
)
:location 7
}
:resno 1
:resname typname
:ressortgroupref 0
:resorigtbl 0
:resorigcol 0
:resjunk false
}
)
:returningList <>
:groupClause <>
:havingQual <>
:windowClause <>
:distinctClause <>
:sortClause <>
:limitOffset <>
:limitCount <>
:rowMarks <>
:setOperations <>
:constraintDeps <>
}
关于进行词法语法分析的 Lex 和 Yacc 请参考下面的资料,这些内容引自博客文章《一天之内不再畏惧 lex&yacc 之必备参考资料》, url 是 http://blog.sciencenet.cn/blog-419883-309595.html
- Lex and YACC primer/HOWTO http://tldp.org/HOWTO/Lex-YACC-HOWTO.html ,短短20 页,足够让你建立自信,一个上午足够了吧。
- A Compact Guide to Lex & Yacc http://epaperpress.com/lexandyacc/ , 修行再提高一步,一个下午搞定。
- 创始人写的书你得看看吧,Lex and yacc, By John R. Levine , Tony Mason, Doug Brown ,不能下载,没关系,这里有:http://www.filefront.com/16046001/lex--yacc.pdf/ ,第五章Parsing SQL 你不看一看?晚上吃完饭在教室里摆开架势三个小时敲定这短短30 页的第5 章,一气呵成,搞定。
有这三篇文档给你揣在兜里,我想你走路的时候应该“
保劲”
吧。
------------
转载请注明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 2065题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1824话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1731话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1437话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1379Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1762话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1886在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1805话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1631话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1856话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1314话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1258话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15773 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5686到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13813 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1613话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14313 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1641话说 main()->Postm ... -
PostgreSQL启动过程中的那些事十六:启动进程三:CheckPointGuts刷出共享内存里所有数据
2012-07-12 16:24 1479话说启动进程调用 Startup ...
相关推荐
五、 pg_auth_members: pg_auth_members: pg_auth_members: pg_auth_members:pg_auth_members: pg_auth_members:pg_auth_members:pg_auth_members:pg_auth_members: .64 七、 pg_tablespace: pg_tablespace: pg_...
查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql
在SQL Server 2012中,连接到外部数据源如PostgreSQL数据库是通过设置链接服务器来实现的。链接服务器允许SQL Server查询和操作非本地的数据,提供了与异构数据库系统交互的能力。以下是一个详细步骤,说明如何在SQL...
SQL Server 2000链接服务器到PostgreSQL
Java的SQL解析器JSQLPaser是一个强大的开源库,专门设计用于处理SQL语句的解析工作。这个库允许开发者分析SQL语句的结构,提取出其中的关键元素,如列名、表名、别名以及查询条件,从而在Java应用程序中实现对SQL的...
pgAdmin是一款免费的开源软件,专为PostgreSQL设计,提供了直观的界面,使得数据库的管理、查询、备份以及监控等工作变得简单易行。 **1. pgAdmin简介** pgAdmin是PostgreSQL数据库管理员和开发者的理想选择,它...
PostgreSQL的存储过程是由一系列SQL语句组成的代码块,可以被多次调用并执行,类似于编程语言中的函数。调试存储过程有助于理解其内部逻辑,查找并修复潜在的错误或性能瓶颈。 1. **调试环境设置** 调试PostgreSQL...
而 `wal2json` 是一个专门针对 PostgreSQL WAL 日志的解析工具,它将复杂的二进制 WAL 记录转换为易于理解和处理的 JSON 格式。 `wal2json` 的核心功能在于其能够将 PostgreSQL 的原始 WAL 信息转换为结构化的 JSON...
PostgreSQL 中的存储过程可以使用函数来实现,函数可以封装一组 SQL 语句,以便于重复使用和提高效率。在 .NET 中,可以使用 Npgsql 组件来连接 PostgreSQL 数据库,并使用函数来查询数据。本文详细介绍了 ...
pg_query_go, 使用PostgreSQL解析器解析和规范化SQL查询 pg_query_go 转到 https://github.com/lfittl/pg_query的版本。这个go库及其扩展使用实际的PostgreSQL服务器源解析SQL查询,并返回内部PostgreSQL解析树。请...
在进行 SQL Server 数据库迁移至 PostgreSQL 的过程中,一个重要的步骤是确保数据类型的正确映射。以下是 SQL Server 与 PostgreSQL 常见的数据类型对照表: - `char(n)` 映射到 `char(n)` - `varchar(n)` 映射到 `...
DBD::Pg作为DBI的子模块,专为PostgreSQL提供服务。 **PostgreSQL与libpq** PostgreSQL,通常简称为Postgres,是一种开源的关系型数据库管理系统(RDBMS),以其高度的稳定性和强大的功能著称。libpq是PostgreSQL...
PostgreSQL 与 MS SQLServer 在过程语言中的差异 PostgreSQL 和 MS SQL Server 是两种流行的关系数据库管理系统,它们在过程语言中有许多差异。下面我们将从数据类型、变量定义与赋值、IF/ELSE 控制结构等方面对这...
Postgresql存储过程是指在Postgresql数据库中定义的一组SQL语句的集合,它可以完成复杂的操作,并且可以重复使用。Postgresql存储过程可以用来实现业务逻辑,减少数据库服务器的压力和网络传输的数据量。 一、存储...
### PostgreSQL与MS SQL Server在过程语言中的差异 在数据库领域,PostgreSQL 和 MS SQL Server 都是非常受欢迎的关系型数据库管理系统。两者在很多方面都提供了强大的功能支持,但在具体实现细节上存在不少差异。...
在Java编程环境中,处理SQL语句时,我们经常会遇到需要解析SQL的需求,比如为了验证语法、提取查询条件或者自定义SQL执行逻辑等。Apache提供了一个强大的工具包——JSqlParser,它是一个开源的Java库,专门用于解析...
### PostgreSQL中的类似SQL Server的ISDATE方法 在SQL Server中,`ISDATE`是一个非常实用的函数,用于检查一个字符串是否能被解析为合法的日期格式。而在PostgreSQL数据库系统中,并没有内置与SQL Server完全相同的...
- `port`:指定PostgreSQL服务监听的TCP端口号,默认为5432。 3. **性能参数** - `shared_buffers`:控制数据库服务器用于缓存数据页的内存大小。 - `work_mem`:每个后台进程可用的内存,用于排序、哈希表等...
PostgreSQL 14.1 手册 PostgreSQL 全球开发组 翻译:彭煜玮1,PostgreSQL中文社区2文档翻译组
本文将详细探讨基于Gudusoft的SQL解析项目,它为开发者提供了一个强大的工具来处理和理解SQL语句。 Gudusoft是一家专注于数据库技术的公司,他们的SQL解析器是一款高效且灵活的组件,主要应用于SQL语句的分析、验证...