From 873356e03c0bff3636269ece49cc6535d977c3f7 Mon Sep 17 00:00:00 2001 From: Vlasta Date: Wed, 17 Jun 2026 14:23:18 +0200 Subject: [PATCH 1/6] Add Memgraph v3.12.0 and Lab v3.12.0 release note titles Co-authored-by: Cursor --- pages/release-notes.mdx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pages/release-notes.mdx b/pages/release-notes.mdx index 9b2d57b16..4242822f7 100644 --- a/pages/release-notes.mdx +++ b/pages/release-notes.mdx @@ -46,6 +46,14 @@ guide. ## 🚀 Latest release +### Memgraph v3.12.0 - July 29th, 2026 + +### Lab v3.12.0 - July 29th, 2026 + + + +## Previous releases + ### Memgraph v3.11.0 - June 17th, 2026 {

⚠️ Breaking changes

} @@ -320,8 +328,6 @@ guide. -## Previous releases - ### Memgraph v3.10.1 - May 15th, 2026 {

🐞 Bug fixes

} From 0c54faa101dd09582478db16e02358221e306e59 Mon Sep 17 00:00:00 2001 From: Vlasta Date: Wed, 17 Jun 2026 14:35:00 +0200 Subject: [PATCH 2/6] Add v3.12.0 release note for #4269 replace() empty search fix. Co-authored-by: Cursor --- pages/release-notes.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pages/release-notes.mdx b/pages/release-notes.mdx index 4242822f7..a412136a6 100644 --- a/pages/release-notes.mdx +++ b/pages/release-notes.mdx @@ -48,6 +48,11 @@ guide. ### Memgraph v3.12.0 - July 29th, 2026 +{

