]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
fixed DDL quoting with literal strings that have ' [ticket:1640]
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 3 Jan 2010 18:53:41 +0000 (18:53 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 3 Jan 2010 18:53:41 +0000 (18:53 +0000)
CHANGES
lib/sqlalchemy/sql/util.py
test/dialect/test_postgresql.py

diff --git a/CHANGES b/CHANGES
index db902e79d8382a46baeaef96b9e5f3ec3a359f1c..140bd058c930d86f05f4d1318b1b4af18d25f6e2 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -524,6 +524,9 @@ CHANGES
              "postgres_where" names still work with a
              deprecation warning.
     
+    - "postgresql_where" now accepts SQL expressions which 
+      can also include literals, which will be quoted as needed.
+      
     - The psycopg2 dialect now uses psycopg2's "unicode extension"
       on all new connections, which allows all String/Text/etc.
       types to skip the need to post-process bytestrings into
index 1b4bc67fcc36c1ef6fdee2f84b521de947b66f8c..821b3a3d129e25cf9ef28c3f5fedb757a7429651 100644 (file)
@@ -172,6 +172,13 @@ def find_columns(clause):
     visitors.traverse(clause, {}, {'column':cols.add})
     return cols
 
+def _quote_ddl_expr(element):
+    if isinstance(element, basestring):
+        element = element.replace("'", "''")
+        return "'%s'" % element
+    else:
+        return repr(element)
+    
 def expression_as_ddl(clause):
     """Given a SQL expression, convert for usage in DDL, such as 
      CREATE INDEX and CHECK CONSTRAINT.
@@ -183,7 +190,7 @@ def expression_as_ddl(clause):
     """
     def repl(element):
         if isinstance(element, expression._BindParamClause):
-            return expression.literal_column(repr(element.value))
+            return expression.literal_column(_quote_ddl_expr(element.value))
         elif isinstance(element, expression.ColumnClause) and \
                 element.table is not None:
             return expression.column(element.name)
index bc181810e6e67a290fa374fab061a927355b10bc..9833042fed5e8b670ec31e7a2518841ca7176d9a 100644 (file)
@@ -87,9 +87,16 @@ class CompileTest(TestBase, AssertsCompiledSQL):
         m = MetaData()
         tbl = Table('testtbl', m, Column('data',Integer))
         idx = Index('test_idx1', tbl.c.data, postgresql_where=and_(tbl.c.data > 5, tbl.c.data < 10))
+        idx = Index('test_idx1', tbl.c.data, postgresql_where=and_(tbl.c.data > 5, tbl.c.data < 10))
+        
+        # test quoting and all that
+        idx2 = Index('test_idx2', tbl.c.data, postgresql_where=and_(tbl.c.data > 'a', tbl.c.data < "b's"))
 
         self.assert_compile(schema.CreateIndex(idx), 
             "CREATE INDEX test_idx1 ON testtbl (data) WHERE data > 5 AND data < 10", dialect=postgresql.dialect())
+
+        self.assert_compile(schema.CreateIndex(idx2), 
+            "CREATE INDEX test_idx2 ON testtbl (data) WHERE data > 'a' AND data < 'b''s'", dialect=postgresql.dialect())
             
     @testing.uses_deprecated(r".*'postgres_where' argument has been renamed.*")
     def test_old_create_partial_index(self):