関数と演算子
本章ではGPUデバイス上で実行可能な関数と演算子について説明します。
型キャスト
bool<--int4int1<--int2,int4,int8,float2,float4,float8,numericint2<--int1,int4,int8,float2,float4,float8,numericint4<--bool,int1,int2,int8,float2,float4,float8,numericint8<--int1,int2,int4,float2,float4,float8,numericfloat2<--int1,int2,int4,int8,float4,float8,numericfloat4<--int1,int2,int4,int8,float2,float8,numericfloat8<--int1,int2,int4,int8,float2,float4,numericnumeric<--int1,int2,int4,int8,float2,float4,float8money<--int4,int8,numericdate<--timestamp,timestamptztime<--timetz,timestamp,timestamptztimetz<--time,timestamptztimestamp<--date,timestamptztimestamptz<--date,timestamp
数値型演算子
bool COMP bool- 論理値型の比較演算子。
COMPは=,<>のいずれかです。} INT COMP INT- 整数型の比較演算子。
INTはint1,int2,int4,int8のいずれかで、左辺と右辺が異なる整数型であっても構いません。COMPは=,<>,<,<=,>=,>のいずれかです。} FP COMP FP- 浮動小数点型の比較演算子。
FPはfloat2,float4,float8のいずれかで、左辺と右辺が異なる浮動小数点型であっても構いません。COMPは=,<>,<,<=,>=,>のいずれかです。} numeric COMP numeric- 実数型の比較演算子。
COMPは=,<>,<,<=,>=,>のいずれかです。} INT OP INT- 整数型の算術演算子。
INTはint1,int2,int4,int8のいずれかで、左辺と右辺が異なる整数型であっても構いません。OPは+,-,*,/のいずれかです。} FP OP FP- 浮動小数点型の算術演算子。
FPはfloat2,float4,float8のいずれかで、左辺と右辺が異なる浮動小数点型であっても構いません。COMPは+,-,*,/のいずれかです。} numeric OP numeric- 実数型の比較演算子。
OPは+,-,*,/のいずれかです。} INT % INT- 剰余演算子。
INTはint1,int2,int4,int8のいずれかです。} INT & INT- 論理積演算子。
INTはint1,int2,int4,int8のいずれかです。} INT | INT- 論理和演算子。
INTはint1,int2,int4,int8のいずれかです。} INT # INT- 排他的論理和演算子。
INTはint1,int2,int4,int8のいずれかです。} ~ INT- 論理否定演算子。
INTはint1,int2,int4,int8のいずれかです。} INT >> int4- 右シフト演算子。
INTはint1,int2,int4,int8のいずれかです。} INT << int4- 左シフト演算子。
INTはint1,int2,int4,int8のいずれかです。} + TYPE- 単項プラス演算子。
TYPEはint1,int2,int4,int8,float2,float4,float8,numericのいずれかです。} - TYPE- 単項マイナス演算子。
TYPEはint1,int2,int4,int8,float2,float4,float8,numericのいずれかです。} @ TYPE- 絶対値。
TYPEはint1,int2,int4,int8,float2,float4,float8,numericのいずれかです。}
数学関数
float8 cbrt(float8)float8 dcbrt(float8)- 立方根
float8 ceil(float8)float8 ceiling(float8)- 引数より大きいか等しく、引数に最も近い整数
float8 exp(float8)float8 dexp(float8)- 指数(eを底とする指定のべき乗)
float8 floor(float8)- 引数より小さいか等しく、引数に最も近い整数
float8 ln(float8)float8 dlog1(float8)- 自然対数
float8 log(float8)float8 dlog10(float8)- 10を底とした対数
float8 pi()- 円周率
float8 power(float8,float8)float8 pow(float8,float8)float8 dpow(float8,float8)- べき乗
float8 round(float8)float8 dround(float8)- 最も近い整数への丸め
float8 sign(float8)- 符号
float8 sqrt(float8)float8 dsqrt(float8)- 平方根
float8 trunc(float8)float8 dtrunc(float8)- 整数への切捨て
三角関数
float8 degrees(float8)- ラジアンに対応する度}
float8 radians(float8)- 度に対応するラジアン}
float8 acos(float8)- 逆余弦関数}
float8 asin(float8)- 逆正弦関数}
float8 atan(float8)- 逆正接関数}
float8 atan2(float8,float8)arg1 / arg2の逆正接関数}float8 cos(float8)- 余弦関数}
float8 cot(float8)- 余接関数}
float8 sin(float8)- 正弦関数}
float8 tan(float8)- 正接関数}
日付/時刻型演算子
date COMP datedate型同士の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}date COMP timestamptimestamp COMP datedate型とtimestamp型の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}date COMP timestamptztimestamptz COMP datedate型とtimestamptz型の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}time COMP timetime型同士の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}timetz COMP timetztimetz型同士の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}timestamp COMP timestamptimestamp型同士の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}timestamptz COMP timestamptztimestamptz型同士の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}timestamp COMP timestamptztimestamptz COMP timestamptimestamp型とtimestamptz型の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}interval COMP intervalinterval型同士の比較演算子。COMPは=,<>,<,<=,>=,>のいずれか。}date + int4int4 + datedate型の加算演算子}date - int4date型の減算演算子}date - datedate型同士の差分}date + timetime + datedateとtimeからtimestampを生成します}date + timetzdateとtimetzからtimestamptzを生成します}time - timetime型同士の差分}timestamp - timestamptimestamp型同士の差分}timetz + intervaltimetz - intervaltimetzとintervalを加算、または減算します。}timestamptz + intervaltimestamptz - intervaltimestamptzとintervalを加算、または減算します。}overlaps(TYPE,TYPE,TYPE,TYPE)- 2つの時間間隔が重なるかどうかを判定します。
TYPEはtime,timetz,timestamp,timestamptzのいずれか一つです。} extract(text FROM TYPE)dayやhourなど日付時刻型の部分フィールドの抽出。TYPEはtime,timetz,timestamp,timestamptz,intervalのいずれか一つです。}now()- トランザクションの現在時刻}
- intervalinterval型の単項マイナス演算子}interval + intervalinterval型の加算演算子}interval - intervalinterval型の減算演算子}
文字列関数/演算子
{text,bpchar} COMP {text,bpchar}- 比較演算子。
COMPは=,<>,<,<=,>=,>のいずれかです。
なお、<,<=,>=,>演算子はロケール設定がUTF-8またはC(ロケール設定なし)の場合にのみ有効です。}
substring(text,int4)substring(text,int4,int4)substr(text,int4)substr(text,int4,int4)- 部分文字列の切り出し}
length({text,bpchar})- 文字列長}
{text,bpchar} [NOT] LIKE text- LIKE表現を用いたパターンマッチング}
{text,bpchar} [NOT] ILIKE text- LIKE表現を用いた大文字小文字を区別しないパターンマッチング。
なお、ILIKE演算子はロケール設定がUTF-8またはC(ロケール設定なし)の場合にのみ有効です。}
ネットワーク関数/演算子
macaddr COMP macaddr- 比較演算子。
COMPは=,<>,<,<=,>=,>のいずれかです。} macaddr & macaddr- ビット積演算子}
macaddr | macaddr- ビット和演算子}
~ macaddr- ビット否定演算子}
trunc(macaddr)- 末尾の3バイトをゼロに設定する}
inet COMP inet- 比較演算子。
COMPは=,<>,<,<=,>=,>のいずれかです。} inet << inet- 左辺は右辺に内包される。}
inet <<= inet- 左辺は右辺に内包されるか等しい。}
inet >> inet- 左辺は右辺を内包する。}
inet >>= inet- 左辺は右辺を内包するか等しい。}
inet && inet- 左辺は右辺を内包するか内包される}
~ inet- ビット否定演算子}
inet & inet- ビット積演算子}
inet | inet- ビット和演算子}
inet + int8- 加算演算子}
inet - int8- 減算演算子}
inet - inet- 減算演算子}
broadcast(inet)- ネットワークアドレスのブロードキャストアドレスを返す}
family(inet)- ネットワークアドレスのアドレスファミリを返す。IPv4の場合は
4、IPv6の場合は6} hostmask(inet)- ネットワークアドレスのホストマスクを返す}
masklen(inet)- ネットワークアドレスのマスク長を返す}
netmask(inet)- ネットワークアドレスのネットマスクを返す}
network(inet)- ネットワークアドレスのネットワーク部を返す}
set_masklen(NETADDR,int)- ネットワークアドレスのネットマスク長を設定する。
NETADDRはinetかcidrのどちらか。} inet_merge(inet,inet)- 両方のネットワークを含む最小のネットワークを返す}
通貨型演算子
money COMP money- 比較演算子。
COMPは=,<>,<,<=,>=,>のいずれかです。} money OP money- 算術演算子。
OPは+,-,/のいずれかです。} money * TYPETYPE * money- 通貨型と数値型の乗算。
TYPEはint1,int2,int4,float2,float4,float8のいずれかです。} money / TYPE- 通貨型の数値型による除算。
TYPEはint1,int2,int4,float2,float4,float8のいずれかです。} money / money- 通貨型同士の除算。}
uuid型演算子
uuid COMP uuid- 比較演算子。
COMPは=,<>,<,<=,>=,>のいずれかです。}
JSONB型演算子
jsonb -> KEYKEYで指定されたJSONオブジェクトフィールドを取得する}jsonb -> NUM- インデックス番号
NUMで指定されたJSONオブジェクトフィールドを取得する} jsonb ->> KEYKEYで指定されたJSONオブジェクトフィールドをテキスト値として取得する}jsonb ->> NUM- インデックス番号
NUMで指定されたJSONオブジェクトフィールドをテキスト値として取得する} (jsonb ->> KEY)::TYPETYPEがint2,int4,int8,float4,float8,numericのいずれかである場合、KEYで指定されたJSONオブジェクトフィールドを数値型として取得する。下記の補足も参照。}(jsonb ->> NUM)::TYPETYPEがint2,int4,int8,float4,float8,numericのいずれかである場合、インデックス番号NUMで指定されたJSONオブジェクトフィールドを数値型として取得する。下記の補足も参照。}jsonb ? KEY- jsonbオブジェクトが指定された
KEYを含むかどうかをチェックする}
Note
jsonb ->> KEY演算子によって取り出した数値データをfloatやnumericなど数値型に変換する時、通常、PostgreSQLはjsonb内部表現をテキストとして出力し、それを数値表現に変換するという2ステップの処理を行います。
PG-Stromはjsonb ->> KEY演算子による参照とテキスト⇒数値表現へのキャストが連続している時、jsonbオブジェクトから数値表現を取り出すための特別なデバイス関数を使用する事で最適化を行います。
PostGIS関数
geometry st_makepoint(float8,float8)geometry st_point(float8,float8)- 2次元座標を含むPOINT型ジオメトリを返す
geometry st_makepoint(float8,float8,float8)- 3次元座標を含むPOINT型ジオメトリを返す
geometry st_makepoint(float8,float8,float8,float8)- ZM座標を含むPOINT型ジオメトリを返す
geometry st_setsrid(geometry,int4)- ジオメトリにSRIDを設定する
float8 st_distance(geometry,geometry)- ジオメトリ間の距離を
float8で返す bool st_dwithin(geometry,geometry,float8)- ジオメトリ間の距離が指定値以内なら真を返す。
st_distanceと比較演算子の組み合わせよりも高速な場合がある。 text st_relate(geometry,geometry)- ジオメトリ間の交差状態を判定し、DE9-IM(Dimensionally Extended Nine-Intersection Matrix)書式を返す。
bool st_contains(geometry,geometry)- ジオメトリ1がジオメトリ2を包含する時、真を返す。
bool st_crosses(geometry,geometry)- ジオメトリ同士が空間的に交差する時、真を返す。
int4 st_linecrossingdirection(geometry,geometry)- 2つのLINESTRING型ジオメトリがどのように交差するか(しないか)を返す。
CUBE型関数
cube COMP cube- 比較演算子。
COMPは=,<>,<,<=,>=,>のいずれかです。} bool cube_contains(cube, cube)- 第一引数の立体が第二引数の立体を包含している時、真を返す。
bool cube_contained(cube, cube)- 第一引数の立体が第二引数の立体に包含されている時、真を返す。
float8 cube_ll_coord(cube, int4)- 立体の左下隅のn次座標の値を返します。
VCF検索関数
text vcf_variant_getattr(text, text)- 第一引数を':'区切りのトークン列と見なして、第二引数で指定された
KEY=以降の文字列を返す。
=# SELECT vcf_variant_getattr('ABC=123:NM=this is a pen:XYZ=3.1415', 'NM');
vcf_variant_getattr
---------------------
this is a pen
(1 row)
text vcf_info_getattr(text, text)- 第一引数を';'区切りのトークン列と見なして、第二引数で指定された
KEY=以降の文字列を返す。
=# SELECT vcf_info_getattr('ABC=123;NM=this is a pen;XYZ=3.1415', 'XYZ');
vcf_info_getattr
------------------
3.141
(1 row)