Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
256 changes: 129 additions & 127 deletions CN/modules/ROOT/nav.adoc
Original file line number Diff line number Diff line change
@@ -1,127 +1,129 @@
* xref:master/about_ivorysql.adoc[关于IvorySQL]
** xref:master/welcome.adoc[欢迎]
** xref:master/release_notes.adoc[发行说明]
* 快速上手
** xref:master/getting-started/quick_start.adoc[快速开始]
* 安装部署
** xref:master/installation_guide.adoc[安装指南]
** xref:master/cluster_setup.adoc[集群搭建]
* Oracle兼容功能
** xref:master/oracle_compatibility/compat_case_conversion.adoc[1、大小写转换]
** xref:master/oracle_compatibility/compat_like_operator.adoc[2、LIKE操作符]
** xref:master/oracle_compatibility/anonymous_block.adoc[3、匿名块]
** xref:master/oracle_compatibility/compat_function_procedure.adoc[4、函数与存储过程]
** xref:master/oracle_compatibility/builtin_types_functions.adoc[5、内置数据类型与内置函数]
** xref:master/oracle_compatibility/port_ip.adoc[6、端口与IP]
** xref:master/oracle_compatibility/xml_functions.adoc[7、XML函数]
** xref:master/oracle_compatibility/sequence.adoc[8、sequence]
** xref:master/oracle_compatibility/package.adoc[9、包]
** xref:master/oracle_compatibility/invisible_column.adoc[10、不可见列]
** xref:master/oracle_compatibility/compat_rowid.adoc[11、RowID]
** xref:master/oracle_compatibility/compat_out_parameter.adoc[12、OUT 参数]
** xref:master/oracle_compatibility/compat_type_rowtype.adoc[13、%TYPE、%ROWTYPE]
** xref:master/oracle_compatibility/compat_nls_parameter.adoc[14、NLS 参数]
** xref:master/oracle_compatibility/compat_force_view.adoc[15、Force View]
** xref:master/oracle_compatibility/compat_nested_function.adoc[16、嵌套子函数]
** xref:master/oracle_compatibility/compat_sys_guid.adoc[17、sys_guid 函数]
** xref:master/oracle_compatibility/compat_empty_string_to_null.adoc[18、空字符串转null]
** xref:master/oracle_compatibility/compat_call_into.adoc[19、CALL INTO]
** xref:master/oracle_compatibility/compat_read_only_view.adoc[20、视图只读]
** xref:master/oracle_compatibility/with_function_procedure.adoc[21、WITH FUNCTION/PROCEDURE]
** xref:master/oracle_compatibility/compat_create_index_online.adoc[22、索引 ONLINE 参数]
** xref:master/oracle_compatibility/compat_stragg.adoc[23、STRAGG 函数]
** xref:master/oracle_compatibility/compat_alter_index_unusable.adoc[24、禁用索引]
** xref:master/oracle_compatibility/compat_dbtimezone.adoc[25、dbtimezone]
* 容器化与云服务
** 容器化指南
*** xref:master/containerization/k8s_deployment.adoc[K8S部署]
*** xref:master/containerization/operator_deployment.adoc[Operator部署]
*** xref:master/containerization/docker_podman_deployment.adoc[Docker & Podman部署]
*** xref:master/containerization/docker_swarm_compose_deployment.adoc[Docker Swarm & Docker Compose部署]
** 云服务平台指南
*** xref:master/cloud_platform/ivorysql_cloud_installation.adoc[IvorySQL Cloud安装]
*** xref:master/cloud_platform/ivorysql_cloud_usage.adoc[IvorySQL Cloud使用]
* IvorySQL生态
** xref:master/cpu_os_adaptation/cpu_architecture_adaptation.adoc[芯片架构适配]
** xref:master/cpu_os_adaptation/os_architecture_adaptation.adoc[操作系统适配]
** 生态组件适配
*** xref:master/ecosystem_components/ecosystem_overview.adoc[概述]
*** xref:master/ecosystem_components/postgis.adoc[postgis]
*** xref:master/ecosystem_components/pgvector.adoc[pgvector]
*** xref:master/ecosystem_components/pgddl.adoc[pgddl(DDL Extractor)]
*** xref:master/ecosystem_components/pg_cron.adoc[pg_cron]
*** xref:master/ecosystem_components/pgsql_http.adoc[pgsql-http]
*** xref:master/ecosystem_components/plpgsql_check.adoc[plpgsql_check]
*** xref:master/ecosystem_components/pgroonga.adoc[pgroonga]
*** xref:master/ecosystem_components/pgaudit.adoc[pgaudit]
*** xref:master/ecosystem_components/pgrouting.adoc[pgrouting]
*** xref:master/ecosystem_components/system_stats.adoc[system_stats]
*** xref:master/ecosystem_components/wal2json.adoc[wal2json]
*** xref:master/ecosystem_components/pg_stat_monitor.adoc[pg_stat_monitor]
*** xref:master/ecosystem_components/pg_ai_query.adoc[pg_ai_query]
*** xref:master/ecosystem_components/pg_partman.adoc[pg_partman]
*** xref:master/ecosystem_components/pgbouncer.adoc[pgbouncer]
*** xref:master/ecosystem_components/age.adoc[age]
*** xref:master/ecosystem_components/pg_curl.adoc[pg_curl]
*** xref:master/ecosystem_components/pg_textsearch.adoc[pg_textsearch]
*** xref:master/ecosystem_components/pg_hint_plan.adoc[pg_hint_plan]
*** xref:master/ecosystem_components/redis_fdw.adoc[redis_fdw]
*** xref:master/ecosystem_components/pg_show_plans.adoc[pg_show_plans]
*** xref:master/ecosystem_components/pg_bulkload.adoc[pg_bulkload]
*** xref:master/ecosystem_components/pg_bigm.adoc[pg_bigm]
*** xref:master/ecosystem_components/pg_profile.adoc[pg_profile]
*** xref:master/ecosystem_components/pg_repack.adoc[pg_repack]
*** xref:master/ecosystem_components/pgdog.adoc[PgDog]
*** xref:master/ecosystem_components/pg_readonly.adoc[pg_readonly]
*** xref:master/ecosystem_components/zhparser.adoc[zhparser]
*** xref:master/ecosystem_components/pgbackrest.adoc[pgBackRest]
*** xref:master/ecosystem_components/set_user.adoc[set_user]
* 监控运维
** xref:master/getting-started/daily_monitoring.adoc[日常监控]
** xref:master/getting-started/daily_maintenance.adoc[日常维护]
** xref:master/operation_guide.adoc[运维管理指南]
* 数据迁移
** xref:master/migration_guide.adoc[迁移指南]
* IvorySQL开发者
** xref:master/contribution/contribution_guide.adoc[贡献指南]
** xref:master/developer_guide.adoc[开发者指南]
** IvorySQL架构设计
*** 查询处理
**** xref:master/architecture/dual_parser.adoc[双parser]
*** 兼容框架
**** xref:master/architecture/framework_design.adoc[框架设计]
**** xref:master/architecture/guc_framework.adoc[GUC框架]
**** xref:master/architecture/dual_mode_design.adoc[双模式设计]
**** xref:master/architecture/initdb_process.adoc[initdb过程]
*** 兼容特性
**** xref:master/compatibility_features_design/like_operator.adoc[like]
**** xref:master/compatibility_features_design/rowid.adoc[RowID]
**** xref:master/compatibility_features_design/out_parameter.adoc[OUT 参数]
**** xref:master/compatibility_features_design/type_rowtype.adoc[%TYPE、%ROWTYPE]
**** xref:master/compatibility_features_design/nls_parameter.adoc[NLS 参数]
**** xref:master/compatibility_features_design/function_procedure.adoc[函数与存储过程]
**** xref:master/compatibility_features_design/nested_function.adoc[嵌套子函数]
**** xref:master/compatibility_features_design/force_view.adoc[Force View]
**** xref:master/compatibility_features_design/case_conversion.adoc[大小写转换]
**** xref:master/compatibility_features_design/sys_guid_function.adoc[sys_guid 函数]
**** xref:master/compatibility_features_design/empty_string_to_null.adoc[空字符串转null]
**** xref:master/compatibility_features_design/call_into.adoc[CALL INTO]
**** xref:master/compatibility_features_design/read_only_view.adoc[视图只读]
**** xref:master/compatibility_features_design/with_function_procedure_impl.adoc[WITH FUNCTION/PROCEDURE]
**** xref:master/compatibility_features_design/create_index_online.adoc[索引 ONLINE 参数]
**** xref:master/compatibility_features_design/alter_index_unusable_impl.adoc[禁用索引]
*** 内置函数
**** xref:master/oracle_builtin_functions/sys_context.adoc[sys_context]
**** xref:master/oracle_builtin_functions/userenv.adoc[userenv]
**** xref:master/oracle_builtin_functions/rawtohex.adoc[rawtohex]
**** xref:master/oracle_builtin_functions/stragg.adoc[stragg]
**** xref:master/oracle_builtin_functions/dbtimezone_impl.adoc[dbtimezone]
*** xref:master/gb18030.adoc[国标GB18030]
* 参考指南
** xref:master/tools_reference.adoc[工具参考]
** xref:master/contribution/asciidoc_syntax_reference.adoc[asciidoc语法快速参考]
** xref:master/pg_reference/pg_parameters_reference.adoc[PG参数参考手册]
** xref:master/pg_reference/pg_functions_reference.adoc[PG函数参考手册]
* 常见问题解答
** xref:master/contribution/faq.adoc[FAQ]

