Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 29 additions & 29 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0
with:
components: rustfmt, clippy

Expand Down Expand Up @@ -90,7 +90,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@1.98.1
- uses: dtolnay/rust-toolchain@1.99.0
- uses: actions/cache@v6
with:
path: |
Expand All @@ -112,7 +112,7 @@ jobs:
with:
python-version: '3.14'
- uses: astral-sh/setup-uv@v7
- uses: dtolnay/rust-toolchain@1.98.1
- uses: dtolnay/rust-toolchain@1.99.0
- uses: actions/cache@v6
with:
path: |
Expand Down Expand Up @@ -143,7 +143,7 @@ jobs:
- uses: actions/setup-node@v7
with:
node-version: '22'
- uses: dtolnay/rust-toolchain@1.98.1
- uses: dtolnay/rust-toolchain@1.99.0
- uses: actions/cache@v6
with:
path: |
Expand All @@ -170,7 +170,7 @@ jobs:
with:
go-version: '1.22'
cache: false
- uses: dtolnay/rust-toolchain@1.98.1
- uses: dtolnay/rust-toolchain@1.99.0
- uses: actions/cache@v6
with:
path: |
Expand All @@ -196,7 +196,7 @@ jobs:
- uses: actions/setup-dotnet@v6
with:
dotnet-version: '8.0'
- uses: dtolnay/rust-toolchain@1.98.1
- uses: dtolnay/rust-toolchain@1.99.0
- uses: actions/cache@v6
with:
path: |
Expand Down Expand Up @@ -224,7 +224,7 @@ jobs:
- uses: dart-lang/setup-dart@v1
with:
sdk: stable
- uses: dtolnay/rust-toolchain@1.98.1
- uses: dtolnay/rust-toolchain@1.99.0
- uses: actions/cache@v6
with:
path: |
Expand Down Expand Up @@ -254,7 +254,7 @@ jobs:
- uses: actions/setup-node@v7
with:
node-version: '22'
- uses: dtolnay/rust-toolchain@1.98.1
- uses: dtolnay/rust-toolchain@1.99.0
with:
targets: wasm32-unknown-unknown
- uses: cargo-bins/cargo-binstall@main
Expand Down Expand Up @@ -300,7 +300,7 @@ jobs:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
Expand Down Expand Up @@ -352,7 +352,7 @@ jobs:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
Expand Down Expand Up @@ -421,15 +421,15 @@ jobs:
- profile: enterprise
features: "--features tracing"
engine_features: "--features metrics,tracing,async-storage"
# Full: all features combined (deprecated in 0.6.0, replace with persona combos)
# Full: all features combined (`full` is a deprecated alias, removed in 0.8.0 per #468; use persona combos)
Comment thread
StevenBtw marked this conversation as resolved.
- profile: full
features: "--features lpg,languages,triple-store,algos,parallel,vector-index,text-index,hybrid-search,spill,mmap,regex,jsonl-import,parquet-import"
engine_features: "--features full"
steps:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Install cargo-nextest
uses: taiki-e/install-action@nextest
Expand Down Expand Up @@ -490,11 +490,11 @@ jobs:
miri:
name: Miri UB Check
runs-on: ubuntu-latest
# Pin nightly due to cargo regression in nightly-2026-02-12+
# See: https://github.com/rust-lang/miri/issues/4855
# Remove pin once rust-lang/cargo#16631 lands in nightly
# Pinned nightly, so a Miri change cannot break CI unannounced. Cargo refuses a
# toolchain older than `rust-version`, so the nightly's rustc must be at least
# the MSRV: bump this pin together with `rust-version` in Cargo.toml.
env:
NIGHTLY: nightly-2026-02-11
NIGHTLY: nightly-2026-10-03
steps:
- uses: actions/checkout@v7

Expand Down Expand Up @@ -533,7 +533,7 @@ jobs:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0
with:
components: llvm-tools-preview

Expand Down Expand Up @@ -580,7 +580,7 @@ jobs:
uses: astral-sh/setup-uv@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Cache cargo registry
uses: actions/cache@v6
Expand Down Expand Up @@ -633,7 +633,7 @@ jobs:
node-version: ${{ matrix.node }}

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Cache cargo registry
uses: actions/cache@v6
Expand Down Expand Up @@ -679,7 +679,7 @@ jobs:
cache: false

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Cache cargo registry
uses: actions/cache@v6
Expand Down Expand Up @@ -738,7 +738,7 @@ jobs:
dotnet-version: '8.0'

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Cache cargo registry
uses: actions/cache@v6
Expand Down Expand Up @@ -803,7 +803,7 @@ jobs:
sdk: stable

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Cache cargo registry
uses: actions/cache@v6
Expand Down Expand Up @@ -860,7 +860,7 @@ jobs:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0
with:
targets: wasm32-unknown-unknown

