From: Mike Bayer Date: Fri, 9 Sep 2011 21:12:52 +0000 (-0400) Subject: - Reflection functions for Table, Sequence no longer X-Git-Tag: rel_0_7_3~55 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=843847740c7fd3705cb7804ac62914b9a77dc174;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Reflection functions for Table, Sequence no longer case insensitive. Names can be differ only in case and will be correctly distinguished. [ticket:2256] --- diff --git a/CHANGES b/CHANGES index aac1a7a4a7..72476994b7 100644 --- a/CHANGES +++ b/CHANGES @@ -107,6 +107,10 @@ CHANGES extensions are in use or not. - postgresql + - Reflection functions for Table, Sequence no longer + case insensitive. Names can be differ only in case + and will be correctly distinguished. [ticket:2256] + - Use an atomic counter as the "random number" source for server side cursor names; conflicts have been reported in rare cases. diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index 5ff20ce734..8c3babd313 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -938,9 +938,9 @@ class PGDialect(default.DefaultDialect): sql.text( "select relname from pg_class c join pg_namespace n on " "n.oid=c.relnamespace where n.nspname=current_schema() and " - "lower(relname)=:name", + "relname=:name", bindparams=[ - sql.bindparam('name', unicode(table_name.lower()), + sql.bindparam('name', unicode(table_name), type_=sqltypes.Unicode)] ) ) @@ -949,10 +949,10 @@ class PGDialect(default.DefaultDialect): sql.text( "select relname from pg_class c join pg_namespace n on " "n.oid=c.relnamespace where n.nspname=:schema and " - "lower(relname)=:name", + "relname=:name", bindparams=[ sql.bindparam('name', - unicode(table_name.lower()), type_=sqltypes.Unicode), + unicode(table_name), type_=sqltypes.Unicode), sql.bindparam('schema', unicode(schema), type_=sqltypes.Unicode)] ) @@ -966,9 +966,9 @@ class PGDialect(default.DefaultDialect): "SELECT relname FROM pg_class c join pg_namespace n on " "n.oid=c.relnamespace where relkind='S' and " "n.nspname=current_schema() " - "and lower(relname)=:name", + "and relname=:name", bindparams=[ - sql.bindparam('name', unicode(sequence_name.lower()), + sql.bindparam('name', unicode(sequence_name), type_=sqltypes.Unicode) ] ) @@ -978,9 +978,9 @@ class PGDialect(default.DefaultDialect): sql.text( "SELECT relname FROM pg_class c join pg_namespace n on " "n.oid=c.relnamespace where relkind='S' and " - "n.nspname=:schema and lower(relname)=:name", + "n.nspname=:schema and relname=:name", bindparams=[ - sql.bindparam('name', unicode(sequence_name.lower()), + sql.bindparam('name', unicode(sequence_name), type_=sqltypes.Unicode), sql.bindparam('schema', unicode(schema), type_=sqltypes.Unicode) diff --git a/test/dialect/test_postgresql.py b/test/dialect/test_postgresql.py index a8b998c71e..adf292999d 100644 --- a/test/dialect/test_postgresql.py +++ b/test/dialect/test_postgresql.py @@ -1360,6 +1360,33 @@ class ReflectionTest(fixtures.TestBase): == referer.c.ref).compare( subject.join(referer).onclause)) + @testing.provide_metadata + def test_uppercase_lowercase_table(self): + metadata = self.metadata + + a_table = Table('a', metadata, Column('x', Integer)) + A_table = Table('A', metadata, Column('x', Integer)) + + a_table.create() + assert testing.db.has_table("a") + assert not testing.db.has_table("A") + A_table.create(checkfirst=True) + assert testing.db.has_table("A") + + def test_uppercase_lowercase_sequence(self): + + a_seq = Sequence('a') + A_seq = Sequence('A') + + a_seq.create(testing.db) + assert testing.db.dialect.has_sequence(testing.db, "a") + assert not testing.db.dialect.has_sequence(testing.db, "A") + A_seq.create(testing.db, checkfirst=True) + assert testing.db.dialect.has_sequence(testing.db, "A") + + a_seq.drop(testing.db) + A_seq.drop(testing.db) + def test_schema_reflection_multi_search_path(self): """test the 'set the same schema' rule when multiple schemas/search paths are in effect."""