1
0
mirror of https://github.com/lana-k/sqliteviz.git synced 2025-12-06 10:08:52 +08:00
Files
sqliteviz/lib/sql-js
saaj 3a6628cab9 Pre-built custom sql.js for sqliteviz (#62)
* Proof-of-concept pre-built custom sql.js

* Rewrite Makefile as a couple of comprehensible Python scripts

* Add link to a blog post about transitive closure in SQLite

* Remove eval extension -- no much point as it only returns a string

* Consistently use existing Path objects

* Add basic tests scalar functions from extension-functions.c

* Test presence of functions from the rest of built extensions

* Use the same sqlite.com domain

* Add a couple SQLite compile flags that may make it a bit faster

* Add regexpi function test

* Add node about regexpi and REGEXP operator

* Workaround first build failure, rebuild lock file and minor fixes
2021-07-03 16:43:43 +02:00
..

SQLite WebAssembly build

This directory contains Docker-based build script, make.sh, that builds a custom version of sql.js. It allows sqliteviz to have more recent version of SQLite build with a number of useful extensions.

Makefile from sql.js is rewritten as more comprehensible configure.py and build.py Python scripts that run in emscripten/emsdk Docker container.

Extension

SQLite amalgamation extensions included:

  1. FTS5 -- virtual table module that provides full-text search functionality

SQLite miscellaneous extensions included:

  1. generate_series table-valued series function (series.c)
  2. transitive_closure virtual table for Querying Tree Structures in SQLite (closure.c)
  3. uuid, uuid_str and uuid_blob RFC-4122 UUID functions (uuid.c)
  4. regexp (hence REGEXP operator) and regexpi functions (regexp.c)

SQLite 3rd party extensions included:

  1. pivot_vtab -- a pivot virtual table

To ease the step to have working clone locally, the build is committed into the repository.

Build method

Basically it's extended amalgamation and SQLITE_EXTRA_INIT concisely described in this message from SQLite Forum:

Simply append it to the end of the amalgamation file. The real problem is how you get the init function called. The easiest way (to me at any rate) is to append a function (after the extensions you want to add are all appended) that adds the init function for each extension to the auto extension list for new connections, and set the pre-processor symbol SQLITE_EXTRA_INIT to the name of this function. [...]

An example SQLITE_EXTRA_INIT function looks like this:

int core_init(const char* dummy)
{
   int nErr = 0;

   nErr += sqlite3_auto_extension((void*)sqlite3_autobusy_init);
   nErr += sqlite3_auto_extension((void*)sqlite3_ipaddress_init);

   return nErr ? SQLITE_ERROR : SQLITE_OK;
}

so you would then define SQLITE_EXTRA_INIT=core_init when compiling the amalgamation code and the extensions would thereafter be automatically initialized on each connection.