$30 off During Our Annual Pro Sale. View Details »

Write Postgres Extensions with Rust!

Write Postgres Extensions with Rust!

I will introduce you how to write PostgreSQL's extensions with Rust.
pgx(https://github.com/zombodb/pgx) is a framework that helps developing extensions.

The LT took place on December 22, 2020 at Shinjuku.rs # 13 (https://forcia.connpass.com/event/194229/).

Kentaro Matsumoto

December 22, 2020
Tweet

More Decks by Kentaro Matsumoto

Other Decks in Technology

Transcript

  1. Write Postgres Extensions with Rust!

    @matsu7874

    2020.12.22 Shinjuku.rs #13


    View Slide

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

    View Slide

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

    View Slide

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


    View Slide

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

    View Slide

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

    View Slide

  7. pgxの導入
    $ cargo install cargo-pgx

    $ cargo pgx init



    7
    ● テスト用のPostgreSQL 10~13がインストールされる

    View Slide

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

    View Slide

  9. C・Rustでの実装例
    9

    View Slide

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

    View Slide

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

    View Slide

  12. デモ
    12

    View Slide

  13. デモ
    13

    View Slide

  14. デモ
    14

    View Slide

  15. デモ
    15

    View Slide

  16. デモ
    16

    View Slide

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

    View Slide

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

    View Slide