Skip to content

Commit 92fed2d

Browse files
authored
Merge branch 'master' into master
2 parents 326fee4 + 8878b4f commit 92fed2d

File tree

18 files changed

+569
-11
lines changed

18 files changed

+569
-11
lines changed

CN/modules/ROOT/nav.adoc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
*** xref:master/5.4.adoc[pg_cron]
2020
*** xref:master/5.5.adoc[pgsql-http]
2121
*** xref:master/5.6.adoc[plpgsql_check]
22-
*** xref:master/5.8.adoc[PgAudit]
22+
*** xref:master/5.7.adoc[pgroonga]
23+
*** xref:master/5.8.adoc[pgaudit]
2324
** IvorySQL架构设计
2425
*** 查询处理
2526
**** xref:master/6.1.1.adoc[双parser]
@@ -35,7 +36,8 @@
3536
**** xref:master/6.3.7.adoc[嵌套子函数]
3637
**** xref:master/6.3.8.adoc[Force View]
3738
**** xref:master/6.3.9.adoc[大小写转换]
38-
*** xref:master/6.4.adoc[国标GB18030]
39+
**** xref:master/6.3.10.adoc[sys_guid 函数]
40+
**** xref:master/6.3.11.adoc[空字符串转null]
3941
*** 内置函数
4042
**** xref:master/6.4.1.adoc[sys_context]
4143
**** xref:master/6.4.2.adoc[userenv]
@@ -60,6 +62,8 @@
6062
*** xref:master/7.17.adoc[17、NLS 参数]
6163
*** xref:master/7.18.adoc[18、Force View]
6264
*** xref:master/7.19.adoc[19、嵌套子函数]
65+
*** xref:master/7.20.adoc[20、sys_guid 函数]
66+
*** xref:master/7.21.adoc[21、空字符串转null]
6367
** IvorySQL贡献指南
6468
*** xref:master/8.1.adoc[社区贡献指南]
6569
*** xref:master/8.2.adoc[asciidoc语法快速参考]

CN/modules/ROOT/pages/master/5.0.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ IvorySQL 作为一款兼容 Oracle 且基于 PostgreSQL 的高级开源数据库
1717
| xref:master/5.4.adoc[pg_cron]​ | 1.6.0 | 提供数据库内部的定时任务调度功能,支持定期执行SQL语句 | 数据清理、定期统计、自动化维护任务
1818
| xref:master/5.5.adoc[pgsql-http]​ | 1.7.0 | 允许在SQL中发起HTTP请求,与外部Web服务进行交互 | 数据采集、API集成、微服务调用
1919
| xref:master/5.6.adoc[plpgsql_check] | 2.8 | 提供PL/pgSQL代码的静态分析功能,可在开发阶段发现潜在错误 | 存储过程开发、代码质量检查、调试优化
20+
| xref:master/5.7.adoc[pgroonga] | 4.0.4 | 提供​非英语语言全文搜索功能,满足高性能应用的需求 | 中日韩等语言的全文搜索功能
2021
|====
2122

