From d4e1aae3681e3e57cc00d6c11c21b24c9d807793 Mon Sep 17 00:00:00 2001 From: sonhmai <> Date: Mon, 3 Feb 2025 15:57:33 +0700 Subject: [PATCH] doc: refine function contributing doc --- CONTRIBUTING.md | 2 +- .../contributing_functions.md} | 28 ++++++++++++++---- docs/contributing/limbo_architecture.png | Bin 0 -> 30172 bytes 3 files changed, 23 insertions(+), 7 deletions(-) rename docs/{internals/functions.md => contributing/contributing_functions.md} (87%) create mode 100644 docs/contributing/limbo_architecture.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index db0e9715a..cad33a8db 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,7 +19,7 @@ If you are new to Rust, the following books are recommended reading: Examples of contributing -* [How to contribute a SQL function implementation](docs/internals/functions.md) +* [How to contribute a SQL function implementation](docs/contributing/contributing_functions.md) To build and run `limbo` cli: diff --git a/docs/internals/functions.md b/docs/contributing/contributing_functions.md similarity index 87% rename from docs/internals/functions.md rename to docs/contributing/contributing_functions.md index ff71b6864..a4386cab5 100644 --- a/docs/internals/functions.md +++ b/docs/contributing/contributing_functions.md @@ -6,6 +6,11 @@ Steps 3. Implement the function in a feature branch. 4. Push it as a Merge Request, get it review. +Sample Pull Requests of function contributing +- [partial support for datetime() and julianday()](https://github.com/tursodatabase/limbo/pull/600) +- [support for changes() and total_changes()](https://github.com/tursodatabase/limbo/pull/589) +- [support for unhex(X)](https://github.com/tursodatabase/limbo/pull/353) + ## An example with function `date(..)` > Note that the files, code location, steps might be not exactly the same because of refactor but the idea of the changes needed in each layer stays. @@ -13,13 +18,24 @@ Steps [Issue #158](https://github.com/tursodatabase/limbo/issues/158) was created for it. Refer to commit [4ff7058](https://github.com/tursodatabase/limbo/commit/4ff705868a054643f6113cbe009655c32bc5f235). +![limbo_architecture.png](limbo_architecture.png) + +To add a function we generally need to touch at least the following modules +- SQL Command Processor + - The `SQL Command Processor` module is responsible for turning sql function string into a sequence of instructions to be executed by the `Virtual Machine` module. + - we need the following things: function definition, how the `bytecode generator` in `core/translate` generates bytecode program for this function to be executed. +- Virtual Machine `core/vdbe` + - we need to add logic of how the `vdbe` should execute the logic of this function in Rust and write result to destination register of the vm. + - [more info](https://www.sqlite.org/opcode.html) +- Tests + ``` -sql function: string ---Parser--> -enum Func ---translate--> -Instruction ---VDBE--> +SQL function string +--Tokenizer and Parser--> +AST (enum Func) +--Bytecode Generator (core/translate)--> +Bytecode Instructions +--Virtual Machine--> Result ``` diff --git a/docs/contributing/limbo_architecture.png b/docs/contributing/limbo_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..630bfb63304da07e7a2c81f718b739cee8eae6e6 GIT binary patch literal 30172 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 literal 0 HcmV?d00001