Skip to content

Commit 7599bb0

Browse files
CASSANDRA-21381: Fix conditional backslash doubling in format_value_text and update regression tests
1 parent fb55b2e commit 7599bb0

2 files changed

Lines changed: 15 additions & 6 deletions

File tree

pylib/cqlshlib/formatting.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,11 @@ def decode_zig_zag_64(n):
479479

480480
@formatter_for('str')
481481
def format_value_text(val, encoding, colormap, quote=False, escape_control_chars=True, **_):
482-
escapedval = val.replace('\\', '\\\\')
482+
if escape_control_chars:
483+
escapedval = val.replace('\\', '\\\\')
484+
else:
485+
escapedval = val
486+
483487
if quote:
484488
escapedval = escapedval.replace("'", "''")
485489
if escape_control_chars:

pylib/cqlshlib/test/test_formatting.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,27 @@ def setUp(self):
5555

5656
def test_format_value_text_control_chars(self):
5757
"""
58-
Test that control chars are escaped for terminal display (default),
59-
but preserved when escape_control_chars=False is passed (for CSV export).
58+
Test that control chars AND literal backslashes are escaped for terminal
59+
display (default), but BOTH are preserved verbatim when
60+
escape_control_chars=False is passed (for CSV export).
6061
"""
6162
self.assertEqual(
6263
format_value_text("Hello World", encoding='utf-8', colormap=NO_COLOR_MAP),
6364
"Hello World"
6465
)
6566

66-
test_string = "Hello\nWorld\x00\tTest\r"
67+
test_string = "C:\\Users\\alice\nHello\x00"
6768

6869
terminal_output = format_value_text(test_string, encoding='utf-8', colormap=NO_COLOR_MAP)
69-
self.assertEqual(terminal_output, "Hello\\nWorld\\x00\\tTest\\r")
70+
self.assertEqual(terminal_output, "C:\\\\Users\\\\alice\\nHello\\x00")
7071

71-
csv_output = format_value_text(test_string, encoding='utf-8', colormap=NO_COLOR_MAP, escape_control_chars=False)
72+
csv_output = format_value_text(test_string, encoding='utf-8', colormap=NO_COLOR_MAP,
73+
escape_control_chars=False)
7274
self.assertEqual(csv_output, test_string)
7375

76+
self.assertIn('C:\\Users', csv_output)
77+
self.assertNotIn('C:\\\\Users', csv_output)
78+
7479
def test_format_value_list_control_chars(self):
7580
""" Test control character propagation in lists """
7681
list_val = ["line1\nline2", "null\x00byte"]

0 commit comments

Comments
 (0)