[sr-dev] git:master: modules_k/db_sqlite: fix crash with computed fields in custom queries

Timo Teras timo.teras at iki.fi
Thu Nov 15 15:16:06 CET 2012


Module: sip-router
Branch: master
Commit: 09205865f98136e0354539f09f4961ca016a915b
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=09205865f98136e0354539f09f4961ca016a915b

Author: Timo Teräs <timo.teras at iki.fi>
Committer: Timo Teräs <timo.teras at iki.fi>
Date:   Thu Nov 15 16:11:41 2012 +0200

modules_k/db_sqlite: fix crash with computed fields in custom queries

Computed fields do not have decltype available, so guess the proper
field type based on the result type of the first row. This does not
work if the first row has null type as result, but is the best we can
do easily and fixes gives right result in most cases.

Reported-by: Pedro Antonio Vico Solano <pvsolano at amper.es>

---

 modules_k/db_sqlite/dbase.c |   28 +++++++++++++++++++++++++++-
 1 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/modules_k/db_sqlite/dbase.c b/modules_k/db_sqlite/dbase.c
index c1d3b71..c4df4ce 100644
--- a/modules_k/db_sqlite/dbase.c
+++ b/modules_k/db_sqlite/dbase.c
@@ -288,6 +288,24 @@ static int decltype_to_dbtype(const char *decltype)
 	return DB1_INT;
 }
 
+static int type_to_dbtype(int type)
+{
+	switch (type) {
+	case SQLITE_INTEGER:
+		return DB1_INT;
+	case SQLITE_FLOAT:
+		return DB1_DOUBLE;
+	case SQLITE_TEXT:
+		return DB1_STR;
+	case SQLITE_BLOB:
+		return DB1_BLOB;
+	default:
+		/* Unknown, or NULL column value. Assume this is a
+		 * string. */
+		return DB1_STR;
+	}
+}
+
 static str* str_dup(const char *_s)
 {
 	str *s;
@@ -348,10 +366,18 @@ int db_sqlite_store_result(const db1_con_t* _h, db1_res_t** _r)
 			RES_COL_N(res) = rc;
 
 			for (i = 0; i < RES_COL_N(res); i++) {
+				const char *decltype;
+				int dbtype;
+
 				RES_NAMES(res)[i] = str_dup(sqlite3_column_name(conn->stmt, i));
 				if (RES_NAMES(res)[i] == NULL)
 					goto no_mem;
-				RES_TYPES(res)[i] = decltype_to_dbtype(sqlite3_column_decltype(conn->stmt, i));
+				decltype = sqlite3_column_decltype(conn->stmt, i);
+				if (decltype != NULL)
+					dbtype = decltype_to_dbtype(decltype);
+				else
+					dbtype = type_to_dbtype(sqlite3_column_type(conn->stmt, i));
+				RES_TYPES(res)[i] = dbtype;
 			}
 		}
 		if (num_rows >= num_alloc) {




More information about the sr-dev mailing list