Fixed a regression introduced in where.as_sql() refactor

At least Oracle needs parentheses in negated where conditions, even if
there is only single condition negated. Fixed this by reverting to old
logic in that part of as_sql() and adding a comment about this.

I did not investigate why the parentheses are needed. The original
offending commit was bd283aa844.
This commit is contained in:
Anssi Kääriäinen 2012-07-01 22:49:38 +03:00
parent f572ee0c65
commit e74787391e
2 changed files with 7 additions and 4 deletions

View File

@ -135,10 +135,13 @@ class WhereNode(tree.Node):
conn = ' %s ' % self.connector
sql_string = conn.join(result)
if sql_string:
if len(result) > 1:
sql_string = '(%s)' % sql_string
if self.negated:
sql_string = 'NOT %s' % sql_string
# Note that some backends (Oracle at least) need the
# parentheses even around single experssion in the
# negated case.
sql_string = 'NOT (%s)' % sql_string
elif len(result) > 1:
sql_string = '(%s)' % sql_string
return sql_string, result_params
def make_atom(self, child, qn, connection):

View File

@ -2091,7 +2091,7 @@ class WhereNodeTest(TestCase):
w = WhereNode(children=[NothingNode(), self.DummyNode()], connector='OR')
self.assertEquals(w.as_sql(qn, connection), ('dummy', []))
w.negate()
self.assertEquals(w.as_sql(qn, connection), ('NOT dummy', []))
self.assertEquals(w.as_sql(qn, connection), ('NOT (dummy)', []))
def test_empty_nodes(self):
qn = connection.ops.quote_name