+```
+
+Set it in your Xcode project under **Build Settings → Objective-C Bridging Header**.
+
+### Step 2: Swift Code to Load Extension
+
+```swift
+import Foundation
+import SQLite3
+
+let dbPath = ":memory:" // or a real file path
+var db: OpaquePointer?
+
+if sqlite3_open(dbPath, &db) != SQLITE_OK {
+ fatalError("Failed to open database")
+}
+
+// Enable loading extensions
+if sqlite3_enable_load_extension(db, 1) != SQLITE_OK {
+ let err = String(cString: sqlite3_errmsg(db))
+ fatalError("Enable extension loading failed: \(err)")
+}
+
+// Load the extension
+let extensionPath = Bundle.main.path(forResource: "my_extension", ofType: "dylib")!
+if sqlite3_load_extension(db, extensionPath, nil, nil) != SQLITE_OK {
+ let err = String(cString: sqlite3_errmsg(db))
+ fatalError("Extension loading failed: \(err)")
+}
+
+print("Extension loaded successfully.")
+```
+
+> ⚠️ Gatekeeper may block unsigned `.dylib` files. You might need to codesign or use `spctl --add`.
+
+## Python on macOS
+
+The default Python on macOS doesn't support loading SQLite extensions.
+Install Python from the official package or use Homebrew Python instead:
+
+```bash
+brew install python
+```
+
+Verify that you are using the Homebrew-installed `python3` by running:
+
+```bash
+which python3
+
+# /opt/homebrew/bin/python3
+```
+
+After installing Python with Homebrew, the `python` command now uses the Homebrew version.
+You can now load SQLite extensions in Python as shown here.
+
+```python
+import sqlite3
+import os
+
+# Path to your compiled extension (.dylib for macOS/iOS)
+EXTENSION_PATH = os.path.abspath("cloudsync")
+
+# Connect to SQLite and enable extension loading
+conn = sqlite3.connect(":memory:")
+conn.enable_load_extension(True)
+
+# Load the extension
+try:
+ conn.load_extension(EXTENSION_PATH)
+ print("Extension loaded successfully.")
+except sqlite3.OperationalError as e:
+ print(f"Failed to load extension: {e}")
+
+conn.enable_load_extension(False)
+
+# Optionally test it (e.g., call a custom SQL function)
+cursor = conn.execute("SELECT cloudsync_version();")
+print(cursor.fetchone())
+```
+
+## Usage Example
+
+Check out the Swift Multiplatform app for a complete implementation of using the SQLite CloudSync extension to sync data across devices.
diff --git a/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/react-native-expo.md b/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/react-native-expo.md
new file mode 100644
index 0000000..fe9c73e
--- /dev/null
+++ b/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/react-native-expo.md
@@ -0,0 +1,169 @@
+---
+title: "React Native - Expo Quick Start Guide"
+description: SQLite Sync is a multi-platform extension that brings a true local-first experience to your applications with minimal effort.
+category: platform
+status: publish
+slug: sqlite-sync-quick-start-expo
+---
+
+This guide shows how to integrate CloudSync extensions in Expo and React Native applications using OP-SQLite.
+
+## Getting Started
+
+Before setting up SQLite extensions, you'll need to create and initialize your project:
+
+### Create a New Expo Project
+
+```bash
+# Create a new project
+npx create-expo-app MyApp
+
+# Or use our pre-configured template with SQLite extensions
+npx create-expo-app MyApp --template @sqliteai/todoapp
+```
+
+### Initialize for Native Code
+
+Since SQLite extensions require native code, you must initialize your project:
+
+```bash
+cd MyApp
+npx expo prebuild
+```
+
+> **Important**: This setup requires native code generation. Run `npx expo prebuild` after any changes to native dependencies or extension files.
+
+## Android Setup
+
+### Step 1: Download Android Extension
+
+1. Go to sqlite-sync releases
+2. Download your preferred .zip architecture releases:
+ - arm64-v8a - Modern 64-bit ARM devices (recommended for most users)
+ - x86_64 - 64-bit x86 emulators and Intel-based devices
+
+### Step 2: Place Extension Files
+
+Extract the `.so` files in the following directory structure:
+
+```
+/android
+ /app
+ /src
+ /main
+ /jniLibs
+ /arm64-v8a
+ cloudsync.so
+ /x86_64
+ cloudsync.so
+```
+
+> **Note:** Create the `jniLibs` directory structure if it doesn't exist.
+
+## iOS Setup
+
+### Step 1: Download iOS Extension
+
+1. Go to sqlite-sync releases
+2. Download the `cloudsync-apple-xcframework-*.zip`
+3. Extract `CloudSync.xcframework`
+
+### Step 2: Add Framework to Project
+
+1. Place the framework in your project:
+
+ ```
+ /ios
+ /[app-name]
+ /Frameworks
+ /CloudSync.xcframework
+ ```
+
+2. **Open Xcode:**
+
+ - Open Existing Project → Select your Expo app's `ios` folder
+ - Click on your app name (top left, with Xcode logo)
+
+3. **Configure Target:**
+
+ - Go to **Targets** → **[app-name]** → **General** tab
+ - Scroll down to **"Frameworks, Libraries, and Embedded Content"**
+ - Click **"+"** → **"Add Other…"** → **"Add Files…"**
+ - Select `/ios/[app-name]/Frameworks/CloudSync.xcframework`
+
+4. **Set Embed Options:**
+
+ - Ensure the **"Embed"** column shows either:
+ - **"Embed & Sign"** (recommended)
+ - **"Embed Without Signing"**
+
+5. **Verify Build Phases:**
+
+ - Go to **"Build Phases"** tab
+ - Check that **"Embed Frameworks"** section contains **CloudSync**
+
+6. Close Xcode
+
+## Install OP-SQLite
+
+### For React Native:
+
+```bash
+npm install @op-engineering/op-sqlite
+npx pod-install
+```
+
+### For Expo:
+
+```bash
+npx expo install @op-engineering/op-sqlite
+npx expo prebuild
+```
+
+## Implementation
+
+### Basic Setup
+
+```javascript
+import { getDylibPath, open } from "@op-engineering/op-sqlite";
+import { Platform } from "react-native";
+
+// Open database connection
+const db = open({ name: "to-do-app" });
+```
+
+### Load Extension
+
+```javascript
+const loadCloudSyncExtension = async () => {
+ let extensionPath;
+
+ console.log("Loading CloudSync extension...");
+
+ try {
+ if (Platform.OS === "ios") {
+ extensionPath = getDylibPath("ai.sqlite.cloudsync", "CloudSync");
+ } else {
+ extensionPath = "cloudsync";
+ }
+
+ // Load the extension
+ db.loadExtension(extensionPath);
+
+ // Verify extension loaded successfully
+ const version = await db.execute("SELECT cloudsync_version();");
+ console.log(
+ `CloudSync extension loaded successfully, version: ${version.rows[0]["cloudsync_version()"]}`
+ );
+
+ return true;
+ } catch (error) {
+ console.error("Error loading CloudSync extension:", error);
+ return false;
+ }
+};
+```
+
+## Usage Example
+
+Check out the Expo to-do-app for comprehensive usage examples and best practices.
diff --git a/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/wasm.md b/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/wasm.md
new file mode 100644
index 0000000..18c84d4
--- /dev/null
+++ b/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/wasm.md
@@ -0,0 +1,100 @@
+---
+title: "WASM Quick Start Guide"
+description: SQLite Sync is a multi-platform extension that brings a true local-first experience to your applications with minimal effort.
+category: platform
+status: publish
+slug: sqlite-sync-quick-start-wasm
+---
+
+1. Install the WebAssembly (WASM) version of SQLite with the SQLite Sync extension enabled from npm:
+
+ ```bash
+ npm install @sqliteai/sqlite-wasm
+ ```
+
+2. Create an HTML file that imports the SQLite WASM module using an import map and references the JavaScript loader:
+
+ ```html
+
+
+
+
+
+ SQLite WASM Extension Example
+
+
+ SQLite WASM with SQLite Sync Example
+ Open the directory in the terminal and type: npx serve .
+ Check the browser console for output.
+
+
+
+
+
+ ```
+
+3. Create the JavaScript file (load_extension.js) that initializes the SQLite WASM worker and verifies the extension is loaded:
+
+ ```javascript
+ /**
+ * This example uses the package `@sqliteai/sqlite-wasm`.
+ * This version of SQLite WASM is bundled with SQLite Sync and SQLite Vector extensions.
+ * Extensions cannot be loaded at runtime in the browser environment.
+ *
+ * Run: `npx serve .`
+ */
+
+ import { sqlite3Worker1Promiser } from '@sqliteai/sqlite-wasm';
+
+ const log = console.log;
+ const error = console.error;
+
+ const initializeSQLite = async () => {
+ try {
+ log('Loading and initializing SQLite3 module with sqlite-sync extension...');
+
+ const promiser = await new Promise((resolve) => {
+ const _promiser = sqlite3Worker1Promiser({
+ onready: () => resolve(_promiser),
+ });
+ });
+
+ const configResponse = await promiser('config-get', {});
+ log('Running SQLite3 version', configResponse.result.version.libVersion);
+
+ const openResponse = await promiser('open', {
+ filename: 'file:mydb.sqlite3',
+ });
+ const { dbId } = openResponse;
+
+ await promiser('exec', {
+ dbId,
+ sql: 'SELECT cloudsync_version();', // or vector_version()
+ callback: (result) => {
+ if (!result.row) {
+ return;
+ }
+ log('Include SQLite Sync version: ', result.row[0]);
+ }
+ });
+
+ } catch (err) {
+ if (!(err instanceof Error)) {
+ err = new Error(err.result.message);
+ }
+ error(err.name, err.message);
+ }
+ };
+
+ initializeSQLite();
+ ```
+
+## Usage Example
+
+Check out the React/Vite app for a complete implementation of using the SQLite CloudSync extension to sync data across devices.
diff --git a/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/windows.md b/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/windows.md
new file mode 100644
index 0000000..1397ad9
--- /dev/null
+++ b/sqlite-cloud/sqlite-ai/sqlite-sync/quick-starts/windows.md
@@ -0,0 +1,227 @@
+---
+title: Windows Quick Start
+description: SQLite Sync is a multi-platform extension that brings a true local-first experience to your applications with minimal effort.
+category: platform
+status: publish
+slug: sqlite-sync-quick-start-windows
+---
+
+This guide explains how to install SQLite on Windows with support for loading extensions.
+
+## Using SQLite with Python
+
+1. **Download Python**
+
+ Get the latest Python for Windows from python.org.
+
+2. **Install Python**
+
+ - Run the installer.
+ - Make sure to check **"Add Python to PATH"**.
+ - SQLite comes bundled with Python, no extra steps needed.
+
+3. **Check your installation**
+ Open Command Prompt and run:
+
+ ```bash
+ python --version
+ python -c "import sqlite3; print('SQLite version:', sqlite3.sqlite_version)"
+ ```
+
+4. **Download the Extension**
+
+ Go to sqlite-sync releases and download the extension.
+
+5. **Load Extension**
+ ```python
+ import sqlite3
+ import os
+
+ # Path to your compiled extension (.dll for Windows)
+ EXTENSION_PATH = os.path.abspath("cloudsync")
+
+ # Connect to SQLite and enable extension loading
+ conn = sqlite3.connect(":memory:")
+ conn.enable_load_extension(True)
+
+ # Load the extension
+ try:
+ conn.load_extension(EXTENSION_PATH)
+ print("Extension loaded successfully.")
+ except sqlite3.OperationalError as e:
+ print(f"Failed to load extension: {e}")
+
+ conn.enable_load_extension(False)
+
+ # Optionally test it (e.g., call a custom SQL function)
+ cursor = conn.execute("SELECT cloudsync_version();")
+ print(cursor.fetchone())
+ ```
+
+## Using SQLite with C#
+
+This guide shows how to load a native SQLite extension (e.g., **`cloudsync.dll`**) from a C# app on **Windows** using **`Microsoft.Data.Sqlite`**.
+
+### Prerequisites
+
+- Windows x64
+- .NET 6+ SDK
+- NuGet package manager
+- The native extension file: `cloudsync.dll` (x64 build) - download from sqlite-sync releases
+
+> **Important:** Your app, `e_sqlite3.dll` (bundled by `Microsoft.Data.Sqlite`), and `cloudsync.dll` must all be the **same architecture** (typically x64).
+
+---
+
+### 1. Install the SQLite package
+
+Install the `Microsoft.Data.Sqlite` NuGet package:
+
+```bash
+dotnet add package Microsoft.Data.Sqlite
+```
+
+### 2. Set up your project structure
+
+Place `cloudsync.dll` in your project and configure it to copy to the output folder.
+
+Example directory structure:
+
+```
+MyApp/
+ Program.cs
+ Native/
+ cloudsync.dll
+ MyApp.csproj
+```
+
+Configure your `MyApp.csproj` file:
+
+```xml
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+```
+
+### 3. Load the extension in your code
+
+Create your `Program.cs` file to initialize SQLite and load the extension:
+
+```csharp
+using System;
+using Microsoft.Data.Sqlite;
+
+class Program
+{
+ static void Main()
+ {
+ // Configure the database connection
+ var cs = new SqliteConnectionStringBuilder
+ {
+ DataSource = "example.db",
+ Mode = SqliteOpenMode.ReadWriteCreate
+ }.ToString();
+
+ using var conn = new SqliteConnection(cs);
+ conn.Open();
+
+ // Enable extension loading
+ conn.EnableExtensions();
+
+ // Load the native extension (DLL must be next to the EXE or on PATH)
+ // You can pass an absolute path if you prefer
+ conn.LoadExtension("cloudsync");
+
+ // Verify SQLite is working
+ using var cmd = conn.CreateCommand();
+ cmd.CommandText = "SELECT sqlite_version();";
+ Console.WriteLine("SQLite version: " + cmd.ExecuteScalar());
+
+ // Verify the extension is loaded
+ cmd.CommandText = "SELECT cloudsync_version();";
+ Console.WriteLine("cloudsync_version(): " + cmd.ExecuteScalar());
+ }
+}
+```
+
+### 4. Run your application
+
+Build and run your application:
+
+```bash
+dotnet build
+dotnet run
+```
+
+You should see output similar to:
+
+```
+SQLite version: 3.45.0
+cloudsync_version(): 1.0.0
+```
+
+#### Extension search locations
+
+SQLite searches for extensions in this order:
+
+1. Process working directory
+2. Application base directory (where your .exe lives)
+3. PATH environment variable directories
+4. Full path provided to `LoadExtension(...)`
+
+> **Tip:** For most apps, simply copying the DLL to the output folder (next to your .exe) is sufficient.
+
+---
+
+### Common issues and solutions
+
+**SqliteException: not authorized**
+
+- **Cause:** Extension loading not enabled
+- **Fix:** Call `conn.EnableExtensions()` before loading
+
+**SqliteException: The specified module could not be found**
+
+- **Cause:** DLL not in search path or missing dependencies
+- **Fix:** Place DLL next to .exe, use absolute path, or ensure dependencies are available
+
+**BadImageFormatException**
+
+- **Cause:** Architecture mismatch (e.g., mixing x86 and x64)
+- **Fix:** Ensure app, `e_sqlite3.dll`, and `cloudsync.dll` are all the same architecture
+
+**EntryPointNotFoundException**
+
+- **Cause:** DLL is not a valid SQLite extension
+- **Fix:** Verify the extension exports `sqlite3_extension_init`
+
+**Windows "blocked" DLL**
+
+- **Cause:** Downloaded DLL is blocked by Windows
+- **Fix:** Right-click → Properties → Check "Unblock" → OK
+
+---
+
+### Deployment
+
+When publishing your app, ensure the extension is included:
+
+```bash
+dotnet publish -c Release -r win-x64 --self-contained false
+```
diff --git a/sqlite-cloud/sqlite-ai/sqlite-vector.mdx b/sqlite-cloud/sqlite-ai/sqlite-vector.mdx
index 4a0fd31..fce48c8 100644
--- a/sqlite-cloud/sqlite-ai/sqlite-vector.mdx
+++ b/sqlite-cloud/sqlite-ai/sqlite-vector.mdx
@@ -6,8 +6,8 @@ status: publish
slug: sqlite-vector
---
-[SQLite-Vector](https://website-stage.sqlitecloud.io/sqlite-vector) is a cross-platform, ultra-efficient SQLite extension that brings vector search capabilities directly into your embedded database
+SQLite-Vector is a cross-platform, ultra-efficient SQLite extension that brings vector search capabilities directly into your embedded database
Whether you're dealing with **millions of high-dimensional vectors** or operating on resource-constrained edge devices, SQLite-Vector delivers **lightning-fast performance** with a **tiny memory footprint**.
-**SQLite-Vector** is an open-source project available on [GitHub](https://github.com/sqliteai/sqlite-vector).
\ No newline at end of file
+**SQLite-Vector** is an open-source project available on GitHub.
\ No newline at end of file
diff --git a/sqlite-cloud/tutorials/tutorial-geopoly.mdx b/sqlite-cloud/tutorials/tutorial-geopoly.mdx
index e26b41a..0c75a9e 100644
--- a/sqlite-cloud/tutorials/tutorial-geopoly.mdx
+++ b/sqlite-cloud/tutorials/tutorial-geopoly.mdx
@@ -6,11 +6,11 @@ status: publish
slug: tutorial-geopoly
---
-In this tutorial you will build a local attractions finder map-plication using GeoJSON data, a SQLite Cloud database, [Mapbox GL JS](https://docs.mapbox.com/mapbox-gl-js/guides) (JavaScript Graphics Library), React, and SQLite's built-in [Geopoly extension](https://devdocs.io/sqlite/geopoly).
+In this tutorial you will build a local attractions finder map-plication using GeoJSON data, a SQLite Cloud database, Mapbox GL JS (JavaScript Graphics Library), React, and SQLite's built-in Geopoly extension.
**Time to complete: 15-20 mins.**
-If you get stuck in the tutorial or prefer to play with the finished product, check out [the example app on GitHub](https://github.com/sqlitecloud/examples/tree/main/geopoly-demo).
+If you get stuck in the tutorial or prefer to play with the finished product, check out the example app on GitHub.
---
@@ -25,9 +25,9 @@ npm init -y
**2. Curate your GeoJSON data**
- - We will leverage the [Overpass API](https://wiki.openstreetmap.org/wiki/Overpass_API) (an open-source, read-only API for fetching OpenStreetMap data) to query NY attractions.
+ - We will leverage the Overpass API (an open-source, read-only API for fetching OpenStreetMap data) to query NY attractions.
- - Visit [Overpass Turbo](https://overpass-turbo.eu/), the Overpass GUI. Copy and paste in the below query, which:
+ - Visit Overpass Turbo, the Overpass GUI. Copy and paste in the below query, which:
- defines New York as the area of interest;
- fetches nodes in the specified area that are tagged with the keys `amenity`, `historic`, `tourism`, `leisure`, etc.; and
- outputs the data.
@@ -106,13 +106,13 @@ out skel qt;
**3. Create a new SQLite Cloud database**
- - If you haven't already, [sign up for a SQLite Cloud account](https://dashboard.sqlitecloud.io/auth/sign-in) and create a new project.
+ - If you haven't already, sign up for a SQLite Cloud account and create a new project.
- In your account dashboard's left nav, click Databases, then Create Database. Name your new database `geopoly-demo`.
**4. Create a Mapbox account**
- - [Sign up](https://account.mapbox.com/auth/signup/) for an Individual Mapbox account. (We'll stay on the free tier.)
+ - Sign up for an Individual Mapbox account. (We'll stay on the free tier.)
**5. Set your environment variables**
@@ -350,7 +350,7 @@ body {
}
```
- - NOTE: To simplify this tutorial, `.marker.background-image` uses a custom Mapbox marker for the pins marking attractions on the map. [The example app on GitHub](https://github.com/sqlitecloud/examples/tree/main/geopoly) uses a custom marker image included in the repo's `images` dir (excluded here).
+ - NOTE: To simplify this tutorial, `.marker.background-image` uses a custom Mapbox marker for the pins marking attractions on the map. The example app on GitHub uses a custom marker image included in the repo's `images` dir (excluded here).
`index.js`
```js
@@ -787,7 +787,7 @@ npm start
- On app load, the map is centered on Central Park, NY.
- - In the geocoder (i.e. search input) at the top right of the map, enter "Empire" and click on the "Empire State Building" result. You can also search coordinates (see [reverse geocoding](https://docs.mapbox.com/api/search/geocoding/)).
+ - In the geocoder (i.e. search input) at the top right of the map, enter "Empire" and click on the "Empire State Building" result. You can also search coordinates (see reverse geocoding).
- When you select a geocoder result:
- a polygon is generated by Geopoly, added to your `polygons` table, and displayed on the map; and
@@ -806,17 +806,17 @@ SELECT rowid, geopoly_json(_shape) FROM polygons;
- You can click on any attraction listing or marker to fly/ zoom to and center on that attraction on the map.
- - [Turf.js uses the Haversine formula](https://turfjs.org/docs/api/distance) to account for global curvature when calculating the distance between your searched location and each attraction. However, you should still expect discrepancies between this app's calculated distances vs, say, Google or Apple Maps.
+ - Turf.js uses the Haversine formula to account for global curvature when calculating the distance between your searched location and each attraction. However, you should still expect discrepancies between this app's calculated distances vs, say, Google or Apple Maps.
And that’s it! You’ve successfully built a local attractions finder app that utilizes Geopoly to write geodata to and read from a SQLite Cloud database.
### Additional Guidance on Overpass:
- - To fetch other attractions or any other kind of location data in NY or another area of interest to you, refer to [OpenStreetMap's Map features documentation](https://wiki.openstreetmap.org/wiki/Map_features). As a starting point, modify the area or key-value pairs in the NY query.
+ - To fetch other attractions or any other kind of location data in NY or another area of interest to you, refer to OpenStreetMap's Map features documentation. As a starting point, modify the area or key-value pairs in the NY query.
- - NOTE: The app works only with Point features (represented in the [Map features](https://wiki.openstreetmap.org/wiki/Map_features) tables' `Element` columns by an icon with a single dot). Be sure to query only nodes and the key-value pairs that can return Point data. For example, don't use most of the values available for the Boundary key.
+ - NOTE: The app works only with Point features (represented in the Map features tables' `Element` columns by an icon with a single dot). Be sure to query only nodes and the key-value pairs that can return Point data. For example, don't use most of the values available for the Boundary key.
- - To implement more complex or granular Point queries, refer to the [Overpass QL documentation](https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL).
+ - To implement more complex or granular Point queries, refer to the Overpass QL documentation.
- If you run a custom Overpass query:
- Add to or replace the FeatureCollection in `geodata.json`.
@@ -824,4 +824,4 @@ And that’s it! You’ve successfully built a local attractions finder app that
- Create Database with the same name.
- From your project dir, run `npm run create-tables`. Your database tables will be re-created, and the `attractions` table will be populated with your updated geodata.
- - If you queried and stored attractions near your location, then after the app's initial load, click on the [GeolocateControl icon](https://docs.mapbox.com/mapbox-gl-js/example/locate-user/) at the top right of the map and allow the browser to quickly center the map on your location. Search away!
\ No newline at end of file
+ - If you queried and stored attractions near your location, then after the app's initial load, click on the GeolocateControl icon at the top right of the map and allow the browser to quickly center the map on your location. Search away!
\ No newline at end of file
diff --git a/sqlite/json1.md b/sqlite/json1.md
index 5ebf204..5085945 100644
--- a/sqlite/json1.md
+++ b/sqlite/json1.md
@@ -10,8 +10,8 @@ status: publish
## 1. Overview
By default, SQLite supports twenty-nine functions and two operators for
-dealing with JSON values. There are also two [table-valued
-functions](https://sqlite.org/vtab.html#tabfunc2) that can be used to
+dealing with JSON values. There are also two table-valued
+functions that can be used to
decompose a JSON string.
There are 25 scalar functions and operators:
@@ -52,7 +52,7 @@ There are four [aggregate SQL functions](lang_aggfunc.html):
3. [json_group_object](#jgroupobject)(*label*,*value*)
4. [jsonb_group_object](#jgroupobjectb)(name,*value*)
-The two [table-valued functions](https://sqlite.org/vtab.html#tabfunc2)
+The two table-valued functions
are:
1. [json_each](#jeach)(*json*)
@@ -91,11 +91,11 @@ function will usually throw an error. (Exceptions to this rule are
[json_valid()](json1#jvalid), [json_quote()](json1#jquote), and
[json_error_position()](json1#jerr).)
-These routines understand all [rfc-8259 JSON
-syntax](https://www.rfc-editor.org/rfc/rfc8259.txt) and also [JSON5
-extensions](https://spec.json5.org/). JSON text generated by these
-routines always strictly conforms to the [canonical JSON
-definition](https://json.org) and does not contain any JSON5 or other
+These routines understand all rfc-8259 JSON
+syntax and also JSON5
+extensions. JSON text generated by these
+routines always strictly conforms to the canonical JSON
+definition and does not contain any JSON5 or other
extensions. The ability to read and understand JSON5 was added in
version 3.42.0 (2023-05-16). Prior versions of SQLite would only read
canonical JSON.
@@ -126,7 +126,7 @@ JSONB is a binary representation of JSON used by SQLite and is intended
for internal use by SQLite only. Applications should not use JSONB
outside of SQLite nor try to reverse-engineer the JSONB format.
-The "JSONB" name is inspired by [PostgreSQL](https://postgresql.org),
+The "JSONB" name is inspired by PostgreSQL,
but the on-disk format for SQLite's JSONB is not the same as
PostgreSQL's. The two formats have the same name, but are not binary
compatible. The PostgreSQL JSONB format claims to offer O(1) lookup of
@@ -240,19 +240,19 @@ The current implementation of this JSON library uses a recursive descent
parser. In order to avoid using excess stack space, any JSON input that
has more than 1000 levels of nesting is considered invalid. Limits on
nesting depth are allowed for compatible implementations of JSON by
-[RFC-8259 section 9](https://tools.ietf.org/html/rfc8259#section-9).
+RFC-8259 section 9.
## 3.6. JSON5 Extensions
Beginning in version 3.42.0 (2023-05-16), these routines will read and
-interpret input JSON text that includes [JSON5](https://spec.json5.org/)
+interpret input JSON text that includes JSON5
extensions. However, JSON text generated by these routines will always
-be strictly conforming to the [canonical definition of
-JSON](https://json.org).
+be strictly conforming to the canonical definition of
+JSON.
-Here is a synopsis of JSON5 extensions (adapted from the [JSON5
-specification](https://spec.json5.org/#introduction)):
+Here is a synopsis of JSON5 extensions (adapted from the JSON5
+specification):
- Object keys may be unquoted identifiers.
- Objects may have a single trailing comma.
@@ -699,7 +699,7 @@ is returned in the binary JSONB format.
## 4.14. The json_patch() function
The json_patch(T,P) SQL function runs the
-[RFC-7396](https://tools.ietf.org/html/rfc7396) MergePatch algorithm to
+RFC-7396 MergePatch algorithm to
apply patch P against input T. The patched copy of T is returned.
MergePatch can add, modify, or delete elements of a JSON Object, and so
@@ -919,8 +919,8 @@ the same except that they return their result in the binary
## 4.22. The json_each() and json_tree() table-valued functions
-The json_each(X) and json_tree(X) [table-valued
-functions](https://www.sqlite.org/vtab.html#tabfunc2) walk the JSON
+The json_each(X) and json_tree(X) table-valued
+functions walk the JSON
value provided as their first argument and return one row for each
element. The json_each(X) function only walks the immediate children of
the top-level array or object, or just the top-level element itself if