summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Kirtland <jek@discorporate.us>2007-09-26 23:37:11 +0000
committerJason Kirtland <jek@discorporate.us>2007-09-26 23:37:11 +0000
commit6f3f85e48c7dca360f029c23231711036c66a95f (patch)
treea84ff82951d3a231de182fa6e181cbf967d9495a
parent3a04b7e4d4a4913cdbb60439b5371cf41c91c976 (diff)
downloadsqlalchemy-6f3f85e48c7dca360f029c23231711036c66a95f.tar.gz
Changed MySQL dialect to use the older LIMIT <offset>, <limit> syntax instead
of LIMIT <l> OFFSET <o> for folks using 3.23. ([ticket:794], thanks for the patch!)
-rw-r--r--CHANGES3
-rw-r--r--lib/sqlalchemy/databases/mysql.py32
-rw-r--r--test/dialect/mysql.py24
3 files changed, 47 insertions, 12 deletions
diff --git a/CHANGES b/CHANGES
index bdb2cd995..cfba8ff22 100644
--- a/CHANGES
+++ b/CHANGES
@@ -58,6 +58,9 @@ CHANGES
- Fixed reflection of the empty string for mysql enums.
+- Changed MySQL dialect to use the older LIMIT <offset>, <limit> syntax
+ instead of LIMIT <l> OFFSET <o> for folks using 3.23. [ticket:794]
+
- Added 'passive_deletes="all"' flag to relation(), disables all nulling-out
of foreign key attributes during a flush where the parent object is
deleted.
diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py
index 9eba2abdb..c0b1179a3 100644
--- a/lib/sqlalchemy/databases/mysql.py
+++ b/lib/sqlalchemy/databases/mysql.py
@@ -1812,16 +1812,28 @@ class MySQLCompiler(compiler.DefaultCompiler):
return super(MySQLCompiler, self).for_update_clause(select)
def limit_clause(self, select):
- text = ""
- if select._limit is not None:
- text += " \n LIMIT " + str(select._limit)
- if select._offset is not None:
- if select._limit is None:
- # straight from the MySQL docs, I kid you not
- text += " \n LIMIT 18446744073709551615"
- text += " OFFSET " + str(select._offset)
- return text
-
+ # MySQL supports:
+ # LIMIT <limit>
+ # LIMIT <offset>, <limit>
+ # and in server versions > 3.3:
+ # LIMIT <limit> OFFSET <offset>
+ # The latter is more readable for offsets but we're stuck with the
+ # former until we can refine dialects by server revision.
+
+ limit, offset = select._limit, select._offset
+
+ if (limit, offset) == (None, None):
+ return ''
+ elif offset is not None:
+ # As suggested by the MySQL docs, need to apply an
+ # artificial limit if one wasn't provided
+ if limit is None:
+ limit = 18446744073709551615
+ return ' \n LIMIT %s, %s' % (offset, limit)
+ else:
+ # No offset provided, so just use the limit
+ return ' \n LIMIT %s' % (limit,)
+
# ug. "InnoDB needs indexes on foreign keys and referenced keys [...].
# Starting with MySQL 4.1.2, these indexes are created automatically.
diff --git a/test/dialect/mysql.py b/test/dialect/mysql.py
index 1482056ab..92d93b8d5 100644
--- a/test/dialect/mysql.py
+++ b/test/dialect/mysql.py
@@ -569,9 +569,12 @@ class TypesTest(AssertMixin):
enum_table.drop()
@testing.supported('mysql')
+ @testing.exclude('mysql', '>', (3))
def test_enum_parse(self):
"""More exercises for the ENUM type."""
-
+
+ # MySQL 3.23 can't handle an ENUM of ''....
+
db = testbase.db
enum_table = Table('mysql_enum', MetaData(testbase.db),
Column('e1', mysql.MSEnum("'a'")),
@@ -727,8 +730,9 @@ class TypesTest(AssertMixin):
self.assertEqual(got, wanted)
-class SQLTest(AssertMixin):
+class SQLTest(SQLCompileTest):
"""Tests MySQL-dialect specific compilation."""
+ __dialect__ = testbase.db.dialect
@testing.supported('mysql')
def test_precolumns(self):
@@ -763,6 +767,22 @@ class SQLTest(AssertMixin):
gen(True, ['high_priority', sql.text('sql_cache')]),
'SELECT high_priority sql_cache DISTINCT q')
+ @testing.supported('mysql')
+ def test_limit(self):
+ t = sql.table('t', sql.column('col1'), sql.column('col2'))
+
+ self.assert_compile(
+ select([t]).limit(10).offset(20),
+ "SELECT t.col1, t.col2 FROM t LIMIT 20, 10"
+ )
+ self.assert_compile(
+ select([t]).limit(10),
+ "SELECT t.col1, t.col2 FROM t LIMIT 10")
+ self.assert_compile(
+ select([t]).offset(10),
+ "SELECT t.col1, t.col2 FROM t LIMIT 10, 18446744073709551615"
+ )
+
def colspec(c):
return testbase.db.dialect.schemagenerator(testbase.db.dialect,