postgreSQL命令的词法分析和语法分析是由Unix工具Yacc和Lex制作的。使用的是 Bison 和
创新互联公司是一家以网络技术公司,为中小企业提供网站维护、成都网站设计、成都做网站、网站备案、服务器租用、主机域名、软件开发、成都小程序开发等企业互联网相关业务,是一家有着丰富的互联网运营推广经验的科技公司,有着多年的网站建站经验,致力于帮助中小企业在互联网让打出自已的品牌和口碑,让企业在互联网上打开一个面向全国乃至全球的业务窗口:建站服务热线:13518219792
Flex。
词法分析和语法分析依赖的文件定义在src\backend\parser下的scan.l和gram.y。其中:
在raw_parser函数(在src/backend/parser/parser.c下)中,主要通过调用Lex和Yacc配合生成的base_yyparse函数来实现词法分析和语法分析的工作。
其他的重要源码文件:
辅助脚本:
SQL关键字定义及查找函数
SQL关键字列表
因为查找是采用二分查找法。如果添加关键字,需要保持name的顺序。
1) 在catalog 的makefile 中添加相应的系统表头文件
./src/backend/catalog/Makefile:42: pg_foreign_table.h pg_partition_key.h \
2) 建表 -- 以pg_partition_key为例:
2.1)在include的 catalog目录下添加这张表的定义
#ifndef PG_PARTITION_KEY_H
#define PG_PARTITION_KEY_H
#include 'catalog/genbki.h'
#define PartitionKeyRelationId 3180
CATALOG(pg_partition_key,3180) BKI_WITHOUT_OIDS
{
Oid pkrelid;
int16 pkattnum;
} FormData_pg_partition_key;
typedef FormData_pg_partition_key *Form_pg_partition_key;
#define Natts_pg_partition_key 2
#define Anum_pg_partition_key_pkrelid 1
#define Anum_pg_partition_key_pkattnum 2
#endif
2.2) 在catalog 的indexing.h 头文件中添加系统表的唯一性索引
DECLARE_UNIQUE_INDEX(pg_partition_key_relid_index, 3181, on pg_partition_key using btree(pkrelid oid_ops));
#define PartitionKeyRelidIndexId 3181 r3) Syscache -- 以 pg_partion_key为例:
3.1)首先要在syscache.h中添加 SysCacheIdentifier
3.2) 要在syscache.c 的 cacheinfo[] 中添加这张表
cache的定义:
struct cachedesc
{
本节简单介绍了XLOG全局(所有进程之间)共享的数据结构:XLogCtlData和XLogCtlInsert。在这两个结构体中,存储了REDO point/Lock等相关重要的信息.
XLogCtlInsert
WAL插入记录时使用的共享数据结构
XLogCtl
XLOG的所有共享内存状态信息
跟踪任意一个后台进程,打印全局变量XLogCtl.
其中:
1.XLogCtl-Insert是XLogCtlInsert结构体变量.
2.RedoRecPtr为5510830896 - 1/48789B30,该值与pg_control文件中的REDO location相对应.
3.ThisTimeLineIDPrevTimeLineID,时间线ID,值为1.
其他相关信息可对照结构体定义阅读.
PostgreSQL 源码解读(4)- 插入数据#3(heap_insert)
PG Source Code
很长时间以来,关系型数据库一直是大公司的专利,市场被Oracle/DB2等企业数据库牢牢把持。
但是随着互联网的崛起、开源社区的发展,上世纪九十年代MySQL1.0的发布,标志着关系型数据库的领域社区终于有可选择的方案。
MySQL第一个介绍的单机RDBMS就是MySQL。
相信大多数朋友都已经对MySQL非常熟悉,基本上MySQL的成长史就是互联网的成长史。
我接触的第一个MySQL版本是MySQL4.0,到后来的MySQL5.5更是经典——基本所有的互联网公司都在使用。
MySQL也普及了「可插拔」引擎这一概念,针对不同的业务场景选用不同的存储引擎是MySQLtuning的一个重要的方式。
比如对于有事务需求的场景使用InnoDB;对于并发读取的场景MyISAM可能比较合适;但是现在我推荐绝大多数情况还是使用InnoDB,毕竟5.6后已经成为了官方的默认引擎。
大多数朋友都基本知道什么场景适用MySQL(几乎所有需要持久化结构化数据的场景),我就不赘述了。
另外值得一提的是MySQL5.6中引入了多线程复制和GTID,使得故障恢复和主从的运维变得比较方便。
另外,5.7(目前处于GA版本)是MySQL的一个重大更新,主要是读写性能和复制性能上有了长足的进步(在5.6版本中实现了SCHEMA级别的并行复制,不过意义不大,倒是MariaDB的多线程并行复制大放异彩,有不少人因为这个特性选择MariaDB。
MySQL5.7MTS支持两种模式,一种是和5.6一样,另一种则是基于binloggroupcommit实现的多线程复制,也就是MASTER上同时提交的binlog在SLE端也可以同时被apply,实现并行复制)。
如果有单机数据库技术选型的朋友,基本上只需要考虑5.7或者MariaDB就好了,而且5.6、5.7由Oracle接手后,性能和稳定性上都有了明显的提升。
PostgreSQLPostgreSQL的历史也非常悠久,其前身是UCB的Ingres,主持这个项目的MichaelStronebraker于2015年获得图灵奖。
后来项目更名为Post-Ingres,项目基于BSDlicense下开源。
1995年几个UCB的学生为Post-Ingres开发了SQL的接口,正式发布了PostgreSQL95,随后一步步在开源社区中成长起来。
和MySQL一样,PostgreSQL也是一个单机的关系型数据库,但是与MySQL方便用户过度扩展的SQL文法不一样的是,PostgreSQL的SQL支持非常强大,不管是内置类型、JSON支持、GIS类型以及对于复杂查询的支持,PL/SQL等都比MySQL强大得多,而且从代码质量上来看,PostgreSQL的代码质量是优于MySQL的,另外相对于MySQL5.7以前的版本,PostgreSQL的SQL优化器比MySQL强大很多,几乎所有稍微复杂的查询PostgreSQL的表现都优于MySQL。
从近几年的趋势上来看,PostgreSQL的势头也很强劲,我认为PostgreSQL的不足之处在于没有MySQL那样强大的社区和群众基础。
MySQL经过那么多年的发展,积累了很多的运维工具和最佳实践,但是PostgreSQL作为后起之秀,拥有更优秀的设计和更丰富的功能。
电脑培训发现PostgreSQL9以后的版本也足够稳定,在做新项目技术选型的时候,是一个很好的选择。
另外也有很多新的数据库项目是基于PostgreSQL源码的基础上进行二次开发,比如Greenplum等。
PostgreSQL安装:一、windows下安装过程
安装介质:postgresql-9.1.3-1-windows.exe(46M),安装过程非常简单,过程如下:
1、开始安装:
2、选择程序安装目录:
注:安装 PostgreSQL 的分区最好是 NTFS 格式的。PostgreSQL 首要任务是要保证数据的完整性,而 FAT 和 FAT32 文件系统不能提供这样的可靠性保障,而且 FAT 文件系统缺乏安全性保障,无法保证原始数据在未经授权的情况下被更改。此外,PostgreSQL 所使用的"多分点"功能完成表空间的这一特征在FAT文件系统下无法实现。
然而,在某些系统中,只有一种 FAT 分区,这种情况下,可以正常安装 PostgreSQL,但不要进行数据库的初始化工作。安装完成后,在 FAT 分区上手动执行 initdb.exe 程序即可,但不能保证其安全性和可靠性,并且建立表空间也会失败。
3、选择数据存放目录:
4、输入数据库超级用户和创建的OS用户的密码
注:数据库超级用户是一个非管理员账户,这是为了减少黑客利用在 PostgreSQL 发现的缺陷对系统造成损害,因此需要对数据库超级用户设置密码,如下图所示,安装程序自动建立的服务用户的用户名默认为 postgres。
5、设置服务监听端口,默认为5432
6、选择运行时语言环境
注:选择数据库存储区域的运行时语言环境(字符编码格式)。
在选择语言环境时,若选择"default locale"会导致安装不正确;同时,PostgreSQL 不支持 GBK 和 GB18030 作为字符集,如果选择其它四个中文字符集:中文繁体 香港(Chinese[Traditional], Hong Kong S.A.R.)、中文简体 新加坡(Chinese[Simplified], Singapore)、中文繁体 台湾(Chinese[Traditional], Taiwan)和中文繁体 澳门(Chinese[Traditional], Marco S.A.R.),会导致查询结果和排序效果不正确。建议选择"C",即不使用区域。
----我选择了default localt,安装正确;建议选择default localt。
7、安装过程(2分钟).
8、安装完成.