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 を見る。