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() 方法。

若要根據暫存器值的比較結果,執行跳至指定標籤的操作,請使用 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())。請參閱基於欄位的 NdbInterpretedCode 分支操作

若要根據表格欄位值的模式比對結果,執行跳躍操作,請使用方法 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()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)

注意

表達式 CEIL(L / 8) 是保存要比較的常數值所需的完整 8 位元組字組數。

基於模式的 NdbInterpretedCode 分支操作

NdbInterpretedCode 類別提供了兩種方法,可用於根據包含字元資料的欄位(即 CHARVARCHARBINARYVARBINARY 欄位)與正規表示式模式之間的比較進行分支。

正規表示式所支援的模式語法與 MySQL 伺服器的 LIKENOT LIKE 運算子所支援的語法相同,包括 _% 的元字元。如需更多相關資訊,請參閱字串比較函式和運算子

注意

這與 NdbScanFilter 支援的正規表示式模式語法相同;如需更多相關資訊,請參閱 NdbScanFilter::cmp()

在例示化 NdbInterpretedCode 物件時,必須提供要操作的表格。正規表示式模式應為純 CHAR 格式,即使欄位實際上是 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)

注意

表達式 CEIL(L / 8) 是保存要比較的常數值所需的完整 8 位元組字組數。

NdbInterpretedCode 位元比較操作

這些指令用於根據 BIT 欄位值與位元遮罩模式之間的邏輯 AND 比較的結果進行分支。

使用這些方法要求在建構 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;如果提供的數值 >= 216:2;如果 >= 232:3
sub_val() 4 1;如果提供的數值 >= 216:2;如果 >= 232:3

搭配 NdbInterpretedCode 使用副程式

NdbInterpretedCode 支援可從直譯程式內調用的副程式,每個副程式都以唯一的數字識別。副程式只能在所有主要程式指令之後定義。

重要

用於識別副程式的數字必須連續;但是,它們不必以任何特定順序排列。

  • 副程式的開頭會透過調用 def_sub() 方法來指示;

  • ret_sub() 會終止副程式;在調用 def_sub() 之後的所有指令,都屬於副程式,直到使用此方法終止副程式為止。

  • 副程式會使用 call_sub() 方法來調用。

副程式完成後,程式會從緊接在調用副程式的指令之後的指令開始恢復執行。副程式也可以從其他副程式調用;目前,最大副程式堆疊深度為 32。

NdbInterpretedCode 公用程式方法

此處列出 NdbInterpretedCode 提供的一些其他公用程式方法