SQLite で LOG や SQRT を使うには
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 を見る。
関連エントリー
- SQLite の WITHOUT ROWID の効果測定 SQLite で「PRIMARY KEY」を《真のプライマリキー》とするには | tech - 氾濫原 の続きです。 以下のような簡単なベン...
- TF-IDFとコサイン類似度による類似エントリー機能の実装 TF-IDFによる類似エントリー機能の実装をしてみました。ほぼSQLiteですませるような構成です。 やっていることの概要 エントリーのHT...
- Lightroom のカタログを SQLite で読んで統計を出したりする .lrcat っていったい何なのか カタログファイルの実体である lrcat は SQLite の DB ファイルそのもの。sqlite3 ...
- Swift で Mac の ScriptingBridge を無理矢理つかう ちょいちょい「環境設定」→「セキュリティとプライバシー」→「アクセシビリティ」を開かせたいケースがあるが、openURL とかで Secur...
- Ubuntu 16.4 LTS クリーンインストールして引越 カスタムOSインストールガイド - Ubuntu 16.04 – さくらのサポート情報 を見ながらインストールまでやる。 旧サーバと同じホス...