1.6 使用 NdbInterpretedCode

接下来的几节提供了有关使用 NdbInterpretedCode方法执行不同类型操作的信息,包括资源使用情况。

将值加载到寄存器中的 NdbInterpretedCode 方法

本节中描述的方法用于将常量值加载到NdbInterpretedCode 程序寄存器中。下表显示了每种方法所需的空间:

表 1.1 NdbInterpretedCode 方法用于将常量值加载到 NdbInterpretedCode 程序寄存器中,具有所需的缓冲区和请求消息空间。

方法 缓冲区(字) 请求消息(字)
load_const_null() 1个 1个
load_const_u16() 1个 1个
load_const_u32() 2个 2个
load_const_u64() 3个 3个

用于在寄存器和表列之间复制值的 NdbInterpretedCode 方法

NdbInterpretedCode提供了两种在当前表行中的列和程序寄存器之间复制值的方法。该read_attr() 方法用于将表列值复制到程序寄存器中;write_attr()用于将值从程序寄存器复制到表列中。这两种方法都要求在创建 NdbInterpretedCode调用它们的对象时指定正在操作的表。

下表显示了每种方法所需的空间:

表 1.2 NdbInterpretedCode 方法用于在寄存器和表列之间复制值,具有所需的缓冲区和请求消息空间。

方法 缓冲区(字) 请求消息(字)
read_attr() 1个 1个
write_attr() 1个 1个

有关详细信息,请参阅 NdbInterpretedCode::read_attr()NdbInterpretedCode::write_attr()

NdbInterpretedCode 注册算术方法

NdbInterpretedCode提供了两种对寄存器执行算术运算的方法。使用 add_reg(),您可以将两个寄存器的总和加载到另一个寄存器中; sub_reg()允许您将两个寄存器的差异加载到另一个寄存器中。

下表显示了每种方法所需的空间:

表 1.3 用于对寄存器执行算术运算的 NdbInterpretedCode 方法,具有所需的缓冲区和请求消息空间。

方法 缓冲区(字) 请求消息(字)
add_reg() 1个 1个
sub_reg() 1个 1个

有关更多信息,请参阅 NdbInterpretedCode::add_reg()NdbInterpretedCode::sub_reg()

NdbInterpretedCode:标签和分支

该类NdbInterpretedCode允许您在解释程序中定义标签,并提供多种方法,用于根据以下任何类型的条件执行跳转至这些标签:

  • 两个寄存器值的比较

  • 列值与给定常量之间的比较

  • 列值是否匹配给定模式

要定义标签,请使用 def_label() 方法。

要执行无条件跳转到标签,请使用该 branch_label() 方法。

要根据寄存器值的比较执行到给定标签的跳转,请使用其中一种 方法(、 、 、 、 、 、 或 )。请参阅 基于寄存器的 NdbInterpretedCode 分支操作branch_*()branch_ge()branch_gt()branch_le()branch_lt()branch_eq()branch_ne()branch_ne_null()branch_eq_null()

要根据表列值的比较执行到给定标签的跳转,请使用其中一种 方法(、 、 、 、 、 、 或 )。请参阅 基于列的 NdbInterpretedCode 分支操作branch_col_*()branch_col_ge()branch_col_gt()branch_col_le()branch_col_lt()branch_col_eq()branch_col_ne()branch_col_ne_null()branch_col_eq_null()

要基于表列值的模式匹配执行跳转,请使用方法之一 branch_col_like()branch_col_notlike()。请参阅 基于模式的 NdbInterpretedCode 分支操作

基于寄存器的 NdbInterpretedCode 分支操作

其中大部分用于根据寄存器到寄存器比较的结果进行分支。还有两种方法用于将寄存器值与 进行比较NULL。所有这些方法都需要使用该方法定义的标签作为参数 def_label()

这些方法可以被认为是执行以下逻辑:

if(register_value1 condition register_value2)
  goto Label

下表显示了每种方法所需的空间:

表 1.4 基于寄存器的 NdbInterpretedCode 分支方法,具有所需的缓冲区和请求消息空间。

方法 缓冲区(字) 请求消息(字)
branch_ge() 1个 1个
branch_gt() 1个 1个
branch_le() 1个 1个
branch_lt() 1个 1个
branch_eq() 1个 1个
branch_ne() 1个 1个
branch_ne_null() 1个 1个
branch_eq_null() 1个 1个

基于列的 NdbInterpretedCode 分支操作

本节中描述的方法用于根据表列值与给定常量值之间的比较来执行分支。这些方法中的每一个都需要要测试其值的列的属性 ID,而不是对Column 对象的引用。

这些方法,除了 branch_col_eq_null()and 之外branch_col_ne_null(),可以被认为是执行以下逻辑:

if(constant_value condition column_value)
  goto Label

在每种情况下(再次除外 branch_col_eq_null()branch_col_ne_null()),任意常量是传递给方法的第一个参数。

下表显示了每种方法的空间要求,其中L表示常量值的长度:

表 1.5 基于列的 NdbInterpretedCode 分支方法,具有所需的缓冲区和请求消息空间。