2223
这些插件均经过 IvorySQL 团队的测试和适配,确保在 IvorySQL 环境下稳定运行。用户可以根据业务需求选择合适的插件,进一步提升数据库系统的能力和灵活性。
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
2+
:sectnums:
3+
:sectnumlevels: 5
4+
5+
= PGroonga
6+
7+
== 概述
8+
PostgreSQL 内置了全文搜索功能,但在处理​​大规模数据​​、​​复杂查询​​以及​​非英语语言(特别是中日韩等 CJK 语言)​​ 时,其功能和性能可能无法满足高性能应用的需求。
9+
10+
PGroonga 应运而生,它是一个 PostgreSQL 的扩展插件,将 ​​Groonga​​ 这款高性能的全功能全文搜索引擎与 PostgreSQL 数据库深度融合。Groonga 本身是一个优秀的开源搜索引擎,以其极致的速度和丰富的功能著称,尤其擅长处理多语言文本。PGroonga 的使命就是将 Groonga 的强大能力无缝地带入 PostgreSQL 的世界,为用户提供远超原生全文搜索的体验。
11+
12+
== 安装
13+
[NOTE]
14+
IvorySQL的安装包里已经集成了PGroonga插件,如果使用安装包安装的IvorySQL,通常不需要再手动安装PGroonga,直接跳过安装步骤即可。
15+
16+
用户可从 https://pgroonga.github.io/install[PGroonga package安装] 页面选择适合自己的方式进行PGroonga安装。
17+
18+
IvorySQL社区提供了源码安装步骤,下面以PGroonga v4.0.4为例进行演示。
19+
20+
=== 安装依赖
21+
22+
环境
23+
```
24+
操作系统:Ubuntu 24.04
25+
CPU架构:x86_64
26+
IvorySQL: v5.0
27+
```
28+
29+
==== 安装 msgpack-c
30+
31+
编译PGroonga,有个配置选项:HAVE_MSGPACK=1,它是用于支持WAL,使用这个选项需要安装msgpack-c 1.4.1或者更高版本。
32+
33+
```
34+
sudo apt install libmsgpack-dev
35+
```
36+
==== 安装 Groonga
37+
38+
确保Groonga >= 14.0.0
39+
40+
```
41+
sudo apt install groonga libgroonga-dev
42+
```
43+
验证Groonga安装成功
44+
```bash
45+
highgo@ubuntu:~/work/IvorySQL/inst$ groonga --version
46+
Groonga 15.1.7 [Linux,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,message-pack,mruby,onigmo,zlib,lz4,zstandard,epoll,apache-arrow,xxhash,blosc,h3,simdjson,llama.cpp]
47+
```
48+
49+
50+
=== 编译安装PGroonga
51+
52+
==== 下载解压源码
53+
54+
```bash
55+
wget https://packages.groonga.org/source/pgroonga/pgroonga-4.0.4.tar.gz
56+
tar xvf pgroonga-4.0.4.tar.gz
57+
cd pgroonga-4.0.4
58+
```
59+
==== 编译
60+
运行make前确保`pg_config`命令的路径在`PATH`环境变量里,例如IvorySQL安装的路径是`~/work/IvorySQL/inst`,则环境变量设置如下:
61+
62+
```bash
63+
export PGHOME=~/work/IvorySQL/inst
64+
export PGDATA=$PGHOME/data
65+
export PATH=$PGHOME/bin:$PATH
66+
```
67+
然后执行以下命令进行编译和安装:
68+
```bash
69+
make HAVE_MSGPACK=1
70+
make install
71+
```
72+
73+
== 创建Extension并确认PGroonga版本
74+
75+
76+
psql 连接到数据库的pg模式下,执行命令:
77+
```sql
78+
postgres=# CREATE extension pgroonga;
79+
CREATE EXTENSION
80+
postgres=# SELECT * FROM pg_available_extensions WHERE name = 'pgroonga';
81+
name | default_version | installed_version | comment
82+
----------+-----------------+-------------------+--------------------------------------------------------------------------------
83+
pgroonga | 4.0.4 | 4.0.4 | Super fast and all languages supported full text search index based on Groonga
84+
(1 row)
85+
86+
postgres=# select version();
87+
version
88+
--------------------------------------------------------------------------------
89+
PostgreSQL (IvorySQL 5.0) 18.0 on x86_64-linux, compiled by gcc-13.3.0, 64-bit
90+
(1 row)
91+
```
92+
93+
== 使用
94+
关于PGroonga的使用,请参阅 https://pgroonga.github.io/tutorial[PGroonga官方文档]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
:sectnums:
2+
:sectnumlevels: 5
3+
4+
:imagesdir: ./_images
5+
6+
= sys_guid() 函数
7+
8+
== 目的
9+
10+
IvorySQL的sys_guid() 是一个强大的随机数产生函数,它产生并返回一个由16个字节组成的数据库级别唯一的标识符(原始值)。
11+
12+
== 实现说明
13+
14+
IvorySQL的sys_guid()函数通过修改插件uuid-ossp的代码实现。为了充分利用uuid的多种基础库,采用如下逻辑:
15+
16+
1. 如果系统有uuid-ossp,就使用uuid_make();
17+
2. 如果系统有uuid-e2fs,就使用 uuid_generate_random();
18+
3. 否则就调用 arc4random();
19+
20+
同时修改代码使得IvorySQL能够自动载入uuid-ossp插件。
21+
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
:sectnums:
2+
:sectnumlevels: 5
3+
4+
:imagesdir: ./_images
5+
6+
= 空字符串转NULL功能
7+
8+
== 目的
9+
10+
在Oracle数据库中,空字符串('')被视为NULL值,这是Oracle的一个重要特性。为了兼容Oracle的这一行为,IvorySQL提供了空字符串转NULL功能。当启用该功能后,SQL语句中的空字符串将自动转换为NULL值,从而保证Oracle应用程序在IvorySQL上的行为一致性。
11+
12+
== 实现说明
13+
14+
参数 `ivorysql.enable_emptystring_to_NULL` 对应的GUC变量为 `enable_emptystring_to_NULL`。
15+
16+
在文件 `ora_scan.l` 中可以看到对这个变量的使用:
17+
18+
[source,c]
19+
----
20+
case xe:
21+
yylval->str = litbufdup(yyscanner);
22+
if (strcmp(yylval->str, "") == 0 &&
23+
ORA_PARSER == compatible_db &&
24+
enable_emptystring_to_NULL)
25+
{
26+
return NULL_P;
27+
}
28+
return SCONST;
29+
----
30+
31+
其中 `xe` 代表被引号包围的字符串:
32+
33+
----
34+
<xe> extended quoted strings (support backslash escape sequences)
35+
----
36+
37+
上面代码的逻辑是,在词法分析时如果遇到空字符串,在空转NULL功能启用的情况下,返回 `NULL_P`,否则返回 `SCONST`。
38+
39+
在语法分析文件 `ora_gram.y` 里,对语句 `insert into abc values('');` 是这样解析的:
40+
41+
[source,c]
42+
----
43+
values_clause:
44+
VALUES '(' expr_list ')'
45+
{
46+
SelectStmt *n = makeNode(SelectStmt);
47+
48+
n->valuesLists = list_make1($3);
49+
$$ = (Node *) n;
50+
}
51+
52+
expr_list: a_expr
53+
{
54+
$$ = list_make1($1);
55+
}
56+
57+
a_expr: c_expr { $$ = $1; }
58+
59+
c_expr: AexprConst { $$ = $1; }
60+
61+
AexprConst: Iconst
62+
| Sconst
63+
{
64+
$$ = makeStringConst($1, @1);
65+
}
66+
| NULL_P
67+
{
68+
$$ = makeNullAConst(@1);
69+
}
70+
----
71+
72+
以上代码对词法分析时返回的 `NULL_P` 或者 `SCONST` 分别构建对应的节点进行处理。
73+

