postgres创建表的过程以及部分源码分析
2018-06-17 19:51:23来源:未知 阅读 ()
背景:修改pg内核,在创建表时,表名不能和当前的用户名同名。
首先我们知道DefineRelation此函数是最终创建表结构的函数,最主要的参数是CreateStmt这个结构,该结构如下
typedef struct CreateStmt { NodeTag type; RangeVar *relation; /* relation to create */ List *tableElts; /* column definitions (list of ColumnDef) */ List *inhRelations; /* relations to inherit from (list of * inhRelation) */ TypeName *ofTypename; /* OF typename */ List *constraints; /* constraints (list of Constraint nodes) */ List *options; /* options from WITH clause */ OnCommitAction oncommit; /* what do we do at COMMIT? */ char *tablespacename; /* table space to use, or NULL */ bool if_not_exists; /* just do nothing if it already exists? */ } CreateStmt;
结构中relation中包含了catalogname,schemaname,relname此时的relname就能够顺利的拿到。
tableElts 这个list定义了表结构中的所有列名,如若想增加个非隐藏列,可以append进去。
下图是创建一个简单表,PG内部函数的调用过程:
在PG backend上敲入的sql,入口函数都是exec_simple_query,把这串sql解析,重写后生产执行计划。
附带一个PG内核删除的函数,将query结构反解析出sql的函数
char * deparse_query_def(Query *query) { StringInfoData buf; initStringInfo(&buf); get_query_def(query, &buf, NIL, NULL, PRETTYFLAG_INDENT, WRAP_COLUMN_DEFAULT, 0); return buf.data; }
如果想很好的看清query以及subquery重写以后的任务是什么,可以将此函数编译进pg内核。
在ProcessUtility这个过程中有钩子函数可以挂接,可以根据nodeTag(parseTree)的类型来分别进行处理,例如cstore_fdw中T_DropStmt这种操作的时候,将物理文件删除
这个钩子的用处还可以控制某些操作加入你想的内容。
我们可以在ProcessUtilitySlow这个函数进行内核修改,加入对当前用户名获取,并从CreateStmt结构中的relname进行对比,然后控制是否创建表或者进行报错信息。
获取当前用户名如下
Datum current_user(PG_FUNCTION_ARGS) { PG_RETURN_DATUM(DirectFunctionCall1(namein, CStringGetDatum(GetUserNameFromId(GetUserId())))); }
此函数是PG的内部函数,使用效果是:
postgres=# select CURRENT_USER; current_user -------------- postgres (1 row)
按照这样的做法就能够完成背景下的内容了。
PS:通常还有几个搭配函数使用->DefineRelation->CommandCounterIncrement->transformRelOptions
->heap_reloptions->NewRelationCreateToastTable[AlterTableCreateToastTable]
注:未经同意,不得转载!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 链接 Mysql 创建 数据库和创表,增加数据 2019-08-13
- Python数据基础类型-列表 2019-08-13
- Python3字典排序 2019-07-24
- django框架使用及创建项目 2019-07-24
- 用python写一个简单的文件上传 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash