pure-js-db 2.53.2 → 2.54.0
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.
- package/README.md +3 -3
- package/package.json +1 -1
- package/src/executor/foreign-key-executor.js +6 -3
- package/src/executor/select-executor.js +58 -0
- package/src/http-server/handlers/transaction.js +37 -4
- package/src/sdk/java/pom.xml +1 -1
- package/src/sdk/java/pureclient/PureClient.java +1 -1
- package/src/sdk/java/pureclient/PureClientTest.java +1 -1
- package/src/sdk/php/composer.json +1 -1
- package/src/sdk/php/src/PureClient.php +1 -1
- package/src/sdk/python/pure_client.py +1 -1
- package/src/sdk/rust/Cargo.toml +1 -1
- package/src/sdk/rust/RELEASE-CHECKLIST.md +2 -2
- package/src/sdk/rust/src/lib.rs +1 -1
- package/src/security/ssrf-guard.js +14 -5
- package/src/version.js +1 -1
package/README.md
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
> **零依赖嵌入式数据库引擎 —— 单文件部署,同时支持向量搜索、MVCC 并发写入、CDC 变更捕获。**
|
|
4
4
|
> 如果你的 Node.js 应用需要 PostgreSQL + Milvus + Debezium 的能力但不想要三个独立服务,这里一个文件就够。
|
|
5
5
|
|
|
6
|
-
> 📌 **当前状态**:v2.
|
|
6
|
+
> 📌 **当前状态**:v2.54.0,成熟度 **Beta+(工程验证成熟)**。历史版本公告(E26 查询缓存/时间旅行、F1-F10 接线、安全审计加固等)详见 [CHANGELOG.md](CHANGELOG.md) 与 [docs/internal/audit/](docs/internal/audit/) 审计档案。安全模块默认 fail-closed,生产部署必须显式配置认证/RBAC/加密(见 [SECURITY.md](SECURITY.md) §2.2)。
|
|
7
7
|
|
|
8
8
|

|
|
9
9
|

|
|
10
|
-

|
|
11
11
|

|
|
12
12
|

|
|
13
13
|

