) -> str:
assert select._for_update_arg is not None
if select._for_update_arg.read:
- tmp = " LOCK IN SHARE MODE"
+ if self.dialect.supports_for_share:
+ tmp = " FOR SHARE"
+ else:
+ tmp = " LOCK IN SHARE MODE"
else:
tmp = " FOR UPDATE"
sequences_optional = False
supports_for_update_of = False # default for MySQL ...
+ supports_for_share = False # default for MySQL ...
# ... may be updated to True for MySQL 8+ in initialize()
_requires_alias_for_on_duplicate_key = False # Only available ...
self._is_mysql and self.server_version_info >= (8,)
)
+ self.supports_for_share = (
+ self._is_mysql and self.server_version_info >= (8,)
+ )
+
self._needs_correct_for_88718_96365 = (
not self.is_mariadb and self.server_version_info >= (8,)
)
for_update_of_dialect = mysql.dialect()
for_update_of_dialect.server_version_info = (8, 0, 0)
for_update_of_dialect.supports_for_update_of = True
+ for_update_of_dialect.supports_for_share = True
+ for_share_dialect = mysql.dialect()
+ for_share_dialect.server_version_info = (8, 0, 0)
+ for_share_dialect.supports_for_share = True
def test_for_update_basic(self):
self.assert_compile(
"FROM mytable WHERE mytable.myid = %s LOCK IN SHARE MODE",
)
+ def test_for_update_read_mysql80(self):
+ self.assert_compile(
+ self.table1.select()
+ .where(self.table1.c.myid == 7)
+ .with_for_update(read=True),
+ "SELECT mytable.myid, mytable.name, mytable.description "
+ "FROM mytable WHERE mytable.myid = %s FOR SHARE",
+ dialect=self.for_share_dialect,
+ )
+
def test_for_update_skip_locked(self):
self.assert_compile(
self.table1.select()
"LOCK IN SHARE MODE SKIP LOCKED",
)
+ def test_for_update_read_skip_locked_mysql80(self):
+ self.assert_compile(
+ self.table1.select()
+ .where(self.table1.c.myid == 7)
+ .with_for_update(read=True, skip_locked=True),
+ "SELECT mytable.myid, mytable.name, mytable.description "
+ "FROM mytable WHERE mytable.myid = %s "
+ "FOR SHARE SKIP LOCKED",
+ dialect=self.for_share_dialect,
+ )
+
def test_for_update_nowait(self):
self.assert_compile(
self.table1.select()
"LOCK IN SHARE MODE NOWAIT",
)
+ def test_for_update_read_nowait_mysql80(self):
+ self.assert_compile(
+ self.table1.select()
+ .where(self.table1.c.myid == 7)
+ .with_for_update(read=True, nowait=True),
+ "SELECT mytable.myid, mytable.name, mytable.description "
+ "FROM mytable WHERE mytable.myid = %s "
+ "FOR SHARE NOWAIT",
+ dialect=self.for_share_dialect,
+ )
+
def test_for_update_of_nowait(self):
self.assert_compile(
self.table1.select()
.with_for_update(read=True, of=self.table1, nowait=True),
"SELECT mytable.myid, mytable.name, mytable.description "
"FROM mytable WHERE mytable.myid = %s "
- "LOCK IN SHARE MODE OF mytable NOWAIT",
+ "FOR SHARE OF mytable NOWAIT",
dialect=self.for_update_of_dialect,
)
.with_for_update(read=True, of=self.table1, skip_locked=True),
"SELECT mytable.myid, mytable.name, mytable.description "
"FROM mytable WHERE mytable.myid = %s "
- "LOCK IN SHARE MODE OF mytable SKIP LOCKED",
+ "FOR SHARE OF mytable SKIP LOCKED",
dialect=self.for_update_of_dialect,
)
),
"SELECT mytable.myid, mytable.name, mytable.description "
"FROM mytable WHERE mytable.myid = %s "
- "LOCK IN SHARE MODE OF mytable NOWAIT",
+ "FOR SHARE OF mytable NOWAIT",
dialect=self.for_update_of_dialect,
)
.with_for_update(read=True, of=self.table1),
"SELECT mytable.myid, mytable.name, mytable.description "
"FROM mytable WHERE mytable.myid = %s "
- "LOCK IN SHARE MODE OF mytable",
+ "FOR SHARE OF mytable",
dialect=self.for_update_of_dialect,
)