🐞 Bug fixes

} + +- Fixed `replace()` causing an infinite loop and OOM when the search string is empty. Empty search now inserts the replacement at every character boundary with bounded allocation, so queries such as `replace("abc", "", "-")` return `"-a-b-c-"` instead of crashing the server. + [#4269](https://github.com/memgraph/memgraph/pull/4269) + ### Lab v3.12.0 - July 29th, 2026 From 648a8558f667bc4dc030ea05b53560276b298e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Milinovi=C4=87?= <44698587+imilinovic@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:00:04 +0200 Subject: [PATCH 3/6] fix: document replace() behavior with empty search string (#1658) --- pages/querying/functions.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/querying/functions.mdx b/pages/querying/functions.mdx index 2c1613f39..6ff140a23 100644 --- a/pages/querying/functions.mdx +++ b/pages/querying/functions.mdx @@ -182,7 +182,7 @@ All aggregation functions can be used with the `DISTINCT` operator to perform ca | `endsWith` | `endsWith(string: string, substring: string) -> (boolean)` | Check if the first argument ends with the second. | | `left` | `left(string: string, count: integer) -> (string)` | Returns a string containing the specified number of leftmost characters of the original string. | | `lTrim` | `lTrim(string: string) -> (string)` | Returns the original string with leading whitespace removed. | -| `replace` | `replace(string: string, search-string: string, replacement-string: string) -> (string)` | Returns a string in which all occurrences of a specified string in the original string have been replaced by another (specified) string. | +| `replace` | `replace(string: string, search-string: string, replacement-string: string) -> (string)` | Returns a string in which all occurrences of a specified string in the original string have been replaced by another (specified) string. An empty `search-string` matches at every position. | | `reverse` | `reverse(string: string) -> (string)` | Returns a string in which the order of all characters in the original string have been reversed. | | `right` | `right(string: string, count: integer) -> (string)` | Returns a string containing the specified number of rightmost characters of the original string. | | `rTrim` | `rTrim(string: string) -> (string)` | Returns the original string with trailing whitespace removed. | From 2e8396fbaa9e09e43b241418e5ab0ec1de36d7d5 Mon Sep 17 00:00:00 2001 From: Andi Skrgat Date: Tue, 23 Jun 2026 09:01:04 +0200 Subject: [PATCH 4/6] docs: WAL file CRC (#1669) --- pages/fundamentals/data-durability.mdx | 33 ++++++++++++++++++++++++++ pages/release-notes.mdx | 9 +++++++ 2 files changed, 42 insertions(+) diff --git a/pages/fundamentals/data-durability.mdx b/pages/fundamentals/data-durability.mdx index 123d1c917..6f3bc7c9a 100644 --- a/pages/fundamentals/data-durability.mdx +++ b/pages/fundamentals/data-durability.mdx @@ -95,6 +95,39 @@ via `--storage-snapshot-retention-count`. enforces periodic snapshots when WAL is enabled and will fail to start if WAL is enabled with snapshot interval set to zero. +

WAL data integrity

+ + +Per-transaction WAL checksums were introduced in Memgraph v3.12. + +WAL files written by older versions do not contain checksums and are recovered +without integrity verification. Checksum verification applies only to WAL files +written by Memgraph v3.12 or newer. + + +To guard against silent on-disk corruption, Memgraph protects WAL files with +[CRC32](https://en.wikipedia.org/wiki/Cyclic_redundancy_check) checksums: + +- The **WAL file header** (offsets and metadata such as the UUID, epoch ID and + sequence number) is protected by its own checksum. +- **Each transaction** is protected by a 4-byte checksum covering the + transaction's bytes (transaction start, deltas and transaction end). + +Checksums are verified automatically during recovery. If a transaction's stored +checksum does not match the recomputed value, the WAL is considered corrupted at +that point and recovery stops, so corrupted data is never applied to the +database. A mismatch in the WAL header causes recovery from that file to fail. + +The same checksums protect WAL files that are buffered on disk on a replica +before being applied, so corruption introduced between the main and the replica +is detected before the data is committed. Deltas streamed during the commit +(`PrepareCommitRpc`) are not checksummed because the TCP transport already +provides integrity guarantees. + + +Snapshots are not yet protected by checksums. + + ### Snapshots Snapshots provide a faster way to restore the states of your database. Snapshots are created periodically based on the value defined with the diff --git a/pages/release-notes.mdx b/pages/release-notes.mdx index a412136a6..d7a546222 100644 --- a/pages/release-notes.mdx +++ b/pages/release-notes.mdx @@ -48,6 +48,15 @@ guide. ### Memgraph v3.12.0 - July 29th, 2026 +{

🛠️ Improvements

} + +- WAL files are now protected with CRC32 checksums. The WAL header and each + transaction carry their own checksum, which is verified during recovery and on + replicas before the data is applied, so silent on-disk corruption is detected + instead of being recovered. WAL files written by older versions remain + recoverable without verification. + [#4225](https://github.com/memgraph/memgraph/pull/4225) + {

🐞 Bug fixes

} - Fixed `replace()` causing an infinite loop and OOM when the search string is empty. Empty search now inserts the replacement at every character boundary with bounded allocation, so queries such as `replace("abc", "", "-")` return `"-a-b-c-"` instead of crashing the server. From 6f3c5d064148cb862d8a40ed14be65a639d03074 Mon Sep 17 00:00:00 2001 From: Vlasta Date: Tue, 23 Jun 2026 09:03:14 +0200 Subject: [PATCH 5/6] Add v3.12.0 release notes for #4228, #4270, and #4271. Co-authored-by: Cursor --- pages/release-notes.mdx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pages/release-notes.mdx b/pages/release-notes.mdx index d7a546222..eba8a9ced 100644 --- a/pages/release-notes.mdx +++ b/pages/release-notes.mdx @@ -48,6 +48,17 @@ guide. ### Memgraph v3.12.0 - July 29th, 2026 +{

✨ New features

} + +- Added `--storage-light-edge` (default `false`) to opt into a compact light-edge + storage path for lower memory use on edge-heavy graphs. The flag must be enabled + at startup; when off, behavior is unchanged. + [#4228](https://github.com/memgraph/memgraph/pull/4228) +- Light-edge storage (with `--storage-light-edge`) uses a dedicated edge pool and + graveyard reclamation for create, find, and delete, reducing per-edge memory + overhead while keeping transactional semantics. + [#4271](https://github.com/memgraph/memgraph/pull/4271) + {

🛠️ Improvements

} - WAL files are now protected with CRC32 checksums. The WAL header and each @@ -61,6 +72,10 @@ guide. - Fixed `replace()` causing an infinite loop and OOM when the search string is empty. Empty search now inserts the replacement at every character boundary with bounded allocation, so queries such as `replace("abc", "", "-")` return `"-a-b-c-"` instead of crashing the server. [#4269](https://github.com/memgraph/memgraph/pull/4269) +- Fixed Bolt 4.4 clients receiving routing tables from data instances and + incorrectly defaulting the target database. Data instances now reject routing + requests, and database selection over Bolt 4.4 works as expected. + [#4270](https://github.com/memgraph/memgraph/pull/4270) ### Lab v3.12.0 - July 29th, 2026 From 6885000f4e677ddbcc5884f4424db73e8f7ddd71 Mon Sep 17 00:00:00 2001 From: Vlasta <95473291+vpavicic@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:08:22 +0200 Subject: [PATCH 6/6] Apply suggestions from code review Co-authored-by: Vlasta <95473291+vpavicic@users.noreply.github.com> --- pages/release-notes.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/release-notes.mdx b/pages/release-notes.mdx index eba8a9ced..517b5e040 100644 --- a/pages/release-notes.mdx +++ b/pages/release-notes.mdx @@ -70,8 +70,7 @@ guide. {

🐞 Bug fixes

} -- Fixed `replace()` causing an infinite loop and OOM when the search string is empty. Empty search now inserts the replacement at every character boundary with bounded allocation, so queries such as `replace("abc", "", "-")` return `"-a-b-c-"` instead of crashing the server. - [#4269](https://github.com/memgraph/memgraph/pull/4269) +- Fixed `replace()` causing an infinite loop and OOM when the search string is empty. Empty search now inserts the replacement at every character boundary with bounded allocation, so queries such as `replace("abc", "", "-")` return `"-a-b-c-"` instead of crashing the server. [#4269](https://github.com/memgraph/memgraph/pull/4269) - Fixed Bolt 4.4 clients receiving routing tables from data instances and incorrectly defaulting the target database. Data instances now reject routing requests, and database selection over Bolt 4.4 works as expected.