]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- The generated index name also is based on
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 2 Aug 2010 05:12:03 +0000 (01:12 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 2 Aug 2010 05:12:03 +0000 (01:12 -0400)
a "max index name length" attribute which is
separate from the "max identifier length" -
this to appease MySQL who has a max length
of 64 for index names, separate from their
overall max length of 255.  [ticket:1412]

CHANGES
lib/sqlalchemy/dialects/mysql/base.py
lib/sqlalchemy/engine/default.py
lib/sqlalchemy/sql/compiler.py
test/dialect/test_mysql.py
test/sql/test_constraints.py

diff --git a/CHANGES b/CHANGES
index 8b555f5a8315e53a1e6e5298c8d9e8114e3795f5..ae17630283759454002078658945b04ecb807920 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -60,6 +60,13 @@ CHANGES
     indexes on columns with similar names still
     have unique names.  [ticket:1855]
 
+  - The generated index name also is based on 
+    a "max index name length" attribute which is
+    separate from the "max identifier length" - 
+    this to appease MySQL who has a max length
+    of 64 for index names, separate from their
+    overall max length of 255.  [ticket:1412]
+    
 - mssql
   - Fixed "default schema" query to work with
     pymssql backend.
index 1c61f47e1895ee58a8f33bc0dcf3f571c3d1f789..a2d3748f330d54f816b0887521bc4d3b22b5907f 100644 (file)
@@ -1607,8 +1607,10 @@ class MySQLDialect(default.DefaultDialect):
     
     name = 'mysql'
     supports_alter = True
+    
     # identifiers are 64, however aliases can be 255...
     max_identifier_length = 255
+    max_index_name_length = 64
     
     supports_native_enum = True
     
index 0724d1fb97ff30e0687ea815c50edfbfcbe248d7..390094c7dec0fec815a20be777d78d2c0a4a96bf 100644 (file)
@@ -59,7 +59,18 @@ class DefaultDialect(base.Dialect):
     # end Py2K
 
     name = 'default'
+    
+    # length at which to truncate
+    # any identifier.
     max_identifier_length = 9999
+    
+    # length at which to truncate
+    # the name of an index.
+    # Usually None to indicate
+    # 'use max_identifier_length'.
+    # thanks to MySQL, sigh
+    max_index_name_length = None
+    
     supports_sane_rowcount = True
     supports_sane_multi_rowcount = True
     dbapi_type_map = {}
index 0383f9690f5abd0e3c0ec382c1453d21228aa62a..fcff5e35500494d31267cb60ca88b95c612b5b80 100644 (file)
@@ -1182,8 +1182,10 @@ class DDLCompiler(engine.Compiled):
 
     def _index_identifier(self, ident):
         if isinstance(ident, sql._generated_label):
-            if len(ident) > self.dialect.max_identifier_length:
-                return ident[0:self.dialect.max_identifier_length - 8] + \
+            max = self.dialect.max_index_name_length or \
+                        self.dialect.max_identifier_length
+            if len(ident) > max:
+                return ident[0:max - 8] + \
                                 "_" + util.md5_hex(ident)[-4:]
             else:
                 return ident
index 791a93c6e63da8c07c11eb316409d2d626f169a5..7c4cc2309f05f51321b1ab7647f34e2e6cc06d4b 100644 (file)
@@ -1212,7 +1212,24 @@ class SQLTest(TestBase, AssertsCompiledSQL):
         self.assert_compile(
             select([extract('milliseconds', t.c.col1)]),
             "SELECT EXTRACT(millisecond FROM t.col1) AS anon_1 FROM t")
-
+    
+    def test_too_long_index(self):
+        exp = 'ix_zyrenian_zyme_zyzzogeton_zyzzogeton_zyrenian_zyme_zyz_5cd2'
+        tname = 'zyrenian_zyme_zyzzogeton_zyzzogeton'
+        cname = 'zyrenian_zyme_zyzzogeton_zo'
+        
+        t1 = Table(tname, MetaData(), 
+                    Column(cname, Integer, index=True),
+                )
+        ix1 = list(t1.indexes)[0]
+        
+        self.assert_compile(
+            schema.CreateIndex(ix1),
+            "CREATE INDEX %s "
+            "ON %s (%s)" % (exp, tname, cname),
+            dialect=mysql.dialect()
+        )
+        
     def test_innodb_autoincrement(self):
         t1 = Table('sometable', MetaData(), Column('assigned_id',
                    Integer(), primary_key=True, autoincrement=False),
index 5624c0ec6d9de6aba3ade77f28041244db135815..69f29a9bd4b6e2c6c84bd91f9f4c85eda3ecf127 100644 (file)
@@ -183,24 +183,30 @@ class ConstraintTest(TestBase, AssertsExecutionResults, AssertsCompiledSQL):
 
     def test_too_long_idx_name(self):
         dialect = testing.db.dialect.__class__()
-        dialect.max_identifier_length = 22
 
-        for tname, cname, exp in [
-            ('sometable', 'this_name_is_too_long', 'ix_sometable_t_09aa'),
-            ('sometable', 'this_name_alsois_long', 'ix_sometable_t_3cf1'),
-        ]:
+        for max_ident, max_index in [(22, None), (256, 22)]:
+            dialect.max_identifier_length = max_ident
+            dialect.max_index_name_length = max_index
+
+            for tname, cname, exp in [
+                ('sometable', 'this_name_is_too_long', 'ix_sometable_t_09aa'),
+                ('sometable', 'this_name_alsois_long', 'ix_sometable_t_3cf1'),
+            ]:
         
-            t1 = Table(tname, MetaData(), 
-                        Column(cname, Integer, index=True),
-                    )
-            ix1 = list(t1.indexes)[0]
+                t1 = Table(tname, MetaData(), 
+                            Column(cname, Integer, index=True),
+                        )
+                ix1 = list(t1.indexes)[0]
         
-            self.assert_compile(
-                schema.CreateIndex(ix1),
-                "CREATE INDEX %s "
-                "ON %s (%s)" % (exp, tname, cname),
-                dialect=dialect
-            )
+                self.assert_compile(
+                    schema.CreateIndex(ix1),
+                    "CREATE INDEX %s "
+                    "ON %s (%s)" % (exp, tname, cname),
+                    dialect=dialect
+                )
+        
+        dialect.max_identifier_length = 22
+        dialect.max_index_name_length = None
         
         t1 = Table('t', MetaData(), Column('c', Integer))
         assert_raises(