Mike Wallace created COUCHDB-2774:
-------------------------------------

             Summary: COPY request create a target document with a different 
revision hash
                 Key: COUCHDB-2774
                 URL: https://issues.apache.org/jira/browse/COUCHDB-2774
             Project: CouchDB
          Issue Type: Bug
      Security Level: public (Regular issues)
          Components: Database Core
            Reporter: Mike Wallace


HTTP COPY requests create an identical copy of the source document. As the body 
of the target is unchanged the revision hash should also be unchanged, however 
that is not currently the case:

$ URL=http://localhost:15984
$ curl -X PUT $URL/doge
{"ok":true}
$ curl -X PUT $URL/doge/shibe1 -d '{"such doge":"very doc"}'
{"ok":true,"id":"shibe1","rev":"1-6429670183877c94fed5cc7996cd880a"}
$ curl -X COPY $URL/doge/shibe1 -H 'Destination: shibe2'
{"ok":true,"ok":true,"id":"shibe2","rev":"1-c73d863c32ec87653923959eae56920b"}
$ curl -X GET $URL/doge/shibe2
{"_id":"shibe2","_rev":"1-c73d863c32ec87653923959eae56920b","such doge":"very 
doc"}

The reason for the difference is because the document opened in the copy 
handler has a binary body [1]. When the revision hash is generated on update 
the binary is passed into couch_db:new_revid/1 and hence the hash is different. 
If we change the binary body to an ejson body and save the doc then the 
revision hash is the same [2].

There are two possible solutions. One is to add a clause to 
couch_db:new_revid/1 which converts any binary doc bodies to ejson [3], the 
alternative is to open the doc with the ejson_body option in the chttpd_db 
handler fun.

I prefer the second approach, using ejson_body to open the doc in chttpd_db, 
since it is simpler and further up the stack, so less likely to have any 
unfortunate side-effects.

Unless anyone comments to the contrary I'll PR the second option.

[1] https://github.com/apache/couchdb-chttpd/blob/master/src/chttpd_db.erl#L774

[2] https://gist.github.com/mikewallace1979/592b65b2e51ca5f9a1a7

[3] 
https://github.com/apache/couchdb-couch/commit/2b44b8d6eb865e24e05866e7aa8dd57d076a01d6



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to