monotone-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Monotone-devel] Updated Issue 96 - SQLite 3.7.3 breakage (monotone)


From: code
Subject: [Monotone-devel] Updated Issue 96 - SQLite 3.7.3 breakage (monotone)
Date: Thu, 21 Oct 2010 12:05:20 GMT

Hello,

The following issue has been updated:

96 - SQLite 3.7.3 breakage
Project: monotone
Status: Fixed
Reported by: Thomas Keller
URL: http://code.monotone.ca/p/monotone/issues/96/
Labels:
 Type:Defect
 Priority:Critical

Comments (last first):

# By Timothy Brownawell, Oct 21, 2010:

As best I can tell, it only returns zero for empty blobs and NULLs. So the 
following should work (committed as 9def7716bcd068fc1929ed8336432bbed775d9ee).


#
# old_revision [97939c9677047b36beef031cce4c1896849a987c]
#
# patch "database.cc"
#  from [0afa3ff4bd9c9ee3bc62b10bcf6295a9f5388d64]
#    to [8bfff559a0894259fe3668294bd3906ae837129b]
#
============================================================
--- database.cc 0afa3ff4bd9c9ee3bc62b10bcf6295a9f5388d64
+++ database.cc 8bfff559a0894259fe3668294bd3906ae837129b
@@ -1531,12 +1531,19 @@ database_impl::fetch(results & res,
       vector<string> row;
       for (int col = 0; col < ncol; col++)
         {
+          // We never store NULLs, so we should never see one.
+          int const datatype = sqlite3_column_type(i->second.stmt(), col);
+          E(datatype != SQLITE_NULL, origin::database,
+            F("null result in query: %s") % query.sql_cmd);
           const char * value = (const 
char*)sqlite3_column_blob(i->second.stmt(), col);
           int bytes = sqlite3_column_bytes(i->second.stmt(), col);
-          E(value, origin::database,
-            F("null result in query: %s") % query.sql_cmd);
-          row.push_back(string(value, value + bytes));
-          //L(FL("row %d col %d value='%s'") % nrow % col % value);
+          if (value) {
+            row.push_back(string(value, value + bytes));
+          } else {
+            // sqlite3_column_blob() returns null for zero-length
+            I(bytes == 0);
+            row.push_back(string());
+          }
         }
       res.push_back(row);
     }

 Status: Fixed

# By Thomas Keller, Oct 18, 2010:

Ok, I debugged into this and the easiest way to reproduce the problem in 3.7.3 
is to do

$ mtn db init -d test.mtn
$ mtn db set foo foo "" -d test.mtn
$ mtn ls vars

The empty value column is returned as "" (zero-length string) in sqlite 3.7.2 
and 3.6.23 (and possibly other versions which used to work), but as 0 in 3.7.3.

According to sqlite's docs (http://www.sqlite.org/c3ref/column_blob.html) this 
seems to be correct

  The return value from sqlite3_column_blob() for a 
  zero-length BLOB is a NULL pointer."

but apparently was broken in earlier versions (or the paragraph has just been 
added for 3.7.3).

I'm now trying to find out whether there is a valid error case for which 
sqlite3_column_blob() also returns 0 and if not, our error in database.cc 
should probably laxed and the null pointer handled properly.

# By Thomas Keller, Oct 16, 2010:

Steps to reproduce the problem:
-------------------------------

$ mtn ls vars

Expected result:
----------------

Database variables

Actual results:
---------------

mtn: fatal: error: null result in query: SELECT domain, name, value FROM db_vars
mtn: this is almost certainly a bug in monotone.
...

Output of `mtn version --full`:
-------------------------------

monotone 0.99dev (base revision: 104f634f6a14e8e085ba5c89d8b95d16ae5b62c4)
Running on          : Darwin 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 
16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386
C++ compiler        : GNU C++ version 4.0.1 (Apple Inc. build 5490)
C++ standard library: GNU libstdc++ version 20050421
Boost version       : 1_44
SQLite version      : 3.7.3 (compiled against 3.7.2)
Lua version         : Lua 5.1
PCRE version        : 8.10 2010-06-25 (compiled against 8.10)
Botan version       : 1.8.10 (compiled against 1.8.10)
Changes since base revision:
format_version "1"

new_manifest [c679fc930e31daba26c09dc437f950a0d7fe7d78]

old_revision [104f634f6a14e8e085ba5c89d8b95d16ae5b62c4]


-----------

This seems to be a runtime-only problem, i.e. it doesn't matter that mtn is 
compiled against 3.7.2 for the problem to pop up. The invariant in 
database.cc:1537 fires, because a column we're trying to fetch returns a NULL 
result:

// value is NULL
const char * value = \
  (const char*)sqlite3_column_blob(i->second.stmt(), col);

I'm not sure why this is the case and I cannot take on this right now. I hope I 
can evaluate the problem more in detail later on.



--
Issue: http://code.monotone.ca/p/monotone/issues/96/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]