sqlrite 0.5.0__tar.gz → 0.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sqlrite-0.5.0 → sqlrite-0.6.0}/Cargo.lock +7 -7
- {sqlrite-0.5.0 → sqlrite-0.6.0}/Cargo.toml +2 -2
- {sqlrite-0.5.0 → sqlrite-0.6.0}/PKG-INFO +1 -1
- {sqlrite-0.5.0 → sqlrite-0.6.0}/README.md +3 -2
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/package.json +1 -1
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/file-format.md +2 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/roadmap.md +1 -1
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/supported-sql.md +3 -4
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/usage.md +2 -2
- {sqlrite-0.5.0 → sqlrite-0.6.0}/pyproject.toml +1 -1
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/python/Cargo.toml +1 -1
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sqlrite-ask/Cargo.toml +1 -1
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/db/table.rs +179 -149
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/executor.rs +144 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/mod.rs +227 -4
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/mod.rs +195 -26
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/overflow.rs +84 -2
- sqlrite-0.6.0/src/sql/parser/insert.rs +124 -0
- sqlrite-0.5.0/src/sql/parser/insert.rs +0 -107
- {sqlrite-0.5.0 → sqlrite-0.6.0}/.github/workflows/ci.yml +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/.github/workflows/release-pr.yml +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/.github/workflows/release.yml +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/.github/workflows/rust.yml +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/.gitignore +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/CLAUDE.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/CODE_OF_CONDUCT.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/LICENSE +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/MAINTAINERS +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/Makefile +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/index.html +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/package-lock.json +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/src/App.svelte +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/src/app.css +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/src/main.ts +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/src/vite-env.d.ts +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/svelte.config.js +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/tsconfig.json +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/desktop/vite.config.ts +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/_index.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/architecture.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/ask-backend-examples.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/ask.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/design-decisions.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/desktop.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/embedding.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/fts.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/getting-started.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/mcp.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/pager.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/phase-7-plan.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/phase-8-plan.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/release-plan.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/release-secrets.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/smoke-test.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/sql-engine.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/docs/storage-model.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/README.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/c/Makefile +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/c/hello.c +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/go/go.mod +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/go/hello.go +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/hybrid-retrieval/README.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/hybrid-retrieval/hybrid_retrieval.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/nodejs/hello.mjs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/python/hello.py +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/rust/quickstart.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/wasm/Makefile +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/wasm/index.html +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/examples/wasm/server.mjs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/images/SQLRite - Desktop.png +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/images/SQLRite Data Structures.png +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/images/SQLRite Simple SQL Execution High Level Diagram.png +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/images/SQLRite Simple SQL INSERT Execution High Level Diagram (Insert Row).png +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/images/SQLRite Simple SQL INSERT Execution High Level Diagram.png +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/images/SQLRite_logo.png +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/images/architecture.png +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/rust-toolchain.toml +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/samples/AST.delete.example +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/samples/AST.insert.exemple +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/samples/AST.select.example +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/samples/AST.update.example +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/samples/CREATE TABLE sqlrite_schema.sql +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/samples/CREATE_TABLE with duplicate.sql +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/samples/CREATE_TABLE.sql +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/samples/INSERT.sql +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/scripts/bump-version.sh +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/README.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/ask.go +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/ask_test.go +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/conn.go +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/go.mod +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/rows.go +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/sqlrite.go +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/sqlrite_test.go +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/go/stmt.go +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/python/README.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/python/src/lib.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/python/tests/test_ask.py +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sdk/python/tests/test_sqlrite.py +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sqlrite-ask/README.md +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sqlrite-ask/src/lib.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sqlrite-ask/src/prompt.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sqlrite-ask/src/provider/anthropic.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sqlrite-ask/src/provider/mock.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sqlrite-ask/src/provider/mod.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/sqlrite-ask/tests/anthropic_http.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/ask/mod.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/ask/schema.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/connection.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/error.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/lib.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/main.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/meta_command/mod.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/repl/mod.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/db/database.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/db/mod.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/db/secondary_index.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/fts/bm25.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/fts/mod.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/fts/posting_list.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/fts/tokenizer.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/hnsw.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/allocator.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/cell.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/file.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/freelist.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/fts_cell.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/header.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/hnsw_cell.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/index_cell.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/interior_page.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/page.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/pager.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/table_page.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/varint.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/pager/wal.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/parser/create.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/parser/mod.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/parser/select.rs +0 -0
- {sqlrite-0.5.0 → sqlrite-0.6.0}/src/sql/tokenizer.rs +0 -0
|
@@ -3817,7 +3817,7 @@ dependencies = [
|
|
|
3817
3817
|
|
|
3818
3818
|
[[package]]
|
|
3819
3819
|
name = "sqlrite-ask"
|
|
3820
|
-
version = "0.
|
|
3820
|
+
version = "0.6.0"
|
|
3821
3821
|
dependencies = [
|
|
3822
3822
|
"serde",
|
|
3823
3823
|
"serde_json",
|
|
@@ -3828,7 +3828,7 @@ dependencies = [
|
|
|
3828
3828
|
|
|
3829
3829
|
[[package]]
|
|
3830
3830
|
name = "sqlrite-desktop"
|
|
3831
|
-
version = "0.
|
|
3831
|
+
version = "0.6.0"
|
|
3832
3832
|
dependencies = [
|
|
3833
3833
|
"serde",
|
|
3834
3834
|
"serde_json",
|
|
@@ -3840,7 +3840,7 @@ dependencies = [
|
|
|
3840
3840
|
|
|
3841
3841
|
[[package]]
|
|
3842
3842
|
name = "sqlrite-engine"
|
|
3843
|
-
version = "0.
|
|
3843
|
+
version = "0.6.0"
|
|
3844
3844
|
dependencies = [
|
|
3845
3845
|
"clap",
|
|
3846
3846
|
"env_logger",
|
|
@@ -3857,7 +3857,7 @@ dependencies = [
|
|
|
3857
3857
|
|
|
3858
3858
|
[[package]]
|
|
3859
3859
|
name = "sqlrite-ffi"
|
|
3860
|
-
version = "0.
|
|
3860
|
+
version = "0.6.0"
|
|
3861
3861
|
dependencies = [
|
|
3862
3862
|
"cbindgen",
|
|
3863
3863
|
"serde",
|
|
@@ -3867,7 +3867,7 @@ dependencies = [
|
|
|
3867
3867
|
|
|
3868
3868
|
[[package]]
|
|
3869
3869
|
name = "sqlrite-mcp"
|
|
3870
|
-
version = "0.
|
|
3870
|
+
version = "0.6.0"
|
|
3871
3871
|
dependencies = [
|
|
3872
3872
|
"clap",
|
|
3873
3873
|
"libc",
|
|
@@ -3878,7 +3878,7 @@ dependencies = [
|
|
|
3878
3878
|
|
|
3879
3879
|
[[package]]
|
|
3880
3880
|
name = "sqlrite-nodejs"
|
|
3881
|
-
version = "0.
|
|
3881
|
+
version = "0.6.0"
|
|
3882
3882
|
dependencies = [
|
|
3883
3883
|
"napi",
|
|
3884
3884
|
"napi-build",
|
|
@@ -3888,7 +3888,7 @@ dependencies = [
|
|
|
3888
3888
|
|
|
3889
3889
|
[[package]]
|
|
3890
3890
|
name = "sqlrite-python"
|
|
3891
|
-
version = "0.
|
|
3891
|
+
version = "0.6.0"
|
|
3892
3892
|
dependencies = [
|
|
3893
3893
|
"pyo3",
|
|
3894
3894
|
"sqlrite-engine",
|
|
@@ -27,7 +27,7 @@ resolver = "3"
|
|
|
27
27
|
# `package =` key so the import name stays `sqlrite` internally:
|
|
28
28
|
# sqlrite = { package = "sqlrite-engine", path = "…" }
|
|
29
29
|
name = "sqlrite-engine"
|
|
30
|
-
version = "0.
|
|
30
|
+
version = "0.6.0"
|
|
31
31
|
authors = ["Joao Henrique Machado Silva <joaoh82@gmail.com>"]
|
|
32
32
|
edition = "2024"
|
|
33
33
|
rust-version = "1.85"
|
|
@@ -138,4 +138,4 @@ fs2 = { version = "0.4", optional = true }
|
|
|
138
138
|
# crate publishes to crates.io, and a path-only dep without a
|
|
139
139
|
# version field fails the manifest verification step. See PR #58
|
|
140
140
|
# retrospective in docs/roadmap.md.
|
|
141
|
-
sqlrite-ask = { version = "0.
|
|
141
|
+
sqlrite-ask = { version = "0.6.0", path = "sqlrite-ask", optional = true }
|
|
@@ -165,12 +165,13 @@ sqlrite> DELETE FROM users WHERE age < 30;
|
|
|
165
165
|
Expressions in `WHERE` and `UPDATE`'s `SET` RHS:
|
|
166
166
|
|
|
167
167
|
- Comparisons — `=`, `<>`, `<`, `<=`, `>`, `>=`
|
|
168
|
+
- Null tests — `IS NULL`, `IS NOT NULL`
|
|
168
169
|
- Logical — `AND`, `OR`, `NOT` (SQL three-valued logic; NULL-as-false in `WHERE`)
|
|
169
170
|
- Arithmetic — `+`, `-`, `*`, `/`, `%` (integer ops stay integer; any `REAL` promotes to `f64`; divide/modulo by zero is a clean error)
|
|
170
171
|
- String concat — `||`
|
|
171
172
|
- Literals — integer + real numbers, `'single-quoted strings'`, `TRUE` / `FALSE`, `NULL`; parentheses for grouping
|
|
172
173
|
|
|
173
|
-
**Not yet supported** (common ones): joins, subqueries, CTEs, `GROUP BY` / aggregates, `DISTINCT`, `LIKE` / `IN
|
|
174
|
+
**Not yet supported** (common ones): joins, subqueries, CTEs, `GROUP BY` / aggregates, `DISTINCT`, `LIKE` / `IN`, expressions in the projection list, column aliases, `OFFSET`, multi-column `ORDER BY`, savepoints, `ALTER TABLE`, `DROP TABLE`, `DROP INDEX`. The [full list with context](docs/supported-sql.md#not-yet-supported) lives in the reference.
|
|
174
175
|
|
|
175
176
|
#### Meta commands
|
|
176
177
|
|
|
@@ -309,7 +310,7 @@ Lockstep versioning — one dispatch bumps every product to the same `vX.Y.Z`. T
|
|
|
309
310
|
|
|
310
311
|
**Possible extras** *(no committed phase)*
|
|
311
312
|
- Joins (`INNER`, `LEFT OUTER`, `CROSS` — SQLite does not support `RIGHT`/`FULL OUTER`)
|
|
312
|
-
- `GROUP BY`, aggregates (`COUNT`, `SUM`, `AVG`, ...), `DISTINCT`, `LIKE`, `IN
|
|
313
|
+
- `GROUP BY`, aggregates (`COUNT`, `SUM`, `AVG`, ...), `DISTINCT`, `LIKE`, `IN`
|
|
313
314
|
- Composite and expression indexes (with cost analysis)
|
|
314
315
|
- Alternate storage engines — LSM/SSTable for write-heavy workloads alongside the B-Tree
|
|
315
316
|
- Benchmarks against SQLite
|
|
@@ -139,6 +139,8 @@ body variable depends on kind_tag
|
|
|
139
139
|
|
|
140
140
|
The shared prefix means `Cell::peek_rowid` works uniformly across all kinds — useful for binary search over a page's slot directory without decoding full bodies.
|
|
141
141
|
|
|
142
|
+
**Decoder dispatch is per-B-tree, not per-cell.** Each B-Tree owns one cell kind on its leaves: table B-Trees carry `Local`/`Overflow` cells (decoded via `PagedEntry::decode`), secondary-index B-Trees carry `Index` cells (`IndexCell::decode`), HNSW carries `HNSW` cells (`HnswNodeCell::decode`), FTS carries `FTS Posting` cells (`FtsPostingCell::decode`), and every interior node — regardless of the leaf kind below it — carries `Interior` divider cells (`InteriorCell::decode`). Callers must dispatch on the *page's owning B-Tree*, not on the kind tag they happen to see; pointing the wrong decoder at a leaf yields an `Internal` error that names both the offending kind and the B-Tree it belongs to (SQLR-1).
|
|
143
|
+
|
|
142
144
|
### Local cell body
|
|
143
145
|
|
|
144
146
|
```
|
|
@@ -520,7 +520,7 @@ Final docs pass — canonical [`fts.md`](fts.md) reference (mirrors `ask.md`'s s
|
|
|
520
520
|
## "Possible extras" not pinned to a phase
|
|
521
521
|
|
|
522
522
|
- Joins (`INNER`, `LEFT OUTER`, `CROSS`)
|
|
523
|
-
- `GROUP BY`, aggregates (`COUNT`, `SUM`, `AVG`, ...), `DISTINCT`, `LIKE`, `IN
|
|
523
|
+
- `GROUP BY`, aggregates (`COUNT`, `SUM`, `AVG`, ...), `DISTINCT`, `LIKE`, `IN`
|
|
524
524
|
- Composite and expression indexes
|
|
525
525
|
- Alternate storage engines (LSM/SSTable for write-heavy workloads)
|
|
526
526
|
- Benchmarks against SQLite
|
|
@@ -158,7 +158,7 @@ FROM <table>
|
|
|
158
158
|
### What works
|
|
159
159
|
|
|
160
160
|
- **Projection**: `*` (all columns in declaration order) or a bare column list. Columns not declared on the table are rejected.
|
|
161
|
-
- **`WHERE`**: any [expression](#expressions). Evaluated per row; NULL-as-false in WHERE context (three-valued logic collapsed to two-valued for filtering).
|
|
161
|
+
- **`WHERE`**: any [expression](#expressions). Evaluated per row; NULL-as-false in WHERE context (three-valued logic collapsed to two-valued for filtering). Includes **`IS NULL`** / **`IS NOT NULL`** for explicit null tests.
|
|
162
162
|
- **`ORDER BY`**: single sort key, `ASC` (default) or `DESC`. The sort key can be a bare column reference OR any expression — including function calls — so KNN queries like `ORDER BY vec_distance_l2(embedding, [...]) LIMIT k` work end-to-end *(Phase 7b)*. Sort key types must match; mixing `INTEGER` and `TEXT` across rows under a single `ORDER BY` is a runtime error.
|
|
163
163
|
- **`LIMIT`**: non-negative integer literal. `LIMIT 0` is valid (returns zero rows).
|
|
164
164
|
|
|
@@ -172,7 +172,7 @@ The executor includes a tiny optimizer: if the `WHERE` is exactly `<indexed_col>
|
|
|
172
172
|
- **Subqueries**, CTEs (`WITH`), views
|
|
173
173
|
- **`GROUP BY`**, aggregate functions (`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`), `HAVING`
|
|
174
174
|
- **`DISTINCT`**
|
|
175
|
-
- **`LIKE`**, **`IN`**,
|
|
175
|
+
- **`LIKE`**, **`IN`**, `BETWEEN`
|
|
176
176
|
- **Expressions in the projection list** (`SELECT age + 1 FROM users`) — projection is bare column references only
|
|
177
177
|
- **Multi-column `ORDER BY`**, `NULLS FIRST/LAST` (single sort key only; the sort key itself can be an expression as of Phase 7b)
|
|
178
178
|
- **`OFFSET`**
|
|
@@ -382,7 +382,7 @@ See [`docs/fts.md`](fts.md) for the canonical FTS reference (tokenizer rules, BM
|
|
|
382
382
|
|
|
383
383
|
SQLRite follows standard SQL three-valued logic:
|
|
384
384
|
|
|
385
|
-
- **Comparisons involving NULL** (`NULL = 1`, `1 < NULL`) evaluate to unknown, which behaves as `false` inside `WHERE`. Neither the NULL = NULL equality nor the NULL <> NULL inequality is true — use
|
|
385
|
+
- **Comparisons involving NULL** (`NULL = 1`, `1 < NULL`) evaluate to unknown, which behaves as `false` inside `WHERE`. Neither the NULL = NULL equality nor the NULL <> NULL inequality is true — use **`IS NULL`** / **`IS NOT NULL`** for explicit null tests (`SELECT … WHERE col IS NULL`). NULLs are not stored in secondary, HNSW, or FTS indexes, so `IS NULL` always falls through to a full scan; that's correct, just not as fast as an indexed equality probe.
|
|
386
386
|
- **Logical operators with NULL**: `NULL AND false` → `false`, `NULL AND true` → `NULL`, `NULL OR true` → `true`, `NOT NULL` → `NULL`. The short-circuit rules prevent NULL from propagating when one operand already decides the result.
|
|
387
387
|
- **Arithmetic with NULL**: any operand NULL → result NULL. `NULL + 1` → `NULL`.
|
|
388
388
|
- **String concat with NULL**: `'foo' || NULL` → `NULL` (same propagation as arithmetic).
|
|
@@ -503,7 +503,6 @@ For context when you hit `NotImplemented`. See [Roadmap](roadmap.md) for when th
|
|
|
503
503
|
### Predicate & expression
|
|
504
504
|
- `LIKE`, `GLOB`, `REGEXP`
|
|
505
505
|
- `IN (...)`, `NOT IN`, `BETWEEN`
|
|
506
|
-
- `IS NULL`, `IS NOT NULL` (pending — use `col = NULL` is NOT a workaround since it's always false; the only current way to select NULL rows is to rely on the NULL-as-false-in-WHERE behavior being absent when the column isn't referenced)
|
|
507
506
|
- `CASE WHEN ... THEN ... END`
|
|
508
507
|
- Expressions in the `SELECT` projection list
|
|
509
508
|
- Column aliases (`AS`)
|
|
@@ -42,9 +42,9 @@ Quick hits worth knowing when you're working at the REPL:
|
|
|
42
42
|
- **One statement per call.** The REPL / `Connection::execute` expects a single statement; multi-statement strings return `Expected a single query statement, but there are N`. For batch execution use the SDKs' `executescript` / `execute_batch`.
|
|
43
43
|
- **Transactions are real.** `BEGIN` / `COMMIT` / `ROLLBACK` land as expected; auto-save is suppressed inside a transaction and everything flushes in one WAL commit frame on `COMMIT`. No nested transactions yet.
|
|
44
44
|
- **Arithmetic stays honest.** Integer-only operations stay integer; any `REAL` operand promotes to `f64`; divide-by-zero is a typed runtime error, never a panic.
|
|
45
|
-
- **NULL follows three-valued logic.** `NULL = NULL` is unknown (not true) — treated as false in `WHERE`. Use `IS NULL` / `IS NOT NULL`
|
|
45
|
+
- **NULL follows three-valued logic.** `NULL = NULL` is unknown (not true) — treated as false in `WHERE`. Use `IS NULL` / `IS NOT NULL` for explicit null tests, e.g. `SELECT id FROM t WHERE qty IS NULL;`.
|
|
46
46
|
- **Identifiers are case-sensitive** (table / column names; no normalization), but keywords aren't. String literals preserve case.
|
|
47
|
-
- **Not yet supported**: joins, subqueries, `GROUP BY` / aggregates, `DISTINCT`, `LIKE` / `IN
|
|
47
|
+
- **Not yet supported**: joins, subqueries, `GROUP BY` / aggregates, `DISTINCT`, `LIKE` / `IN`, projection expressions, column aliases, `OFFSET`, multi-column `ORDER BY`, savepoints, `ALTER TABLE`, `DROP TABLE`, `DROP INDEX`. See the [full list in the reference](supported-sql.md#not-yet-supported).
|
|
48
48
|
|
|
49
49
|
## History
|
|
50
50
|
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sqlrite"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.6.0"
|
|
8
8
|
description = "Python bindings for SQLRite — a small, embeddable SQLite clone written in Rust."
|
|
9
9
|
authors = [{ name = "Joao Henrique Machado Silva", email = "joaoh82@gmail.com" }]
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
# Published to crates.io as `sqlrite-ask`. Joins the lockstep release
|
|
11
11
|
# wave (`sqlrite-ask-vX.Y.Z` tag) — see `docs/release-plan.md`.
|
|
12
12
|
name = "sqlrite-ask"
|
|
13
|
-
version = "0.
|
|
13
|
+
version = "0.6.0"
|
|
14
14
|
authors = ["Joao Henrique Machado Silva <joaoh82@gmail.com>"]
|
|
15
15
|
edition = "2024"
|
|
16
16
|
rust-version = "1.85"
|