* xref:master/about_ivorysql.adoc[关于IvorySQL]
** xref:master/welcome.adoc[欢迎]
** xref:master/release_notes.adoc[发行说明]
* 快速上手
** xref:master/getting-started/quick_start.adoc[快速开始]
* 安装部署
** xref:master/installation_guide.adoc[安装指南]
** xref:master/cluster_setup.adoc[集群搭建]
* Oracle兼容功能
** xref:master/oracle_compatibility/compat_case_conversion.adoc[1、大小写转换]
** xref:master/oracle_compatibility/compat_like_operator.adoc[2、LIKE操作符]
** xref:master/oracle_compatibility/anonymous_block.adoc[3、匿名块]
** xref:master/oracle_compatibility/compat_function_procedure.adoc[4、函数与存储过程]
** xref:master/oracle_compatibility/builtin_types_functions.adoc[5、内置数据类型与内置函数]
** xref:master/oracle_compatibility/port_ip.adoc[6、端口与IP]
** xref:master/oracle_compatibility/xml_functions.adoc[7、XML函数]
** xref:master/oracle_compatibility/sequence.adoc[8、sequence]
** xref:master/oracle_compatibility/package.adoc[9、包]
** xref:master/oracle_compatibility/invisible_column.adoc[10、不可见列]
** xref:master/oracle_compatibility/compat_rowid.adoc[11、RowID]
** xref:master/oracle_compatibility/compat_out_parameter.adoc[12、OUT 参数]
** xref:master/oracle_compatibility/compat_type_rowtype.adoc[13、%TYPE、%ROWTYPE]
** xref:master/oracle_compatibility/compat_nls_parameter.adoc[14、NLS 参数]
** xref:master/oracle_compatibility/compat_force_view.adoc[15、Force View]
** xref:master/oracle_compatibility/compat_nested_function.adoc[16、嵌套子函数]
** xref:master/oracle_compatibility/compat_sys_guid.adoc[17、sys_guid 函数]
** xref:master/oracle_compatibility/compat_empty_string_to_null.adoc[18、空字符串转null]
** xref:master/oracle_compatibility/compat_call_into.adoc[19、CALL INTO]
** xref:master/oracle_compatibility/compat_read_only_view.adoc[20、视图只读]
** xref:master/oracle_compatibility/with_function_procedure.adoc[21、WITH FUNCTION/PROCEDURE]
** xref:master/oracle_compatibility/compat_create_index_online.adoc[22、索引 ONLINE 参数]
** xref:master/oracle_compatibility/compat_stragg.adoc[23、STRAGG 函数]
** xref:master/oracle_compatibility/compat_alter_index_unusable.adoc[24、禁用索引]
** xref:master/oracle_compatibility/compat_dbtimezone.adoc[25、dbtimezone]
** xref:master/oracle_compatibility/compat_lnnvl.adoc[26、LNNVL 函数]
* 容器化与云服务
** 容器化指南
*** xref:master/containerization/k8s_deployment.adoc[K8S部署]
*** xref:master/containerization/operator_deployment.adoc[Operator部署]
*** xref:master/containerization/docker_podman_deployment.adoc[Docker & Podman部署]
*** xref:master/containerization/docker_swarm_compose_deployment.adoc[Docker Swarm & Docker Compose部署]
** 云服务平台指南
*** xref:master/cloud_platform/ivorysql_cloud_installation.adoc[IvorySQL Cloud安装]
*** xref:master/cloud_platform/ivorysql_cloud_usage.adoc[IvorySQL Cloud使用]
* IvorySQL生态
** xref:master/cpu_os_adaptation/cpu_architecture_adaptation.adoc[芯片架构适配]
** xref:master/cpu_os_adaptation/os_architecture_adaptation.adoc[操作系统适配]
** 生态组件适配
*** xref:master/ecosystem_components/ecosystem_overview.adoc[概述]
*** xref:master/ecosystem_components/postgis.adoc[postgis]
*** xref:master/ecosystem_components/pgvector.adoc[pgvector]
*** xref:master/ecosystem_components/pgddl.adoc[pgddl(DDL Extractor)]
*** xref:master/ecosystem_components/pg_cron.adoc[pg_cron]
*** xref:master/ecosystem_components/pgsql_http.adoc[pgsql-http]
*** xref:master/ecosystem_components/plpgsql_check.adoc[plpgsql_check]
*** xref:master/ecosystem_components/pgroonga.adoc[pgroonga]
*** xref:master/ecosystem_components/pgaudit.adoc[pgaudit]
*** xref:master/ecosystem_components/pgrouting.adoc[pgrouting]
*** xref:master/ecosystem_components/system_stats.adoc[system_stats]
*** xref:master/ecosystem_components/wal2json.adoc[wal2json]
*** xref:master/ecosystem_components/pg_stat_monitor.adoc[pg_stat_monitor]
*** xref:master/ecosystem_components/pg_ai_query.adoc[pg_ai_query]
*** xref:master/ecosystem_components/pg_partman.adoc[pg_partman]
*** xref:master/ecosystem_components/pgbouncer.adoc[pgbouncer]
*** xref:master/ecosystem_components/age.adoc[age]
*** xref:master/ecosystem_components/pg_curl.adoc[pg_curl]
*** xref:master/ecosystem_components/pg_textsearch.adoc[pg_textsearch]
*** xref:master/ecosystem_components/pg_hint_plan.adoc[pg_hint_plan]
*** xref:master/ecosystem_components/redis_fdw.adoc[redis_fdw]
*** xref:master/ecosystem_components/pg_show_plans.adoc[pg_show_plans]
*** xref:master/ecosystem_components/pg_bulkload.adoc[pg_bulkload]
*** xref:master/ecosystem_components/pg_bigm.adoc[pg_bigm]
*** xref:master/ecosystem_components/pg_profile.adoc[pg_profile]
*** xref:master/ecosystem_components/pg_repack.adoc[pg_repack]
*** xref:master/ecosystem_components/pgdog.adoc[PgDog]
*** xref:master/ecosystem_components/pg_readonly.adoc[pg_readonly]
*** xref:master/ecosystem_components/zhparser.adoc[zhparser]
*** xref:master/ecosystem_components/pgbackrest.adoc[pgBackRest]
*** xref:master/ecosystem_components/set_user.adoc[set_user]
* 监控运维
** xref:master/getting-started/daily_monitoring.adoc[日常监控]
** xref:master/getting-started/daily_maintenance.adoc[日常维护]
** xref:master/operation_guide.adoc[运维管理指南]
* 数据迁移
** xref:master/migration_guide.adoc[迁移指南]
* IvorySQL开发者
** xref:master/contribution/contribution_guide.adoc[贡献指南]
** xref:master/developer_guide.adoc[开发者指南]
** IvorySQL架构设计
*** 查询处理
**** xref:master/architecture/dual_parser.adoc[双parser]
*** 兼容框架
**** xref:master/architecture/framework_design.adoc[框架设计]
**** xref:master/architecture/guc_framework.adoc[GUC框架]
**** xref:master/architecture/dual_mode_design.adoc[双模式设计]
**** xref:master/architecture/initdb_process.adoc[initdb过程]
*** 兼容特性
**** xref:master/compatibility_features_design/like_operator.adoc[like]
**** xref:master/compatibility_features_design/rowid.adoc[RowID]
**** xref:master/compatibility_features_design/out_parameter.adoc[OUT 参数]
**** xref:master/compatibility_features_design/type_rowtype.adoc[%TYPE、%ROWTYPE]
**** xref:master/compatibility_features_design/nls_parameter.adoc[NLS 参数]
**** xref:master/compatibility_features_design/function_procedure.adoc[函数与存储过程]
**** xref:master/compatibility_features_design/nested_function.adoc[嵌套子函数]
**** xref:master/compatibility_features_design/force_view.adoc[Force View]
**** xref:master/compatibility_features_design/case_conversion.adoc[大小写转换]
**** xref:master/compatibility_features_design/sys_guid_function.adoc[sys_guid 函数]
**** xref:master/compatibility_features_design/empty_string_to_null.adoc[空字符串转null]
**** xref:master/compatibility_features_design/call_into.adoc[CALL INTO]
**** xref:master/compatibility_features_design/read_only_view.adoc[视图只读]
**** xref:master/compatibility_features_design/with_function_procedure_impl.adoc[WITH FUNCTION/PROCEDURE]
**** xref:master/compatibility_features_design/create_index_online.adoc[索引 ONLINE 参数]
**** xref:master/compatibility_features_design/alter_index_unusable_impl.adoc[禁用索引]
*** 内置函数
**** xref:master/oracle_builtin_functions/sys_context.adoc[sys_context]
**** xref:master/oracle_builtin_functions/userenv.adoc[userenv]
**** xref:master/oracle_builtin_functions/rawtohex.adoc[rawtohex]
**** xref:master/oracle_builtin_functions/stragg.adoc[stragg]
**** xref:master/oracle_builtin_functions/dbtimezone_impl.adoc[dbtimezone]
**** xref:master/oracle_builtin_functions/lnnvl.adoc[lnnvl]
*** xref:master/gb18030.adoc[国标GB18030]
* 参考指南
** xref:master/tools_reference.adoc[工具参考]
** xref:master/contribution/asciidoc_syntax_reference.adoc[asciidoc语法快速参考]
** xref:master/pg_reference/pg_parameters_reference.adoc[PG参数参考手册]
** xref:master/pg_reference/pg_functions_reference.adoc[PG函数参考手册]
* 常见问题解答
** xref:master/contribution/faq.adoc[FAQ]

