Kaydet (Commit) e7478739 authored tarafından Anssi Kääriäinen's avatar Anssi Kääriäinen

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 bd283aa8.
üst f572ee0c
......@@ -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):
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment