接下来的几节提供了有关使用
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
提供了两种在当前表行中的列和程序寄存器之间复制值的方法。该read_attr()
方法用于将表列值复制到程序寄存器中;write_attr()
用于将值从程序寄存器复制到表列中。这两种方法都要求在创建
NdbInterpretedCode
调用它们的对象时指定正在操作的表。
下表显示了每种方法所需的空间:
表 1.2 NdbInterpretedCode 方法用于在寄存器和表列之间复制值,具有所需的缓冲区和请求消息空间。
方法 | 缓冲区(字) | 请求消息(字) |
---|---|---|
read_attr() |
1个 | 1个 |
write_attr() |
1个 | 1个 |
有关详细信息,请参阅 NdbInterpretedCode::read_attr()和 NdbInterpretedCode::write_attr()。
NdbInterpretedCode
提供了两种对寄存器执行算术运算的方法。使用
add_reg()
,您可以将两个寄存器的总和加载到另一个寄存器中;
sub_reg()
允许您将两个寄存器的差异加载到另一个寄存器中。
下表显示了每种方法所需的空间:
有关更多信息,请参阅 NdbInterpretedCode::add_reg()和 NdbInterpretedCode::sub_reg()。
该类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 分支操作。
其中大部分用于根据寄存器到寄存器比较的结果进行分支。还有两种方法用于将寄存器值与 进行比较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个 |
本节中描述的方法用于根据表列值与给定常量值之间的比较来执行分支。这些方法中的每一个都需要要测试其值的列的属性 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(
|
branch_col_ne() |
2个 | 2 +CEIL(
|
branch_col_lt() |
2个 | 2 +CEIL(
|
branch_col_le() |
2个 | 2 +CEIL(
|
branch_col_gt() |
2个 | 2 +CEIL(
|
branch_col_ge() |
2个 | 2 +CEIL(
|
该表达式是保存要比较的常量值所需的完整 8 字节字数。
CEIL(
L
/
8)
该类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(
|
branch_col_notlike() |
2个 | 2 +CEIL(
|
该表达式
是保存要比较的常量值所需的完整 8 字节字数。
CEIL(
L
/
8)
这些指令用于根据列值和位掩码模式
AND
之间的逻辑比较
结果进行分支。BIT
使用这些方法需要在
NdbInterpretedCode
构造对象时提供正在操作的表。掩码值应与被比较的位列大小相同。BIT
值作为 32 位字传入和传出 NDB API,位设置为从最低有效位到最高有效位。执行指令的平台的字节顺序控制哪个字节包含最低有效位。在 x86 上,这是第一个字节(字节 0);在 SPARC 和 PPC 上,它是最后一个字节。
此处列出的每种方法的缓冲区长度和请求长度均需要等于 2 个字加上列宽四舍五入(向上)到最接近的整个字的空间量:
本节中描述的方法用于告诉解释器当前行的处理已完成,并且(在扫描的情况下)是否将此行包含在扫描结果中。
这些方法的空间要求如下表所示,其中L
表示常量值的长度:
表 1.7 NdbInterpretedCode 结果处理方法,具有所需的缓冲区和请求消息空间。
方法 | 缓冲区(字) | 请求消息(字) |
---|---|---|
interpret_exit_ok() |
1个 | 1个 |
interpret_exit_nok() |
1个 | 1个 |
interpret_exit_last_row() |
1个 | 1个 |
本节中描述的方法可用于将多条指令(使用特定寄存器)插入解释程序。
除了更新表列之外,这些方法还使用解释器寄存器 6 和 7,将寄存器 6 的任何现有内容替换为原始列值,将寄存器 7 的任何现有内容替换为修改后的列值。NdbInterpretedCode
在实例化为其调用该方法
的对象时,必须预先定义表本身
。
这些方法的空间要求如下表所示,其中L
表示常量值的长度:
NdbInterpretedCode
支持可以从解释程序中调用的子程序,每个子程序都由一个唯一的数字标识。只能在所有主程序指令之后定义子程序。
用于标识子程序的编号必须是连续的;但是,它们不必按任何特定顺序排列。
子程序的开始是通过调用该
def_sub()
方法来指示的;使用该
call_sub()
方法调用子例程。
一旦子例程完成,程序将继续执行紧跟在调用子例程的指令之后的指令。子程序也可以被其他子程序调用;当前,最大子程序堆栈深度为 32。
NdbInterpretedCode
此处列出了
由提供的一些其他实用方法
:
copy()
NdbInterpretedCode
:通过对关联对象 执行深层复制来复制现有的解释程序 。finalise()
:通过解析所有分支指令和子程序调用来准备解释程序。getTable()
:获取NdbInterpretedCode
对其定义对象的表的引用。getNdbError()
NdbInterpretedCode
:获取与此对象 关联的最新错误 。getWordsUsed()
:获取缓冲区中使用的单词数。