131 changes: 131 additions & 0 deletions CN/modules/ROOT/pages/master/oracle_builtin_functions/lnnvl.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
:sectnums:
:sectnumlevels: 5

:imagesdir: ./_images

= LNNVL 函数的实现

== 目的

IvorySQL 在 `contrib/ivorysql_ora` 扩展中新增 `sys.lnnvl(boolean)` 函数,
实现与 Oracle 同名函数一致的条件取反行为:条件求值为 FALSE 或 UNKNOWN 时返回 TRUE,
求值为 TRUE 时返回 FALSE。

== 实现说明

=== 语义等价于 IS NOT TRUE

LNNVL 的真值表与 SQL 标准的 `IS NOT TRUE` 谓词逐格相同:

[cols="1,1,1"]
|===
|条件求值结果 |`LNNVL(cond)` |`cond IS NOT TRUE`

|TRUE
|FALSE
|FALSE

|FALSE
|TRUE
|TRUE

|UNKNOWN
|TRUE
|TRUE
|===

因此实现无需新增任何求值逻辑,函数体只是这一个谓词。
PostgreSQL 中 `IS NOT TRUE` 的求值位于
`src/backend/executor/execExprInterp.c` 的 `EEOP_BOOLTEST_IS_NOT_TRUE` 分支,
入参为 NULL 时直接返回 true 并清除结果的 null 标记,
因此 LNNVL 自身永不返回 NULL。