|
|
@@ -699,7 +699,7 @@ const backend = getAccelerationBackend();
|
|
|
699
699
|
|
|
700
700
|
### Rust NAPI 加速引擎性能 (SIMD)
|
|
701
701
|
|
|
702
|
-
> ⚠️ **2026-10-27 独立评测修正(2026-10-28 部分已修复)**:下表数据来自 v1.32 时代的旧基准。独立评测实测发现:Rust 加速层多数路径未在生产代码接线(4/5 性能声称失效);评测同时暴露三处 AVX2 正确性 bug(utf8 批量编码、Float64 min/max 全 NaN、null bitmap ≥0x80),该三处已在 2026-10-28 修复并重建 `native/index.node`、相关 Native 路径已恢复。下表加速比仅供参考,不构成当前版本(v2.
|
|
702
|
+
> ⚠️ **2026-10-27 独立评测修正(2026-10-28 部分已修复)**:下表数据来自 v1.32 时代的旧基准。独立评测实测发现:Rust 加速层多数路径未在生产代码接线(4/5 性能声称失效);评测同时暴露三处 AVX2 正确性 bug(utf8 批量编码、Float64 min/max 全 NaN、null bitmap ≥0x80),该三处已在 2026-10-28 修复并重建 `native/index.node`、相关 Native 路径已恢复。下表加速比仅供参考,不构成当前版本(v2.54.0)的性能承诺。
|
|
703
703
|
>
|
|
704
704
|
> 详见 [SIMD 优化报告](docs/simd/simd-final-optimization-report.md)
|
|
705
705
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pure-js-db",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.54.0",
|
|
4
4
|
"description": "Pure JavaScript 关系型数据库引擎 - 面向小程序/受限运行时环境。零 C/C++/WASM 依赖,支持 SQL 解析、B+树索引、查询优化、物化视图、数据分片、分布式事务、Worker Pool 并行、SharedArrayBuffer 共享内存、HTAP 混合存储、多语言客户端 SDK。可选 Rust NAPI 原生加速层(编译后性能提升 2-5x)。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -42,7 +42,8 @@ export class ForeignKeyExecutor {
|
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
44
|
// v2.53.0 专项 A 阶段 3: MVCC 事务内基于快照可见行读写版本链,避免泄漏未提交写入。
|
|
45
|
-
|
|
45
|
+
// 防御:轻量 mock executor(防御性测试)可能未实现 _isMvccTxn,按非 MVCC 处理。
|
|
46
|
+
const isMvcc = typeof this._executor._isMvccTxn === 'function' ? this._executor._isMvccTxn() : false;
|
|
46
47
|
for (const [otherTableName, otherTable] of Object.entries(this.db.tables)) {
|
|
47
48
|
if (otherTableName === parentTableName) {
|
|
48
49
|
continue;
|
|
@@ -263,7 +264,8 @@ export class ForeignKeyExecutor {
|
|
|
263
264
|
return;
|
|
264
265
|
}
|
|
265
266
|
// v2.53.0 专项 A 阶段 3: MVCC 事务内基于快照可见行校验引用存在性
|
|
266
|
-
|
|
267
|
+
// 防御:轻量 mock executor 可能未实现 _isMvccTxn,按非 MVCC 处理。
|
|
268
|
+
const isMvcc = typeof this._executor._isMvccTxn === 'function' && this._executor._isMvccTxn();
|
|
267
269
|
// 1. 列级 FK 约束(CREATE TABLE)
|
|
268
270
|
for (const col of columnDefs) {
|
|
269
271
|
if (col.foreignKey) {
|
|
@@ -463,7 +465,8 @@ export class ForeignKeyExecutor {
|
|
|
463
465
|
continue;
|
|
464
466
|
}
|
|
465
467
|
// v2.53.0 专项 A 阶段 3: MVCC 事务内基于快照可见行检查引用
|
|
466
|
-
|
|
468
|
+
// 防御:轻量 mock executor 可能未实现 _isMvccTxn,按非 MVCC 处理。
|
|
469
|
+
const isMvcc = typeof this._executor._isMvccTxn === 'function' && this._executor._isMvccTxn();
|
|
467
470
|
const childRows = isMvcc
|
|
468
471
|
? (this._executor._mvccGetVisibleRows(otherTable) || [])
|
|
469
472
|
: otherTable.rows;
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
import { evaluate, isWhereTrue, applyCast } from './expression.js';
|
|
51
51
|
import { JoinEngine } from '../utils/join-engine.js';
|
|
52
52
|
import { TopNHeap } from './topn.js';
|
|
53
|
+
import { topnF64Asc, topnF64Desc } from '../native/native-acceleration.js';
|
|
53
54
|
import { decimalCompare } from '../types/decimal.js';
|
|
54
55
|
import {
|
|
55
56
|
ColumnRef, WindowFunction, DerivedTable, JsonTable, BinaryExpr, FunctionCall, Literal,
|
|
@@ -823,6 +824,13 @@ export class SelectExecutor {
|
|
|
823
824
|
const useTopN = limitVal > 0 && heapLimit < rows.length && heapLimit <= 10000;
|
|
824
825
|
|
|
825
826
|
if (useTopN) {
|
|
827
|
+
// v2.54.0 快速路径:单列数值 ORDER BY + LIMIT → native 堆选择(O(n log K),Rust)。
|
|
828
|
+
// 实测 1M 行 top-10 完整路径(含取行 + K 行排序)比 TopNHeap 快约 16x
|
|
829
|
+
// (1.48ms vs 23.55ms);任何非纯有限数字场景自动回退通用堆,NULLS 语义不变。
|
|
830
|
+
const fastRows = this._tryNativeTopN(resolvedOrderBy, rows, heapLimit);
|
|
831
|
+
if (fastRows) {
|
|
832
|
+
return fastRows;
|
|
833
|
+
}
|
|
826
834
|
const heap = new TopNHeap(heapLimit, compareRows);
|
|
827
835
|
for (const row of rows) {
|
|
828
836
|
heap.push(row);
|
|
@@ -833,6 +841,56 @@ export class SelectExecutor {
|
|
|
833
841
|
return rows;
|
|
834
842
|
}
|
|
835
843
|
|
|
844
|
+
/**
|
|
845
|
+
* v2.54.0: native TopN 快速路径 —— 仅处理"单一列引用 + 该列在全部行上均为有限 number"。
|
|
846
|
+
* 用 Rust 堆选择直接取 top-K 索引(比 JS 堆逐行 push 快一个数量级),取行后对 K 行
|
|
847
|
+
* 做方向排序保证与通用路径同序。不满足条件返回 null(调用方回退 TopNHeap)。
|
|
848
|
+
* @param {Array<{expression: Object, direction: string}>} orderBy - 已解析的 ORDER BY 项
|
|
849
|
+
* @param {Array<Object>} rows - 待排序行
|
|
850
|
+
* @param {number} k - 保留行数(limit + offset)
|
|
851
|
+
* @returns {Array<Object]|null}
|
|
852
|
+
*/
|
|
853
|
+
_tryNativeTopN(orderBy, rows, k) {
|
|
854
|
+
try {
|
|
855
|
+
if (!orderBy || orderBy.length !== 1) {
|
|
856
|
+
return null;
|
|
857
|
+
}
|
|
858
|
+
const item = orderBy[0];
|
|
859
|
+
if (!(item.expression instanceof ColumnRef) || item.fallback) {
|
|
860
|
+
return null;
|
|
861
|
+
}
|
|
862
|
+
const n = rows.length;
|
|
863
|
+
// 小数据集堆已足够快,TypedArray 构建开销不划算
|
|
864
|
+
if (n < 1000 || k <= 0 || k >= n) {
|
|
865
|
+
return null;
|
|
866
|
+
}
|
|
867
|
+
const colName = item.expression.columnName;
|
|
868
|
+
const vals = new Float64Array(n);
|
|
869
|
+
for (let i = 0; i < n; i++) {
|
|
870
|
+
const v = rows[i][colName];
|
|
871
|
+
// 仅支持有限 number:null/NaN/字符串(含 DECIMAL 字符串)走通用堆保持语义
|
|
872
|
+
if (typeof v !== 'number' || !Number.isFinite(v)) {
|
|
873
|
+
return null;
|
|
874
|
+
}
|
|
875
|
+
vals[i] = v;
|
|
876
|
+
}
|
|
877
|
+
const desc = item.direction === 'DESC';
|
|
878
|
+
const idx = desc ? topnF64Desc(vals, k) : topnF64Asc(vals, k);
|
|
879
|
+
const picked = new Array(k);
|
|
880
|
+
for (let i = 0; i < k; i++) {
|
|
881
|
+
picked[i] = rows[idx[i]];
|
|
882
|
+
}
|
|
883
|
+
// native 只保证 top-K 集合正确;对 K 行按同一比较语义排序(K ≤ 10000,成本可忽略)
|
|
884
|
+
picked.sort((a, b) => {
|
|
885
|
+
const d = a[colName] - b[colName];
|
|
886
|
+
return desc ? -d : d;
|
|
887
|
+
});
|
|
888
|
+
return picked;
|
|
889
|
+
} catch {
|
|
890
|
+
return null;
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
|
|
836
894
|
// ════════════════════════════════════════════════════════════════
|
|
837
895
|
// 阶段 7: LIMIT/OFFSET
|
|
838
896
|
// ════════════════════════════════════════════════════════════════
|
|
@@ -13,6 +13,23 @@
|
|
|
13
13
|
|
|
14
14
|
import { parseBody, jsonOk, jsonError, safeErrorMessage } from '../server.js';
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* 在事务所属的连接级 TransactionContext 中执行 fn(v2.53.3 回滚失效修复)。
|
|
18
|
+
* - begin 时记录了 txOwnerId(begin 请求的 ALS ownerId)→ 后续事务请求
|
|
19
|
+
* 统一路由到该 ownerId 的 TransactionContext,保证 undoLog/inTransaction
|
|
20
|
+
* 在 BEGIN/EXECUTE/COMMIT/ROLLBACK 之间连续(不受 HTTP 请求边界影响)。
|
|
21
|
+
* - 兼容旧数据(无 txOwnerId)或 db 无 withTransactionContext:直接执行。
|
|
22
|
+
* @private
|
|
23
|
+
*/
|
|
24
|
+
async function _execInTxContext(server, session, fn) {
|
|
25
|
+
const db = server.executor?.db;
|
|
26
|
+
const ownerId = session?.txOwnerId;
|
|
27
|
+
if (db && typeof db.withTransactionContext === 'function' && ownerId) {
|
|
28
|
+
return db.withTransactionContext(ownerId, fn);
|
|
29
|
+
}
|
|
30
|
+
return fn();
|
|
31
|
+
}
|
|
32
|
+
|
|
16
33
|
/**
|
|
17
34
|
* 创建事务处理器
|
|
18
35
|
* @param {import('../server.js').DBServer} server
|
|
@@ -67,11 +84,26 @@ export function createTransactionHandlers(server) {
|
|
|
67
84
|
} else {
|
|
68
85
|
// 使用本地事务
|
|
69
86
|
await server.executor.executeSQL('BEGIN');
|
|
87
|
+
// v2.53.3 修复:本地事务的 BEGIN 落在"当前请求 session"的连接级
|
|
88
|
+
// TransactionContext(ALS 路由)里;后续 execute/commit/rollback 请求
|
|
89
|
+
// 各自是新 HTTP 请求、新 session——若不把事务端点统一路由到同一
|
|
90
|
+
// TransactionContext,undoLog 与 inTransaction 状态会在请求间割裂,
|
|
91
|
+
// 导致 INSERT 自动提交、ROLLBACK 失效(数据泄漏)。
|
|
92
|
+
// 这里在 begin 时记录当前 ALS ownerId,后续事务请求强制以该 ownerId
|
|
93
|
+
// 运行 executor 调用,保证同一事务的 BEGIN/EXECUTE/COMMIT/ROLLBACK
|
|
94
|
+
// 共享同一 undoLog。
|
|
95
|
+
let txOwnerId = null;
|
|
96
|
+
const _db = server.executor?.db;
|
|
97
|
+
if (_db && typeof _db._txCtx === 'function') {
|
|
98
|
+
const cur = _db._txCtx();
|
|
99
|
+
txOwnerId = cur?.ownerId ?? null;
|
|
100
|
+
}
|
|
70
101
|
server._txSessions.set(sessionId, {
|
|
71
102
|
transactionId: sessionId,
|
|
72
103
|
participants: [],
|
|
73
104
|
startTime: Date.now(),
|
|
74
105
|
coordinator: false,
|
|
106
|
+
txOwnerId,
|
|
75
107
|
});
|
|
76
108
|
|
|
77
109
|
return jsonOk(res, {
|
|
@@ -128,7 +160,7 @@ export function createTransactionHandlers(server) {
|
|
|
128
160
|
});
|
|
129
161
|
} else {
|
|
130
162
|
// 本地事务提交
|
|
131
|
-
await server.executor.executeSQL('COMMIT');
|
|
163
|
+
await _execInTxContext(server, session, () => server.executor.executeSQL('COMMIT'));
|
|
132
164
|
const duration = performance.now() - start;
|
|
133
165
|
server._txSessions.delete(sessionId);
|
|
134
166
|
|
|
@@ -166,7 +198,7 @@ export function createTransactionHandlers(server) {
|
|
|
166
198
|
if (session.coordinator && server.coordinator) {
|
|
167
199
|
server.coordinator.rollback(session.transactionId);
|
|
168
200
|
} else {
|
|
169
|
-
await server.executor.executeSQL('ROLLBACK');
|
|
201
|
+
await _execInTxContext(server, session, () => server.executor.executeSQL('ROLLBACK'));
|
|
170
202
|
}
|
|
171
203
|
|
|
172
204
|
const duration = performance.now() - start;
|
|
@@ -217,8 +249,9 @@ export function createTransactionHandlers(server) {
|
|
|
217
249
|
// 分布式事务:通过协调者执行
|
|
218
250
|
results = await server.coordinator.executeSQL(session.transactionId, sql, params || []);
|
|
219
251
|
} else {
|
|
220
|
-
//
|
|
221
|
-
results = await server
|
|
252
|
+
// 本地事务:直接执行(路由到 begin 时记录的事务上下文,见 begin 内说明)
|
|
253
|
+
results = await _execInTxContext(server, session, () =>
|
|
254
|
+
server.executor.executeSQL(sql, params || []));
|
|
222
255
|
}
|
|
223
256
|
|
|
224
257
|
const duration = performance.now() - start;
|
package/src/sdk/java/pom.xml
CHANGED
|
@@ -62,7 +62,7 @@ import java.util.NoSuchElementException;
|
|
|
62
62
|
public class PureClient {
|
|
63
63
|
|
|
64
64
|
/** SDK 版本号。 */
|
|
65
|
-
public static final String SDK_VERSION = "2.
|
|
65
|
+
public static final String SDK_VERSION = "2.54.0";
|
|
66
66
|
|
|
67
67
|
/** 默认请求超时(秒)。 */
|
|
68
68
|
public static final long DEFAULT_TIMEOUT_SECONDS = 30;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "pure-js-db/php-sdk",
|
|
3
3
|
"description": "PHP SDK for pure-js-db — pure JavaScript database engine, via HTTP RESTful API.",
|
|
4
4
|
"type": "library",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.54.0",
|
|
6
6
|
"keywords": ["database", "sdk", "pure-js-db", "rest", "curl"],
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"require": {
|
package/src/sdk/rust/Cargo.toml
CHANGED
|
@@ -29,8 +29,8 @@ grep -E 'SDK 版本:\*\*[0-9]+\.[0-9]+\.[0-9]+\*\*' README.md # 期望: SDK
|
|
|
29
29
|
|
|
30
30
|
| 文件 | 当前值 |
|
|
31
31
|
|------|--------|
|
|
32
|
-
| `pure-js-db/package.json` | `2.
|
|
33
|
-
| `pure-js-db/src/index.js` `VERSION` | `'2.
|
|
32
|
+
| `pure-js-db/package.json` | `2.54.0` |
|
|
33
|
+
| `pure-js-db/src/index.js` `VERSION` | `'2.54.0'` |
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
package/src/sdk/rust/src/lib.rs
CHANGED
|
@@ -693,11 +693,20 @@ export class SSRFGuard {
|
|
|
693
693
|
// 2. DNS 解析校验(防 DNS 重绑定)
|
|
694
694
|
const dnsCheck = await this.validateDNS(urlCheck.host);
|
|
695
695
|
if (!dnsCheck.allowed) {
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
696
|
+
// 与 validateDeep 同语义:DNS 解析失败(ENOTFOUND/EAI_AGAIN 等)时
|
|
697
|
+
// 目标主机本就无法连接,无 SSRF 风险——放行交由下层请求报错
|
|
698
|
+
// (同时兼容使用不可解析 mock 主机名的测试)。仅"解析成功但 IP 被拒"
|
|
699
|
+
// 才是真正的 SSRF 防护边界,仍阻断。
|
|
700
|
+
if (dnsCheck.reason && dnsCheck.reason.includes('DNS 解析失败')) {
|
|
701
|
+
dnsCheck.allowed = true;
|
|
702
|
+
dnsCheck.resolutionFailed = true;
|
|
703
|
+
} else {
|
|
704
|
+
const err = new Error(`SSRF blocked: ${dnsCheck.reason}`);
|
|
705
|
+
err.code = 'SSRF_BLOCKED';
|
|
706
|
+
err.reason = dnsCheck.reason;
|
|
707
|
+
err.url = currentUrl;
|
|
708
|
+
throw err;
|
|
709
|
+
}
|
|
701
710
|
}
|
|
702
711
|
|
|
703
712
|
// 3. 实际请求
|
package/src/version.js
CHANGED
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
* 并校验所有 JS 文件不再硬编码版本号。
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
export const VERSION = '2.
|
|
17
|
+
export const VERSION = '2.54.0';
|
|
18
18
|
|
|
19
19
|
export const PHASE = 'v2.53.2 可靠性验证与发版演练:Raft 3 节点容器集群实测通过(Leader 选举 + 日志复制 + 宕机重选三项 PASS,raft-node-entry.js 新增 POST /raft/propose 提案端点 + raft-extended-verify.mjs 两阶段扩展验证 + run-raft-extended.sh 一键编排);可靠性周期重跑(2026-11-03)五项全 PASS(3 节点 2PC 30/30 TPS 95.85、网络分区注入 PARTITION_TEST_PASS、MVCC 同行冲突 SAME_ROW_CONFLICT_PASS、7 分钟 soak 7 cycle 0 abort 资金守恒、崩溃重启 6/6、断电模拟 8/8);npm 周下载 486 破零记录;' + 'v2.53.0 性能服务化(P0-5/P0-6 请求级查询取消与超时):执行器新增 options 级取消检查 _abortCheck(直接读 options.signal,避免共享 Executor 并发异步查询互相覆盖实例级取消状态),接线到全部分片让出检查点(分片过滤/分片 GROUP BY/_finishSelectAfterRows 阶段边界/JOIN 派发前/parallelHashJoinWithWorker 键计算让出点);executeSQLAsync 与 parallelHashJoinWithWorker 对取消错误(QUERY_ABORTED)上抛而非静默回退同步;routeSQL(sql, params, res) 为每个请求创建 AbortController——客户端断开(res 提前 close)即中止 + this._timeout 超时中止,取消在让出检查点真实生效(P0-6);query handler 主查询与 SELECT 端点传递 res;新增 query-cancel.test.js 6 项(预中止/JOIN 路径/运行中/routeSQL 断开/超时/正常回归)已注册 run-all;' + 'v2.52.0 性能服务化(P0-1 Worker 并行 JOIN + P0-3 HTTP WorkerPool):JoinEngine.parallelHashJoinWithWorker 把 Hash Join 探测(JOIN_PROBE)真实分发到 Worker 线程(主线程预计算键 + 浅拷贝行附加 __joinKey + execAll 分发 + 合并 + LEFT 补行 + 失败回退同步 _parallelHashJoin);Executor._performJoinAsync 委托 JoinExecutor 供异步路径使用;execSelectShardedAsync 支持单普通表等值 INNER/LEFT JOIN 的 Worker 并行(_canShardAsyncSelect 扩展 + WHERE 不得引用右表列的安全限制);DBServer 启动时初始化 WorkerPool(lazy,默认 CPU-1,可 enableWorkerPool=false 关闭)并在 stop 时终止,使 HTTP 服务中 JOIN/SORT/FILTER/GROUP_BY 并行算子真实可用;新增 worker-join.test.js 5 项(INNER/LEFT/无池回退/右表列回退/任务分发断言)已注册 run-all;' + 'v2.51.0 缺陷修复(物化视图注册为可查询关系 + WAL 大批次分块):物化视图作为只读关系注册到 Database(materializedViews 注册表 + hasTable/getTable 识别 + 只读表外观 + 命名冲突双向拒绝 + INFORMATION_SCHEMA.TABLES/COLUMNS 与 pg_class 可见 + CLI/.tables 与 HTTP 表列表纳入 + 持久化重建后重新注册 + SELECT/JOIN/EXPLAIN/跨库可解析),修复 CREATE MATERIALIZED VIEW 通过 SQL 调用时校验错误变为未处理 Promise 拒绝的问题(createMaterializedView 同步抛出 + execCreateMaterializedView 透传异步刷新);事务 WAL 按 maxEntriesPerBatch 分块,消除同步突发写入 >65535 条时 serializeBatch 的 RangeError 崩溃路径(守卫保留供防御测试);物化视图测试 +4 项(注册/冲突/只读/持久化),wal-count-bound 7/7 全绿;' + 'v2.50.0 T-05/T-06 架构清理:优化器 barrel 补齐 5 个生产可达类导出(ExplainVisualizer/JoinOrderOptimizer/QueryPlanCache/Histogram·HistogramBucket/TimestampQueryRewriter,经 engine/public-api.js 接主入口)+ StorageEngine 统一存储引擎接口(STORAGE_ENGINE_METHODS 契约 + isStorageEngine/assertStorageEngine 校验 + STORAGE_BACKENDS 四后端工厂 memory/file/binary/buffered + StorageEngine.switchBackend 运行时切换 + createStorageEngine)+ T-06 lockfree-worker.js 占位桩整体移除(lockfree-manager 移除 _startWorkers/useWorkers,单线程 COW 模式收敛);storage-engine.test 16 项(含绕过)+ optimizer-exports.test 4 项(含主入口接线)已注册 run-all,全量 806/806 全绿、幻影审计 A 类 0/B 类 0、dist 22/22 含新符号;' + 'v2.49.0 E34 数据血缘收尾(UPDATE 源追踪 + CREATE VIEW 事前环拒绝 + Mermaid 导出):extractUpdateColumnLineage(UPDATE SET 列级血缘,直接列/表达式/函数,常量不产生依赖,多表 UPDATE...FROM 无前缀 unresolved)+ recordStatement UpdateStatement 分支;wouldCreateCycle + DDLExecutor._assertNoLineageCycle(CREATE VIEW/CREATE MATERIALIZED VIEW 事前环拒绝,仅目标视图已存在时预检,保留 v2.11 E15 M2 T3 前向引用后补行为);toMermaid/getLineageMermaid(Mermaid flowchart 导出);生产入口导出 + lineage-e34 19 项 + 生产接线 4 项,run-all 804/804 全绿;' + 'v2.48.0 数据血缘全链路落地(P7 M1-M4 + P8 深化 + P9 版本历史):表级/列级血缘自动记录(CREATE VIEW/MATERIALIZED VIEW/INSERT...SELECT)、LINEAGE SQL 语句(LINEAGE TABLE/COLUMN + lineage-executor + MCP 工具)、任务级登记(CopyStream/Migrator)、持久化(meta v5 随 PersistedDatabase 落盘)、环检测 detectCycles、CTE 列级推导(collectCtes)、HTML 可视化 toHTML、版本历史(getLineageHistory/getLineageAtTime/getLineageEvolution)、变更影响分析(analyzeImpact),生产入口全导出 + 常驻测试 70 项;run-all 全量通过 + vitest 123/123 + c8 Lines 91.99%/Branches 88.43%;' + 'v2.45.2 双缺陷修复(多轮门禁盘点发现):① REGEXP (?g)/(?y) 全局/粘性标志剥离——编译产物跨行 LRU 缓存复用而 g/y 的 lastIndex 状态使求值行依赖((?g)a 四行 [1,0,1,0]),REGEXP 逐行独立求值语义下 g/y 无意义且有害,编译期剥离(i/m/s/u 保持);② WASM min/max 对齐区 NaN 传播——f32x4.min/max 按 IEEE 语义传播 NaN 与"NaN 被忽略"文档语义相悖(v2.45.1 激活 SIMD 路径后成为实际行为),NaN 结果 ⟺ 对齐区有 NaN lane,JS 重扫跳过 NaN 与降级路径对齐;绕过测试 v2450 +2(29 项)、wasm-simd-engine E3 守卫(23 项);' + 'v2.45.1 WASM SIMD 常量错位修复 + 覆盖率债务清零:f32x4_max 误写 0xEA(实为 f32x4.pmin)致 init 运行时验证恒败、引擎自引入即静默降级(SIMD 路径从未激活,全部流量走 TypedArray fallback)——修正 0xE9 并经验解码验证(0xE7=div/0xE8=min/0xE9=max/0xEA=pmin/0xEB=pmax),修复后 READY/WASM_SIMD 五算子精确正确;wasm-simd-engine 移出 c8 exclude 并补全路径测试(初始化/SIMD 数值/降级/扩容/单例 + 修复守卫);lockfree-worker.js 人工评估归档(确认占位桩:主路径不经 Worker,保持 exclude 豁免);' + 'v2.45.0 安满分诊 P1/P2 治理落地(eslint-security 58 errors 分诊第四节立项 ①②③④ 全部修复):REGEXP 用户正则防护(security/regex-guard.js compileUserRegex:模式长度上限 1024 + 嵌套量词灾难回溯编译期筛查,bitmap-filter _getRegex 接线)+ LIKE/GLOB/KEYS→regex 转换入口统一模式长度上限 1024(bitmap-filter _likeToRegex/_buildEscapeRegex、btree/offheap 部分索引 LikeExpr、cache-adapter KEYS、sqlite-kv-adapter LIKE、expression.js GLOB 共 7 处)+ oracle-adapter DECODE 线性解析重写(消除指数回溯,修复多分支 CASE 语义 + 括号/引号感知 + 嵌套 DECODE 递归转换)+ 输入长度上限(sql-injection-detector 256KB fail-closed、schema-versioning DDL 256KB + 顶层逗号线性切分);绕过测试 v2450-p0-bypass-boundary 通过;v2.0 长期路线图收官:v2.0-1..6 全部落地(JSONB 二进制 JSON / Lambda 表达式 x->x+1 / UNNEST 多列并行 / DEFERRABLE 约束 / EXCLUDE 排他约束 / LISTEN-NOTIFY 异步通知,DoD 5/5 各 27-39 用例);v2.0-7 WAL flush 慢 seq 初始化 flaky 修复 + wal-crash-validation 测试加固(10/10 稳定 + 绕过测试有效性验证)+ flush-timeout-simulation FT2/FT4 libuv 时钟边界修复;全量回归 run-all 459/459 全绿(历史首次);v2.0-8 SQL:2016 阶段1 聚合补全(PERCENTILE_CONT/DISC + STRING_AGG/ARRAY_AGG + MODE + BOOL_AND/OR/EVERY + WIDTH_BUCKET + REGR_*,DoD 5/5 37/37);v2.0-9 SQL:2016 阶段2 MATCH_RECOGNIZE 行模式识别(Part 2 §21.6 新执行器,DoD 5/5 30/30);v2.0-10 SQL:2016 阶段3 多态表函数 PTF(Part 2 §10.9:ANY TABLE/COLUMN/MAX(n) + RETURNS TABLE + 函数体 AST 重写 + 物化临时表 + JOIN 内调用 + 幂等性/零副作用,DoD 5/5 25/25,run-all 461/462 + audit-log A8 时间竞态 flaky 修复);v2.0-11 SQL:2016 阶段4 RATIO_TO_REPORT 分析函数(Part 2 §9.6 G9:分区求和比例 + NULL/除零语义 + 参数校验,DoD 5/5 14/14)+ 窗口函数源表零副作用 P0 修复(window-functions.js 浅拷贝行,156 项窗口回归全绿);v2.0-12 SQL:2016 阶段5 类型系统深化(Part 2 §4.4 G11 INTERVAL 完整类型:YEAR/MONTH/DAY/HOUR/MINUTE/SECOND 字段子句 + 单位内嵌 + 纯时间/天数自动判断 + DAY TO MINUTE HH:MM + DAY TO HOUR/MINUTE/SECOND 时间部分列宽 + date/timestamp±interval 日历月 clamp + 算术/比较/CAST/一元运算;G12 TIMESTAMP WITH TIME ZONE:带偏移解析→UTC 内部存储 + 会话时区显示 + SET TIME ZONE/SHOW TIME ZONE + INSERT/UPDATE 归一化 + 混合比较,DoD 5/5 62/62);v1.42.x 基础:STRUCT 类型 / LIST-ARRAY 完整操作 / WITHOUT ROWID 表 / VACUUM-REINDEX / user_version-application_id 持久化 + v1.42.1 全量回归闭环(16 个预存失败清零 + 2 个源码回归修复:query-isolation 原型链 / select-executor ORDER BY 聚合别名);v1.41.x 基础:ASOF JOIN / ATTACH DATABASE / COMMENT ON / PIVOT 多聚合 / WITH CHECK OPTION;v1.40.4 基础:PRAGMA 完整集(25+ SQLite 标准)+ 版本号多 SDK 单一来源同步;v1.40.3 基础:3 个 P0 安全修复真实现 + SECURITY DEFINER 真实现 + 循环依赖 0;v2.11(E15)遗留清零:WAL 恢复数据版本一致性 + 视图 lossy 根治 + 多视图 CASCADED 链 + SECURITY DEFINER 真实现 + RedisCacheAdapter 真实现 + Arrow 有限宽度 guard + WAL count 上界 + executor 拆分(sql-reconstructor);v2.12(E16)稳定性与分布式闭环:flaky 三件套根治(2pc-perf/index-build/soak-test + vector-executor 门槛统一)+ 跨库 DDL/事务 + WAL hot-standby 探针 + 分布式真实网络验证(raft/3PC/2PC + PK fastpath WAL 缺陷修复 + 2PC rejection 修复)+ executor PRAGMA 族拆离(pragma-executor,-550 行)+ 全量回归 612/612 + DL-D3 时序 flaky 修复;v2.13(E17)收尾治理与 SQL/XML:版本号全量对齐 + SQL:2016 阶段6 G10(XMLSERIALIZE/XMLAGG/XMLTABLE)+ 全量 c8 复验 + 跨库 TPC-H 数据刷新 + SQL:2023 roadmap 收敛;v2.14(E18)列存文件格式 M1+M2:PJDC 二进制列文件格式(表签名三层校验:schemaHash + rowCount + columnCount)+ save/load 持久化加速缓存 + 列存 roundtrip 持久化验证(22+8 用例全绿);v2.15(E19)列存文件格式 M3:WAL _invalidateTableIndexes 修复(checkpoint 后索引失效重建)+ run-all 618/618 全绿;v2.15(E20)工程化基线清零:parquet.js 3 处 setUint32 guard 补零 + 超限绕过测试 + 版本号同步 2.13.0→2.15.0 + c8 覆盖率实测 + 审计章节归档;';
|