Skip to content

Commit 5afc3fa

Browse files
committed
Revert query_tags changes for CI baseline test
1 parent 23b6591 commit 5afc3fa

File tree

5 files changed

+20
-60
lines changed

5 files changed

+20
-60
lines changed

examples/query_tags_example.py

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
1717
Special cases:
1818
- If a value is None, only the key is included (no colon or value)
19-
- Special characters (comma, colon and backslash) in values are automatically escaped
19+
- Special characters (:, ,, \\) in values are automatically escaped
2020
- Keys are not escaped (should be controlled identifiers)
2121
"""
2222

@@ -74,11 +74,6 @@
7474
result = cursor.fetchone()
7575
print(f" Special Chars Query Result: {result[0]}")
7676

77-
# Query 4: No tags (demonstrates tags don't persist from previous queries)
78-
cursor.execute("SELECT 4")
79-
result = cursor.fetchone()
80-
print(f" No Tags Query Result: {result[0]}")
81-
8277
print()
8378

8479
# Example 3: Async execution with query tags
@@ -91,31 +86,11 @@
9186

9287
with connection.cursor() as cursor:
9388
cursor.execute_async(
94-
"SELECT 5",
89+
"SELECT 4",
9590
query_tags={"team": "data-eng", "mode": "async"}
9691
)
9792
cursor.get_async_execution_result()
9893
result = cursor.fetchone()
9994
print(f" Async Query Result: {result[0]}")
10095

101-
print()
102-
103-
# Example 4: executemany with query tags
104-
print("Example 4: executemany with query tags")
105-
with sql.connect(
106-
server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"),
107-
http_path=os.getenv("DATABRICKS_HTTP_PATH"),
108-
access_token=os.getenv("DATABRICKS_TOKEN"),
109-
) as connection:
110-
111-
with connection.cursor() as cursor:
112-
# Execute multiple queries with the same tags
113-
cursor.executemany(
114-
"SELECT ?",
115-
[[6], [7], [8]],
116-
query_tags={"team": "data-eng", "batch": "executemany"}
117-
)
118-
result = cursor.fetchone()
119-
print(f" Executemany Query Result (last): {result[0]}")
120-
121-
print("\n=== Query Tags Example Complete ===")
96+
print("\n=== Query Tags Example Complete ===")

src/databricks/sql/backend/sea/backend.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -463,9 +463,6 @@ def execute_command(
463463
async_op: bool,
464464
enforce_embedded_schema_correctness: bool,
465465
row_limit: Optional[int] = None,
466-
query_tags: Optional[
467-
Dict[str, Optional[str]]
468-
] = None, # TODO: implement query_tags for SEA backend
469466
) -> Union[SeaResultSet, None]:
470467
"""
471468
Execute a SQL command using the SEA backend.

src/databricks/sql/client.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,12 +1459,7 @@ def get_async_execution_result(self):
14591459
session_id_hex=self.connection.get_session_id_hex(),
14601460
)
14611461

1462-
def executemany(
1463-
self,
1464-
operation,
1465-
seq_of_parameters,
1466-
query_tags: Optional[Dict[str, Optional[str]]] = None,
1467-
):
1462+
def executemany(self, operation, seq_of_parameters):
14681463
"""
14691464
Execute the operation once for every set of passed in parameters.
14701465
@@ -1473,14 +1468,10 @@ def executemany(
14731468
14741469
Only the final result set is retained.
14751470
1476-
:param query_tags: Optional dictionary of query tags to apply for all queries in this batch.
1477-
Tags are key-value pairs that can be used to identify and categorize queries.
1478-
Example: {"team": "data-eng", "application": "etl"}
1479-
14801471
:returns self
14811472
"""
14821473
for parameters in seq_of_parameters:
1483-
self.execute(operation, parameters, query_tags=query_tags)
1474+
self.execute(operation, parameters)
14841475
return self
14851476

14861477
@log_latency(StatementType.METADATA)

