--- /dev/null
+.. change::
+ :tags: bug, mssql, reflection
+ :tickets: 8700
+
+ Fixed regression which occurred throughout the 1.4 series where the
+ :meth:`.Inspector.has_table` method, which historically reported on views
+ as well, stopped working for SQL Server. The method never worked for
+ Oracle in this way, so for compatibility within the 1.4 series,
+ Oracle's dialect remains returning False for ``has_table()`` against a
+ view within the 1.4 series.
+
+ The issue is not present in the 2.0 series which uses a different
+ reflection architecture, where has_table() reports True for views on all
+ backends including SQL Server and Oracle. Test support is added within the
+ 1.4 series to ensure ``has_table()`` remains working per spec re: views.
else:
tables = ischema.tables
- s = sql.select(tables.c.table_name).where(
- sql.and_(
- tables.c.table_type == "BASE TABLE",
- tables.c.table_name == tablename,
- )
+ s = sql.select(tables.c.table_name, tables.c.table_type).where(
+ tables.c.table_name == tablename,
)
if owner:
schema=config.test_schema,
)
+ if testing.requires.view_reflection:
+ cls.define_views(metadata)
+
+ @classmethod
+ def define_views(cls, metadata):
+ query = "CREATE VIEW vv AS SELECT * FROM test_table"
+
+ event.listen(metadata, "after_create", DDL(query))
+ event.listen(metadata, "before_drop", DDL("DROP VIEW vv"))
+
+ if testing.requires.schemas.enabled:
+ query = "CREATE VIEW %s.vv AS SELECT * FROM %s.test_table_s" % (
+ config.test_schema,
+ config.test_schema,
+ )
+ event.listen(metadata, "after_create", DDL(query))
+ event.listen(
+ metadata,
+ "before_drop",
+ DDL("DROP VIEW %s.vv" % (config.test_schema)),
+ )
+
def test_has_table(self):
with config.db.begin() as conn:
is_true(config.db.dialect.has_table(conn, "test_table"))
)
)
+ @testing.fails_on(
+ "oracle",
+ "per #8700 this remains at its previous behavior of not "
+ "working within 1.4.",
+ )
+ @testing.requires.views
+ def test_has_table_view(self, connection):
+ insp = inspect(connection)
+ is_true(insp.has_table("vv"))
+
+ @testing.fails_on(
+ "oracle",
+ "per #8700 this remains at its previous behavior of not "
+ "working within 1.4",
+ )
+ @testing.requires.views
+ @testing.requires.schemas
+ def test_has_table_view_schema(self, connection):
+ insp = inspect(connection)
+ is_true(insp.has_table("vv", config.test_schema))
+
class HasIndexTest(fixtures.TablesTest):
__backend__ = True