It would probably have been a good thing if this patch actually fixed
the issue it purported to, yes?
I missed a key set of references in sqlbuilder.py and was insufficiently
aggressive elsewhere. The attached patch resolves these issues.
Index: sqlobject/dbconnection.py
===================================================================
--- sqlobject/dbconnection.py (revision 1695)
+++ sqlobject/dbconnection.py (working copy)
@@ -604,9 +604,9 @@
# in the SQLObject class.
def _SO_update(self, so, values):
- self.query("UPDATE %s SET %s WHERE %s = %s" %
+ self.query("UPDATE %s SET %s WHERE (%s) = (%s)" %
(so.sqlmeta.table,
- ", ".join(["%s = %s" % (dbName, self.sqlrepr(value))
+ ", ".join(["(%s) = (%s)" % (dbName, self.sqlrepr(value))
for dbName, value in values]),
so.sqlmeta.idName,
self.sqlrepr(so.id)))
@@ -615,14 +615,14 @@
columns = ", ".join(columnNames)
if columns:
return self.queryOne(
- "SELECT %s FROM %s WHERE %s = %s" %
+ "SELECT %s FROM %s WHERE (%s) = (%s)" %
(columns,
so.sqlmeta.table,
so.sqlmeta.idName,
self.sqlrepr(so.id)))
else:
return self.queryOne(
- "SELECT NULL FROM %s WHERE %s = %s" %
+ "SELECT NULL FROM %s WHERE (%s) = (%s)" %
(so.sqlmeta.table,
so.sqlmeta.idName,
self.sqlrepr(so.id)))
@@ -635,7 +635,7 @@
raise ValueError, "'column' and 'value' tuples must be of the same size"
columns = []
for i in xrange(len(column)):
- columns.append("%s = %s" % (column[i], self.sqlrepr(value[i])))
+ columns.append("(%s) = (%s)" % (column[i], self.sqlrepr(value[i])))
condition = ' AND '.join(columns)
return self.queryOne("SELECT %s FROM %s WHERE %s" %
(", ".join(columnNames),
@@ -643,20 +643,20 @@
condition))
def _SO_delete(self, so):
- self.query("DELETE FROM %s WHERE %s = %s" %
+ self.query("DELETE FROM %s WHERE (%s) = (%s)" %
(so.sqlmeta.table,
so.sqlmeta.idName,
self.sqlrepr(so.id)))
def _SO_selectJoin(self, soClass, column, value):
- return self.queryAll("SELECT %s FROM %s WHERE %s = %s" %
+ return self.queryAll("SELECT %s FROM %s WHERE (%s) = (%s)" %
(soClass.sqlmeta.idName,
soClass.sqlmeta.table,
column,
self.sqlrepr(value)))
def _SO_intermediateJoin(self, table, getColumn, joinColumn, value):
- return self.queryAll("SELECT %s FROM %s WHERE %s = %s" %
+ return self.queryAll("SELECT %s FROM %s WHERE (%s) = (%s)" %
(getColumn,
table,
joinColumn,
@@ -664,7 +664,7 @@
def _SO_intermediateDelete(self, table, firstColumn, firstValue,
secondColumn, secondValue):
- self.query("DELETE FROM %s WHERE %s = %s AND %s = %s" %
+ self.query("DELETE FROM %s WHERE (%s) = (%s) AND (%s) = (%s)" %
(table,
firstColumn,
self.sqlrepr(firstValue),
Index: sqlobject/sqlbuilder.py
===================================================================
--- sqlobject/sqlbuilder.py (revision 1695)
+++ sqlobject/sqlbuilder.py (working copy)
@@ -230,7 +230,7 @@
self.expr1 = expr1
self.expr2 = expr2
def __sqlrepr__(self, db):
- return "(%s %s %s)" % (sqlrepr(self.expr1, db), self.op, sqlrepr(self.expr2, db))
+ return "((%s) %s (%s))" % (sqlrepr(self.expr1, db), self.op, sqlrepr(self.expr2, db))
def components(self):
return [self.expr1, self.expr2]
def execute(self, executor):
@@ -884,7 +884,7 @@
self.expr = expr
self.string = string
def __sqlrepr__(self, db):
- return "(%s %s %s)" % (sqlrepr(self.expr, db), self.op, sqlrepr(self.string, db))
+ return "(%s %s (%s))" % (sqlrepr(self.expr, db), self.op, sqlrepr(self.string, db))
def components(self):
return [self.expr, self.string]
def execute(self, executor):
@@ -912,7 +912,7 @@
else:
return "LIKE"
def __sqlrepr__(self, db):
- return "(%s %s %s)" % (
+ return "(%s %s (%s))" % (
sqlrepr(self.expr, db), self._get_op(db), sqlrepr(self.string, db)
)
def execute(self, executor):
Index: sqlobject/main.py
===================================================================
--- sqlobject/main.py (revision 1695)
+++ sqlobject/main.py (working copy)
@@ -1293,7 +1293,7 @@
else:
names = []
for i in xrange(len(name)):
- names.append("%s = %s" % (name[i], repr(value[i])))
+ names.append("(%s) = (%s)" % (name[i], repr(value[i])))
names = ', '.join(names)
raise SQLObjectNotFound, "The %s by unique index %s(%s) does not exist" % (cls.__name__, idxName, names)
if obj:
@@ -1483,7 +1483,7 @@
if col.cascade == False:
# Found a restriction
restrict = True
- query.append("%s = %s" % (col.dbName, self.id))
+ query.append("%s = (%s)" % (col.dbName, self.id))
if col.cascade == 'null':
setnull = col.name
elif col.cascade: