[storm] What's the best way to handle Python Boolean values with Oracle?
James Henstridge
james at jamesh.id.au
Tue Jun 23 10:16:02 BST 2009
On Mon, Jun 22, 2009 at 11:44 PM, Jason Baker<jbaker at zeomega.com> wrote:
> There are two tests left that are giving me trouble:
>
> def test_is_in_empty_result_set(self):
> result1 = self.store.find(Foo, Foo.id < 10)
> result2 = self.store.find(Foo, Or(Foo.id > 20, Foo.id.is_in(result1)))
> self.assertEquals(result2.count(), 1)
>
> def test_is_in_empty_list(self):
> result2 = self.store.find(Foo, Eq(False, And(True, Foo.id.is_in([]))))
> self.assertEquals(result2.count(), 3)
>
> Both of these tests pass a Python Boolean to the backend. The problem
> is that these both pass a boolean value in the WHERE clause, which
> there's really not any direct translation for in Oracle. I tried it
> with this compile function:
>
> @compile.when(bool)
> def compile_bool(compile, expr, state):
> return compile_eq(compile, Eq(1, int(expr)), state)
>
> This essentially converts a bool to a 1=1 or 1=0 expression. This
> works with the first test, but the second one gives me this:
>
> [10:27:38.064000] EXECUTE: 'SELECT COUNT(*) FROM foo WHERE 1 = 0 = (1
> = 1 AND 1 = 0)', (1, 0, 1, 1, 1, 0)
> [10:27:38.111000] ERROR: ORA-00933: SQL command not properly ended
>
> Which is of course gibberish in Oracle. I can run the test without a
> WHERE clause and have it work, but will anything break if the backend
> can't handle an expression of the form FALSE = (TRUE AND FALSE)? Or
> is there a better way to do this that I'm missing?
If this is just a case of parentheses, it might be easiest to do the following:
@compile.when(bool)
def compile_bool(compile, expr, state):
if expr:
return "(1=1)"
else:
return "(1=0)"
That should avoid the operator precedence problems.
James.
More information about the storm
mailing list