pure-js-db 2.55.0 → 2.55.1
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/engine/public-api.js +4 -0
- package/src/executor/executor.js +106 -124
- 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/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.55.
|
|
6
|
+
> 📌 **当前状态**:v2.55.1,成熟度 **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
|

|
|
@@ -748,7 +748,7 @@ const backend = getAccelerationBackend();
|
|
|
748
748
|
|
|
749
749
|
### Rust NAPI 加速引擎性能 (SIMD)
|
|
750
750
|
|
|
751
|
-
> ⚠️ **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.55.
|
|
751
|
+
> ⚠️ **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.55.1)的性能承诺。
|
|
752
752
|
>
|
|
753
753
|
> 详见 [SIMD 优化报告](docs/simd/simd-final-optimization-report.md)
|
|
754
754
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pure-js-db",
|
|
3
|
-
"version": "2.55.
|
|
3
|
+
"version": "2.55.1",
|
|
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",
|
package/src/engine/public-api.js
CHANGED
|
@@ -208,3 +208,7 @@ export { LineageStore, extractSourceTables, extractSourceTablesFromSQL, extractC
|
|
|
208
208
|
// 部署配置与启动 (生产环境)
|
|
209
209
|
export { config as productionConfig } from '../../config/production.config.js';
|
|
210
210
|
export { setupSoADaemon } from '../daemon/soa-daemon-integration.js';
|
|
211
|
+
|
|
212
|
+
// v2.55.1: 批量聚合器(Rust/JS 自动选择)——batchSumF32 系列此前不在任何公开导出面,
|
|
213
|
+
// exports 收紧后成为死导出;经 engine 子入口对用户可达。
|
|
214
|
+
export { createBatchAggregator } from '../native/native-acceleration.js';
|
package/src/executor/executor.js
CHANGED
|
@@ -2668,8 +2668,9 @@ export class Executor {
|
|
|
2668
2668
|
const requiredColumns = this._computeRequiredColumns(stmt);
|
|
2669
2669
|
if (requiredColumns) {
|
|
2670
2670
|
options = { ...options, _requiredColumns: requiredColumns };
|
|
2671
|
-
// 无限定列引用 ⇒ __table__ 命名空间零消费 → 跳过赋值(复合行再降 ~40%
|
|
2672
|
-
|
|
2671
|
+
// 无限定列引用 ⇒ __table__ 命名空间零消费 → 跳过赋值(复合行再降 ~40% 宽度);
|
|
2672
|
+
// 含子查询时保守保留 __table__(相关子查询提升/物化链路的隐式依赖,Q20 回归)
|
|
2673
|
+
if (!requiredColumns.hasQualified && !requiredColumns.hasSubquery) {
|
|
2673
2674
|
options._skipTableNamespaces = true;
|
|
2674
2675
|
}
|
|
2675
2676
|
}
|
|
@@ -3069,6 +3070,7 @@ export class Executor {
|
|
|
3069
3070
|
let hasStar = false;
|
|
3070
3071
|
let hasSetOp = false;
|
|
3071
3072
|
let hasQualified = false;
|
|
3073
|
+
let hasSubquery = false;
|
|
3072
3074
|
const walk = (node, depth) => {
|
|
3073
3075
|
if (!node || typeof node !== 'object' || depth > 64) return;
|
|
3074
3076
|
if (Array.isArray(node)) {
|
|
@@ -3081,6 +3083,11 @@ export class Executor {
|
|
|
3081
3083
|
if (node.tableName) hasQualified = true;
|
|
3082
3084
|
return;
|
|
3083
3085
|
}
|
|
3086
|
+
// 子查询节点(InSubquery/ScalarSubquery/ExistsSubquery 等):含子查询的语句
|
|
3087
|
+
// 禁用 _skipTableNamespaces——相关子查询的提升/物化链路(flattener temp 表、
|
|
3088
|
+
// _replaceColumnRefs 外层绑定)对复合行结构有隐式依赖(Q20 回归实测),
|
|
3089
|
+
// 保守保留 __table__ 命名空间。
|
|
3090
|
+
if (cname && cname.includes('Subquery')) hasSubquery = true;
|
|
3084
3091
|
// 集合操作节点(UNION/EXCEPT/INTERSECT 解析为 {left, operation, right})→ 禁裁剪
|
|
3085
3092
|
if (typeof node.operation === 'string' && node.left && node.right) {
|
|
3086
3093
|
hasSetOp = true;
|
|
@@ -3101,10 +3108,13 @@ export class Executor {
|
|
|
3101
3108
|
};
|
|
3102
3109
|
walk(stmt, 0);
|
|
3103
3110
|
if (hasStar || hasSetOp || required.size === 0) return null;
|
|
3104
|
-
// hasQualified 挂在返回 Set 上:无限定列时 execute() 额外注入
|
|
3105
|
-
// (_hashJoin 跳过 __table__ 命名空间赋值,复合行再降
|
|
3106
|
-
//
|
|
3111
|
+
// hasQualified/hasSubquery 挂在返回 Set 上:无限定列时 execute() 额外注入
|
|
3112
|
+
// _skipTableNamespaces(_hashJoin 跳过 __table__ 命名空间赋值,复合行再降
|
|
3113
|
+
// ~40% 宽度)。无限定列 ⇒ __table__ 的全部消费点(限定列解析/_getTableRow/
|
|
3114
|
+
// graph-table)均不被触发。**含子查询时仅禁 ns 跳过、保留列裁剪**(相关子查询
|
|
3115
|
+
// 的提升/物化链路对复合行结构有隐式依赖,Q20 回归实测)。
|
|
3107
3116
|
required.hasQualified = hasQualified;
|
|
3117
|
+
required.hasSubquery = hasSubquery;
|
|
3108
3118
|
return required;
|
|
3109
3119
|
}
|
|
3110
3120
|
|
|
@@ -3640,10 +3650,11 @@ export class Executor {
|
|
|
3640
3650
|
// 从 table.rows 取对应行(保持行存格式,确保兼容性)
|
|
3641
3651
|
const rows = indices.map(i => table.rows[i]);
|
|
3642
3652
|
|
|
3643
|
-
//
|
|
3653
|
+
// 构造投影后的行({} 原型,与行存路径 _rowPool 的 {} 原型行一致——
|
|
3654
|
+
// 原 Object.create(null) 与行存输出原型不同,deepStrictEqual 可区分)
|
|
3644
3655
|
const projectedRows = [];
|
|
3645
3656
|
for (const row of rows) {
|
|
3646
|
-
const projRow =
|
|
3657
|
+
const projRow = {};
|
|
3647
3658
|
let hasStar = false;
|
|
3648
3659
|
for (const item of selectItems) {
|
|
3649
3660
|
if (item.expression instanceof Star) {
|
|
@@ -3655,13 +3666,24 @@ export class Executor {
|
|
|
3655
3666
|
projRow[outputName] = row[colName];
|
|
3656
3667
|
}
|
|
3657
3668
|
if (hasStar) {
|
|
3658
|
-
// SELECT * —
|
|
3659
|
-
|
|
3669
|
+
// SELECT * — 与行存 Star 语义一致:仅输出表声明列(排除 __rowId 等
|
|
3670
|
+
// 系统键;原 {...row} 整行拷贝泄漏 __rowId,行存路径不携带)
|
|
3671
|
+
const starRow = {};
|
|
3672
|
+
for (const col of table.columns) {
|
|
3673
|
+
if (col.name in row) {
|
|
3674
|
+
starRow[col.name] = row[col.name];
|
|
3675
|
+
}
|
|
3676
|
+
}
|
|
3677
|
+
projectedRows.push(starRow);
|
|
3660
3678
|
} else {
|
|
3661
3679
|
projectedRows.push(projRow);
|
|
3662
3680
|
}
|
|
3663
3681
|
}
|
|
3664
3682
|
|
|
3683
|
+
// 投影类型格式化(JSON/JSONB/ARRAY/GEOMETRY/TIMESTAMPTZ)——与行存路径一致;
|
|
3684
|
+
// 修复前返回列存原始值(ARRAY/JSON 为数组/对象、TIMESTAMPTZ 无会话时区)
|
|
3685
|
+
const formattedRows = this._formatTypedColumns(projectedRows, table);
|
|
3686
|
+
|
|
3665
3687
|
// 构造输出列元信息
|
|
3666
3688
|
const outputColumns = [];
|
|
3667
3689
|
for (const item of selectItems) {
|
|
@@ -3681,9 +3703,9 @@ export class Executor {
|
|
|
3681
3703
|
|
|
3682
3704
|
return {
|
|
3683
3705
|
type: 'SELECT',
|
|
3684
|
-
rows:
|
|
3706
|
+
rows: formattedRows,
|
|
3685
3707
|
columns: outputColumns,
|
|
3686
|
-
rowCount:
|
|
3708
|
+
rowCount: formattedRows.length,
|
|
3687
3709
|
_columnarAccelerated: true,
|
|
3688
3710
|
};
|
|
3689
3711
|
}
|
|
@@ -5491,63 +5513,82 @@ export class Executor {
|
|
|
5491
5513
|
});
|
|
5492
5514
|
|
|
5493
5515
|
// JSON/JSONB/ARRAY/GEOMETRY/TIMESTAMPTZ 类型输出:自动序列化
|
|
5494
|
-
|
|
5495
|
-
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
|
|
5499
|
-
|
|
5500
|
-
|
|
5501
|
-
|
|
5502
|
-
|
|
5516
|
+
// (2026-11-07 抽取为 _formatTypedColumns 共享方法,供列存模式 B 复用)
|
|
5517
|
+
return this._formatTypedColumns(resultRows, table);
|
|
5518
|
+
}
|
|
5519
|
+
|
|
5520
|
+
/**
|
|
5521
|
+
* 投影类型格式化(JSON/JSONB/ARRAY/GEOMETRY/TIMESTAMPTZ 输出形态)
|
|
5522
|
+
*
|
|
5523
|
+
* 2026-11-07 从 _applyProjection/_projectRowsCore 的两份内联块抽取为共享方法,
|
|
5524
|
+
* 并接线列存加速模式 B(_tryColumnarFilterProject)——此前模式 B 返回列存原始值
|
|
5525
|
+
* (ARRAY/JSON 为数组/对象、TIMESTAMPTZ 无会话时区格式化),与行存路径输出类型
|
|
5526
|
+
* 不一致(同一列不同查询形状返回类型不同)。
|
|
5527
|
+
* 语义与原内联块逐行一致:按表声明列收集类型列,逐行浅拷贝后格式化;
|
|
5528
|
+
* 表无类型列时原样返回(零开销)。行键为输出列名(别名替换后与表列名不同的
|
|
5529
|
+
* 列不参与格式化——与原两处内联块行为一致,未收窄)。
|
|
5530
|
+
* @param {Object[]} resultRows 投影后的行
|
|
5531
|
+
* @param {Object|null} table
|
|
5532
|
+
* @returns {Object[]} 格式化后的行
|
|
5533
|
+
*/
|
|
5534
|
+
_formatTypedColumns(resultRows, table) {
|
|
5535
|
+
if (!table || !table.columns) {
|
|
5536
|
+
return resultRows;
|
|
5537
|
+
}
|
|
5538
|
+
const jsonColumns = new Set(table.columns.filter(c => c.type === 'JSON' || c.type === 'JSONB').map(c => c.name));
|
|
5539
|
+
if (jsonColumns.size > 0) {
|
|
5540
|
+
resultRows = resultRows.map(row => {
|
|
5541
|
+
const formatted = { ...row };
|
|
5542
|
+
for (const colName of jsonColumns) {
|
|
5543
|
+
if (colName in formatted && typeof formatted[colName] === 'object' && formatted[colName] !== null) {
|
|
5544
|
+
formatted[colName] = formatJSON(formatted[colName]);
|
|
5503
5545
|
}
|
|
5504
|
-
|
|
5505
|
-
|
|
5506
|
-
}
|
|
5507
|
-
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
|
|
5511
|
-
|
|
5512
|
-
|
|
5513
|
-
|
|
5514
|
-
|
|
5546
|
+
}
|
|
5547
|
+
return formatted;
|
|
5548
|
+
});
|
|
5549
|
+
}
|
|
5550
|
+
const arrayColumns = new Set(table.columns.filter(c => c.type === 'ARRAY').map(c => c.name));
|
|
5551
|
+
if (arrayColumns.size > 0) {
|
|
5552
|
+
resultRows = resultRows.map(row => {
|
|
5553
|
+
const formatted = { ...row };
|
|
5554
|
+
for (const colName of arrayColumns) {
|
|
5555
|
+
if (colName in formatted && Array.isArray(formatted[colName])) {
|
|
5556
|
+
formatted[colName] = JSON.stringify(formatted[colName]);
|
|
5515
5557
|
}
|
|
5516
|
-
|
|
5517
|
-
|
|
5518
|
-
}
|
|
5519
|
-
|
|
5520
|
-
|
|
5521
|
-
|
|
5522
|
-
|
|
5523
|
-
|
|
5524
|
-
|
|
5525
|
-
|
|
5526
|
-
|
|
5558
|
+
}
|
|
5559
|
+
return formatted;
|
|
5560
|
+
});
|
|
5561
|
+
}
|
|
5562
|
+
const geomColumns = new Set(table.columns.filter(c => c.type === 'GEOMETRY').map(c => c.name));
|
|
5563
|
+
if (geomColumns.size > 0) {
|
|
5564
|
+
resultRows = resultRows.map(row => {
|
|
5565
|
+
const formatted = { ...row };
|
|
5566
|
+
for (const colName of geomColumns) {
|
|
5567
|
+
if (colName in formatted && formatted[colName] && typeof formatted[colName].toWKT === 'function') {
|
|
5568
|
+
formatted[colName] = formatted[colName].toWKT();
|
|
5527
5569
|
}
|
|
5528
|
-
|
|
5529
|
-
|
|
5530
|
-
}
|
|
5531
|
-
|
|
5532
|
-
|
|
5533
|
-
|
|
5534
|
-
|
|
5535
|
-
|
|
5536
|
-
|
|
5537
|
-
|
|
5538
|
-
|
|
5539
|
-
|
|
5540
|
-
|
|
5541
|
-
|
|
5542
|
-
|
|
5543
|
-
|
|
5570
|
+
}
|
|
5571
|
+
return formatted;
|
|
5572
|
+
});
|
|
5573
|
+
}
|
|
5574
|
+
const tstzColumns = new Set(table.columns.filter(c => c.type === 'TIMESTAMPTZ').map(c => c.name));
|
|
5575
|
+
if (tstzColumns.size > 0) {
|
|
5576
|
+
const tz = (this.db && typeof this.db._sessionTimeZoneOffset === 'number')
|
|
5577
|
+
? this.db._sessionTimeZoneOffset : 0;
|
|
5578
|
+
resultRows = resultRows.map(row => {
|
|
5579
|
+
const formatted = { ...row };
|
|
5580
|
+
for (const colName of tstzColumns) {
|
|
5581
|
+
if (colName in formatted && typeof formatted[colName] === 'string') {
|
|
5582
|
+
const p = parseTimestampTZ(formatted[colName]);
|
|
5583
|
+
const base = p ? p.date : parseWallTimeUTC(formatted[colName]);
|
|
5584
|
+
if (base && !isNaN(base.getTime())) {
|
|
5585
|
+
formatted[colName] = formatTimestampTZ(base, tz);
|
|
5544
5586
|
}
|
|
5545
5587
|
}
|
|
5546
|
-
|
|
5547
|
-
|
|
5548
|
-
}
|
|
5588
|
+
}
|
|
5589
|
+
return formatted;
|
|
5590
|
+
});
|
|
5549
5591
|
}
|
|
5550
|
-
|
|
5551
5592
|
return resultRows;
|
|
5552
5593
|
}
|
|
5553
5594
|
|
|
@@ -5696,68 +5737,9 @@ export class Executor {
|
|
|
5696
5737
|
return clean;
|
|
5697
5738
|
});
|
|
5698
5739
|
|
|
5699
|
-
// JSON/JSONB/ARRAY 类型输出:自动序列化
|
|
5700
|
-
|
|
5701
|
-
|
|
5702
|
-
if (jsonColumns.size > 0) {
|
|
5703
|
-
resultRows = resultRows.map(row => {
|
|
5704
|
-
const formatted = { ...row };
|
|
5705
|
-
for (const colName of jsonColumns) {
|
|
5706
|
-
if (colName in formatted && typeof formatted[colName] === 'object' && formatted[colName] !== null) {
|
|
5707
|
-
formatted[colName] = formatJSON(formatted[colName]);
|
|
5708
|
-
}
|
|
5709
|
-
}
|
|
5710
|
-
return formatted;
|
|
5711
|
-
});
|
|
5712
|
-
}
|
|
5713
|
-
const arrayColumns = new Set(table.columns.filter(c => c.type === 'ARRAY').map(c => c.name));
|
|
5714
|
-
if (arrayColumns.size > 0) {
|
|
5715
|
-
resultRows = resultRows.map(row => {
|
|
5716
|
-
const formatted = { ...row };
|
|
5717
|
-
for (const colName of arrayColumns) {
|
|
5718
|
-
if (colName in formatted && Array.isArray(formatted[colName])) {
|
|
5719
|
-
formatted[colName] = JSON.stringify(formatted[colName]);
|
|
5720
|
-
}
|
|
5721
|
-
}
|
|
5722
|
-
return formatted;
|
|
5723
|
-
});
|
|
5724
|
-
}
|
|
5725
|
-
|
|
5726
|
-
// GEOMETRY 类型输出:自动序列化为 WKT
|
|
5727
|
-
const geomColumns = new Set(table.columns.filter(c => c.type === 'GEOMETRY').map(c => c.name));
|
|
5728
|
-
if (geomColumns.size > 0) {
|
|
5729
|
-
resultRows = resultRows.map(row => {
|
|
5730
|
-
const formatted = { ...row };
|
|
5731
|
-
for (const colName of geomColumns) {
|
|
5732
|
-
if (colName in formatted && formatted[colName] && typeof formatted[colName].toWKT === 'function') {
|
|
5733
|
-
formatted[colName] = formatted[colName].toWKT();
|
|
5734
|
-
}
|
|
5735
|
-
}
|
|
5736
|
-
return formatted;
|
|
5737
|
-
});
|
|
5738
|
-
}
|
|
5739
|
-
|
|
5740
|
-
// v2.0-12 G12: TIMESTAMPTZ 类型输出 — 内部以 UTC 存储(无后缀字符串),
|
|
5741
|
-
// 展示时按会话时区偏移转换为 'YYYY-MM-DD HH:MM:SS±HH:MM'
|
|
5742
|
-
const tstzColumns = new Set(table.columns.filter(c => c.type === 'TIMESTAMPTZ').map(c => c.name));
|
|
5743
|
-
if (tstzColumns.size > 0) {
|
|
5744
|
-
const tz = (this.db && typeof this.db._sessionTimeZoneOffset === 'number')
|
|
5745
|
-
? this.db._sessionTimeZoneOffset : 0;
|
|
5746
|
-
resultRows = resultRows.map(row => {
|
|
5747
|
-
const formatted = { ...row };
|
|
5748
|
-
for (const colName of tstzColumns) {
|
|
5749
|
-
if (colName in formatted && typeof formatted[colName] === 'string') {
|
|
5750
|
-
const p = parseTimestampTZ(formatted[colName]);
|
|
5751
|
-
const base = p ? p.date : parseWallTimeUTC(formatted[colName]);
|
|
5752
|
-
if (base && !isNaN(base.getTime())) {
|
|
5753
|
-
formatted[colName] = formatTimestampTZ(base, tz);
|
|
5754
|
-
}
|
|
5755
|
-
}
|
|
5756
|
-
}
|
|
5757
|
-
return formatted;
|
|
5758
|
-
});
|
|
5759
|
-
}
|
|
5760
|
-
}
|
|
5740
|
+
// JSON/JSONB/ARRAY/GEOMETRY/TIMESTAMPTZ 类型输出:自动序列化
|
|
5741
|
+
// (2026-11-07 抽取为 _formatTypedColumns 共享方法,与 _projectRowsCore 共用)
|
|
5742
|
+
resultRows = this._formatTypedColumns(resultRows, table);
|
|
5761
5743
|
|
|
5762
5744
|
// 清理子查询展开创建的临时表(已缓存的保留,供后续查询复用)
|
|
5763
5745
|
for (const alias of _flattenTempTables) {
|
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.55.
|
|
65
|
+
public static final String SDK_VERSION = "2.55.1";
|
|
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.55.
|
|
5
|
+
"version": "2.55.1",
|
|
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.55.
|
|
33
|
-
| `pure-js-db/src/index.js` `VERSION` | `'2.55.
|
|
32
|
+
| `pure-js-db/package.json` | `2.55.1` |
|
|
33
|
+
| `pure-js-db/src/index.js` `VERSION` | `'2.55.1'` |
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
package/src/sdk/rust/src/lib.rs
CHANGED
package/src/version.js
CHANGED
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
* 并校验所有 JS 文件不再硬编码版本号。
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
export const VERSION = '2.55.
|
|
17
|
+
export const VERSION = '2.55.1';
|
|
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 覆盖率实测 + 审计章节归档;';
|