|
8 | 8 | [](https://github.com/commandprompt/plruby/actions/workflows/ci.yml) |
9 | 9 | [](https://www.postgresql.org/) |
10 | 10 | [](https://www.ruby-lang.org/) |
11 | | -[](sql/) |
| 11 | +[](sql/) |
12 | 12 | [](LICENSE) |
13 | 13 |
|
14 | 14 | </div> |
@@ -45,11 +45,11 @@ SELECT hello('world'); -- Hello, world! |
45 | 45 | | 🔁 **Set-returning functions** | `RETURNS SETOF` / `RETURNS TABLE` with `return_next`. | |
46 | 46 | | ⚡ **Triggers** | Row & statement triggers via `$_TD` (with `'SKIP'` / `'MODIFY'`). | |
47 | 47 | | 📣 **Event triggers** | Back `CREATE EVENT TRIGGER` with `RETURNS event_trigger`. | |
48 | | -| 🗄️ **Database access (SPI)** | `spi_exec`, `spi_fetch_row`, `spi_processed`, `spi_status`, `spi_rewind`. | |
| 48 | +| 🗄️ **Database access (SPI)** | `spi_exec`, `spi_fetch_row`, `spi_processed`, `spi_status`, `spi_rewind`, and result column metadata (`spi_colnames` / `spi_coltypes` / `spi_coltypmods`). | |
49 | 49 | | 🌊 **Cursor streaming** | `spi_query` (block or handle), `spi_fetchrow`, `spi_cursor_close`, `Cursor#each`. Consume large results without materializing them. | |
50 | 50 | | 📝 **Prepared statements** | `spi_prepare` / `spi_exec_prepared` / `spi_query_prepared` / `spi_freeplan`. | |
51 | 51 | | 🔐 **Transaction control** | `spi_commit` / `spi_rollback` in procedures, plus `subtransaction` blocks. | |
52 | | -| 🧰 **Utilities** | `quote_literal` / `quote_nullable` / `quote_ident`, `elog`, `$_SHARED`. | |
| 52 | +| 🧰 **Utilities** | `quote_literal` / `quote_nullable` / `quote_ident`, `elog`, session-shared `$_SHARED`, and per-function `$_SD`. | |
53 | 53 | | 📦 **Session setup** | Anonymous `DO` blocks, `plruby_modules` autoloading, and a `plruby.start_proc` hook. | |
54 | 54 | | 🔄 **Transforms** | `jsonb_plruby`, `hstore_plruby`, and `ltree_plruby`: functions declared `TRANSFORM FOR TYPE` exchange native Ruby Hashes/Arrays with `jsonb`, `hstore`, and `ltree`. | |
55 | 55 |
|
|
0 commit comments