=== SQL 定义

函数定义位于
`contrib/ivorysql_ora/src/builtin_functions/builtin_functions--1.0.sql`。

[source,sql]
----
CREATE FUNCTION sys.lnnvl(pg_catalog.bool)
RETURNS pg_catalog.bool
AS $$SELECT $1 IS NOT TRUE$$
LANGUAGE sql
CALLED ON NULL INPUT
PARALLEL SAFE
IMMUTABLE;
----

各项属性的选择理由:

[cols="1,1,3"]
|===
|属性 |取值 |理由

|所在模式
|`sys`
|与其它 Oracle 兼容函数一致。`sys` 仅在 Oracle 兼容模式下进入隐式 `search_path`。

|参数类型
|`pg_catalog.bool`
|显式限定模式,避免 Oracle 模式下 `sys` 位于 `search_path` 首位时类型名解析受影响。

|语言
|`sql`
|可被 `inline_function()` 内联,见下节。C 函数不会被内联。

|NULL 处理
|`CALLED ON NULL INPUT`
|必须项,见下节。

|易变性
|`IMMUTABLE`
|纯逻辑运算,同一输入恒定输出;也是用于表达式索引等场景的前提。

|并行性
|`PARALLEL SAFE`
|无副作用。若不声明,默认为 `PARALLEL UNSAFE`,会禁用相关查询的并行计划。
|===

