如何为 PostgreSQL 增加系统表字段

如何为 PostgreSQL 增加系统表字段,第1张

1为pg_database增加一个字段 datdummy,打开 /src/include/catalog/pg_database.h:

CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO

{

NameDatadatname /* database name */

Oid datdba/* owner of database */

int32 encoding /* character encoding */

NameDatadatcollate/* LC_COLLATE setting */

NameDatadatctype /* LC_CTYPE setting */

booldatistemplate /* allowed as CREATE DATABASE template? */

booldatallowconn /* new connections allowed? */

int32 datconnlimit /* max connections allowed (-1=no limit) */

Oid datlastsysoid /* highest OID to consider a system OID */

TransactionId datfrozenxid/* all Xids <this are frozen in this DB */

TransactionId datminmxid /* all multixacts in the DB are >= this */

Oid dattablespace /* default table space for this DB */

#ifdef CATALOG_VARLEN /* variable-length fields start here */

aclitem datacl[1] /* access permissions */

#endif

} FormData_pg_database

/* ----------------

* Form_pg_database corresponds to a pointer to a tuple with

* the format of pg_database relation.

* ----------------

*/

typedef FormData_pg_database *Form_pg_database

/* ----------------

* compiler constants for pg_database

* ----------------

*/

#define Natts_pg_database 13

#define Anum_pg_database_datname 1

#define Anum_pg_database_datdba2

#define Anum_pg_database_encoding 3

#define Anum_pg_database_datcollate4

#define Anum_pg_database_datctype 5

#define Anum_pg_database_datistemplate 6

#define Anum_pg_database_datallowconn 7

#define Anum_pg_database_datconnlimit 8

#define Anum_pg_database_datlastsysoid 9

#define Anum_pg_database_datfrozenxid 10

#define Anum_pg_database_datminmxid11

#define Anum_pg_database_dattablespace 12

#define Anum_pg_database_datacl13

它们最终会被脚本 genbki.pl 利用生成 postgresql.bki文件,用在 initdb 初始化 data cluster 时,有兴趣可以自己学习一下,PG编译系统也是一个充分展示强大 perl 语言的系统;

3、在 dattablespace 下增加新定义:

int8datdummy /* dummy column */

后边字段序号的定义也是很重要的,必须按顺序修改,也要记得属性数相应修改:

#define Natts_pg_database 14

...

#define Anum_pg_database_dattablespace 12

#define Anum_pg_database_datdummy 13

#define Anum_pg_database_datacl14

预定义的数据库必须也要修改,_null_ 前边增加 100的字段为 datdummy 数据:

DATA(insert OID = 1 ( template1 PGUID ENCODING "LC_COLLATE" "LC_CTYPE" t t -1 0 0 1 1663 100 _null_))

4、编译运行,会发生什么,编译正常,然后 initdb,竟然也神奇的通过了,难道这就好了吗?

Tip:Linux 下不停在一个目录下改代码,可能会遇到莫名的程序问题,试试 make clean

5、那么创建一个数据库试试看:CREATE DATABASE quanzl成功了,是不是感觉似乎还缺点什么?

datdummy的赋值,总不能 UPDATE pg_database SET datdummy = xxx 吧?

预订义的数据库比如template1,我们可以在catalog里边定义 BKI 脚本,比如上边的例子,给它一个初始值。程序里也必须有所改动才能成为可 *** 作属性;

6、参照语法修改,创建一个 CREATE DATABASE xxx DUMMY nnn语法,修改结构体 CreatedbStmt 增加新属性,语法分析阶段将此值读入,创建数据库时将它写入属性;

new_record[Anum_pg_database_datdummy - 1] = 1234

此部分代码在 src/backend/commands/dbcommands.c 中,自行阅读好了,写程序就这么简单。:)

您好,很高兴为您解答。

首先,修改geometry_columns表中对应字段的SRID为新的坐标系ID

其次,修改beijing_highway表的定义,将enforce_dims_the_geom的定义的(st_srid(the_geom) = (-1))删除(注:此处the_geom是空间字段);

然后更新数据内容 update table_name set the_geom = st_geomfromtext(ST_AsText(the_geom),4326)(注:此处4326为数据的坐标系ID);

最后,将enforce_dims_the_geom的定义(st_srid(the_geom) = (4326))加回去就可以变更SRID了。

如果是从一个坐标系向另外一个坐标系调整,就需要进行坐标系的变换了。这时候可能会意识到,字段是只能增加,也就是插入。

采用postgis函数将墨卡托投影变成4326并插入空间数据库

QuanGuo=# insert into test values(1,'hahaha',st_transform(st_geomfromtext('POINT

(10070507.650288 4282901.6281314)',900913),4326))

INSERT 0 1

QuanGuo=# select astext(location) from test

astext

------------------------------------------

POINT(-104.987 39.739)

POINT(-104.955 39.739)

POINT(10 10)

POINT(10070507.650288 4282901.6281314)

POINT(90.4649094109628 35.8711162526031)

(5 rows)

QuanGuo=#

如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】

希望我的回答对您有所帮助,望采纳!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11467074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存