duckdb 1.3.2
CRAN 发布: 2025-07-09
新功能
- 更新至 duckdb v1.3.2,详见 https://github.com/duckdb/duckdb/releases/tag/v1.3.2。
duckdb 1.3.1
CRAN 发布: 2025-06-23
新功能
- 更新至 duckdb v1.3.1,详见 https://github.com/duckdb/duckdb/releases/tag/v1.3.1。
duckdb 1.3.0
CRAN 发布: 2025-06-02
新功能
更新至 duckdb v1.3.0,详见 https://github.com/duckdb/duckdb/releases/tag/v1.3.0。
添加了矩阵的摄取功能 (@joakimlinde, #1150)。
杂项
修复 rchk (#1173)。
修复编译器警告 (@joakimlinde, #1172)。
duckdb 1.2.2
CRAN 发布: 2025-04-29
新功能
更新至 duckdb v1.2.2,详见 https://github.com/duckdb/duckdb/releases/tag/v1.2.2。
添加了对 R 中 duckdb 数组的支持 (@joakimlinde, #102, #1090)。要启用此功能,请使用
dbConnect(duckdb(), array = "matrix")
进行连接 (@joakimlinde, #1125)。支持
TIME
和INTERVAL
数据中的小数秒 (#1109)。在转换错误中提及列名 (#1108)。
杂项
通过 ALTREP 暴露的类型与通过 DBI 暴露的类型相同 (#1111),包括
STRUCT
。这使得即将发布的 duckplyr 版本支持更多类型。在
rel_from_df()
和expr_constant()
中执行 ALTREP 兼容性的可选检查 (#1117)。尽可能在 C++ 层执行时区转换,以支持 ALTREP (#1130)。
改善开发者体验:
pkgload::load_all()
现在可用,如果头文件更改,源文件将重建,配置 clangd (#1128)。为未导出的函数添加带检查的点 (#1115)。
清理获取零行数据的边界情况 (#1104)。
避免 CRAN 上的计时测试 (#1101)。
duckdb 1.2.1
CRAN 发布: 2025-03-14
新功能
- 更新至 duckdb v1.2.1,详见 https://github.com/duckdb/duckdb/releases/tag/v1.2.1。
杂项
更新捆绑的 cpp11 到 0.5.2 (#1068)。
避免调用非 API R 函数。
duckdb 1.2.0
CRAN 发布: 2025-02-20
Bug 修复
移除
CPPHTTPLIB_USE_POLL
的无条件使用,以再次支持 R 4.0 和 R 4.1 的编译 (@Antonov548, #1043)。修复
add_days()
和add_years()
时钟函数的翻译问题 (#976, @IoannaNika)。
duckdb 1.1.3
CRAN 发布: 2024-11-21
新功能
更新至 duckdb v1.1.3,详见 https://github.com/duckdb/duckdb/releases/tag/v1.1.3。
新增
duckdb.materialize_callback
选项,取代get_last_rel()
(#589)。新增
rel_explain_df()
和rel_tostring()
(#587)。处理列表常量为空子值的情况 (#186, @romainfrancois)。
duckdb 1.1.2
CRAN 发布: 2024-10-30
新功能
- 更新至 duckdb v1.1.2,详见 https://github.com/duckdb/duckdb/releases/tag/v1.1.2。
新功能
长时间运行的查询现在可以使用 Ctrl + C (终端) 或 Escape (RStudio IDE 和 Workbench) 立即取消 (#514, #515)。
为
duckdb_read_csv()
添加col.types
参数 (#445, @eli-daniels)。如果已安装 rlang,则用 rlang 重新抛出错误 (#522)。
改进了语句提取过程中解析错误的错误消息 (tidyverse/duckplyr#219, #521)。
duckdb 1.1.1
CRAN 发布: 2024-10-16
新功能
更新至 duckdb v1.1.1,详见 https://github.com/duckdb/duckdb/releases/tag/v1.1.1。
为
duckdb_read_csv()
添加temporary
参数 (@ThomasSoeiro, #223)。
杂项
更新捆绑的扩展源至 hannes/duckdb-rfuns@20cde009b51b9355e6041b72b87105c6b45793fe。
移除未初始化变量的警告。
duckdb 1.1.0
CRAN 发布: 2024-09-24
新功能
更新至 duckdb v1.1.0,详见 https://github.com/duckdb/duckdb/releases/tag/v1.1.0。
将捆绑的 cpp11 升级到 0.5.0。
duckdb 1.0.0
CRAN 发布: 2024-06-13
Bug 修复
- 更新至 duckdb v1.0.0,详见 https://github.com/duckdb/duckdb/releases/tag/v1.0.0。
duckdb 0.10.3
新功能
- 更新至 duckdb v0.10.3,详见 https://github.com/duckdb/duckdb/releases/tag/v0.10.3。
- 支持获取
MAP
类型 (#61, #165)。 - 为
clock::date_count_between()
添加 dbplyr 翻译 (@edward-burn, #163, #166)。 -
round()
duckdb 翻译使用ROUND_EVEN()
而非ROUND()
(@lschneiderbauer, #146, #157)。 - 新增
sort
参数至rel_order()
(@toppyy, #168)。 - 为
clock::add_days()
,clock::add_years()
,clock::get_day()
,clock::get_month()
, 和clock::get_year()
添加 dbplyr 翻译 (@edward-burn, #153)。
Bug 修复
- 更正了 SQL 翻译中
win_current_group()
而非win_current_order()
的用法 (@lschneiderbauer, #173, #175)。
duckdb 0.10.2
CRAN 发布: 2024-05-01
新功能
- 更新至 duckdb v0.10.2,详见 https://github.com/duckdb/duckdb/releases/tag/v0.10.2。
"difftime"
类现在映射到INTERVAL
数据类型 (#151)。- 使用 DBItest 的最新测试 (#148)。
- 使用 duckdb structs 实现多个参数的
n_distinct()
(@lschneiderbauer, #110, #122)。 - 包含 rfuns 扩展 (hannes/duckdb-rfuns#78, #144)。
- 将
NA
映射到SQLNULL
(#143)。
duckdb 0.10.1
CRAN 发布: 2024-04-02
新功能
- 更新至 duckdb v0.10.1,详见 https://github.com/duckdb/duckdb/releases/tag/v0.10.1。
- 修复了
duckdb()
创建的驱动程序对象的关闭语义。使用此文件的最后一个连接调用dbDisconnect()
后,数据库文件将被关闭(并可供另一个会话打开)。dbDisconnect()
的shutdown
参数或duckdb_shutdown()
函数不再是必需的。同一 R 会话的两个数据库连接可以以读写模式并发访问同一个文件 (#124)。
duckdb 0.10.0
CRAN 发布: 2024-03-13
Bug 修复
当传递 Parquet 或 CSV 文件而不是表名时,
dplyr::tbl()
再次正常工作 (#38, #91)。DBI::dbQuoteIdentifier()
正确引用以数字开头的标识符 (#67, #92)。
新功能
新增
tbl_file()
和tbl_query()
以显式访问表和查询作为 dbplyr 惰性表 (#96)。tbl()
和新函数的cache
参数必须命名。对
LIST
逻辑类型的初始 ALTREP 支持 (@romainfrancois, #77)。核心更新至 duckdb v0.10.0 (#90)。
duckdb 0.9.1
CRAN 发布: 2023-10-13
请参阅博客文章:https://duckdb.net.cn/2023/09/26/announcing-duckdb-090.html。
请参阅发布说明:https://github.com/duckdb/duckdb/releases/tag/v0.9.1。
将源文件移至 https://github.com/duckdb/duckdb-r (@krlmlr)。
与 adbcdrivermanager 包添加 ADBC 集成 (duckdb/duckdb#8172, @paleolimbot)。
R 中列表和结构体的完全支持 (duckdb/duckdb#8503, @krlmlr)。
duckdb 0.2.8
CRAN 发布: 2021-08-02
此 DuckDB 预览版命名为“Ceruttii”,以纪念 现存丑鸭(Histrionicus Ceruttii)的一种早已灭绝的近亲。二进制构建列表如下。非常欢迎提供反馈。
注意:此版本再次引入了对磁盘存储格式的向后不兼容更改。我们建议您使用旧版本中的 EXPORT DATABASE 命令,然后在新版本中使用 IMPORT DATABASE 命令来迁移您的数据。详见文档。
duckdb 0.2.7
CRAN 发布: 2021-06-14
此 DuckDB 预览版命名为“Mollissima”,以纪念普通绒鸭 (Somateria mollissima)。二进制构建列表如下。非常欢迎提供反馈。
注意:此版本引入了对磁盘存储格式的向后不兼容更改。我们建议您使用旧版本中的 EXPORT DATABASE 命令,然后在新版本中使用 IMPORT DATABASE 命令来迁移您的数据。详见文档。
主要变更
SQL - #1847: 统一目录访问函数,并为常用 PostgreSQL 目录函数提供视图 - #1822: Python/JSON 风格的结构体和列表语法 - #1862: #1584 为浮点数和双精度数实现 NEXTAFTER
- #1860: 嵌套类型的 FIRST
实现 - #1858: UNNEST
表函数和解析器中的数组语法 - #1761: 问题 #1746: 移动 QUANTILE
API
- #1852, #1840, #1831, #1819 和 #1779: Arrow 集成改进
- #1843: ODBC 驱动程序的第一个迭代
- #1832: 添加可视化器扩展
- #1803: 将嵌套类型转换为原生 python
- #1773: 添加对键/值风格配置的支持,并在 Python API 中公开
引擎 - #1808: 基于行组的存储 - #1842: 添加(持久)结构体存储支持 - #1859: 带偏移量的原子读写 - #1851: 内部类型重构 - #1845: 嵌套连接负载 - #1813: 聚合行布局 - #1836: 连接行布局 - #1804: 在缓冲区管理器中使用 Allocator 类并添加自定义分配器使用测试
duckdb 0.2.6
CRAN 发布: 2021-05-09
此 DuckDB 预览版命名为“Jamaicensis”,以纪念 蓝嘴硬尾鸭 (Oxyura jamaicensis)。二进制构建列表如下。非常欢迎提供反馈。
注意:此版本引入了对磁盘存储格式的向后不兼容更改。我们建议您使用旧版本中的 EXPORT DATABASE 命令,然后在新版本中使用 IMPORT DATABASE 命令来迁移您的数据。详见文档。
另请注意:由于内部存储的变化 (#1530),使用此版本创建的数据库将需要更多磁盘空间。这是暂时的,我们正在努力最终确定磁盘存储格式。
主要变更
引擎 - #1666: 外部归并排序, #1580: 有序结果的并行扫描 和 #1561: 重构物理 ORDER BY - #1520 和 #1574: 窗口函数计算并行性 - #1540: 添加接受子查询参数的表函数 - #1533: 使用向量而非列块作为列表 - #1530: 将空值与主数据分开存储在有效性段中
SQL - #1568: 位置引用运算符 #1
等。 - #1671: QUANTILE
变体 和 #1685: 时间分位数 - #1695: 新的时间戳类型 TIMESTAMP_NS
, TIMESTAMP_MS
和 TIMESTAMP_NS
- #1647: 为常规时间戳转换添加对 UTC 偏移时间戳解析的支持 - #1659: 添加对 DELETE
语句中 USING
关键字的支持 - #1638, #1663, #1621 和 #1484: 围绕 ARRAY
语法的许多更改 - #1610: 添加对 CURRVAL
的支持 - #1544: 为 READ_CSV
和 COPY
添加 SKIP
选项
API - #1525: 添加可加载扩展支持 - #1711: 并行 Arrow 扫描 - #1569: Python API 的映射式 UDF - #1534: 可扩展的替换扫描 & 自动 Pandas 扫描 和 #1487: 当表名以 .parquet
或 .csv
结尾时自动使用 parquet 或 CSV 扫描 - #1649: 添加一个 QueryRelation 对象,可用于将查询直接转换为关系对象,#1665: 向 python api 添加 from_query - #1550: Shell: 为 linenoise 添加 Ctrl + 箭头键支持,并使 Ctrl+C 终止当前查询而非进程 - #1514: 使用 ALTREP
加速字符串列传输到 R - #1502: R: Rstudio 连接契约选项卡的实现
duckdb 0.2.5
CRAN 发布: 2021-03-16
此 DuckDB 预览版命名为“Falcata”,以纪念镰翅鸭(Mareca falcata)。二进制构建列表如下。非常欢迎提供反馈。
注意:此版本引入了对磁盘存储格式的向后不兼容更改。我们建议您使用旧版本中的 EXPORT DATABASE 命令,然后在新版本中使用 IMPORT DATABASE 命令来迁移您的数据。详见文档。
主要变更
引擎 - #1356: 增量检查点 - #1422: 优化 Top N 实现
SQL - #1406, #1372, #1387: 许多新的聚合函数 - #1460: 接受分位数列表的 QUANTILE
聚合变体 & #1346: 近似分位数 - #1461: JACCARD
, #1441 LEVENSHTEIN
和 HAMMING
距离标量函数 - #1370: FACTORIAL
标量函数和 ! 后缀运算符 - #1363: IS (NOT) DISTINCT FROM
- #1385: LIST_EXTRACT
用于从列表中获取单个元素 - #1361: HAVING
子句中的别名 (修复问题 #1358) - #1355: 带有非常量值的 Limit 子句
API: - #1430 和 #1424: DuckDB WASM 构建 - #1419: 将 appender api 导出到 C - #1408: 为 C API 添加 blob 支持 - #1432, #1459 和 #1456: 进度条 - #1440: 详细分析器。
duckdb 0.2.4
CRAN 发布: 2021-02-02
此 DuckDB 预览版命名为“Jubata”,以纪念 澳大利亚树鸭 (Chenonetta jubata)。二进制构建列表如下。非常欢迎提供反馈。
注意:此版本引入了对磁盘存储格式的向后不兼容更改。我们建议您使用旧版本中的 EXPORT DATABASE 命令,然后在新版本中使用 IMPORT DATABASE 命令来迁移您的数据。详见文档。
主要变更: SQL - #1231: 全文搜索扩展 - #1309: 聚合函数的 Filter Clause - #1195: SAMPLE
运算符 - #1244: SHOW
select queries - #1301: CHR
和 ASCII
函数 & #1252: 添加 GAMMA
和 LGAMMA
函数
引擎 - #1211: (大部分) 无锁缓冲区管理器 - #1325: 无符号整数类型支持 - #1229: 过滤器上拉优化器 - #1296: 移除冗余 DELIM_GET
和 DELIM_JOIN
运算符的优化器 - #1219: DATE
, TIME
和 TIMESTAMP
重构:迁移到 epoch 格式 & 支持微秒
客户端 - #1287 和 #1275: 改进 JDBC 兼容性 - #1260: 重构客户端 API 和预处理语句,并改进 DuckDB -> Pandas 转换 - #1230: 添加对 pandas 数据框并行扫描的支持 - #1256: JNI appender - #1209: 将 shell 历史记录写入文件以允许崩溃恢复,并修复导入无效文件时的崩溃 - #1204: 为 R API 添加 blob 支持 和 #1202: 为 python api 添加 blob 支持
Parquet - #1314: Parquet Reader 的重构和嵌套类型支持
duckdb 0.2.3
CRAN 发布: 2020-12-12
此 DuckDB 预览版命名为“Serrator”,以纪念红胸秋沙鸭 (Mergus serrator)。二进制构建列表如下。非常欢迎提供反馈。
注意:此版本引入了对磁盘存储格式的向后不兼容更改。我们建议您使用旧版本中的 EXPORT DATABASE 命令,然后在新版本中使用 IMPORT DATABASE 命令来迁移您的数据。详见文档。
主要变更
SQL: - #1179: 间隔清理 & 扩展 INTERVAL
语法 - #1147: 添加精确的 MEDIAN
和 QUANTILE
函数 - #1129: 支持带 CREATE FUNCTION
的标量函数 - #1137: 添加对 (NOT
) ILIKE
的支持,并优化某些类型的 LIKE
表达式
引擎 - #1160: 完美聚合哈希表 - #1133: 统计信息重构和统计信息传播 - #1144: 通用聚合优化器, #1143: CSE 优化器 和 #1135: 优化分组键中的表达式 - #1138: 在过滤器中使用谓词 - #1071: 移除字符串空终止要求
客户端 - #1112: 添加 DuckDB node.js API - #1168: 添加对 Pandas 类别类型的支持 - #1181: 扩展 DuckDB::LibraryVersion() 以输出 dev 版本格式 0.2.3-devXXX
& #1176: Python 绑定: 添加模块属性以自省 DuckDB 版本
Parquet 读取器: - #1183: Parquet 读取器的过滤器下推 - #1167: 将 Parquet 统计信息导出到 DuckDB - #1162: 添加对 Parquet 写入器中压缩编解码器的支持 & #1163: 添加 ZSTD 压缩代码并添加 ZSTD 编解码器作为 Parquet 导出的选项 - #1103: 添加对象缓存和 Parquet 元数据缓存
duckdb 0.2.2
CRAN 发布: 2020-11-03
这是 DuckDB 的预览版。从该版本开始,版本也将命名。名称选自鸭子种类(当然)。我们从“Clypeata”开始。
注意: 此版本引入了对磁盘存储格式的向后不兼容更改。我们建议您使用旧版本中的 EXPORT DATABASE
命令,然后在新版本中使用 IMPORT DATABASE
命令来迁移您的数据。详见文档。
二进制构建列表如下。非常欢迎提供反馈。主要变更
SQL - #1057: 添加用于启用/禁用优化器的 PRAGMA & 扩展查询图输出 - #1048: 允许子查询中的 CTE (包括 CTE 本身) 和 #987: 允许 CREATE VIEW 语句中的 CTE - #1046: 美化 Explain/Query Profiler 输出 - #1037: 支持 UPDATE 语句中的 FROM 子句 - #1006: STRING_SPLIT 和 STRING_SPLIT_REGEX SQL 函数 - #1000: 实现 MD5 函数 - #936: 为 Parquet 和 CSV 读取器添加 GLOB 支持 - #899: 表函数 information_schema_schemata() 和 information_schema_tables() 以及 #903: 添加表函数 information_schema_columns()
引擎 - #984: 并行分组聚合 和 #1045: 聚合哈希表的一些性能修复 - #1008: 索引连接 - #991: 本地存储重构: 每块的版本信息并刷新中间块到基表 - #906: 单个 Parquet 文件的并行扫描 和 #982: Parquet 库中的 ZSTD 支持 - #883: 统一表扫描与表函数 - #873: TPC-H 扩展 - #884: 移除所有数据的 NFC-normalization 要求并添加 COLLATE NFC
客户端 - #1001: Shell 中的动态语法高亮 - #933: 将 shell.c 升级到 3330000 - #918: 在绑定中添加对 Python datetime 类型的支持 - #950: 支持日期和时间输出到 arrow - #893: 支持 Arrow NULL 列
duckdb 0.2.1
CRAN 发布: 2020-09-10
这是 DuckDB 的预览版。二进制构建列表如下。非常欢迎提供反馈。主要变更
引擎 - #770: 启用流水线间并行性 - #835: 类型系统更新,包括 #779: INTERVAL
类型, #858: 定点 DECIMAL
类型 & #819: HUGEINT
类型 - #790: Parquet 写入支持
API - #866: 初始 Arrow 支持 - #809: 聚合 UDF 支持,包括 #843: 通用 CreateAggregateFunction()
& #752: 仅使用模板参数的 CreateVectorizedFunction()
SQL - #824: strftime
和 strptime
- #858: EXPORT DATABASE
和 IMPORT DATABASE
- #832: read_csv(_auto) 改进: 可选参数、可配置样本大小、行号信息
duckdb 0.2.0
这是 DuckDB 的预览版。二进制构建列表如下。非常欢迎提供反馈。
SQL: - #730: FULL OUTER JOIN
支持 - #732: 支持 NULLS FIRST
/NULLS LAST
- #698: 添加 LEAST
/GREATEST
函数的实现 - #772: 实现 TRIM
函数并为 RTRIM
/LTRIM
/TRIM
添加可选的第二个参数 - #771: 扩展正则表达式选项
客户端: - Python: #720: 使 Pandas 成为可选并添加对 PyPy 的支持 - C++: #712: C++ UDF API
duckdb 0.1.9
这是 DuckDB 的预览版。二进制文件列表如下。非常欢迎提供反馈。主要变更:新网站 woo-ho!
引擎 - #653: Parquet 读取器集成
duckdb 0.1.8
这是 DuckDB 的预览版。欢迎提供反馈。
SQL - SQL 函数 IF
和 IFNULL
#644 - SQL 字符串函数 LEFT
#620 和 RIGHT
#631 - #641: BLOB
类型支持 - #640: LIKE
转义支持
客户端 - #627: Python 关系 API 的插入支持
duckdb 0.1.7
这是 DuckDB 的第六个预览版。欢迎提供反馈。二进制构建也可用。
SQL - 添加/删除列、更改默认值和列类型 #612 - 排序规则支持 - CSV 嗅探器 READ_CSV_AUTO
用于方言、数据类型和头检测 #582 - SHOW
& DESCRIBE
表 #501 - 字符串函数 CONTAINS
#488 - 字符串函数 LPAD
/ RPAD
, LTRIM
/ RTRIM
, REPEAT
, REPLACE
& UNICODE
#597 - 位函数 BIT_LENGTH
, BIT_COUNT
, BIT_AND
, BIT_OR
, BIT_XOR
& BIT_AGG
#608
引擎 - LIKE
优化规则 #559 - 表扫描中的自适应过滤器 #574 - ICU 扩展用于扩展排序规则 & 扩展支持 #594 - 扫描中的扩展区域映射支持 #551 - 禁止系统中的 NaN/INF #541 - 在 Reverse 和 Shell 中使用 UTF Grapheme Cluster Breakers #570
客户端 - C++ 的关系 API #509 和 Python 的关系 API #598 - DuckDB 的 Java (TM) JDBC (R) 客户端 #492 #520 #550
duckdb 0.1.6
这是 DuckDB 的第五个预览版。欢迎提供反馈。二进制构建可在以下网址找到:http://download.duckdb.org/alias/v0.1.6/
SQL - #455 表重命名 ALTER TABLE tbl RENAME TO tbl2
- #457 嵌套列表类型可以使用 LIST
聚合创建,并通过新的 UNNEST
运算符解包 - #463 INSTR
字符串函数, #477 PREFIX
字符串函数, #480 SUFFIX
字符串函数
引擎 - #442 优化了字符串的类型转换性能 - #444 表生成函数的变量返回类型 - #453 重构聚合函数接口 - #474 选择向量重构 - #478 所有传入字符串的 UTF8 NFC 规范化 - #482 基于最小/最大索引跳过扫描中的表段
Python 客户端 - #451 date
/ datetime
支持 - #467 游标的 description
字段 - #473 为 connect
添加 read_only
标志 - #481 使用 pybind11
重写 Python API
R 客户端 - #468 R 客户端中预处理语句的支持 - #479 为表函数 read_csv_duckdb
添加自动 CSV 转换 - #483 R data.frame
对象的直接扫描运算符
duckdb 0.1.5
这是 DuckDB 的第四个预览版。欢迎提供反馈。注意:由于 Python 打包问题,v0.1.4 版本被跳过。
二进制构建可在以下网址找到:http://download.duckdb.org/rev/59f8907b5d89268c158ae1774d77d6314a5c075f/
主要变更: - #409 向量大修 - #423 移除单个向量基数 - #418 DATE_TRUNC
SQL 函数 - #424 REVERSE
SQL 函数 - #416 支持 SELECT table.* FROM table
- #414 查询执行中的 STRUCT 类型 - #431 更改内部字符串表示 - #433 将内部类型 index_t
重命名为 idx_t
- #439 支持只读模式下的临时结构 - #440 在 Solaris 和 OpenBSD 上构建
注意: 此版本在 Python API 中包含一个错误,导致在将字符串获取到 NumPy/Pandas 时崩溃 #447
duckdb 0.1.3
这是 DuckDB 的第三个预览版。欢迎提供反馈。二进制构建可在以下网址找到:http://download.duckdb.org/rev/59f8907b5d89268c158ae1774d77d6314a5c075f/
主要变更: * #388 Shell 的重大更新 * #390 未使用的列和列生命周期优化器 * #402 索引/主键中的字符串和复合键 * #406 过滤表达式的自适应重新排序
duckdb 0.1.2
这是 DuckDB 的第三个预览版。欢迎提供反馈。二进制构建可在以下网址找到:http://download.duckdb.org/rev/6fcb5ef8e91dcb3c9b2c4ca86dab3b1037446b24/
duckdb 0.1.1
这是 DuckDB 的第二个预览版。欢迎提供反馈。二进制构建可在以下网址找到:http://download.duckdb.org/rev/2e51e9bae7699853420851d3d2237f232fc2a9a8/
duckdb 0.1.0
这是 DuckDB 的第一个预览版。欢迎提供反馈。
二进制构建可在以下网址找到:http://download.duckdb.org/rev/c1cbc9d0b5f98a425bfb7edb5e6c59b5d10550e4/