]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- fix to anonymous label generation of long table/column names [ticket:806]
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 7 Oct 2007 01:58:40 +0000 (01:58 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 7 Oct 2007 01:58:40 +0000 (01:58 +0000)
CHANGES
lib/sqlalchemy/sql/compiler.py
test/sql/labels.py

diff --git a/CHANGES b/CHANGES
index 4a45c30185e27a39a0894783201326c204931c42..c0b559baf778cc5465ed7b47a3180b260ffc9d44 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -42,8 +42,9 @@ CHANGES
   previously it was detecting DBAPI types and converting regardless).
   should fix [ticket:800]
 
-- Firebird dialect now uses SingletonThreadPool as poolclass.
+- fix to anonymous label generation of long table/column names [ticket:806]
 
+- Firebird dialect now uses SingletonThreadPool as poolclass.
 
 0.4.0beta6
 ----------
index 3afd3fdc34049d887d51739252a1490a66d95962..50664db16f459f9662982838ac29210db442bbc0 100644 (file)
@@ -415,7 +415,7 @@ class DefaultCompiler(engine.Compiled, visitors.ClauseVisitor):
 
         if len(anonname) > self.dialect.max_identifier_length:
             counter = self.generated_ids.get(ident_class, 1)
-            truncname = name[0:self.dialect.max_identifier_length - 6] + "_" + hex(counter)[2:]
+            truncname = anonname[0:self.dialect.max_identifier_length - 6] + "_" + hex(counter)[2:]
             self.generated_ids[ident_class] = counter + 1
         else:
             truncname = anonname
index 6588c4da4c861c380e34f1a5915c6096829339b1..6f94956dc49223762359ce01de5e0da95077f71b 100644 (file)
@@ -1,11 +1,13 @@
 import testbase
 from sqlalchemy import *
 from testlib import *
-
+from sqlalchemy.engine import default
 
 # TODO: either create a mock dialect with named paramstyle and a short identifier length,
 # or find a way to just use sqlite dialect and make those changes
 
+IDENT_LENGTH = 29
+
 class LabelTypeTest(PersistTest):
     def test_type(self):
         m = MetaData()
@@ -15,7 +17,7 @@ class LabelTypeTest(PersistTest):
         assert isinstance(t.c.col1.label('hi').type, Integer)
         assert isinstance(select([t.c.col2], scalar=True).label('lala').type, Float)
 
-class LongLabelsTest(PersistTest):
+class LongLabelsTest(SQLCompileTest):
     def setUpAll(self):
         global metadata, table1, maxlen
         metadata = MetaData(testbase.db)
@@ -27,7 +29,7 @@ class LongLabelsTest(PersistTest):
         metadata.create_all()
         
         maxlen = testbase.db.dialect.max_identifier_length
-        testbase.db.dialect.max_identifier_length = 29
+        testbase.db.dialect.max_identifier_length = IDENT_LENGTH
         
     def tearDown(self):
         table1.delete().execute()
@@ -84,6 +86,20 @@ class LongLabelsTest(PersistTest):
       q = table1.select(table1.c.this_is_the_primarykey_column == 4).alias('foo')
       x = select([q])
       print x.execute().fetchall()
+
+    def test_anon_alias(self):
+      compile_dialect = default.DefaultDialect()
+      compile_dialect.max_identifier_length = IDENT_LENGTH
+
+      q = table1.select(table1.c.this_is_the_primarykey_column == 4).alias()
+      x = select([q], use_labels=True)
+
+      self.assert_compile(x, "SELECT anon_1.this_is_the_primarykey_column AS anon_1_this_is_the_prim_1, anon_1.this_is_the_data_column AS anon_1_this_is_the_data_2 " 
+            "FROM (SELECT some_large_named_table.this_is_the_primarykey_column AS this_is_the_primarykey_column, some_large_named_table.this_is_the_data_column AS this_is_the_data_column "
+            "FROM some_large_named_table "
+            "WHERE some_large_named_table.this_is_the_primarykey_column = :some_large_named_table__1) AS anon_1", dialect=compile_dialect)
+            
+      print x.execute().fetchall()
     
     def test_oid(self):
         """test that a primary key column compiled as the 'oid' column gets proper length truncation"""