Announcing VillageSQL Server 0.0.3

Announcing VillageSQL Server 0.0.3

The 0.0.3 release of VillageSQL Server is now available. This update adds broader support for standard SQL operations, provides a more idiomatic C++ experience, and starts to expand what custom types can do by introducing Parametrized Types. We also rebased the server onto the latest MySQL LTS release, 8.4.8.

First-Class SQL Integration

Custom types now work seamlessly with advanced MySQL features. We expanded the engine to support:

  • Window Functions: LAG, LEAD, FIRST_VALUE, LAST_VALUE, and NTH_VALUE now support custom type columns.
  • Aggregates: GROUP_CONCAT is fully compatible with custom type data.
  • Programmability: Custom types integrate with Triggers, CHECK constraints, and Generated Columns.
  • Temporary Tables: Full support for custom types, including ALTER TABLE operations.
  • Indexing: Functional indexes can now be applied to VDF expressions for faster query execution.

SDK and Tooling

The Extension SDK now provides a more idiomatic C++ experience, including wrappers for type operations and support for deterministic VDFs. Marking a VDF as deterministic tells the optimizer that the same inputs always produce the same output which improves query performance.

The new builder-style API simplifies registration by chaining operations, as shown in this registration of an example myextension:

VEF_GENERATE_ENTRY_POINTS(
    // "1.0.0" is the version of your extension, independent of the server version
    make_extension("vsql_myextension", "1.0.0")
        .type(make_type(MYTYPE)
            .persisted_length(8)
            .max_decode_buffer_length(256)
            .encode("mytype_from_string")
            .decode("mytype_to_string")
            .compare("mytype_compare")
            .build())
        .func(make_type_encode<&mytype_from_string>("mytype_from_string", MYTYPE))
        .func(make_type_decode<&mytype_to_string>("mytype_to_string", MYTYPE))
        .func(make_type_compare<&mytype_compare>("mytype_compare", MYTYPE))
        .func(make_func<&mytype_transform>("transform_mytype")
            .returns(MYTYPE)
            .param(MYTYPE)
            .deterministic()
            .build())
)

Parametrized Types

VillageSQL 0.0.3 adds initial support for Parametrized Types to the extension framework. Extensions can now define types that carry their own constraints and metadata. For example, a vector type can specify its dimension when declared, and the extension uses that parameter to determine memory allocation and enforce sizing at insert time. We consider this implementation a v1. Future work we are thinking about will add support for casting and unbound types, by removing some type ambiguities. We’d love your feedback on what other capabilities you want added for parameterized types. For example, we currently support a single integer parameter in more idiomatic SQL (e.g. a hypothetical VECTOR(1536)), but it may make sense to also support TYPE(10, 2) instead of having to fall back to a key/value string, as is currently the case.

Extension Updates

We made updates to some of the VillageSQL Extensions:

  • vsql-ai - Added ChatGPT as an option for inference and added Gemini and ChatGPT as options for generating embeddings. Also added a local option to run your own Ollama server directly on the database server
  • vsql-uuid - Updated to be more MySQL idiomatic

You can build your own extensions and run them with VillageSQL. Start by cloning the extension template.

Additional updates:

  • CLI: We consolidated internal development tools from the dev_server into a single villagesql CLI. This provides a unified interface for extension developers to manage build workflows and local development environments more efficiently.
  • Docker: The official image now bundles all core vsql-* extensions.

These are some of the highlights, but there is more in this release. Check the Release Notes for additional details. Please let us know what you're building and what feedback you have. You can find us on Discord and GitHub.