Hello, I think I found a bug in CouchDB 1.2.1 that makes it possible to insert a document that will be accepted but disappears in the database. The problem occurs after you run compact on a database with a document containing an attachment, then delete the document and try to insert a new document with the same id.
How to reproduce the problem: # I have a newly created database named "test" mikael@couchdb:~$ curl http://127.0.0.1:5998/_all_dbs ["_users","test"] # Insert a document mikael@couchdb:~$ curl -H "Content-Type: application/json" -d '{"_id":"1"}' -X PUT http://127.0.0.1:5998/test/1 {"ok":true,"id":"1","rev":"1-967a00dff5e02add41819138abb3284d"} # Add an attachment mikael@couchdb:~$ curl -H "Content-Type: application/json" -d 'data' -X PUT http://127.0.0.1:5998/test/1/test?rev=1-967a00dff5e02add41819138abb3284d {"ok":true,"id":"1","rev":"2-a8027b975388125d7d3d174a5e5c01d5"} # Run compact on the database mikael@couchdb:~$ curl -H "Content-Type: application/json" -X POST http://127.0.0.1:5998/test/_compact {"ok":true} # Delete the document mikael@couchdb:~$ curl -H "Content-Type: application/json" -X DELETE http://127.0.0.1:5998/test/1?rev=2-a8027b975388125d7d3d174a5e5c01d5 {"ok":true,"id":"1","rev":"3-b65cd2eecc2b3038ce5a94aabb738c95"} # Insert a new document with same id mikael@couchdb:~$ curl -H "Content-Type: application/json" -d '{"_id":"1"}' -X PUT http://127.0.0.1:5998/test/1 {"ok":true,"id":"1","rev":"1-967a00dff5e02add41819138abb3284d"} # Notice that couch gives it a rev number starting with "1-XX" and that it doesn't show up in the database. mikael@couchdb:~$ curl http://127.0.0.1:5998/test/_all_docs {"total_rows":0,"offset":0,"rows":[]} An other way to get the same behavior is to fiddle around with the rev number: # I have two newly created databases named "a" and "b" couchdb@couchdb:~$ curl http://127.0.0.1:5998/_all_dbs ["_users","a","b"] # Insert a document to database "a", just to get hold of a rev number (doesn't seem to work with random rev number, but I haven't looked in to that so much) couchdb@couchdb:~$ curl -H "Content-Type: application/json" -d '{"docs":[{"_id":"1"}]}' -X POST http://127.0.0.1:5998/a/_bulk_docs [{"ok":true,"id":"1","rev":"1-967a00dff5e02add41819138abb3284d"}] # Insert a document to database "b" with the same id and rev as the document from "a" couchdb@couchdb:~$ curl -H "Content-Type: application/json" -d '{"docs":[{"_id":"1", "_rev":"1-967a00dff5e02add41819138abb3284d"}]}' -X POST http://127.0.0.1:5998/b/_bulk_docs [{"ok":true,"id":"1","rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}] # Delete the document in "b" (notice that the rev number is "2-XX") couchdb@couchdb:~$ curl -H "Content-Type: application/json" -d '{"docs":[{"_id":"1","_rev":"2-7051cbe5c8faecd085a3fa619e6e6337","_deleted":true}]}' -X POST http://127.0.0.1:5998/b/_bulk_docs [{"ok":true,"id":"1","rev":"3-7379b9e515b161226c6559d90c4dc49f"}] # Insert a document with the same id but without a rev number couchdb@couchdb:~$ curl -H "Content-Type: application/json" -d '{"docs":[{"_id":"1"}]}' -X POST http://127.0.0.1:5998/b/_bulk_docs [{"ok":true,"id":"1","rev":"1-967a00dff5e02add41819138abb3284d"}] # Notice that couch gives it a rev number starting with "1-XX" and that it doesn't show up in the database. couchdb@couchdb:~$ curl http://127.0.0.1:5998/b/_all_docs {"total_rows":0,"offset":0,"rows":[]} Best regards Mikael Hägerbro
