SQLite にはかなり基本的な算術演算関数しかない。追加で何かしらやるためには拡張 (Run-Time Loadable Extension) を使う必要がある。

LOG や SQRT などはオフィシャルの Contributed Files のextension-functions.c をコンパイルして使う。 http://www.sqlite.org/contrib

Ubuntu でのコンパイル。当然ながら SQLite のヘッダファイルなどが必要なので入れておく。

sudo apt-get install libsqlite3-dev

そのうえで以下のようにコンパイルする。apt-get で入れてる場合 -I などは指定しなくてもデフォルトで良さそう。必要なら pkg-config sqlite3 とかして引数を得る。

gcc -fPIC -shared extension-functions.c -o libsqlitefunctions.so -lm

extension-functions.c の冒頭にもコンパイル方法が書いてある。ただし、今はそれだと上手くいかなくて、-lmは最後につけないとダメ。罠があって、リンクに失敗しても load_extension するまで気付かない。

使うときは以下のように load_extension() を使う

select load_extension("/path/to/libsqlitefunctions.so");

Perl の DBD::SQLite で使うには

Perl から DBD::SQLite 経由で使う場合、

$dbh->do('SELECT load_extension("/path/to/libsqlitefunctions.so")');   

とする。が、実はこれだけだと動かず、以下のように謎のエラーが出る。

DBD::SQLite::db do failed: SQL logic error or missing database
not authorized 

ドキュメントにも書いてあるが、sqlite_enable_load_extension を前もって呼ぶ必要がある。

$dbh->sqlite_enable_load_extension(1);
# または
$dbh->func(1, "enable_load_extension"); 

備考

拡張の開発方法については Run-Time Loadable Extensions を見る。

  1. トップ
  2. tech
  3. SQLite で LOG や SQRT を使うには
▲ この日のエントリ