src/databricks/sql/utils.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -898,17 +898,15 @@ def concat_table_chunks(
898898
return pyarrow.concat_tables(table_chunks)
899899

900900

901-
def serialize_query_tags(
902-
query_tags: Optional[Dict[str, Optional[str]]]
903-
) -> Optional[str]:
901+
def serialize_query_tags(query_tags: Optional[Dict[str, Optional[str]]]) -> Optional[str]:
904902
"""
905903
Serialize query_tags dictionary to a string format.
906904
907905
Format: "key1:value1,key2:value2"
908906
Special cases:
909907
- If value is None, omit the colon and value (e.g., "key1:value1,key2,key3:value3")
910908
- Escape special characters (:, ,, \\) in values with a leading backslash
911-
- Backslashes in keys are escaped; other special characters in keys are not escaped
909+
- Keys are not escaped (assumed to be controlled identifiers)
912910
913911
Args:
914912
query_tags: Dictionary of query tags where keys are strings and values are optional strings
@@ -922,21 +920,20 @@ def serialize_query_tags(
922920
def escape_value(value: str) -> str:
923921
"""Escape special characters in tag values."""
924922
# Escape backslash first to avoid double-escaping
925-
value = value.replace("\\", r"\\")
923+
value = value.replace("\\", "\\\\")
926924
# Escape colon and comma
927-
value = value.replace(":", r"\:")
928-
value = value.replace(",", r"\,")
925+
value = value.replace(":", "\\:")
926+
value = value.replace(",", "\\,")
929927
return value
930928

931929
serialized_parts = []
932930
for key, value in query_tags.items():
933-
escaped_key = key.replace("\\", r"\\")
934931
if value is None:
935932
# No colon or value when value is None
936-
serialized_parts.append(escaped_key)
933+
serialized_parts.append(key)
937934
else:
938935
escaped_value = escape_value(value)
939-
serialized_parts.append(f"{escaped_key}:{escaped_value}")
936+
serialized_parts.append(f"{key}:{escaped_value}")
940937

941938
return ",".join(serialized_parts)
942939

tests/unit/test_util.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,19 +180,19 @@ def test_serialize_query_tags_with_special_chars(self):
180180
query_tags = {
181181
"key1": "value:with:colons",
182182
"key2": "value,with,commas",
183-
"key3": r"value\with\backslashes",
183+
"key3": "value\\with\\backslashes",
184184
}
185185
result = serialize_query_tags(query_tags)
186186
assert (
187187
result
188-
== r"key1:value\:with\:colons,key2:value\,with\,commas,key3:value\\with\\backslashes"
188+
== "key1:value\\:with\\:colons,key2:value\\,with\\,commas,key3:value\\\\with\\\\backslashes"
189189
)
190190

191191
def test_serialize_query_tags_with_mixed_special_chars(self):
192192
"""Test query tags with mixed special characters"""
193-
query_tags = {"key1": r"a:b,c\d"}
193+
query_tags = {"key1": "a:b,c\\d"}
194194
result = serialize_query_tags(query_tags)
195-
assert result == r"key1:a\:b\,c\\d"
195+
assert result == "key1:a\\:b\\,c\\\\d"
196196

197197
def test_serialize_query_tags_empty_dict(self):
198198
"""Test serialization with empty dictionary"""
@@ -206,17 +206,17 @@ def test_serialize_query_tags_none(self):
206206
assert result is None
207207

208208
def test_serialize_query_tags_with_special_chars_in_key(self):
209-
"""Test query tags with special characters in keys (only backslashes are escaped in keys)"""
209+
"""Test query tags with special characters in keys (keys are not escaped)"""
210210
query_tags = {
211211
"key:with:colons": "value1",
212212
"key,with,commas": "value2",
213-
r"key\with\backslashes": "value3",
213+
"key\\with\\backslashes": "value3",
214214
}
215215
result = serialize_query_tags(query_tags)
216-
# Only backslashes are escaped in keys; colons and commas in keys are not escaped
216+
# Keys are not escaped, only values are
217217
assert (
218218
result
219-
== r"key:with:colons:value1,key,with,commas:value2,key\\with\\backslashes:value3"
219+
== "key:with:colons:value1,key,with,commas:value2,key\\with\\backslashes:value3"
220220
)
221221

222222
def test_serialize_query_tags_all_none_values(self):

0 commit comments

Comments
 (0)