Expand Down Expand Up @@ -908,7 +908,7 @@ jobs:
fetch-depth: 0 # Need full history to checkout base commit

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Cache cargo registry
uses: actions/cache@v6
Expand Down Expand Up @@ -976,7 +976,7 @@ jobs:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Cache cargo registry
uses: actions/cache@v6
Expand Down Expand Up @@ -1024,11 +1024,11 @@ jobs:
- uses: actions/checkout@v7

- name: Install MSRV toolchain
uses: dtolnay/rust-toolchain@1.91.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Check compilation with MSRV
# Explicit `+1.91.1` so rust-toolchain.toml does not override the MSRV toolchain
run: cargo +1.91.1 check --workspace --all-features
# Explicit `+1.99.0` so rust-toolchain.toml does not override the MSRV toolchain
run: cargo +1.99.0 check --workspace --all-features

# Typo detection
typos:
Expand All @@ -1052,7 +1052,7 @@ jobs:
with:
python-version: '3.14'
- uses: astral-sh/setup-uv@v7
- uses: dtolnay/rust-toolchain@1.98.1
- uses: dtolnay/rust-toolchain@1.99.0
- uses: actions/cache@v6
with:
path: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
args: --release --out dist -m crates/bindings/python/Cargo.toml
sccache: "true"
manylinux: auto
rust-toolchain: "1.98.1"
rust-toolchain: "1.99.0"
- name: Upload wheels
uses: actions/upload-artifact@v7
with:
Expand Down Expand Up @@ -58,7 +58,7 @@ jobs:
args: --release --out dist -m crates/bindings/python/Cargo.toml
sccache: "true"
manylinux: musllinux_1_2
rust-toolchain: "1.98.1"
rust-toolchain: "1.99.0"
- name: Upload wheels
uses: actions/upload-artifact@v7
with:
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ jobs:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0
with:
targets: ${{ matrix.target }}

Expand Down Expand Up @@ -206,7 +206,7 @@ jobs:
- uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0

- name: Verify version consistency
run: |
Expand Down Expand Up @@ -305,7 +305,7 @@ jobs:
node-version: '24'

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0
with:
targets: ${{ matrix.target }}

Expand Down Expand Up @@ -419,7 +419,7 @@ jobs:
registry-url: 'https://registry.npmjs.org'

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0
with:
targets: wasm32-unknown-unknown

Expand Down Expand Up @@ -461,7 +461,7 @@ jobs:
registry-url: 'https://registry.npmjs.org'

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@1.98.1
uses: dtolnay/rust-toolchain@1.99.0
with:
targets: wasm32-unknown-unknown

Expand Down
18 changes: 14 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,23 @@

All notable changes to Grafeo, for future reference (and enjoyment).

## [0.5.45] - Unreleased
## [0.6.0] - Unreleased

### Changed

