summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Johnston <paj@pajhome.org.uk>2007-07-17 20:13:36 +0000
committerPaul Johnston <paj@pajhome.org.uk>2007-07-17 20:13:36 +0000
commita966505992b94ec1cc0633aafa7dda0a287fb96c (patch)
treeb2c40729792b7ab343169f6ddcc2667c778ee00e
parent1dba9d48c28d59523f952d5e6b2f1425450cd7db (diff)
downloadsqlalchemy-a966505992b94ec1cc0633aafa7dda0a287fb96c.tar.gz
Properly escape table names when reflecting for mssql and sqlite [ticket:653]
-rw-r--r--lib/sqlalchemy/databases/mssql.py8
-rw-r--r--lib/sqlalchemy/databases/sqlite.py6
-rw-r--r--test/engine/reflection.py17
-rw-r--r--test/sql/query.py16
4 files changed, 38 insertions, 9 deletions
diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py
index 553e07a48..6b1b41123 100644
--- a/lib/sqlalchemy/databases/mssql.py
+++ b/lib/sqlalchemy/databases/mssql.py
@@ -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()
diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py
index b42468c7a..5c4a38b5d 100644
--- a/lib/sqlalchemy/databases/sqlite.py
+++ b/lib/sqlalchemy/databases/sqlite.py
@@ -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()
diff --git a/test/engine/reflection.py b/test/engine/reflection.py
index a7d18b7b6..cb12560ea 100644
--- a/test/engine/reflection.py
+++ b/test/engine/reflection.py
@@ -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):
diff --git a/test/sql/query.py b/test/sql/query.py
index 91587bc0e..8af5aafea 100644
--- a/test/sql/query.py
+++ b/test/sql/query.py
@@ -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."""