Skip to content

Commit e1f50c2

Browse files
authored
Catalog modify and updating (#62)
* catalog modify and updating * modify adoc file name * double check and fix some issues
1 parent 15906c7 commit e1f50c2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+25202
-25567
lines changed

CN/modules/ROOT/nav.adoc

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,26 @@
22
* xref:v3.1/1.adoc[发行说明]
33
* xref:v3.1/2.adoc[关于IvorySQL]
44
* IvorySQL入门
5-
** xref:v3.1/3.adoc[用户使用手册]
6-
** xref:v3.1/4.adoc[管理员指南]
7-
** xref:v3.1/5.adoc[运维人员指南]
8-
* xref:v3.1/6.adoc[安装部署]
9-
* xref:v3.1/7.adoc[开发者指南]
10-
* xref:v3.1/8.adoc[运维管理指南]
11-
* xref:v3.1/9.adoc[迁移指南]
12-
* xref:v3.1/10.adoc[社区贡献指南]
13-
* xref:v3.1/11.adoc[工具参考]
14-
* xref:v3.1/12.adoc[FAQ]
5+
** xref:v3.1/3.adoc[快速开始]
6+
** xref:v3.1/4.adoc[日常监控]
7+
** xref:v3.1/5.adoc[日常维护]
8+
* IvorySQL高级
9+
** xref:v3.1/6.adoc[安装指南]
10+
** xref:v3.1/7.adoc[集群搭建]
11+
** xref:v3.1/8.adoc[开发者指南]
12+
** xref:v3.1/9.adoc[运维管理指南]
13+
** xref:v3.1/10.adoc[迁移指南]
1514
* 功能列表
16-
** xref:v3.1/14.adoc[1、Ivorysql框架设计]
17-
** xref:v3.1/15.adoc[2、GUC框架]
18-
** xref:v3.1/16.adoc[3、大小写转换]
19-
** xref:v3.1/17.adoc[4、双模式设计]
20-
** xref:v3.1/18.adoc[5、兼容Oracle like]
21-
** xref:v3.1/19.adoc[6、兼容Oracle匿名块]
22-
** xref:v3.1/20.adoc[7、兼容Oracle函数与存储过程]
23-
** xref:v3.1/21.adoc[8、内置数据类型与内置函数]
24-
** xref:v3.1/22.adoc[9、新增Oracle兼容模式的端口与Ip]
15+
** xref:v3.1/11.adoc[1、框架设计]
16+
** xref:v3.1/12.adoc[2、GUC框架]
17+
** xref:v3.1/13.adoc[3、大小写转换]
18+
** xref:v3.1/14.adoc[4、双模式设计]
19+
** xref:v3.1/15.adoc[5、兼容Oracle like]
20+
** xref:v3.1/16.adoc[6、兼容Oracle匿名块]
21+
** xref:v3.1/17.adoc[7、兼容Oracle函数与存储过程]
22+
** xref:v3.1/18.adoc[8、内置数据类型与内置函数]
23+
** xref:v3.1/19.adoc[9、新增Oracle兼容模式的端口与IP]
24+
* xref:v3.1/20.adoc[社区贡献指南]
25+
* xref:v3.1/21.adoc[工具参考]
26+
* xref:v3.1/22.adoc[FAQ]
27+

CN/modules/ROOT/pages/v3.1/10.adoc

Lines changed: 449 additions & 735 deletions
Large diffs are not rendered by default.

CN/modules/ROOT/pages/v3.1/11.adoc

Lines changed: 12 additions & 4989 deletions
Large diffs are not rendered by default.

CN/modules/ROOT/pages/v3.1/12.adoc

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,35 @@
1-
21
:sectnums:
32
:sectnumlevels: 5
43

4+
:imagesdir: ./_images
55

6-
= FAQ
7-
8-
== IvorySQL贡献的许可
9-
10-
如果您提交的贡献是原创作品,那么您可以假设IvorySQL将作为整个IvorySQL版本的一部分发布给下游用户,该版本将遵循Apache许可证2.0版本。
11-
12-
如果您提交的内容不是原创作品,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布。请注意需要满足如下条件:
13-
14-
1、需要给代码的用户一份Apache许可证。
15-
16-
2、如果您修改了代码,需要在被修改的文件中说明。
17-
18-
3、在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议、商标、专利声明和其他原来作者规定需要包含的说明。
19-
20-
4、如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache许可证。您可以在Notice中增加自己的许可,但不可以表现为对Apache许可证构成更改。
21-
22-
最后,请记住,从非原始的工作中删除许可标头从来都不是一个好主意。即使您使用的文件部分最初在顶部有许可标头,您也应该保留它。与往常一样,如果您不太确定您的贡献所涉及的许可问题,请随时在开发人员邮件列表中联系我们。
23-
24-
== 编码指南
25-
26-
您获得反馈和看到代码合并到项目中的机会在很大程度上取决于更改的粒度。如果您的想法发生了更大的变化,我们强烈建议您在花大量时间编写代码之前,先加入开发人员的邮件列表,并与我们分享您的建议。即使您的建议得到社区的验证,我们仍然建议您将实际工作作为一系列小型的、独立的提交来完成。这使得评审员的工作更加容易,并提高了反馈的及时性。
27-
28-
当谈到IvorySQL的C和C++部分时,我们尝试遵循PostgreSQL编码约定。除此之外:
29-
30-
对于C和Perl代码,如果需要,请运行pgindent。我们建议在查看更改时使用git diff--color,这样您提交的代码中就不会出现任何虚假的空白问题。
31-
32-
所有贡献给IvorySQL的新功能都应该由与其一起贡献的回归测试覆盖。如果您不确定如何测试或记录您的工作,请在ivorysql-hackers邮件列表中提出问题,社区的开发人员将尽力帮助您。
33-
34-
至少,您应该始终运行make installcheck world,以确保您没有破坏任何东西。
35-
36-
== 适用于上游PostgreSQL的更改
37-
38-
如果您正在进行的更改涉及PostgreSQL和IvorySQL之间的通用功能,则可能会要求您将其转发到PostgreSQL。这不仅是为了我们不断减少两个项目之间的差异,而且是为了让与PostgreSQL相关的任何变化都能从对上游PostgreSQL社区更广泛的审查中受益。一般来说,将这两个代码库都放在手边是个好主意,这样您就可以确定您的更改是否需要前移。
39-
40-
== 补丁提交
6+
== 新增GUC变量
417

42-
一旦您准备好与IvorySQL核心团队和IvorySQL社区的其他成员共享您的工作,您应该将所有提交推送到从官方IvorySQL派生的分支的您自己的存储库中,并向我们发送请求
8+
为了兼容Oracle,需要在原有的GUC变量基础之上增加一些用于控制数据库执行结果的变量,以达到和Oracle行为一致的目的
439

44-
== 补丁审查
10+
为了以后更好的添加兼容的guc参数,以及为了更少的改动pg内核源码,我们需要设计一个框架将guc添加到一个统一的地方。
4511

46-
假定提交的拉取请求通过验证检查,可供同行审查。同行审查是确保对IvorySQL的贡献具有高质量并与路线图和社区期望保持一致的过程。我们鼓励IvorySQL社区的每个成员审查请求并提供反馈。由于您不必成为核心团队成员就可以做到这一点,因此我们建议您向有兴趣成为IvorySQL长期贡献者的任何人提供一系列拉动式评论。
4712

48-
同行评审的一个结果可能是达成共识,即您需要以某些方式修改pull请求。GitHub允许您将其他提交推送到从中发送请求的分支中。这些额外的提交将对所有审阅者可见。
13+
=== 实现
4914

50-
当同行评议收到参与者至少+1张+1和no-1张的选票时,同行评议会趋于一致。在这一点上,您应该期望核心团队成员之一将您的更改引入到项目中
15+
添加兼容版本的guc参数时,我们需统一在 *ivy_guc.c* 文件中添加。其中 `Ivy_ConfigureNamesBool`、`Ivy_ConfigureNamesInt`、`Ivy_ConfigureNamesString`、`Ivy_ConfigureNamesReal` 和 `Ivy_ConfigureNamesEnum` 分别表示5种不同类型的guc参数,添加guc参数时,将guc的值添加到对应数组中即可
5116

52-
在补丁审查期间的任何时候,您都可能会因审查人员和核心团队成员的工作效率而遇到延迟。请耐心点,也不要气馁。如果您在几天内没有收到预期的反馈,请添加一条评论,要求更新pull请求本身,或者向邮件列表发送一封电子邮件。
5317

54-
== 直接提交到存储库
18+
=== 新增变量(目前)
5519

56-
有时,您会看到核心团队成员直接提交到存储库,而无需执行pull请求工作流。这仅适用于小的更改,我们使用的经验法则是:如果更改涉及任何可能导致测试失败的功能,那么它必须通过pull请求工作流。另一方面,如果更改发生在代码库的非功能部分(例如在注释块中修复打字错误),则核心团队成员可以决定直接提交到存储库。
20+
[cols="^1,^2"]
21+
|====
22+
| 变量名 | 描述
23+
| ivorysql.compatible_mode | 表示当前兼容哪种数据库(pg/oracle),可以通过show命令查看,set命令更改该变量,reset命令重置为连接时的数据库模式,reset all会影响该变量
24+
| ivorysql.database_mode | 表示当前数据库的模式(pg/oracle),可以通过show命令查看,set/reset/reset all命令不影响该变量
25+
| ivorysql.datetime_ignore_nls_mask | 表示日期格式是否会受NLS参数影响,默认为0,可以通过set命令设置,reset 命令重置,reset all命令会重置该变量
26+
| ivorysql.enable_emptystring_to_NULL | 取值为(on/off),该变量为on时,会将插入的空字符串转成NULL值存储
27+
| ivorysql.identifier_case_switch | 设置字符大小写转换模式
28+
| ivorysql.listen_address | 表示兼容模式监听的地址,在初始化数据库时,从ivorysql.conf文件中读取该配置,在配置文件中修改该值,需要重启数据库生效,可以通过show命令查看
29+
| ivorysql.port | 表示兼容模式下连接的端口号,在初始化数据库时,从ivorysql.conf文件中读取该配置,在配置文件中修改该值,需要重启数据库生效,可以通过show命令查看
30+
| nls_date_format | 表示默认的日期格式,可以通过show命令查看,默认为‘YYYY-MM-DD’,可以通过set命令设置,可以通过reset命令重置回默认值,reset all 命令会重置该变量
31+
| nls_length_semantic | 兼容Oracle的同名参数,控制一个字符所占内存的大小
32+
| nls_timestamp_format | 兼容Oracle的同名参数,控制带时间的日期格式
33+
| nls_timestamp_tz_format | 兼容Oracle的同名参数,控制带时区的日期格式
34+
| shared_preload_libraries | 在初始话数据库时,从ivorysql.conf文件中读取,可以通过show命令查看,在配置文件中修改该值,重启数据库生效。
35+
|====

CN/modules/ROOT/pages/v3.1/13.adoc

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
2+
:sectnums:
3+
:sectnumlevels: 5
4+
5+
= 引用标识符的大小写转换设计
6+
7+
== 目的
8+
9+
- 为了满足PG和Oracle的引用标识符大小写兼容,ivorysql设计了三种引用标识符的大小写转换模式。通过guc参数“identifier_case_switch”选择转换模式;
10+
11+
== 功能
12+
13+
=== 大小写转换的三种模式(默认为interchange)
14+
15+
- 如果 guc参数“identifier_case_switch”值为“interchange”:
16+
17+
1). 如果双引号所引用的标识符中的字母全部为大写,则将大写转换为小写。
18+
19+
2). 如果双引号所引用的标识符中的字母全部为小写,则将小写转换为大写。
20+
21+
3). 如果用双引号引起来的标识符中的字母是大小写混合的,则保持标识符不变。
22+
23+
=== 初始化数据库集簇时
24+
25+
- 在initdb程序中加入 -C选项设置大小写转换模式,-C对应的值为:
26+
27+
"normal" ------ "0"同义
28+
29+
"interchange" ------ "1"同义
30+
31+
"lowercase" ------ "2"同义
32+
33+
在初始化数据库集簇的过程中,将大小写转换模式保存到data目录的global/pg_control文件中。
34+
35+
=== 测试用例
36+
37+
```
38+
SET ivorysql.enable_case_switch = true;
39+
SET ivorysql.identifier_case_switch = interchange;
40+
CREATE TABLE "ABC"(c1 int, c2 int);
41+
SELECT relname FROM pg_class WHERE relname = 'ABC';
42+
SELECT relname FROM pg_class WHERE relname = 'abc';
43+
SELECT * FROM "ABC";
44+
SELECT * FROM ABC;
45+
SELECT * FROM abc;
46+
SELECT * FROM Abc;
47+
SELECT * FROM "Abc"; -- ERROR
48+
DROP TABLE abc;
49+
50+
CREATE TABLE "Abc"(c1 int, c2 int);
51+
SELECT relname FROM pg_class WHERE relname = 'ABC';
52+
SELECT relname FROM pg_class WHERE relname = 'abc';
53+
SELECT relname FROM pg_class WHERE relname = 'Abc';
54+
SELECT * FROM "ABC"; -- ERROR
55+
SELECT * FROM ABC; -- ERROR
56+
SELECT * FROM abc; -- ERROR
57+
SELECT * FROM Abc; -- ERROR
58+
SELECT * FROM "Abc";
59+
DROP TABLE "Abc";
60+
61+
```
62+
63+
64+
65+

