diff --git a/ydb/core/grpc_services/rpc_load_rows.cpp b/ydb/core/grpc_services/rpc_load_rows.cpp index cdfe1e7b5f0d..e780de7eea05 100644 --- a/ydb/core/grpc_services/rpc_load_rows.cpp +++ b/ydb/core/grpc_services/rpc_load_rows.cpp @@ -467,6 +467,13 @@ class TUploadColumnsRPCPublic : public NTxProxy::TUploadRowsBase 1) { + errorMessage = TStringBuilder() << "Wrong quote char '" << quoting.quote_char() << "'"; + return false; + } + const char qchar = quoting.quote_char().empty() ? '"' : quoting.quote_char().front(); + reader->SetQuoting(!quoting.disabled(), qchar, !quoting.double_quote_disabled()); reader->SetSkipRows(skipRows); if (!delimiter.empty()) { diff --git a/ydb/public/api/protos/ydb_formats.proto b/ydb/public/api/protos/ydb_formats.proto index 272af52629f3..287c440982d6 100644 --- a/ydb/public/api/protos/ydb_formats.proto +++ b/ydb/public/api/protos/ydb_formats.proto @@ -9,6 +9,12 @@ message ArrowBatchSettings { } message CsvSettings { + message Quoting { + bool disabled = 1; + bytes quote_char = 2; + bool double_quote_disabled = 3; + } + // Number of rows to skip before CSV data. It should be present only in the first upsert of CSV file. uint32 skip_rows = 1; // Fields delimiter in CSV file. It's "," if not set. @@ -17,4 +23,5 @@ message CsvSettings { bytes null_value = 3; // First not skipped line is a CSV header (list of column names). bool header = 4; + Quoting quoting = 5; }