=== CALLED ON NULL INPUT 是必须项

`CALLED ON NULL INPUT` 是 SQL 的默认值,此处显式写出是为了防止被误改。

若声明为 `STRICT`,入参为 NULL 时函数体根本不会执行,直接返回 NULL,
而正确行为是返回 TRUE —— 恰好毁掉 LNNVL 存在的唯一理由,且不产生任何错误。
风险来自代码风格的一致性压力:`builtin_functions--1.0.sql` 中多数邻近函数均声明为
`STRICT`,按邻居样式统一即会踩中。

`STRICT` 还会连带废掉内联。声明为严格意味着承诺"NULL 进则 NULL 出",
而 `IS NOT TRUE` 本身并非严格谓词,优化器无法在保持语义的前提下将其展开,
只能保留函数调用:

[source,text]
----
-- CALLED ON NULL INPUT
Filter: (t.v IS NOT TRUE)

-- STRICT
Filter: f_strict(t.v)
----

因此误写为 `STRICT` 是双重损失:语义错误且静默,同时性能退化为逐行函数调用。

=== 函数内联

函数体是可内联的简单 SQL 表达式,优化器的 `inline_function()` 会将其折叠到调用处:

[source,sql]
----
EXPLAIN (VERBOSE, COSTS OFF) SELECT id FROM t WHERE LNNVL(v >= 0.2);
----

[source,text]
----
Seq Scan on public.t
Output: id
Filter: ((t.v >= 0.2) IS NOT TRUE)
----

计划中已不存在函数调用,与用户直接书写 `IS NOT TRUE` 的计划逐字相同,
因此不引入额外运行期开销。
Loading
Loading