If you prefer C++, see Creating Extensions for the C++ SDK walkthrough.
villagesql crate. The SDK handles all FFI marshaling — you work in ordinary Rust types and the extension! macro generates the C entry points the server calls at load time.
Prerequisites
You need:- Rust stable toolchain — install at rustup.rs
- cargo-vsql — the Cargo subcommand for packaging, installing, and testing extensions
- VillageSQL build directory — set
VillageSQL_BUILD_DIRto your server build path forcargo vsql installandcargo vsql test
cargo-vsql from the SDK repo:
Create a new crate
Create a new Rust library crate:Cargo.toml to set the crate type and add the villagesql dependency:
cdylib crate type tells Cargo to produce a shared library (.so on Linux, .dylib on macOS) that the server can load.
Write your first function
Replacesrc/lib.rs with a complete extension:
func! macro wires rot13_impl to the SQL name vsql_rot13 with a STRING -> STRING signature.
The function signature is fn(&[InValue]) -> VdfReturn. InValue is an enum over the SQL types the server passes in. VdfReturn is what you send back. Check args.first() to handle both the NULL case and the wrong-type case before touching the value.
If your function always returns the same output for the same inputs, declare it deterministic — the optimizer can then cache results for identical inputs:
Add manifest.json
Createmanifest.json in the crate root (alongside Cargo.toml):
name field must match what you pass to INSTALL EXTENSION.
Build and install
Run
cargo vsql package, cargo vsql install, and cargo vsql test from inside the extension directory (where Cargo.toml and manifest.json live), not from the workspace root..veb file:
dist/vsql_rot13.veb. To package and copy the VEB directly to your VillageSQL build directory:
Test
Write a test file inmysql-test/t/rot13_basic.test:
cargo vsql test --record to update the expected results, then cargo vsql test to confirm.
Install in SQL
Once the VEB is in the extensions directory, install it:Next steps
Custom Types in Rust
Define new column types with binary storage, ordering, and hashing.
Rust API Reference
InValue, VdfReturn, extension!, func!, and custom_type! — all fields.
C++ SDK (Creating Extensions)
The C++ path — typed wrappers, builder API, and CMake setup.
Extension Architecture
How VEB files load, lifecycle hooks, and symbol isolation.