方法 缓冲区(字) 请求消息(字)
branch_col_eq_null() 2个 2个
branch_col_ne_null() 2个 2个
branch_col_eq() 2个 2 +CEIL(L / 8)
branch_col_ne() 2个 2 +CEIL(L / 8)
branch_col_lt() 2个 2 +CEIL(L / 8)
branch_col_le() 2个 2 +CEIL(L / 8)
branch_col_gt() 2个 2 +CEIL(L / 8)
branch_col_ge() 2个 2 +CEIL(L / 8)

笔记

该表达式是保存要比较的常量值所需的完整 8 字节字数。 CEIL(L / 8)

基于模式的 NdbInterpretedCode 分支操作

该类NdbInterpretedCode提供了两种方法,可用于根据包含字符数据的列(即 、 、 或列)与正则表达式模式之间的CHAR比较 VARCHAR进行 BINARY分支 VARBINARY

LIKE正则表达式支持的模式语法与 MySQL 服务器的和运算符 支持的模式语法相同 NOT LIKE ,包括_%元字符。有关这些的更多信息,请参阅字符串比较函数和运算符

笔记

这与 支持的正则表达式模式语法相同NdbScanFilter;有关详细信息,请参阅NdbScanFilter::cmp()

NdbInterpretedCode实例化对象 时必须提供正在操作的表 。正则表达式模式应采用纯 CHAR格式,即使该列实际上是 a VARCHAR(换句话说,不应有前导长度字节)。

这些函数的行为如下所示:

if (column_value [NOT] LIKE pattern)
  goto Label;

这些方法的空间要求如下表所示,其中L表示常量值的长度:

表 1.6 基于模式的 NdbInterpretedCode 分支方法,具有所需的缓冲区和请求消息空间。

方法 缓冲区(字) 请求消息(字)
branch_col_like() 2个 2 +CEIL(L / 8)
branch_col_notlike() 2个 2 +CEIL(L / 8)

笔记

该表达式 是保存要比较的常量值所需的完整 8 字节字数。 CEIL(L / 8)

NdbInterpretedCode 按位比较操作

这些指令用于根据列值和位掩码模式 AND之间的逻辑比较 结果进行分支。BIT

使用这些方法需要在 NdbInterpretedCode构造对象时提供正在操作的表。掩码值应与被比较的位列大小相同。BIT值作为 32 位字传入和传出 NDB API,位设置为从最低有效位到最高有效位。执行指令的平台的字节顺序控制哪个字节包含最低有效位。在 x86 上,这是第一个字节(字节 0);在 SPARC 和 PPC 上,它是最后一个字节。

此处列出的每种方法的缓冲区长度和请求长度均需要等于 2 个字加上列宽四舍五入(向上)到最接近的整个字的空间量:

NdbInterpretedCode 结果处理方法

本节中描述的方法用于告诉解释器当前行的处理已完成,并且(在扫描的情况下)是否将此行包含在扫描结果中。

这些方法的空间要求如下表所示,其中L表示常量值的长度:

表 1.7 NdbInterpretedCode 结果处理方法,具有所需的缓冲区和请求消息空间。

方法 缓冲区(字) 请求消息(字)
interpret_exit_ok() 1个 1个
interpret_exit_nok() 1个 1个
interpret_exit_last_row() 1个 1个

NdbInterpretedCode 便捷方法

本节中描述的方法可用于将多条指令(使用特定寄存器)插入解释程序。

重要的

除了更新表列之外,这些方法还使用解释器寄存器 6 和 7,将寄存器 6 的任何现有内容替换为原始列值,将寄存器 7 的任何现有内容替换为修改后的列值。NdbInterpretedCode在实例化为其调用该方法 的对象时,必须预先定义表本身 。

这些方法的空间要求如下表所示,其中L表示常量值的长度:

表 1.8 NdbInterpretedCode 便利方法,具有所需的缓冲区和请求消息空间。

方法 缓冲区(字) 请求消息(字)
add_val() 4个 1; 如果提供的值 >= 2 16 : 2; 如果 >= 2 32 : 3
sub_val() 4个 1; 如果提供的值 >= 2 16 : 2; 如果 >= 2 32 : 3

使用带有 NdbInterpretedCode 的子程序

NdbInterpretedCode支持可以从解释程序中调用的子程序,每个子程序都由一个唯一的数字标识。只能在所有主程序指令之后定义子程序。

重要的

用于标识子程序的编号必须是连续的;但是,它们不必按任何特定顺序排列。

  • 子程序的开始是通过调用该 def_sub() 方法来指示的;

  • ret_sub() 终止子程序;调用之后的所有指令都 def_sub() 属于子例程,直到使用此方法终止为止。

  • 使用该 call_sub() 方法调用子例程。

一旦子例程完成,程序将继续执行紧跟在调用子例程的指令之后的指令。子程序也可以被其他子程序调用;当前,最大子程序堆栈深度为 32。

NdbInterpretedCode 实用方法

NdbInterpretedCode此处列出了 由提供的一些其他实用方法 :