Commits

Mike Bayer committed 0fcd8b4

- [bug] The CreateIndex construct in Oracle
will now schema-qualify the name of the index
to be that of the parent table. Previously this
name was omitted which apparently creates the
index in the default schema, rather than that
of the table.

Comments (0)

Files changed (4)

     now defaults to STRING, UNICODE, removing
     CLOB, NCLOB from the list.  [ticket:2469]
 
+  - [bug] The CreateIndex construct in Oracle
+    will now schema-qualify the name of the index
+    to be that of the parent table.  Previously this
+    name was omitted which apparently creates the
+    index in the default schema, rather than that
+    of the table.
+
 - extensions
   - [removed] The SQLSoup extension is removed from
     SQLAlchemy, and is now an external project.

lib/sqlalchemy/dialects/oracle/base.py

 
         return text
 
+    def visit_create_index(self, create, **kw):
+        return super(OracleDDLCompiler, self).\
+                    visit_create_index(create, include_schema=True)
+
 class OracleIdentifierPreparer(compiler.IdentifierPreparer):
 
     reserved_words = set([x.lower() for x in RESERVED_WORDS])

lib/sqlalchemy/sql/compiler.py

 
         return ident
 
-    def visit_create_index(self, create):
+    def visit_create_index(self, create, include_schema=False):
         index = create.element
         preparer = self.preparer
         text = "CREATE "
         if index.unique:
             text += "UNIQUE "
         text += "INDEX %s ON %s (%s)" \
-                    % (preparer.quote(self._index_identifier(index.name),
-                        index.quote),
+                    % (
+                        self._prepared_index_name(index,
+                                include_schema=include_schema),
                        preparer.format_table(index.table),
                        ', '.join(preparer.quote(c.name, c.quote)
                                  for c in index.columns))
 
     def visit_drop_index(self, drop):
         index = drop.element
-        if index.table is not None and index.table.schema:
+        return "\nDROP INDEX " + self._prepared_index_name(index,
+                                        include_schema=True)
+
+    def _prepared_index_name(self, index, include_schema=False):
+        if include_schema and index.table is not None and index.table.schema:
             schema = index.table.schema
             schema_name = self.preparer.quote_schema(schema,
                                 index.table.quote_schema)
 
         if schema_name:
             index_name = schema_name + "." + index_name
-        return "\nDROP INDEX " + index_name
+        return index_name
+
 
     def visit_add_constraint(self, create):
         preparer = self.preparer

test/dialect/test_oracle.py

 
 from sqlalchemy.testing import eq_
 from sqlalchemy import *
-from sqlalchemy import types as sqltypes, exc
+from sqlalchemy import types as sqltypes, exc, schema
 from sqlalchemy.sql import table, column
 from sqlalchemy.testing import fixtures, AssertsExecutionResults, AssertsCompiledSQL
 from sqlalchemy import testing
         ]:
             self.assert_compile(fn, expected)
 
+    def test_create_index_alt_schema(self):
+        m = MetaData()
+        t1 = Table('foo', m,
+                Column('x', Integer),
+                schema="alt_schema"
+            )
+        self.assert_compile(
+            schema.CreateIndex(Index("bar", t1.c.x)),
+            "CREATE INDEX alt_schema.bar ON alt_schema.foo (x)"
+        )
 class CompatFlagsTest(fixtures.TestBase, AssertsCompiledSQL):
     __only_on__ = 'oracle'