]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Rewrote the query used to get the definition of a view,
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 16 Mar 2011 18:09:25 +0000 (14:09 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 16 Mar 2011 18:09:25 +0000 (14:09 -0400)
typically when using the Inspector interface, to
use sys.sql_modules instead of the information schema,
thereby allowing views definitions longer than 4000
characters to be fully returned.  [ticket:2071]

CHANGES
lib/sqlalchemy/dialects/mssql/base.py
test/dialect/test_mssql.py

diff --git a/CHANGES b/CHANGES
index dcda1ccaa2cb2d7f7c3cf229b8708ab6a728aa82..dd44030fbd08a5f57ca877d686c7905e988340bb 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -77,6 +77,13 @@ CHANGES
 
   - Added RESERVED_WORDS informix dialect. [ticket:2092]
 
+- mssql
+  - Rewrote the query used to get the definition of a view,
+    typically when using the Inspector interface, to
+    use sys.sql_modules instead of the information schema,
+    thereby allowing views definitions longer than 4000 
+    characters to be fully returned.  [ticket:2071]
+
 - mysql
   - oursql dialect accepts the same "ssl" arguments in 
     create_engine() as that of MySQLdb.  [ticket:2047]
index f544753381a4dfb5a4db71a5fcc5babee87e6e99..8cf3c2ad584594b11879635a882274ba30b64a92 100644 (file)
@@ -130,14 +130,14 @@ which has triggers::
         # ...,
         implicit_returning=False
     )
-    
+
 Declarative form::
 
     class MyClass(Base):
         # ...
         __table_args__ = {'implicit_returning':False}
-        
-        
+
+
 This option can also be specified engine-wide using the
 ``implicit_returning=False`` argument on :func:`.create_engine`.
 
@@ -1217,14 +1217,25 @@ class MSDialect(default.DefaultDialect):
     @reflection.cache
     def get_view_definition(self, connection, viewname, schema=None, **kw):
         current_schema = schema or self.default_schema_name
-        views = ischema.views
-        s = sql.select([views.c.view_definition],
-            sql.and_(
-                views.c.table_schema == current_schema,
-                views.c.table_name == viewname
-            ),
+
+        rp = connection.execute(
+            sql.text(
+                "select definition from sys.sql_modules as mod, "
+                "sys.views as views, "
+                "sys.schemas as sch"
+                " where "
+                "mod.object_id=views.object_id and "
+                "views.schema_id=sch.schema_id and "
+                "views.name=:viewname and sch.name=:schname",
+                bindparams=[
+                    sql.bindparam('viewname', viewname, 
+                            sqltypes.String(convert_unicode=True)),
+                    sql.bindparam('schname', current_schema, 
+                            sqltypes.String(convert_unicode=True))
+                ]
+            )
         )
-        rp = connection.execute(s)
+
         if rp:
             view_def = rp.scalar()
             return view_def
index 3ea3074fda832666908036b88385dc96b7207a6c..d0edb437b4b0fc0ffb251b488fd1c75e13b946ee 100644 (file)
@@ -14,6 +14,7 @@ from sqlalchemy.engine import url
 from sqlalchemy.test import *
 from sqlalchemy.test.testing import eq_, emits_warning_on, \
     assert_raises_message
+from sqlalchemy.engine.reflection import Inspector
 
 class CompileTest(TestBase, AssertsCompiledSQL):
     __dialect__ = mssql.dialect()
@@ -1622,3 +1623,36 @@ class BinaryTest(TestBase, AssertsExecutionResults):
         stream = fp.read(len)
         fp.close()
         return stream
+
+
+class ReflectHugeViewTest(TestBase):
+    def setup(self):
+        self.col_num = 150
+
+        self.metadata = MetaData(testing.db)
+        t = Table('base_table', self.metadata,
+                *[
+                    Column("long_named_column_number_%d" % i, Integer)
+                    for i in xrange(self.col_num)
+                ]
+        )
+        self.view_str = view_str = \
+            "CREATE VIEW huge_named_view AS SELECT %s FROM base_table" % (
+            ",".join("long_named_column_number_%d" % i 
+                        for i in xrange(self.col_num))
+            )
+        assert len(view_str) > 4000
+
+        DDL(view_str).execute_at('after-create', t)
+        DDL("DROP VIEW huge_named_view").execute_at('before-drop', t)
+
+        self.metadata.create_all()
+
+    def teardown(self):
+        self.metadata.drop_all()
+
+    def test_inspect_view_definition(self):
+        inspector = Inspector.from_engine(testing.db)
+        view_def = inspector.get_view_definition("huge_named_view")
+        eq_(view_def, self.view_str)
+