]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Properly escape table names when reflecting for mssql and sqlite [ticket:653]
authorPaul Johnston <paj@pajhome.org.uk>
Tue, 17 Jul 2007 20:13:36 +0000 (20:13 +0000)
committerPaul Johnston <paj@pajhome.org.uk>
Tue, 17 Jul 2007 20:13:36 +0000 (20:13 +0000)
lib/sqlalchemy/databases/mssql.py
lib/sqlalchemy/databases/sqlite.py
test/engine/reflection.py
test/sql/query.py

index 553e07a48aaa5da96bfbfe351984ad3e3d3e3a72..6b1b41123f3733abb7ef8dfaf50d01a153814774 100644 (file)
@@ -251,8 +251,7 @@ class MSSQLExecutionContext(default.DefaultExecutionContext):
                 self.IINSERT = False
 
             if self.IINSERT:
-                # TODO: quoting rules for table name here ?
-                self.cursor.execute("SET IDENTITY_INSERT %s ON" % self.compiled.statement.table.fullname)
+                self.cursor.execute("SET IDENTITY_INSERT %s ON" % self.dialect.preparer().format_table(self.compiled.statement.table))
 
         super(MSSQLExecutionContext, self).pre_exec()
 
@@ -264,8 +263,7 @@ class MSSQLExecutionContext(default.DefaultExecutionContext):
         
         if self.compiled.isinsert:
             if self.IINSERT:
-                # TODO: quoting rules for table name here ?
-                self.cursor.execute("SET IDENTITY_INSERT %s OFF" % self.compiled.statement.table.fullname)
+                self.cursor.execute("SET IDENTITY_INSERT %s OFF" % self.dialect.preparer().format_table(self.compiled.statement.table))
                 self.IINSERT = False
             elif self.HASIDENT:
                 if not len(self._last_inserted_ids) or self._last_inserted_ids[0] is None:
@@ -532,7 +530,7 @@ class MSSQLDialect(ansisql.ANSIDialect):
             raise exceptions.NoSuchTableError(table.name)
 
         # We also run an sp_columns to check for identity columns:
-        cursor = connection.execute("sp_columns " + table.name)
+        cursor = connection.execute("sp_columns " + self.preparer().format_table(table))
         ic = None
         while True:
             row = cursor.fetchone()
index b42468c7a4874dd38939f415029e86c59b412dce..5c4a38b5d7c7df46c506078057efa8bade5e6385 100644 (file)
@@ -233,7 +233,7 @@ class SQLiteDialect(ansisql.ANSIDialect):
         return (row is not None)
 
     def reflecttable(self, connection, table):
-        c = connection.execute("PRAGMA table_info(" + table.name + ")", {})
+        c = connection.execute("PRAGMA table_info(%s)" % self.preparer().format_table(table), {})
         found_table = False
         while True:
             row = c.fetchone()
@@ -266,7 +266,7 @@ class SQLiteDialect(ansisql.ANSIDialect):
         if not found_table:
             raise exceptions.NoSuchTableError(table.name)
 
-        c = connection.execute("PRAGMA foreign_key_list(" + table.name + ")", {})
+        c = connection.execute("PRAGMA foreign_key_list(%s)" % self.preparer().format_table(table), {})
         fks = {}
         while True:
             row = c.fetchone()
@@ -295,7 +295,7 @@ class SQLiteDialect(ansisql.ANSIDialect):
         for name, value in fks.iteritems():
             table.append_constraint(schema.ForeignKeyConstraint(value[0], value[1]))
         # check for UNIQUE indexes
-        c = connection.execute("PRAGMA index_list(" + table.name + ")", {})
+        c = connection.execute("PRAGMA index_list(%s)" % self.preparer().format_table(table), {})
         unique_indexes = []
         while True:
             row = c.fetchone()
index a7d18b7b6065fed2473d8e4b073a60bacb88db03..cb12560ea06941e51fabb2633d227d44e4952f9e 100644 (file)
@@ -464,10 +464,25 @@ class ReflectionTest(PersistTest):
         meta2 = MetaData(testbase.db)
         try:
             table2 = Table('identity_test', meta2, autoload=True)
-            print table2.c['col1'].sequence
+            assert table2.c['col1'].sequence.start == 2
+            assert table2.c['col1'].sequence.increment == 3
         finally:
             table.drop()
 
+    def testreserved(self):
+        # check a table that uses an SQL reserved name doesn't cause an error
+        meta = MetaData(testbase.db)
+        table = Table(
+            'select', meta, 
+            Column('col1', Integer, primary_key=True)
+        )
+        table.create()
+        
+        meta2 = MetaData(testbase.db)
+        try:
+            table2 = Table('select', meta2, autoload=True)
+        finally:
+            table.drop()
 
 class CreateDropTest(PersistTest):
     def setUpAll(self):
index 91587bc0e151208815cc01230abbecb4a15e22b9..8af5aafeabafdf6862cf4c8539a0dc43bc58687e 100644 (file)
@@ -458,6 +458,22 @@ class QueryTest(PersistTest):
         finally:
             tbl.drop()
             con.execute('drop schema paj')
+
+    @testbase.supported('mssql')
+    def test_insertid_reserved(self):
+        meta = MetaData(testbase.db)
+        table = Table(
+            'select', meta, 
+            Column('col', Integer, primary_key=True)
+        )
+        table.create()
+        
+        meta2 = MetaData(testbase.db)
+        try:
+            table.insert().execute(col=7)
+        finally:
+            table.drop()
+
     
     def test_in_filtering(self):
         """test the 'shortname' field on BindParamClause."""