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:

Reply via email to