式には値と型の両方があります。値が収まる範囲を定めた一連の制限が型です。
以下の規則では、EGL のプリミティブ型を使用します。『プリミティブ・データ型』を参照してください。
以下の規則により、式の型が決まります。
これらの規則では、プラットフォーム依存型である個々のオペランドについて実行可能な変換 (上位変換) に関しては言及していません。
- 数式
- これらの規則は、算術演算子が含まれる式に適用されます。
この規則は精度または長さに関係なく予期される式の型を定義します。
また、ターゲット言語によってプロセスが異なるため、オペランドの変換方法については言及していません。
以下の 2 項演算子では、1 つ以上のオペランドの上位変換が必要になる場合があります。
- 算術演算子 +、-、*、/、%、**
- 数値比較演算子 ==、!=、<、>、<=、>=
- ビット単位演算 &、|、^
- 算術および数値比較の演算子に対して、以下の規則が順番に適用されます。
- どちらかのオペランドがテキスト型であれば、式の型は NUMBER になります
- そうでない場合、どちらかのオペランドが FLOAT であれば、式の型は FLOAT になります
- そうでない場合、どちらかのオペランドが SMALLFLOAT であれば、式の型は SMALLFLOAT になります
- そうでない場合、どちらかのオペランドが NUM であれば、式の型は NUM になります
- そうでない場合、どちらかのオペランドが NUMC であれば、式の型は NUMC になります
- そうでない場合、どちらかのオペランドが DECIMAL であれば、式の型は DECIMAL になります
- そうでない場合、どちらかのオペランドが BIN であれば、式の型は BIN になります
- そうでない場合、どちらかのオペランドが BIGINT であれば、式の型は BIGINT になります
- そうでない場合、どちらかのオペランドが INT であれば、式の型は INT になります
- そうでない場合、どちらかのオペランドが SMALLINT であれば、式の型は SMALLINT になります
ビット単位演算子 AND (&)、OR (|)、および 排他 OR (^) は、2 つのオペランド間のビット単位演算を実行し、INT 型の値を戻します。
オペランドは、HEX(2)、HEX(4)、HEX(8)、INT、または SMALLINT のいずれかの型です。
演算は、すべての HEX または SMALLINT のオペランドを INT 型に変換して開始します。
HEX の場合、演算では長さが 4 バイトになるまでオペランドの値をゼロで左詰めで埋め込みます。
- テキスト式
- この規則は、テキスト型の値を持つ必要がある 2 項演算のオペランドに適用されます。
ここでは、いずれのオペランドも数値型ではないものと仮定します (いずれかのオペランドが数値式の規則が適用されます)。
以下のテキスト比較演算子では、==、!=、<、>、<=、>= のうち 1 つ以上のオペランドの上位変換が必要になる場合があります。
- 以下の規則が順次適用されます。
- どちらかのオペランドが STRING であれば、もう一方は STRING に変換されます
- そうでない場合、どちらかのオペランドが STRING(i) であれば、第 2 オペランドは STRING(j) に変換されます (j は、その第 2 オペランドと i の長さの大きい方)
- そうでない場合、どちらかのオペランドが UNICODE(i) であれば、第 2 オペランドは UNICODE(j) に変換されます (j は、その第 2 オペランドと i の長さの大きい方)
- そうでない場合、どちらかのオペランドが MBCHAR(i) であれば、第 2 オペランドは MBCHAR(j) に変換されます (j は、その第 2 オペランドと i の長さの大きい方)
- そうでない場合、どちらかのオペランドが CHAR(i) であれば、第 2 オペランドは CHAR(j) に変換されます (j は、その第 2 オペランドと i の長さの大きい方)