CN/modules/ROOT/pages/master/6.4.1.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
= **功能概述**
77

8-
IvorySQL提供兼容Oracle内置函数`SYS_CONTEXT('namespace', 'parameter' [, length ])`,
8+
IvorySQL提供兼容Oracle内置函数 ```SYS_CONTEXT('namespace', 'parameter' [, length ])``` ,
99
返回当前时刻与给定上下文关联参数的值,可以在SQL和PLSQL语言中使用。
1010

1111
提供以下命名空间:
@@ -16,8 +16,8 @@ IvorySQL提供兼容Oracle内置函数`SYS_CONTEXT('namespace', 'parameter' [, l
1616

1717
== 实现原理
1818

19-
SYS_CONTEXT的实现原理是通过动态查询系统表与postgres的内置函数,确保结果的实时性,
20-
使用 SECURITY INVOKER 确保函数以调用者的权限执行,避免权限提升问题。
19+
`SYS_CONTEXT` 的实现原理是通过动态查询系统表与postgres的内置函数,确保结果的实时性,
20+
使用 `SECURITY INVOKER` 确保函数以调用者的权限执行,避免权限提升问题。
2121
该方法的实现逻辑如下:
2222
```sql
2323
CREATE OR REPLACE FUNCTION sys.sys_context(a varchar2, b varchar2)

CN/modules/ROOT/pages/master/6.4.2.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
= **功能概述**
77

8-
IvorySQL提供兼容Oracle内置函数`USERENV('parameter')`,用于返回当前会话的相关信息。
9-
这是一个遗留函数,建议使用 SYS_CONTEXT 函数及其内置的 USERENV 命名空间来获取当前功能。
8+
IvorySQL提供兼容Oracle内置函数 ```USERENV('parameter')``` ,用于返回当前会话的相关信息。
9+
这是一个遗留函数,建议使用 `SYS_CONTEXT` 函数及其内置的 `USERENV` 命名空间来获取当前功能。
1010

