If you prefer C++, see Creating Extensions in C++ 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
Before you begin, build VillageSQL from source — extensions link against the server’s build tree. Follow the Build from Source guide first. You also need:- Rust stable toolchain — install at rustup.rs
- Git — for cloning the SDK and your extension repo
- 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 - Basic Rust knowledge — comfort with Cargo, enums, and pattern matching
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:
--config KEY=VALUE (repeatable):
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.
Testing Network-Dependent Extensions
MTR port patterns for extensions that spawn HTTP servers or external listeners — applies equally to Rust and C++ extensions.

