]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
merged r4813 from trunk, oracle schema name fix for [ticket:709]
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 24 May 2008 23:35:41 +0000 (23:35 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 24 May 2008 23:35:41 +0000 (23:35 +0000)
CHANGES
lib/sqlalchemy/databases/oracle.py
test/dialect/oracle.py

diff --git a/CHANGES b/CHANGES
index 89dec92d9d0d0e94127e5aca1eeef1a6b8e3164c..6b7e0c61accbd90bf1c8f71ad025d6ec695037c5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -9,6 +9,12 @@ CHANGES
       before returning, meaning it returns a lower-case name
       when the identifier is detected as case insensitive.
 
+    - creating/dropping tables takes schema name into account
+      when searching for the existing table, so that tables
+      in other owner namespaces with the same name do not
+      conflict [ticket:709]
+
+
 0.4.6
 =====
 - orm
index cda39b4990d3f5648c1938f33c46f741e440be64..d295aab666784ca68e3398a79cd7c2003e55b26d 100644 (file)
@@ -357,7 +357,9 @@ class OracleDialect(default.DefaultDialect):
         return OracleExecutionContext(self, *args, **kwargs)
 
     def has_table(self, connection, table_name, schema=None):
-        cursor = connection.execute("""select table_name from all_tables where table_name=:name""", {'name':self._denormalize_name(table_name)})
+        if not schema:
+            schema = self.get_default_schema_name(connection)
+        cursor = connection.execute("""select table_name from all_tables where table_name=:name and owner=:schema_name""", {'name':self._denormalize_name(table_name), 'schema_name':self._denormalize_name(schema)})
         return bool( cursor.fetchone() is not None )
 
     def has_sequence(self, connection, sequence_name):
index cdd575dd38abb764e8ed7bf8384596b24463bdd0..829c18978688df6e5ad9c9006e0bc6306d77eb49 100644 (file)
@@ -156,7 +156,7 @@ WHERE ora_rn>5 AND ora_rn<=15", dialect=oracle.dialect(use_ansi=False))
             "ON addresses.address_type_id = address_types_1.id WHERE addresses.user_id = :user_id_1 ORDER BY addresses.rowid, "
             "address_types.rowid")
 
-class SchemaReflectionTest(TestBase, AssertsCompiledSQL):
+class MultiSchemaTest(TestBase, AssertsCompiledSQL):
     """instructions:
 
        1. create a user 'ed' in the oracle database.
@@ -174,6 +174,44 @@ class SchemaReflectionTest(TestBase, AssertsCompiledSQL):
 
     __only_on__ = 'oracle'
 
+    def test_create_same_names_explicit_schema(self):
+        schema = testing.db.dialect.get_default_schema_name(testing.db.connect())
+        meta = MetaData(testing.db)
+        parent = Table('parent', meta, 
+            Column('pid', Integer, primary_key=True),
+            schema=schema
+        )
+        child = Table('child', meta, 
+            Column('cid', Integer, primary_key=True),
+            Column('pid', Integer, ForeignKey('scott.parent.pid')),
+            schema=schema
+        )
+        meta.create_all()
+        try:
+            parent.insert().execute({'pid':1})
+            child.insert().execute({'cid':1, 'pid':1})
+            self.assertEquals(child.select().execute().fetchall(), [(1, 1)])
+        finally:
+            meta.drop_all()
+
+    def test_create_same_names_implicit_schema(self):
+        meta = MetaData(testing.db)
+        parent = Table('parent', meta, 
+            Column('pid', Integer, primary_key=True),
+        )
+        child = Table('child', meta, 
+            Column('cid', Integer, primary_key=True),
+            Column('pid', Integer, ForeignKey('parent.pid')),
+        )
+        meta.create_all()
+        try:
+            parent.insert().execute({'pid':1})
+            child.insert().execute({'cid':1, 'pid':1})
+            self.assertEquals(child.select().execute().fetchall(), [(1, 1)])
+        finally:
+            meta.drop_all()
+
+
     def test_reflect_alt_owner_explicit(self):
         meta = MetaData(testing.db)
         parent = Table('parent', meta, autoload=True, schema='ed')