self.strings[list] = string.join([self.get_str(c) for c in list.clauses], ', ')
def visit_binary(self, binary):
-
+ if isinstance(binary.right, sql.Select):
+ s = self.get_str(binary.left) + " " + str(binary.operator) + " (" + self.get_str(binary.right) + ")"
+ else:
+ s = self.get_str(binary.left) + " " + str(binary.operator) + " " + self.get_str(binary.right)
if binary.parens:
- self.strings[binary] = "(" + self.get_str(binary.left) + " " + str(binary.operator) + " " + self.get_str(binary.right) + ")"
+ self.strings[binary] = "(" + s + ")"
else:
- self.strings[binary] = self.get_str(binary.left) + " " + str(binary.operator) + " " + self.get_str(binary.right)
+ self.strings[binary] = s
def visit_bindparam(self, bindparam):
self.binds[bindparam.shortname] = bindparam
def visit_alias(self, alias):
self.froms[alias] = self.get_from_text(alias.selectable) + " " + alias.name
+ self.strings[alias] = self.get_str(alias.selectable)
def visit_select(self, select):
inner_columns = []
def visit_table(self, table):
self.froms[table] = table.name
+ self.strings[table] = ""
def visit_join(self, join):
if join.isouter:
def visit_insert(self, insert_stmt):
colparams = insert_stmt.get_colparams(self._bindparams)
-
for c in colparams:
b = c[1]
self.binds[b.key] = b
clause = _compound_clause('OR', *clauses)
return clause
+def exists(*args, **params):
+ s = select(*args, **params)
+ return BinaryClause(TextClause("EXISTS"), s, '')
+
+def in_(*args, **params):
+ s = select(*args, **params)
+ return BinaryClause(TextClause("IN"), s, '')
+
def union(*selects, **params):
return _compound_select('UNION', *selects, **params)
for c in self.clauses:
c.accept_visitor(visitor)
visitor.visit_clauselist(self)
-
+
+ def _get_from_objects(self):
+ return []
class BinaryClause(ClauseElement):
"""represents two clauses with an operator in between"""
def __init__(self, left, right, operator):
self.left = left
self.right = right
+ if isinstance(right, Select):
+ right._set_from_objects([])
self.operator = operator
self.parens = False
return result
class Alias(Selectable):
- def __init__(self, selectable, alias):
+ def __init__(self, selectable, alias = None):
self.selectable = selectable
self.columns = util.OrderedProperties()
+ if alias is None:
+ alias = id(self)
self.name = alias
self.id = self.name
self.count = 0
return [self.column.table]
def _compare(self, operator, obj):
- if not isinstance(obj, BindParamClause) and not isinstance(obj, schema.Column):
+ if not isinstance(obj, ClauseElement) and not isinstance(obj, schema.Column):
if self.column.table.name is None:
obj = BindParamClause(self.name, obj, shortname = self.name)
else:
obj = BindParamClause(self.column.table.name + "_" + self.name, obj, shortname = self.name)
-
+
return BinaryClause(self.column, obj, operator)
def __lt__(self, other):
for f in self.whereclause._get_from_objects():
self.froms.setdefault(f.id, f)
+ class CorrelatedVisitor(ClauseVisitor):
+ def visit_select(s, select):
+ for f in self.froms.keys():
+ select.clear_from(f)
+ self.whereclause.accept_visitor(CorrelatedVisitor())
+
+ def clear_from(self, id):
+ self.append_from(FromClause(from_name = None, from_key = id))
def append_from(self, fromclause):
if type(fromclause) == str:
fromclause = FromClause(from_name = fromclause)
return None
+ def _set_from_objects(self, obj):
+ self._from_obj = obj
+
def _get_from_objects(self):
- return [self]
+ return getattr(self, '_from_obj', [self])
class UpdateBase(ClauseElement):
for c in self.table.columns:
if d.has_key(c):
value = d[c]
- if isinstance(value, str):
+ if not isinstance(value, schema.Column) and not isinstance(value, ClauseElement):
value = bindparam(c.name, value)
values.append((c, value))
return values