EDBでは,データを記憶するコアの部分にPostgreSQL 7.2を利用している. 本ページでは,PostgreSQL 7.2 のバックエンド部分に付加したタイプ,関数,オペレータについて説明する.

SQL拡張TYPE

EDBでは記憶するデータの基本的な部分で多言語に対応できるように新しいデータ型を追加した. この型の意図するところは,同じ意味の内容でも英語での表記,日本語での表記が異なっていることをデータの基本構造でカバーすることにある.

現時点では,英語,日本語,および日本語の読みと参照形式で登録される場合の情報識別子(EID)を一つのデータセットとして扱うための型(TYPE)を追加している.

TYPE名: mtext
型 mtext には,「情報識別子(EID)」,「英語テキスト」,「日本語テキスト」,「日本語読みテキスト」が含まれる.
mtextの入出力関数(INSERT やSELECT時に用いられる)として,
  • mtext mtext_in ( 'EID|English Text|日本語テキスト|読み' )
  • opaque mtext_out ( mtext )
を定義している.
  • 'EID', 'English Text', '日本語テキスト', '読み'は `|'で区切られる.
  • 'English Text', '日本語テキスト', '読み' 中に'|'を利用したいときには'\|'のようにバックスラッシュを用いて区切りの`|'と区別する.INSERT文ではバックスラッシュが独自に処理されるため,`\\|'のように指定する必要がある.
  • SELECT文で読みだしたときには,`|'と`\|'が混在する可能性があるので,まず`\'の付いていない`|'で,'EID', 'English Text', '日本語テキスト', '読み'を分離し,その後各テキストについて`\|'を`|'に変換する.
  • EIDが0のとき,そのEIDは意味をなさない.
  • `読み'は主に`日本語テキスト'を50音順に配列するために用いる.`読み'そのものが利用されるケースとしては人名ぐらいと推測される.
型変換関数として,
  • int4 int4 ( mtext ) … 情報識別子(EID)を得る.
  • text english ( mtext ) … 英語テキストを得る.
  • text japanese ( mtext ) … 日本語テキストを得る.
  • text pronounce ( mtext ) … 読みテキストを得る.
を定義している.(下記参照)
型 mtext の配列は,型 _mtext と表現される.

SQL拡張関数

制御関数

型 mtext にかかわる関数系で,陽に英語,日本語が指定されなかったとき,どちらの言語を主体として処理を行うか(言語モード)を指定する関数を以下のように定義している.

  • text setdatabasespeaking ( speaking-language )
    • mtextの言語モードを指定する.
    • 現在,'English' と 'Japanese' が利用可能.
    (実行例)
    SELECT setdatabasespeaking( 'English' )
    SELECT setdatabasespeaking( 'Japanese' )
  • text getdatabasespeaking ( )
    • 現在の言語モードを得る.
    • 値としては,'English','Japanese' などの text が戻る.
以上の制御関数の設定により,
  • 関数text で mtext から取り出す言語が変化する.
  • 比較関数の比較の順序が変化する.言語モードで指定されている方を先に比較する.
などの調節を行う.

比較関数

  • bool mtext_lt ( mtext1, mtext2 )
    • mtext1 < mtext2 のときに真.
    • テキストの大小関係は辞書排列による.英語テキストは英字アルファベット順,日本語テキストは読みの50音順.
    • setdatabasespeaking で設定されている言語モードによって,mtextの大小関係が変化することに注意.(以下同様)
  • bool mtext_le ( mtext1, mtext2 )
    • mtext1 ≦ mtext2 のときに真.
  • bool mtext_gt ( mtext1, mtext2 )
    • mtext1 > mtext2 のときに真.
  • bool mtext_ge ( mtext1, mtext2 )
    • mtext1 ≧ mtext2 のときに真.
  • bool mtext_eq ( mtext1, mtext2 )
    • mtext1 = mtext2 のときに真.
  • bool mtext_ne ( mtext1, mtext2 )
    • mtext1 ≠ mtext2 のときに真.
  • bool mtext_int4eq ( mtext, int4 )
    • mtextにEIDが定義されている場合には,そのEIDと第2引数を比較.
    • それ以外では0と比較する.
  • bool mtext_texteq ( mtext, text )
    • mtextとテキストを比較.(英語,日本語,読みのいずれかと同じであれば真)
    • 第2引数はtext型でなくてはならない.
  • bool mtext_textregexeq ( mtext, text )
    • mtext_texteqの正規表現版.
  • bool mtext_array_int4eq ( _mtext, int4 )
    • mtext_int4eq の配列版.(論理和)
  • bool mtext_array_texteq ( _mtext, text )
    • mtext_texteq の配列版.(論理和)
  • bool mtext_array_textregexeq ( _mtext, text )
    • mtext_textregexeq の配列版.(論理和)
  • bool mtext_array_array_eq ( _mtext1, _mtext2 )
    • _mtext1 = _mtext2 のときに真.
  • bool mtext_array_array_ne ( _mtext1, _mtext2 )
    • _mtext1 ≠ _mtext2 のときに真.
  • bool mtext_array_array_lt ( _mtext1, _mtext2 )
    • _mtext1 < _mtext2 のときに真.
  • bool mtext_array_array_le ( _mtext1, _mtext2 )
    • _mtext1 ≦ _mtext2 のときに真.
  • bool mtext_array_array_gt ( _mtext1, _mtext2 )
    • _mtext1 > _mtext2 のときに真.
  • bool mtext_array_array_ge ( _mtext1, _mtext2 )
    • _mtext1 ≧ _mtext2 のときに真.

型変換関数

  • int4 int4 ( mtext ) --- SQL関数
  • int4 mtext_int4 ( mtext ) --- 組み込み関数
    • mtextにEIDが登録されているときEIDの値.
    • それ以外では0.
  • text text ( mtext ) --- SQL関数
  • text mtext_text ( mtext ) --- 組み込み関数
    • setdatabasespeakingで設定されている現在の言語(英語 or 日本語)のテキストに変換する.
  • text english ( mtext ) --- SQL関数
  • text mtext_english ( mtext ) --- 組み込み関数
    • 英語テキストを取り出す.
  • text japanese ( mtext ) --- SQL関数
  • text mtext_japanese ( mtext ) --- 組み込み関数
    • 日本語テキストを取り出す.
  • text pronounce ( mtext ) --- SQL関数
  • text mtext_pronounce ( mtext ) --- 組み込み関数
    • 日本語読みテキストを取り出す.

オペレータ

先に述べた関数をオペレータとして定義したものを以下に示す.

operatorusageoriginal function
= mtext = mtextmtext_eq
<> mtext <> mtextmtext_ne
< mtext < mtextmtext_lt
<= mtext <= mtextmtext_le
> mtext > mtextmtext_gt
>= mtext >= mtextmtext_ge
= mtext = int4mtext_int4eq
= mtext = textmtext_texteq
~ mtext ~ textmtext_textregexeq
*= _mtext *= int4mtext_array_int4eq
*= _mtext *= textmtext_array_texteq
*~ _mtext *~ textmtext_array_textregexeq
= _mtext = _mtextmtext_array_array_eq
<> _mtext <> _mtextmtext_array_array_ne
< _mtext < _mtextmtext_array_array_lt
<= _mtext <= _mtextmtext_array_array_le
> _mtext > _mtextmtext_array_array_gt
>= _mtext >= _mtextmtext_array_array_ge