CN/modules/ROOT/pages/v3.1/14.adoc

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,33 @@
11
:sectnums:
22
:sectnumlevels: 5
3+
34
:imagesdir: ./_images
45

5-
= Ivorysql框架设计
6+
= 双模式设计
67

78
== 目的
8-
- 为了对原有的postgres改动最小的前提下,实现对oracle兼容。我们需要实现双parser、双端口、模式PLPGSQL实现PL\iSQL的框架。实现流程图如下:
99

10-
image::p18.png[]
10+
- 为了满足PG模式和兼容Oracle模式,Ivorysql设计了pg和oracle两种模式。并且可以在initdb时指定模式;
1111

1212
== 功能
1313

14-
=== 双端口设计
15-
16-
- 保持了Ivorysql 5432端口兼容原有postgres情况,因此 Ivorysql采用另一个独立的端口登录,默认为1521。从该端口登录,默认采用oracle兼容模式。如果需要从5432端口登录且还要进入兼容模式,则需要通过compatible_mode参数进行设置;
17-
18-
=== parser模块设计
19-
20-
- 为了将Oracle语法与postgres语法间的相互干扰降到最低,因此新增parser模块,用于处理Oracle相关的语法;
14+
- Initdb -m 初始化,需要判断不同的模式,其中Oracle模式下,需要执行postgres_oracle.bki的SQL语句;
15+
- 启动时会根据初始化模式,判断是否为oracle兼容模式。
2116

