Skip to content

[SYNPY-1749]Allow quote, apostrophe and ellipsis in store_row_async#1316

Open
danlu1 wants to merge 14 commits intodevelopfrom
SYNPY-1749-allow-quote-apostrophe-in-store-rows
Open

[SYNPY-1749]Allow quote, apostrophe and ellipsis in store_row_async#1316
danlu1 wants to merge 14 commits intodevelopfrom
SYNPY-1749-allow-quote-apostrophe-in-store-rows

Conversation

@danlu1
Copy link
Contributor

@danlu1 danlu1 commented Feb 9, 2026

Problem:

A JSON serialization issue occurs when a DataFrame passed to store_row_async contains a list or dictionary with strings that include both double quotes and apostrophes.

Solution:

Restrict to_csv_kwargs in get_partial_dataframe_chunk, which is the final step before uploading the data to Synapse to obtain the file handle.

Testing:

Unit test and integration test have been added.

@danlu1 danlu1 requested a review from a team as a code owner February 9, 2026 20:01
@andrewelamb
Copy link
Contributor

@danlu1 Is this still WIP, or are you looking for reviews?

@danlu1
Copy link
Contributor Author

danlu1 commented Feb 10, 2026

@andrewelamb sorry I should have marked this a draft.

@danlu1 danlu1 marked this pull request as draft February 10, 2026 00:48
@danlu1 danlu1 marked this pull request as ready for review February 18, 2026 18:36
@danlu1
Copy link
Contributor Author

danlu1 commented Feb 18, 2026

The integration test failures are in the recordset and submission modules and do not appear to be related to my changes.

Copy link
Contributor

@linglp linglp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think overall it looks good. The tests can be consolidated a bit to test all the edge cases in fewer integration tests to improve performance, and the docstring can be updated to reflect the new state of the code since json.dumps() was removed. There's also some logic that can be simplified in the redundant checks where sample_values is created but never actually used. The function name could also be more descriptive of what it actually does now (sanitizing special values rather than just converting dtypes)

@danlu1 danlu1 requested a review from linglp February 24, 2026 00:15

import pandas as pd
import pytest
from pandas.api.types import is_object_dtype
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if you merge develop to this branch, you should be able to see that we are no longer adding tests to synchronous folder any more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is right, Sorry for the code conflicts that you'll need to deal with @danlu1

@@ -141,6 +141,7 @@ def row_labels_from_rows(rows: List[Row]) -> List[Row]:
def convert_dtypes_to_json_serializable(df):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: add return type hints

to_csv_kwargs: Additional arguments to pass to the `pd.DataFrame.to_csv`
function when writing the data to a CSV file.
"""
# Serializes dict/list values to JSON strings
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the comment here is misleading. The function no longer converts dict/list values to JSON strings. I think in your function, the dict/list values remain as dict/list objects

Comment on lines +67 to +75
df.iloc[offset_start:end].to_csv(
buffer,
mode="a",
header=False,
index=False,
float_format="%.12g",
doublequote=False,
escapechar="\\",
quoting=0,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this instead be a passthrough for the settings that the user has defined for the doublequote, escapechar, when they called the row upsert or store method(s)? I am seeing that it is currently used to go from CSV -> DataFrame, but then we are not using them to go from DataFrame -> CSV (And we probably should in some capacity). We could then default them as we do today if not passed in, but it would allow a user to specify them.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried implementing a passthrough when calling the store method, but it didn’t work. The likely root cause is a bug: to_csv_kwargs isn’t being passed into _stream_and_update_from_df, so downstream steps never get a chance to use it. I added the parameters here because Synapse only allows a limited set of options, similar to how we handled float_format. That said, the ideal solution is to support to_csv_kwargs directly for DataFrames. I’m going to add support for to_csv_kwargs.

Copy link
Member

@BryanFauble BryanFauble left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is looking great, once we get the last few items handled (and develop merged in), I can approve!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants