Commits

paj committed 741774a

Properly escape table names when reflecting for mssql and sqlite [ticket:653]

  • Participants
  • Parent commits 2d34c98

Comments (0)

Files changed (4)

lib/sqlalchemy/databases/mssql.py

                 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()
 
         
         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:
             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()

lib/sqlalchemy/databases/sqlite.py

         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()
         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()
         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()

test/engine/reflection.py

         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):

test/sql/query.py

         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."""