named "tablename_id" - this is because
the labeling logic is always applied to all columns
so a naming conflict will never occur.
-
+
+ - calling expr.in_([]), i.e. with an empty list, emits a warning
+ before issuing the usual "expr != expr" clause. The
+ "expr != expr" can be very expensive, and it's preferred
+ that the user not issue in_() if the list is empty,
+ instead simply not querying, or modifying the criterion
+ as appropriate for more complex situations.
+ [ticket:1628]
+
- Deprecated or removed:
* "scalar" flag on select() is removed, use
select.as_scalar().
args.append(o)
if len(args) == 0:
- # Special case handling for empty IN's, behave like comparison against zero row selectable
+ # Special case handling for empty IN's, behave like comparison
+ # against zero row selectable. We use != to build the
+ # contradiction as it handles NULL values appropriately, i.e.
+ # "not (x IN ())" should not return NULL values for x.
+ util.warn("The IN-predicate on \"%s\" was invoked with an empty sequence. "
+ "This results in a contradiction, which nonetheless can be "
+ "expensive to evaluate. Consider alternative strategies for "
+ "improved performance." % self)
+
return self != self
return self.__compare(op, ClauseList(*args).self_group(against=op), negate=negate_op)
finally:
shadowed.drop(checkfirst=True)
+ @testing.emits_warning('.*empty sequence.*')
def test_in_filtering(self):
"""test the behavior of the in_() function."""
# Null values are not outside any set
assert len(r) == 0
+ @testing.emits_warning('.*empty sequence.*')
@testing.fails_on('firebird', "kinterbasdb doesn't send full type information")
def test_bind_in(self):
users.insert().execute(user_id = 7, user_name = 'jack')
r = s.execute(search_key=None).fetchall()
assert len(r) == 0
+ @testing.emits_warning('.*empty sequence.*')
@testing.fails_on('firebird', 'FIXME: unknown')
@testing.fails_on('maxdb', 'FIXME: unknown')
@testing.fails_on('oracle', 'FIXME: unknown')
assert [str(c) for c in s.c] == ["id", "hoho"]
+ @testing.emits_warning('.*empty sequence.*')
def test_in(self):
self.assert_compile(select([table1], table1.c.myid.in_(['a'])),
"SELECT mytable.myid, mytable.name, mytable.description FROM mytable WHERE mytable.myid IN (:myid_1)")