On Tue, Jun 23, 2009 at 5:16 AM, James Henstridge<[email protected]> wrote: > On Mon, Jun 22, 2009 at 11:44 PM, Jason Baker<[email protected]> 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. >
The problem is more than operator precendence with Oracle; Oracle simply doesn't have a boolean type (outside of PL/SQL) and can't understand a boolean comparison: (1=0) = (1=1). This would result in an ORA-00933. In that respect, I don't see how it's possible to make test_is_in_empty_list pass since it involves a boolean comparison. Given that boolean data type is optional in the SQL spec, would it not be sufficient to skip this test for oracle? -Drew -- storm mailing list [email protected] Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/storm
