from ...sql import compiler
from ...sql import elements
from ...sql import expression
+from ...sql import selectable
from ...sql import sqltypes
from ...types import BIGINT
from ...types import BOOLEAN
tmp = " FOR UPDATE"
if select._for_update_arg.of:
- tables = util.OrderedSet(
- c.table if isinstance(c, expression.ColumnClause) else c
- for c in select._for_update_arg.of
- )
+ tables = util.OrderedSet()
+ for clause in select._for_update_arg.of:
+ if isinstance(clause, expression.ColumnClause):
+ tables.add(clause.table)
+ else:
+ table_classes = (schema.Table, selectable.TableClause)
+ for f in clause.select()._froms:
+ if isinstance(f, table_classes):
+ tables.add(f)
tmp += " OF " + ", ".join(
self.process(table, ashint=True, use_schema=False, **kw)
for table in tables
"WHERE mytable_1.myid = %(myid_1)s FOR UPDATE OF mytable_1",
)
+ table2 = table('table2', column('mytable_id'))
+ join = table2.join(table1, table2.c.mytable_id == table1.c.myid)
+ self.assert_compile(
+ join.select(table2.c.mytable_id == 7).
+ with_for_update(of=[join]),
+ "SELECT table2.mytable_id, "
+ "mytable.myid, mytable.name, mytable.description "
+ "FROM table2 "
+ "JOIN mytable ON table2.mytable_id = mytable.myid "
+ "WHERE table2.mytable_id = %(mytable_id_1)s "
+ "FOR UPDATE OF table2, mytable"
+ )
+
def test_for_update_with_schema(self):
m = MetaData()
table1 = Table(