おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子の名前をPostgreSQLで扱えるようにする拡張機能pg_mochochoをつくってみた

この記事は [NTTコムウェア Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nttcomware) 9日目の記事です。

## はじめに

NTTコムウェアの黒田といいます、よろしくお願いします。

ふだんはデータベースエンジニアとして、おもにオープンソースのデータベースである
[PostgreSQL](https://www.postgresql.org/ "PostgreSQL") に関する技術調査・技術サポートに取り組んでおり、コミュニティ活動にも参加しています。

## PostgreSQLの拡張機能をつくってみたい

PostgreSQLは、だれでも自由に拡張機能を作成して組み込むことができるようつくられており、多くのシステムで拡張機能が作成・利用されています。せっかくなので私もつくってみたいなということでひとつ考えてきました。

## 拡張機能pg_mochochoをつくってみた

最近、とあるゲームのフェス[^1] でも話題となりましたが、 `おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子` 、たくさん名前がありますね。

* `おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子` にどんな名前があるのか、教えてくれる仕組みが欲しい
* ある名前が `おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子` の名前なのか、確認する仕組みが欲しい
* `おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子` の名前だけが持てるデータ型が欲しい

こういった要望、あるかと思います。

これらの要望を満たすべく、PostgreSQLの拡張機能 `pg_mochocho` をつくってみました。これで、PostgreSQLで `おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子` の名前を簡単に扱うことができます。

拡張機能の名前は、名前のひとつとして流行した「ベイクドモチョチョ」からインスパイアされました。

## ソースコード

[pg_mochocho](https://github.com/kiskk/pg_mochocho "pg_mochocho - Github") で公開されています。

## インストール

ソースコード入手後、構築対象となるPostgreSQLのpg_configプログラムへのPATHを指定してインストールします。pg_configはpostgresql-develパッケージに含まれています。

```shell
git clone https://github.com/kiskk/pg_mochocho.git
cd pg_mochocho
make USE_PGXS=1 PG_CONFIG=<PATH>/pg_config install
```

インストール後、利用したいデータベースに拡張機能をインストールします。

```sql
psql -d postgres
CREATE EXTENSION pg_mochocho;
```

## 使い方

### おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子の名前をランダムに取得する

`get_random_mochocho()` 関数は、ランダムに名前をひとつ返します。

```sql
postgres=# SELECT get_random_mochocho();
 get_random_mochocho
---------------------
 大判焼き

postgres=# SELECT get_random_mochocho();
 get_random_mochocho
---------------------
 回転焼き
```

### おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子の名前を検証する

`verify_mochocho(text)` 関数は、引数に指定された名前を検証します。

```sql
postgres=# SELECT verify_mochocho('大判焼き');
INFO:  大判焼き は、おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子の名前です。
 verify_mochocho
-----------------
 t

postgres=# SELECT verify_mochocho('おでん');
INFO:  おでん は、おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子の名前ではおそらくありません。
 verify_mochocho
-----------------
 f

```

### おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子の名前を追加する

名前は列挙型 `mochocho` で管理されています。

名前を追加したい場合は `mochocho` 型に任意の名前を追加してください。



```sql
postgres=# ALTER TYPE mochocho ADD VALUE 'ベイクドモチョモチョ';
ALTER TYPE
```

```sql
postgres=# SELECT verify_mochocho('ベイクドモチョモチョ');
INFO:  ベイクドモチョモチョ は、おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子の名前です。
 verify_mochocho
-----------------
 t
```

これで、 `おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子` の新商品や新たな名前が出ても簡単に対応できます。

## まとめ

PostgreSQLとpg_mochochoを使うことで、だれでも簡単に、 `おもに小麦粉からなる生地にあんこをいれて金属製焼き型で焼成した和菓子` の名前を扱うことができるようになりましたね！

## ほんとうのまとめ

…ということで、本拡張機能は、あくまでPostgreSQL拡張機能の作成手順学習を目的としたジョーク拡張機能ですが、拡張機能のインストール手順や作成方法自体はマニュアルで紹介されている手順にのっとったものです。PostgreSQLの拡張機能のインストール手順が非常にシンプルでわかりやすいことがおわかりいただけたのではないでしょうか。

また、たとえば [PostgreSQL 用 Amazon RDS の拡張バージョン](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/PostgreSQLReleaseNotes/postgresql-extensions.html "PostgreSQL 用 Amazon RDS の拡張バージョン") でも確認できるとおり、各種クラウドサービスも、多くのPostgreSQL拡張機能をサポートしています。これだけ数多くの有用な拡張機能があるということですね。

今回作成してみた拡張機能は「データ型」「関数」だけで構成されているシンプルなものですが、実際にはC言語で処理を記述して、PostgreSQLの内部処理まで介入するような、高機能な拡張機能も組み込むことができるようになっています。SQLの実行情報を収集する `pg_stat_statements` など、便利な拡張機能が充実しているのがPostgreSQLの特徴です。

PostgreSQLには無限の可能性があるということで、引き続き進化しつづけるPostgreSQLにご期待ください。

記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。

[^1]: わたしのお気に入りブキはヒッセン・ヒューです。