在文档中使用NULL值已截断

时间:2015-07-03 20:41:37

标签: arangodb

在ArangoDB 2.5.2中(可能更早),我们编写的代码依赖于允许NULL字符的文档中的值。

在ArangoDB 2.6.1+中,似乎NULL充当字符串终止符,即使可能有更多的字符串数据。我们如何恢复以前的行为?

例如,如果值为"value\u0000SubValue1\u0000SubValue2",则不幸的是,较新的版本会截断:

2.5.2 => "value\u0000SubValue1\u0000SubValue2"
2.6.2 => "value"

我们使用NULL作为分隔符,因为我们知道这是一个不会出现在子字符串中的字符。

更新

以下是在Windows上从shell重现问题的步骤。

arangosh [demo]> db._create("SO")
[ArangoCollection 848312398088, "SO" (type document, status loaded)]
arangosh [demo]> db.SO.save({ "v":"a\u0001b"})
{
  "_id" : "SO/848317640968",
  "_rev" : "848317640968",
  "_key" : "848317640968"
}
arangosh [demo]> db.SO.document("SO/848317640968")
{
  "v" : "a\u0001b",
  "_id" : "SO/848317640968",
  "_rev" : "848317640968",
  "_key" : "848317640968"
}
arangosh [demo]> db.SO.save({ "v":"a\u0000b"})
{
  "_id" : "SO/848320262408",
  "_rev" : "848320262408",
  "_key" : "848320262408"
}
arangosh [demo]> db.SO.document("SO/848320262408")
{
  "v" : "a",      // the rest of the value has been truncated
  "_id" : "SO/848320262408",
  "_rev" : "848320262408",
  "_key" : "848320262408"
}

而且,我在GitHub上创建了一个issue

1 个答案:

答案 0 :(得分:1)

这确实是一个错误,但它只发生在特定情况下。

是否触发它取决于文档的检索方式(服务器内的JavaScript函数或通过HTTP API,AQL或CRUD操作)以及文档是否以ShapedJson格式内部保存。

我能够重现2.5& amp; 2.6在Linux下以及以下情况下,当通过HTTP REST API检索文档并使用单个文档读取时,即通过HTTP GET / _api / document //.

以下是如何重现:

  • 创建集合并存储包含NUL属性值的文档:

    db._create("SO");
    db.SO.save({ "v": "a\u0000b", _key: "b" });
    
  • 然后从ArangoShell内部查询文档:

    db.SO.document("b")
    

这将返回截断值:

{ 
  "v" : "a", 
  "_id" : "SO/b", 
  "_rev" : "4124146417077", 
  "_key" : "b" 
}

在arangod中查询文档或使用ArangoShell中的以下方法之一时,它可以正常工作:

  • db.<collection>.any()
  • db.<collection>.toArray()

我在2.6分支中提交了一个修复程序,最终将成为发布版本2.6.3。

请注意,在上述情况下,使用属性值内的NUL字节似乎至少自2014年4月起无效,这意味着它可能无法在2.5中工作,甚至不能在2.4和2.3中工作。