22-
=== 新增PL\iSQL过程语言
17+
```
18+
database_mode:用于表示初始化模式;
19+
database_mode=DB_PG,PG模式,且不可切换;
20+
database_mode=DB_ORACLE,Oracle兼容模式;
21+
```
2322

24-
- 同样为了减少Oracle兼容与postgres语法不同而导致测试用例冲突得情况,因此单独设计了一套Oracle专用的测试用例。该套测试用例由postgres原有测试框架拷贝修改而来;
23+
== 测试用例
2524

25+
```
26+
初始化PG模式:
27+
./initdb -D ../data -m pg
2628

29+
初始化oracle兼容模式:
30+
./initdb -D ../data -m oracle
31+
32+
./initdb -D ../data
33+
```

CN/modules/ROOT/pages/v3.1/15.adoc

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,67 @@
33

44
:imagesdir: ./_images
55

6-
== 新增GUC变量
6+
= 兼容Oracle like
77

8-
为了兼容Oracle,需要在原有的GUC变量基础之上增加一些用于控制数据库执行结果的变量,以达到和Oracle行为一致的目的。
8+
== 目的
99

10-
为了以后更好的添加兼容的guc参数,以及为了更少的改动pg内核源码,我们需要设计一个框架将guc添加到一个统一的地方
10+
- 本文档意在为使用 like 模糊查询的人员提供一个深入了解兼容Oracle 的模糊查询like实现的过程,是like兼容的实现文档
1111

