summaryrefslogtreecommitdiff
path: root/test/sql
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-10-27 09:28:02 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2022-10-27 09:28:02 -0400
commitcaa9f0ff98d44359f5162bca8e7fe7bcaa2989a7 (patch)
tree4c5dc28f076179e1a7bf8c45b9c916c480d53d69 /test/sql
parent811979150cd9f1aed3d6de6938b84179b2092b89 (diff)
downloadsqlalchemy-caa9f0ff98d44359f5162bca8e7fe7bcaa2989a7.tar.gz
apply basic escaping to anon_labels unconditionally
Fixed issue which prevented the :func:`_sql.literal_column` construct from working properly within the context of a :class:`.Select` construct as well as other potential places where "anonymized labels" might be generated, if the literal expression contained characters which could interfere with format strings, such as open parenthesis, due to an implementation detail of the "anonymous label" structure. Fixes: #8724 Change-Id: I3089124fbd055a011c8a245964258503b717d941
Diffstat (limited to 'test/sql')
-rw-r--r--test/sql/test_labels.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/test/sql/test_labels.py b/test/sql/test_labels.py
index d385b9e8d..42d9c5f00 100644
--- a/test/sql/test_labels.py
+++ b/test/sql/test_labels.py
@@ -3,6 +3,7 @@ from sqlalchemy import Boolean
from sqlalchemy import cast
from sqlalchemy import exc as exceptions
from sqlalchemy import Integer
+from sqlalchemy import literal_column
from sqlalchemy import MetaData
from sqlalchemy import or_
from sqlalchemy import select
@@ -20,6 +21,7 @@ from sqlalchemy.sql.elements import _truncated_label
from sqlalchemy.sql.elements import ColumnElement
from sqlalchemy.sql.elements import WrapsColumnExpression
from sqlalchemy.sql.selectable import LABEL_STYLE_NONE
+from sqlalchemy.sql.visitors import prefix_anon_map
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
from sqlalchemy.testing import AssertsCompiledSQL
@@ -1038,3 +1040,35 @@ class ColExprLabelTest(fixtures.TestBase, AssertsCompiledSQL):
"SOME_COL_THING(some_table.value) "
"AS some_table_value FROM some_table",
)
+
+ @testing.combinations(
+ # the resulting strings are completely arbitrary and are not
+ # exposed in SQL with current implementations. we want to
+ # only assert that the operation doesn't fail. It's safe to
+ # change the assertion cases for this test if the label escaping
+ # format changes
+ (literal_column("'(1,2]'"), "'_1,2]'_1"),
+ (literal_column("))"), "__1"),
+ (literal_column("'%('"), "'_'_1"),
+ )
+ def test_labels_w_strformat_chars_in_isolation(self, test_case, expected):
+ """test #8724"""
+
+ pa = prefix_anon_map()
+ eq_(test_case._anon_key_label % pa, expected)
+
+ @testing.combinations(
+ (
+ select(literal_column("'(1,2]'"), literal_column("'(1,2]'")),
+ "SELECT '(1,2]', '(1,2]'",
+ ),
+ (select(literal_column("))"), literal_column("))")), "SELECT )), ))"),
+ (
+ select(literal_column("'%('"), literal_column("'%('")),
+ "SELECT '%(', '%('",
+ ),
+ )
+ def test_labels_w_strformat_chars_in_statements(self, test_case, expected):
+ """test #8724"""
+
+ self.assert_compile(test_case, expected)