From 4bbd814fffb563e38f776d7c11ab162f8095ca51 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 13 Feb 2012 18:53:21 -0500 Subject: [PATCH] - [bug] Fixed the "render literal bind" function, used by Alembic, to escape % signs with %%. --- CHANGES | 4 ++++ lib/sqlalchemy/dialects/postgresql/base.py | 1 + test/dialect/test_postgresql.py | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/CHANGES b/CHANGES index 29e8c2ba0f..b589751eb2 100644 --- a/CHANGES +++ b/CHANGES @@ -93,6 +93,10 @@ CHANGES commit or rollback transaction with errors on engine.begin(). +- postgresql + - [bug] Fixed the "render literal bind" function, + used by Alembic, to escape % signs with %%. + - mysql - [feature] Added support for the "isolation_level" parameter to all MySQL dialects. Thanks diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index c4c2bbdb4e..51f69b7b2c 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -644,6 +644,7 @@ class PGCompiler(compiler.SQLCompiler): # TODO: need to inspect "standard_conforming_strings" if self.dialect._backslash_escapes: value = value.replace('\\', '\\\\') + value = value.replace("%", "%%") return value def visit_sequence(self, seq): diff --git a/test/dialect/test_postgresql.py b/test/dialect/test_postgresql.py index 769f18ce9a..a537ee3e9e 100644 --- a/test/dialect/test_postgresql.py +++ b/test/dialect/test_postgresql.py @@ -74,6 +74,18 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): 'RETURNING length(mytable.name) AS length_1' , dialect=dialect) + def test_render_literal(self): + dialect = postgresql.dialect() + compiler = dialect.statement_compiler(dialect, None) + for value, exp in [ + ('hi', "'hi'"), + ("with 'quotes'", "'with ''quotes'''"), + ('%.%', "'%%.%%'") + ]: + eq_( + compiler.render_literal_value(value, None), + exp + ) def test_insert_returning(self): dialect = postgresql.dialect() -- 2.47.2