Slide 1

Slide 1 text

Write Postgres Extensions with Rust!
 @matsu7874
 2020.12.22 Shinjuku.rs #13


Slide 2

Slide 2 text

自己紹介 ● 松本健太郎 (Kentaro MATSUMOTO) @matsu7874 ● ソフトウェアエンジニア@フォルシア株式会社 ○ Rustでインメモリデータベースを開発 ○ インターンの企画とか技術広報とか ● 興味 ○ Webアプリケーション ○ 技術広報・エンジニア採用 ○ 競技プログラミング 2

Slide 3

Slide 3 text

『実践Rustプログラミング入門』 共著 ● 8月22日発売 ¥3,600(税別) 秀和システム ● 12月1日 Kindle版発売! ● 360/508ページくらい実践的な内容 ○ Webアプリ ○ WebAssembly ○ GUI ○ 組み込み ○ プロダクションで使う話など ● Shinjuku.rsで知り合ったエンジニアで共著 3

Slide 4

Slide 4 text

目次 ● PostgreSQLのユーザー定義関数 ● pgxとは ● デモ 4 参考 『RustでPostgreSQLのユーザー定義関数を書く』  https://www.forcia.com/blog/001560.html


Slide 5

Slide 5 text

PostgreSQLのユーザー定義関数 ● PostgreSQLは関数を定義することができる ● C言語関数と呼ばれるタイプのユーザー定義関数がある ○ 動的ロード可能なオブジェクトファイルとしてコンパイル ○ PL/pgSQL, PL/Pythonより高速! ○ C(もしくはCと互換性のある言語)で作成できる ■ Rustで実装するぞ! 5

Slide 6

Slide 6 text

pgxとは ● RustでPostgreSQL拡張を書くためのフレームワーク ○ Rustを書くとPostgreSQL向けにコンパイルしてくれる ○ バージョン10,11,12,13(2020/09リリースの最新版)に対応 ○ ZomboDBが開発している      6

Slide 7

Slide 7 text

pgxの導入 $ cargo install cargo-pgx
 $ cargo pgx init
 
 
 7 ● テスト用のPostgreSQL 10~13がインストールされる

Slide 8

Slide 8 text

サンプルプログラム:コラッツの問題 ● 終了までのループ回数を出力 ● n == 1 ⇒ 終了 ● n%2 == 0 ⇒ n=n/2 ● n%2 == 1 ⇒ n=3*n+1 8

Slide 9

Slide 9 text

C・Rustでの実装例 9

Slide 10

Slide 10 text

構造体を定義する ● pubな構造体を定義して ● #[derive(PostgresType, Serialize, Deserialize)]するとよい ○ assert_eq!観点ではDebug,PartialEqもあるとうれしい 10

Slide 11

Slide 11 text

2種類のテスト ● cargo test ○ Rustの標準的なユニットテスト ● cargo pgx test pg13 ○ PostgreSQL13を使ったテストが書ける 11

Slide 12

Slide 12 text

デモ 12

Slide 13

Slide 13 text

デモ 13

Slide 14

Slide 14 text

デモ 14

Slide 15

Slide 15 text

デモ 15

Slide 16

Slide 16 text

デモ 16

Slide 17

Slide 17 text

ハマったところ ● 構造体xxxに対して、2つの関数が生成される ○ 関数xxx_in(cstring)->xxx ○ 関数xxx_out(xxx)->cstring ○ PostgreSQLに実装されている型、例えばpoint型などと被る ○ 関数定義のSQLを見れば原因がわかる! ● 型パラメータを持った構造体はNG ● 構造体のメソッドは別の関数経由で呼び出す ● pg_externの関数でusizeを引数に取れないがエラーにならない。 17

Slide 18

Slide 18 text

pgxを使ってRustで PostgreSQL拡張を書こう 18