- **Versioning**: before 1.0, a release that changes the file format or breaks the stable surface (the `grafeo` crate, the bindings, the CLI) bumps the minor version, as Cargo and npm expect for `0.x`. This release, first planned as 0.5.45, is 0.6.0 for that reason. See [Versioning and Compatibility](https://grafeo.dev/versioning/).
- **Breaking: the minimum Rust version is 1.99.0** (was 1.91.1).
- **Rust (`grafeo-engine`): `TransactionState::Committing`**: `TransactionManager::state` reports it while a commit is being completed, between its commit epoch and its WAL records.

### Fixed

- **Writes during a commit could land in the middle of it** ([#548](https://github.com/GrafeoDB/grafeo/issues/548)): a direct write, or another transaction writing what the committing one wrote, could hide the committed value from point-in-time reads, remove it on rollback or mark an uncommitted value as committed; a transaction that began during a commit could miss it; and after a crash, two commits could be replayed in the wrong order. A commit now completes before anything that comes after it.

## [0.5.44] - 2026-10-04

Durability and consistency release. Crash-safe checkpoints and WAL recovery, indexes and constraints that survive a reopen, schema checks on every write path, per-graph conflicts and grants, commit and rollback in O(changes), and fixes for shortest paths, variable-length edges, list comprehensions, subqueries, `OPTIONAL MATCH` and `MERGE`. Plus graph handles, upserts by key and write counters.

> **Heads-up: 0.5.45 changes the on-disk format.** 0.5.45 migrates a database automatically on first open (WAL-directory databases become a single `.grafeo` file); after that, 0.5.44 and older can no longer open it, so keep a backup if you may need to go back.
> **Heads-up: 0.6.0 (first announced as 0.5.45) changes the on-disk format.** 0.6.0 migrates a database automatically on first open (WAL-directory databases become a single `.grafeo` file); after that, 0.5.44 and older can no longer open it, so keep a backup if you may need to go back.

### Changed

Expand Down Expand Up @@ -37,7 +47,7 @@ Every query result in the differential test corpus that differs from 0.5.43 is l
- **`DurabilityMode::Adaptive` never synced the WAL**, so it behaved like `NoSync`, and backups missed writes made while they ran; those now land in this backup or the next.
- **Schema changes, constraints and `create_graph()` / `drop_graph()` were lost on WAL replay** ([#421](https://github.com/GrafeoDB/grafeo/issues/421), [#422](https://github.com/GrafeoDB/grafeo/issues/422)). An unknown WAL record now fails the open instead of being skipped.
- **`DROP CONSTRAINT` did nothing** ([#420](https://github.com/GrafeoDB/grafeo/issues/420)). Constraints are now stored by name: `CREATE` and `DROP CONSTRAINT` support `IF NOT EXISTS` / `IF EXISTS`, `SHOW CONSTRAINTS` lists them, and unnamed ones get a name such as `City_name_not_null`. Constraints from 0.5.43 files have no name and cannot be dropped by name.
- **Reopening a `.grafeo` database or `to_memory()` lost its indexes** (lookups on a reopened file scanned every node, [#459](https://github.com/GrafeoDB/grafeo/issues/459)), and `to_memory()` also dropped the schema, constraints and property history. WAL-directory databases still lose their indexes until 0.5.45 ([#401](https://github.com/GrafeoDB/grafeo/issues/401)).
- **Reopening a `.grafeo` database or `to_memory()` lost its indexes** (lookups on a reopened file scanned every node, [#459](https://github.com/GrafeoDB/grafeo/issues/459)), and `to_memory()` also dropped the schema, constraints and property history. WAL-directory databases still lose their indexes until 0.6.0 ([#401](https://github.com/GrafeoDB/grafeo/issues/401)).
- **Rust builds with only the `rdf` profile kept no data across a reopen** ([#544](https://github.com/GrafeoDB/grafeo/issues/544)); the facade's `rdf` profile now includes the LPG store.
- **Embeddings changed while their vector index was spilled reverted on reload** ([#522](https://github.com/GrafeoDB/grafeo/issues/522)).
- **Sessions and direct reads after `compact()` missed parts of the database**: SPARQL writes were lost, CDC missed queries, the selected graph was ignored, and `get_node`, `node_count`, `info()`, `schema()` and similar did not see pre-compaction data (or panicked on a `with_store` database). Queries after `compact()` are still not written to the WAL, so a crash loses them; direct calls are logged.
Expand Down Expand Up @@ -133,7 +143,7 @@ Stabilization release. Fixes for silent wrong results (`ORDER BY` + `LIMIT`, `UN
- **GQL ran only the first statement and ignored the rest** ([#380](https://github.com/GrafeoDB/grafeo/issues/380)): `INSERT ... INSERT ...` (as in the quickstart) created only the first node and `INSERT ... RETURN` ignored its `RETURN`; both now work. Gremlin and Cypher had similar gaps.
- **GQL `^` (power) was not parsed**: `RETURN 2 ^ 10` returned `2`. It now computes the power, binding tighter than `*` and right associative.
- **`ALTER NODE TYPE / ALTER EDGE TYPE ... ADD PROPERTY name TYPE` added a property called `PROPERTY`** of type `name` and dropped the real type; `DROP PROPERTY name` dropped the wrong property. `PROPERTY` is now an optional keyword.
- **Databases over the storage format's limits were written corrupt** ([#392](https://github.com/GrafeoDB/grafeo/issues/392)): an LPG section over 4 GiB or 65,535 blocks, or over 65,535 labels on one node or versions of one property, wrapped a size field, and the file failed to open with `CRC mismatch`. Such a checkpoint now fails with an error naming the limit and keeps the sidecar WAL, so nothing is lost. Larger sections are planned for 0.5.45.
- **Databases over the storage format's limits were written corrupt** ([#392](https://github.com/GrafeoDB/grafeo/issues/392)): an LPG section over 4 GiB or 65,535 blocks, or over 65,535 labels on one node or versions of one property, wrapped a size field, and the file failed to open with `CRC mismatch`. Such a checkpoint now fails with an error naming the limit and keeps the sidecar WAL, so nothing is lost. Larger sections are planned for 0.6.0.
- **Rolling back a transaction on a persistent database did not undo `SET`, `REMOVE` or label changes**, and single-file databases wrote them to disk on `close()`.
- **`ORDER BY ... LIMIT` over a whole-node `RETURN` returned raw NodeIds** instead of node maps, both for property sort keys ([#335](https://github.com/GrafeoDB/grafeo/issues/335)) and for expression keys such as `text_score(...)`, `CASE` or arithmetic ([#347](https://github.com/GrafeoDB/grafeo/issues/347)). ([#337](https://github.com/GrafeoDB/grafeo/pull/337), [#349](https://github.com/GrafeoDB/grafeo/pull/349), [@temporaryfix](https://github.com/temporaryfix))
- **Duplicate column names silently lost data** ([#371](https://github.com/GrafeoDB/grafeo/issues/371)), e.g. `RETURN id(s), id(t)`. Distinct expressions now get distinct names, and a result that would still repeat a name is an error asking for an alias; in SPARQL, an `AS ?x` that repeats a projected or bound name is a parse error. ([#372](https://github.com/GrafeoDB/grafeo/pull/372), [@teipsum](https://github.com/teipsum); [#350](https://github.com/GrafeoDB/grafeo/pull/350), [@temporaryfix](https://github.com/temporaryfix))
Expand Down
15 changes: 14 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ cd grafeo
cargo build --workspace
```

You'll need **Rust 1.91.1+** and optionally **Python 3.12+** / **Node.js 20+** for the bindings.
You'll need **Rust 1.99.0+** and optionally **Python 3.12+** / **Node.js 20+** for the bindings.

## Branching

Expand Down Expand Up @@ -170,6 +170,19 @@ npm run build
npm test
```

## Versioning

Grafeo follows the rules in [Versioning and Compatibility](https://grafeo.dev/versioning/). In short, for a
pull request:

- A breaking change to the stable surface (the `grafeo` crate and its re-exports, the bindings, the CLI, the file
format) or a higher minimum Rust version goes into a minor release (`0.6` to `0.7`). Mark its CHANGELOG entry
**Breaking**; patch releases have none.
- Changes inside the implementation crates (`grafeo-common`, `grafeo-core`, `grafeo-storage`, `grafeo-adapters`,
`grafeo-engine`) that do not reach the stable surface can go into any release.
- Bug fixes go into patch releases, also when they change query results.
- Deprecate before removing: name the replacement, and remove it at the earliest in the next minor release.

## Ecosystem Projects

These companion projects live in separate repositories under the [GrafeoDB](https://github.com/GrafeoDB) organization:
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ members = [
[workspace.package]
version = "0.5.44"
edition = "2024"
rust-version = "1.91.1"
rust-version = "1.99.0"
license = "Apache-2.0"
repository = "https://github.com/GrafeoDB/grafeo"
authors = ["S.T. Grond"]
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
[![Web](https://img.shields.io/npm/v/@grafeo-db/web.svg?label=web&color=7c4dff)](https://www.npmjs.com/package/@grafeo-db/web)
[![Server](https://img.shields.io/github/v/release/GrafeoDB/grafeo-server?label=server&color=7c4dff)](https://github.com/GrafeoDB/grafeo-server)
[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
[![MSRV](https://img.shields.io/badge/MSRV-1.91.1-blue)](https://www.rust-lang.org)
[![MSRV](https://img.shields.io/badge/MSRV-1.99.0-blue)](https://www.rust-lang.org)
[![Python](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org)
[![Discord](https://img.shields.io/badge/Discord-join-5865F2?logo=discord&logoColor=white)](https://discord.gg/nqU6RUVaxW)

Expand Down
2 changes: 1 addition & 1 deletion crates/bindings/c/src/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2399,7 +2399,7 @@ mod tests {
assert!(!v.is_null());
// SAFETY: Static string, always valid.
let version_str = unsafe { std::ffi::CStr::from_ptr(v) }.to_str().unwrap();
assert!(!version_str.is_empty());
assert!(!version_str.is_empty(), "version_str is empty");
}

// ── Edge property CRUD ──
Expand Down
Loading
Loading