12+
== 功能说明
13+
|====
14+
|数据库名称|like模糊查询
15+
|oracle|oracle的字符串类型是varchar2,支持对数字、日期、字符串字段类型的列用Like关键字配合通配符来实现模糊查询
16+
|IvorySQL|IvorySQL的字符串基本类型是text,所以like是以text为基础上,其他IvorySQL的类型能隐式转换成text,这样不用创建opeartor就能自动转换
17+
|====
1218

13-
=== 实现
19+
== 测试用例
1420

15-
添加兼容版本的guc参数时,我们需统一在 *ivy_guc.c* 文件中添加。其中 `Ivy_ConfigureNamesBool`、`Ivy_ConfigureNamesInt`、`Ivy_ConfigureNamesString`、`Ivy_ConfigureNamesReal` 和 `Ivy_ConfigureNamesEnum` 分别表示5种不同类型的guc参数,添加guc参数时,将guc的值添加到对应数组中即可。
21+
```
1622

23+
create table t_ora_like (id int ,str1 varchar(8), date1 timestamp with time zone, date2 time with time zone, num int, str2 varchar(8));
24+
insert into t_ora_like (id ,str1 ,date1 ,date2) values (123456,'test1','2022-09-26 16:39:20','2022-09-26 16:39:20');
25+
insert into t_ora_like (id ,str1 ,date1 ,date2) values (123457,'test2','2022-09-26 16:40:20','2022-09-26 16:40:20');
26+
insert into t_ora_like (id ,str1 ,date1 ,date2) values (223456,'test3','2022-09-26 16:41:20','2022-09-26 16:41:20');
27+
insert into t_ora_like (id ,str1 ,date1 ,date2) values (123458,'test4','2022-09-26 16:42:20','2022-09-26 16:42:20');
1728

18-
=== 新增变量(目前)
29+
select * from t_ora_like where str1 like 'test%';
30+
id | str1 | date1 | date2 | num | str2
31+
--------+-------+-----------------------------------+-------------+-----+------
32+
123456 | test1 | 2022-09-26 16:39:20.000000 +08:00 | 16:39:20+08 | |
33+
123457 | test2 | 2022-09-26 16:40:20.000000 +08:00 | 16:40:20+08 | |
34+
223456 | test3 | 2022-09-26 16:41:20.000000 +08:00 | 16:41:20+08 | |
35+
123458 | test4 | 2022-09-26 16:42:20.000000 +08:00 | 16:42:20+08 | |
36+
(4 rows)
1937
20-
[cols="^1,^2"]
21-
|====
22-
| 变量名 | 描述
23-
| ivorysql.compatible_mode | 表示当前兼容哪种数据库(pg/oracle),可以通过show命令查看,set命令更改该变量,reset命令重置为连接时的数据库模式,reset all会影响该变量
24-
| ivorysql.database_mode | 表示当前数据库的模式(pg/oracle),可以通过show命令查看,set/reset/reset all命令不影响该变量
25-
| ivorysql.datetime_ignore_nls_mask | 表示日期格式是否会受NLS参数影响,默认为0,可以通过set命令设置,reset 命令重置,reset all命令会重置该变量
26-
| ivorysql.enable_emptystring_to_NULL | 取值为(on/off),该变量为on时,会将插入的空字符串转成NULL值存储
27-
| ivorysql.identifier_case_switch | 设置字符大小写转换模式
28-
| ivorysql.listen_address | 表示兼容模式监听的地址,在初始化数据库时,从ivorysql.conf文件中读取该配置,在配置文件中修改该值,需要重启数据库生效,可以通过show命令查看
29-
| ivorysql.port | 表示兼容模式下连接的端口号,在初始化数据库时,从ivorysql.conf文件中读取该配置,在配置文件中修改该值,需要重启数据库生效,可以通过show命令查看
30-
| nls_date_format | 表示默认的日期格式,可以通过show命令查看,默认为‘YYYY-MM-DD’,可以通过set命令设置,可以通过reset命令重置回默认值,reset all 命令会重置该变量
31-
| nls_length_semantic | 兼容Oracle的同名参数,控制一个字符所占内存的大小
32-
| nls_timestamp_format | 兼容Oracle的同名参数,控制带时间的日期格式
33-
| nls_timestamp_tz_format | 兼容Oracle的同名参数,控制带时区的日期格式
34-
| shared_preload_libraries | 在初始话数据库时,从ivorysql.conf文件中读取,可以通过show命令查看,在配置文件中修改该值,重启数据库生效。
35-
|====
38+
select * from t_ora_like where date1 like '2022%';
39+
id | str1 | date1 | date2 | num | str2
40+
--------+-------+-----------------------------------+-------------+-----+------
41+
123456 | test1 | 2022-09-26 16:39:20.000000 +08:00 | 16:39:20+08 | |
42+
123457 | test2 | 2022-09-26 16:40:20.000000 +08:00 | 16:40:20+08 | |
43+
223456 | test3 | 2022-09-26 16:41:20.000000 +08:00 | 16:41:20+08 | |
44+
123458 | test4 | 2022-09-26 16:42:20.000000 +08:00 | 16:42:20+08 | |
45+
(4 rows)
46+
47+
select * from t_ora_like where date2 like '16%';
48+
id | str1 | date1 | date2 | num | str2
49+
--------+-------+-----------------------------------+-------------+-----+------
50+
123456 | test1 | 2022-09-26 16:39:20.000000 +08:00 | 16:39:20+08 | |
51+
123457 | test2 | 2022-09-26 16:40:20.000000 +08:00 | 16:40:20+08 | |
52+
223456 | test3 | 2022-09-26 16:41:20.000000 +08:00 | 16:41:20+08 | |
53+
123458 | test4 | 2022-09-26 16:42:20.000000 +08:00 | 16:42:20+08 | |
54+
(4 rows)
55+
56+
select * from t_ora_like where id like '123%';
57+
id | str1 | date1 | date2 | num | str2
58+
--------+-------+-----------------------------------+-------------+-----+------
59+
123456 | test1 | 2022-09-26 16:39:20.000000 +08:00 | 16:39:20+08 | |
60+
123457 | test2 | 2022-09-26 16:40:20.000000 +08:00 | 16:40:20+08 | |
61+
123458 | test4 | 2022-09-26 16:42:20.000000 +08:00 | 16:42:20+08 | |
62+
(3 rows)
63+
64+
select * from t_ora_like where id like null;
65+
id | str1 | date1 | date2 | num | str2
66+
----+------+-------+-------+-----+------
67+
(0 rows)
68+
69+
```

0 commit comments

Comments
 (0)