From: Mike Bayer Date: Wed, 27 May 2020 14:18:33 +0000 (-0400) Subject: Render table hints in generic SQL X-Git-Tag: rel_1_3_18~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1e42b3562198889b58634ca28080eef8914b8eb6;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Render table hints in generic SQL Added :meth:`.Select.with_hint` output to the generic SQL string that is produced when calling ``str()`` on a statement. Previously, this clause would be omitted under the assumption that it was dialect specific. The hint text is presented within brackets to indicate the rendering of such hints varies among backends. Fixes: #5353 References: #4667 Change-Id: I01d97d6baa993e495519036ec7ecd5ae62856c16 (cherry picked from commit 7dc411dc63faf59b4e28fa0dea805887821d0d99) --- diff --git a/doc/build/changelog/unreleased_13/5353.rst b/doc/build/changelog/unreleased_13/5353.rst new file mode 100644 index 0000000000..39a5ba490b --- /dev/null +++ b/doc/build/changelog/unreleased_13/5353.rst @@ -0,0 +1,10 @@ +.. change:: + :tags: bug, sql + :tickets: 5353 + + Added :meth:`.Select.with_hint` output to the generic SQL string that is + produced when calling ``str()`` on a statement. Previously, this clause + would be omitted under the assumption that it was dialect specific. + The hint text is presented within brackets to indicate the rendering + of such hints varies among backends. + diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 47f12f0493..473e886171 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -2828,6 +2828,9 @@ class StrSQLCompiler(SQLCompiler): for t in extra_froms ) + def get_from_hint_text(self, table, text): + return "[%s]" % text + class DDLCompiler(Compiled): @util.memoized_property diff --git a/test/sql/test_compiler.py b/test/sql/test_compiler.py index 00f7a97636..f79bbed5f4 100644 --- a/test/sql/test_compiler.py +++ b/test/sql/test_compiler.py @@ -3393,6 +3393,41 @@ class StringifySpecialTest(fixtures.TestBase): "'%s'" % value, ) + def test_with_hint_table(self): + stmt = ( + select([table1]) + .select_from( + table1.join(table2, table1.c.myid == table2.c.otherid) + ) + .with_hint(table1, "use some_hint") + ) + + # note that some dialects instead use the "with_select_hint" + # hook to put the 'hint' up front + eq_ignore_whitespace( + str(stmt), + "SELECT mytable.myid, mytable.name, mytable.description " + "FROM mytable [use some_hint] " + "JOIN myothertable ON mytable.myid = myothertable.otherid", + ) + + def test_with_hint_statement(self): + stmt = ( + select([table1]) + .select_from( + table1.join(table2, table1.c.myid == table2.c.otherid) + ) + .with_statement_hint("use some_hint") + ) + + eq_ignore_whitespace( + str(stmt), + "SELECT mytable.myid, mytable.name, mytable.description " + "FROM mytable " + "JOIN myothertable ON mytable.myid = myothertable.otherid " + "use some_hint", + ) + class KwargPropagationTest(fixtures.TestBase): @classmethod