1111
== 实现原理
1212

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
:sectnums:
2+
:sectnumlevels: 5
3+
4+
:imagesdir: ./_images
5+
6+
= sys_guid() 函数
7+
8+
== 目的
9+
10+
IvorySQL的sys_guid() 是一个强大的随机数产生函数,它产生并返回一个由16个字节组成的数据库级别唯一的标识符(原始值)。
11+
12+
== 使用示例
13+
14+
```
15+
ivorysql=# select sys_guid() from dual;
16+
sys_guid
17+
------------------------------------
18+
\x3ed9426c8a093442a38bea09a74f44a1
19+
(1 row)
20+
```
21+
22+
== sys_guid函数在建表时可以作为主键
23+
24+
```
25+
create table student
26+
(
27+
student_id raw(16) default sys_guid() primary key,
28+
student_name varchar2(100) not null
29+
);
30+
```
31+
32+
== 新增数据时自动填充主键
33+
34+
```
35+
insert into student(student_name) values ('Steven');
36+
```
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
:sectnums:
2+
:sectnumlevels: 5
3+
4+
:imagesdir: ./_images
5+
6+
= 兼容Oracle 空字符串转NULL
7+
8+
== 目的
9+
10+
- 在 IvorySQL 的 Oracle 兼容模式下,支持将空字符串转换成NULL进行存储,提供与Oracle数据库一致的行为。
11+
12+
== 功能说明
13+
14+
- Oracle兼容模式下支持将空字符串转换成NULL进行存储。
15+
- 通过参数 `ivorysql.enable_emptystring_to_null` 控制该特性,默认值为 `on`。
16+
- 当该参数开启时,插入空字符串会自动转换为NULL值存储。
17+
- 可以通过 `IS NULL` 条件查询到转换后的NULL值。
18+
19+
== 测试用例
20+
21+
[literal]
22+
----
23+
-- 创建测试表
24+
ivorysql=# create table abc (id int);
25+
CREATE TABLE
26+
27+
-- 查看空字符串转NULL参数状态
28+
ivorysql=# show ivorysql.enable_emptystring_to_null;
29+
ivorysql.enable_emptystring_to_NULL
30+
-------------------------------------
31+
on
32+
(1 row)
33+
34+
-- 插入空字符串
35+
ivorysql=# insert into abc values('');
36+
INSERT 0 1
37+
38+
-- 查询表数据,显示为NULL
39+
ivorysql=# select * from abc;
40+
id
41+
\----
42+
43+
(1 row)
44+
45+
-- 使用IS NULL条件查询
46+
ivorysql=# select * from abc where id is null;
47+
id
48+
\----
49+
50+
(1 row)
51+
----

EN/modules/ROOT/nav.adoc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
** xref:master/5.4.adoc[pg_cron]
1919
** xref:master/5.5.adoc[pgsql-http]
2020
** xref:master/5.6.adoc[plpgsql_check]
21-
** xref:master/5.8.adoc[PgAudit]
21+
** xref:master/5.7.adoc[pgroonga]
22+
** xref:master/5.8.adoc[pgaudit]
2223
* IvorySQL Architecture Design
2324
** Query Processing
2425
*** xref:master/6.1.1.adoc[Dual Parser]
@@ -34,7 +35,8 @@
3435
*** xref:master/6.3.7.adoc[Nested Subfunctions]
3536
*** xref:master/6.3.8.adoc[Force View]
3637
*** xref:master/6.3.9.adoc[Case Conversion]
37-
** xref:master/6.4.adoc[GB18030 Character Set]
38+
*** xref:master/6.3.10.adoc[sys_guid Function]
39+
*** xref:master/6.3.11.adoc[Empty String to NULL]
3840
** Built-in Functions
3941
*** xref:master/6.4.1.adoc[sys_context]
4042
*** xref:master/6.4.2.adoc[userenv]
@@ -59,6 +61,8 @@
5961
** xref:master/7.17.adoc[17、NLS Parameters]
6062
** xref:master/7.18.adoc[18、Force View]
6163
** xref:master/7.19.adoc[19、Nested Subfunctions]
64+
** xref:master/7.20.adoc[20、sys_guid Function]
65+
** xref:master/7.21.adoc[21、Empty String to NULL]
6266
* xref:master/8.adoc[Community contribution]
6367
* xref:master/9.adoc[Tool Reference]
6468
* xref:master/10.adoc[FAQ]

0 commit comments

Comments
 (0)