Skip to content

Commit 668280d

Browse files
committed
Merge commit '9a0959b91952b39ab4bce71c550f6b21574004a7' into fix_opfs_support_issues
# Conflicts: # lib/CMakeLists.txt # packages/duckdb-wasm/src/bindings/bindings_base.ts # packages/duckdb-wasm/test/opfs.test.ts
2 parents 8b9d057 + 9a0959b commit 668280d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1301
-350
lines changed

.github/workflows/main.yml

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ concurrency:
2929
env:
3030
EMSCRIPTEN_VERSION: '3.1.71'
3131
EMSCRIPTEN_VERSION_COI: '3.1.57'
32+
DEFAULT_USE_GENERATED_EXPORTED_LIST: 'no'
3233

3334
jobs:
3435
clang_format:
@@ -494,6 +495,10 @@ jobs:
494495
submodules: 'recursive'
495496
fetch-depth: 0
496497

498+
- name: Install dependencies
499+
run: |
500+
sudo apt install wabt
501+
497502
- name: Prepare repository
498503
run: |
499504
make apply_patches
@@ -514,7 +519,7 @@ jobs:
514519
515520
- name: Build Wasm module
516521
run: |
517-
DUCKDB_PLATFORM="wasm_mvp" DUCKDB_WASM_LOADABLE_EXTENSIONS=1 GEN=ninja ./scripts/wasm_build_lib.sh relsize mvp
522+
USE_GENERATED_EXPORTED_LIST="$DEFAULT_USE_GENERATED_EXPORTED_LIST" DUCKDB_PLATFORM="wasm_mvp" DUCKDB_WASM_LOADABLE_EXTENSIONS=1 GEN=ninja ./scripts/wasm_build_lib.sh relsize mvp
518523
519524
- name: Upload artifact
520525
uses: actions/upload-artifact@v4
@@ -537,6 +542,10 @@ jobs:
537542
submodules: 'recursive'
538543
fetch-depth: 0
539544

545+
- name: Install dependencies
546+
run: |
547+
sudo apt install wabt
548+
540549
- name: Prepare repository
541550
run: |
542551
make apply_patches
@@ -557,7 +566,7 @@ jobs:
557566
558567
- name: Build Wasm module
559568
run: |
560-
DUCKDB_PLATFORM="wasm_eh" DUCKDB_WASM_LOADABLE_EXTENSIONS=1 GEN=ninja ./scripts/wasm_build_lib.sh relsize eh
569+
USE_GENERATED_EXPORTED_LIST="$DEFAULT_USE_GENERATED_EXPORTED_LIST" DUCKDB_PLATFORM="wasm_eh" DUCKDB_WASM_LOADABLE_EXTENSIONS=1 GEN=ninja ./scripts/wasm_build_lib.sh relsize eh
561570
562571
- name: Upload artifact
563572
uses: actions/upload-artifact@v4
@@ -580,6 +589,10 @@ jobs:
580589
submodules: 'recursive'
581590
fetch-depth: 0
582591

592+
- name: Install dependencies
593+
run: |
594+
sudo apt install wabt
595+
583596
- name: Prepare repository
584597
run: |
585598
make apply_patches
@@ -600,7 +613,7 @@ jobs:
600613
601614
- name: Build Wasm module
602615
run: |
603-
DUCKDB_PLATFORM="wasm_threads" DUCKDB_WASM_LOADABLE_EXTENSIONS="signed" GEN=ninja ./scripts/wasm_build_lib.sh relsize coi
616+
USE_GENERATED_EXPORTED_LIST="$DEFAULT_USE_GENERATED_EXPORTED_LIST" DUCKDB_PLATFORM="wasm_threads" DUCKDB_WASM_LOADABLE_EXTENSIONS="signed" GEN=ninja ./scripts/wasm_build_lib.sh relsize coi
604617
605618
- name: Upload artifact
606619
uses: actions/upload-artifact@v4
@@ -1084,7 +1097,7 @@ jobs:
10841097
env:
10851098
NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}
10861099
TAG: ${{ startsWith(github.head_ref, 'v') && 'latest' || 'next' }}
1087-
if: env.NODE_AUTH_TOKEN != null
1100+
if: env.NODE_AUTH_TOKEN != null && github.ref == 'refs/heads/main'
10881101
run: |
10891102
echo "${TAG}"
10901103
./scripts/npm_publish_lib.sh

Makefile

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ app: wasm wasmpack shell docs js_tests_release
357357
yarn workspace @duckdb/duckdb-wasm-app build:release
358358

359359
build_loadable:
360-
DUCKDB_PLATFORM=wasm_${TARGET} DUCKDB_WASM_LOADABLE_EXTENSIONS=1 GEN=ninja ./scripts/wasm_build_lib.sh relsize ${TARGET}
360+
USE_GENERATED_EXPORTED_LIST=no DUCKDB_PLATFORM=wasm_${TARGET} DUCKDB_WASM_LOADABLE_EXTENSIONS=1 ./scripts/wasm_build_lib.sh relsize ${TARGET}
361361

362362
build_loadable_unsigned: build_loadable
363363
# need to propagate the unsigned flag
@@ -436,6 +436,7 @@ build/docker_ci_image:
436436
patch_duckdb:
437437
(find patches/duckdb/* -type f -name '*.patch' -print0 | xargs -0 cat | patch -p1 --forward -d submodules/duckdb) || true
438438
(find patches/arrow/* -type f -name '*.patch' -print0 | xargs -0 cat | patch -p1 --forward -d submodules/arrow) || true
439+
(find patches/rapidjson/* -type f -name '*.patch' -print0 | xargs -0 cat | patch -p1 --forward -d submodules/rapidjson) || true
439440

440441
apply_patches: patch_duckdb
441442

@@ -447,3 +448,15 @@ submodules:
447448
build/bootstrap: submodules yarn_install
448449
mkdir -p build
449450
touch build/bootstrap
451+
452+
update_exported_list:
453+
cd build/relsize/${TARGET} && wasm2wat duckdb_wasm.wasm --enable-all -o duckdb-wasm.wat
454+
cd build/relsize/${TARGET} && grep export duckdb-wasm.wat | cut -d \" -f2 | sed '$d' | grep -v "^orig" | grep -v "^dynCall_" > export_list.txt
455+
## filter list of c++ symbols
456+
cd build/relsize/${TARGET} && cat export_list.txt | grep "^_" | grep -v "_Unwind_DeleteException" | grep -v "_Unwind_RaiseException" | grep -v "__syscall_shutdown" | grep -v "0\\00\\0" | grep -v "^_ZZN5arrow" | grep -v "^_ZGVZN5arrow" | grep -v "^_ZN5arrow" | sort > cpp_list
457+
cd build/relsize/${TARGET} && sed 's/^/_/g' cpp_list > exported_list.txt
458+
## filter list of c symbols
459+
cd build/relsize/${TARGET} && cat export_list.txt | grep -v "^_" | grep -v "getTempRet" | grep -v "^sched_yield" | grep -v "emscripten_wget" | grep -v "0\\00\\0" | sort > c_exported_list
460+
# prepend '_'
461+
cd build/relsize/${TARGET} && sed 's/^/_/g' c_exported_list >> exported_list.txt
462+
cd build/relsize/${TARGET} && echo '__ZNSt3__26chrono12system_clock9to_time_tERKNS0_10time_pointIS1_NS0_8durationIxNS_5ratioILx1ELx1000000EEEEEEE' >> exported_list.txt

lib/CMakeLists.txt

Lines changed: 10 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,15 @@ else()
150150
endif()
151151

152152
if (DUCKDB_WASM_LOADABLE_EXTENSIONS)
153-
set(WASM_LINK_FLAGS "${WASM_LINK_FLAGS} -s MAIN_MODULE=1 -s FILESYSTEM=1 -s ENVIRONMENT='web,node,worker' -s ALLOW_TABLE_GROWTH -lembind")
153+
set(WASM_LINK_FLAGS "${WASM_LINK_FLAGS} -s FILESYSTEM=1 -s ENVIRONMENT='web,node,worker' -s ALLOW_TABLE_GROWTH -lembind")
154+
155+
if ($ENV{USE_GENERATED_EXPORTED_LIST} STREQUAL "yes")
156+
set(WASM_LINK_FLAGS "${WASM_LINK_FLAGS} -s MAIN_MODULE=2 -s EXPORTED_FUNCTIONS='@exported_list.txt'")
157+
else()
158+
set(WASM_LINK_FLAGS "${WASM_LINK_FLAGS} -s MAIN_MODULE=1 -s EXPORTED_FUNCTIONS='@../../../lib/base_exported_list.txt'")
159+
endif()
154160
else()
155-
set(WASM_LINK_FLAGS "${WASM_LINK_FLAGS} -s FILESYSTEM=0 -s ENVIRONMENT='web,node,worker'")
161+
set(WASM_LINK_FLAGS "${WASM_LINK_FLAGS} -s FILESYSTEM=0 -s ENVIRONMENT='web,node,worker' -s EXPORTED_FUNCTIONS='@../../../lib/base_exported_list.txt'")
156162
endif()
157163

158164
# ---------------------------------------------------------------------------
@@ -287,59 +293,7 @@ if(EMSCRIPTEN)
287293
-s MAXIMUM_MEMORY=4GB \
288294
-s MODULARIZE=1 \
289295
-s EXPORT_NAME='DuckDB' \
290-
-s EXPORTED_FUNCTIONS='[ \
291-
_main, \
292-
_malloc, \
293-
_calloc, \
294-
_free, \
295-
stringToUTF8, \
296-
lengthBytesUTF8, \
297-
stackAlloc, \
298-
_duckdb_web_clear_response, \
299-
_duckdb_web_collect_file_stats, \
300-
_duckdb_web_connect, \
301-
_duckdb_web_copy_file_to_buffer, \
302-
_duckdb_web_copy_file_to_path, \
303-
_duckdb_web_disconnect, \
304-
_duckdb_web_export_file_stats, \
305-
_duckdb_web_fail_with, \
306-
_duckdb_web_flush_file, \
307-
_duckdb_web_flush_files, \
308-
_duckdb_web_fs_drop_file, \
309-
_duckdb_web_fs_drop_files, \
310-
_duckdb_web_fs_get_file_info_by_id, \
311-
_duckdb_web_fs_get_file_info_by_name, \
312-
_duckdb_web_fs_glob_add_path, \
313-
_duckdb_web_fs_glob_file_infos, \
314-
_duckdb_web_fs_register_file_buffer, \
315-
_duckdb_web_fs_register_file_url, \
316-
_duckdb_web_get_feature_flags, \
317-
_duckdb_web_get_global_file_info, \
318-
_duckdb_web_get_tablenames, \
319-
_duckdb_web_get_tablenames_buffer, \
320-
_duckdb_web_get_version, \
321-
_duckdb_web_insert_arrow_from_ipc_stream, \
322-
_duckdb_web_insert_csv_from_path, \
323-
_duckdb_web_insert_json_from_path, \
324-
_duckdb_web_open, \
325-
_duckdb_web_pending_query_cancel, \
326-
_duckdb_web_pending_query_poll, \
327-
_duckdb_web_pending_query_start, \
328-
_duckdb_web_pending_query_start_buffer, \
329-
_duckdb_web_prepared_close, \
330-
_duckdb_web_prepared_create, \
331-
_duckdb_web_prepared_create_buffer, \
332-
_duckdb_web_prepared_run, \
333-
_duckdb_web_prepared_send, \
334-
_duckdb_web_query_fetch_results, \
335-
_duckdb_web_query_run, \
336-
_duckdb_web_query_run_buffer, \
337-
_duckdb_web_reset, \
338-
_duckdb_web_tokenize, \
339-
_duckdb_web_tokenize_buffer, \
340-
_duckdb_web_udf_scalar_create \
341-
]' \
342-
-s EXPORTED_RUNTIME_METHODS='[\"ccall\", \"stackSave\", \"stackAlloc\", \"stackRestore\"]' \
296+
-s EXPORTED_RUNTIME_METHODS='[\"ccall\", \"stackSave\", \"stackAlloc\", \"stackRestore\", \"createDyncallWrapper\", \"getTempRet0\", \"setTempRet0\"]' \
343297
--js-library=${CMAKE_SOURCE_DIR}/js-stubs.js")
344298

345299
endif()
@@ -375,4 +329,4 @@ if(NOT EMSCRIPTEN)
375329

376330
add_executable(tester ${TEST_CC})
377331
target_link_libraries(tester ${TEST_LIBS})
378-
endif()
332+
endif()

lib/base_exported_list.txt

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
_main
2+
_malloc
3+
_calloc
4+
_free
5+
_duckdb_web_clear_response
6+
_duckdb_web_collect_file_stats
7+
_duckdb_web_connect
8+
_duckdb_web_copy_file_to_buffer
9+
_duckdb_web_copy_file_to_path
10+
_duckdb_web_disconnect
11+
_duckdb_web_export_file_stats
12+
_duckdb_web_fail_with
13+
_duckdb_web_flush_file
14+
_duckdb_web_flush_files
15+
_duckdb_web_fs_drop_file
16+
_duckdb_web_fs_drop_files
17+
_duckdb_web_fs_get_file_info_by_id
18+
_duckdb_web_fs_get_file_info_by_name
19+
_duckdb_web_fs_glob_add_path
20+
_duckdb_web_fs_glob_file_infos
21+
_duckdb_web_fs_register_file_buffer
22+
_duckdb_web_fs_register_file_url
23+
_duckdb_web_get_feature_flags
24+
_duckdb_web_get_global_file_info
25+
_duckdb_web_get_tablenames
26+
_duckdb_web_get_tablenames_buffer
27+
_duckdb_web_get_version
28+
_duckdb_web_insert_arrow_from_ipc_stream
29+
_duckdb_web_insert_csv_from_path
30+
_duckdb_web_insert_json_from_path
31+
_duckdb_web_open
32+
_duckdb_web_pending_query_cancel
33+
_duckdb_web_pending_query_poll
34+
_duckdb_web_pending_query_start
35+
_duckdb_web_pending_query_start_buffer
36+
_duckdb_web_prepared_close
37+
_duckdb_web_prepared_create
38+
_duckdb_web_prepared_create_buffer
39+
_duckdb_web_prepared_run
40+
_duckdb_web_prepared_send
41+
_duckdb_web_query_fetch_results
42+
_duckdb_web_query_run
43+
_duckdb_web_query_run_buffer
44+
_duckdb_web_reset
45+
_duckdb_web_tokenize
46+
_duckdb_web_tokenize_buffer
47+
_duckdb_web_udf_scalar_create

lib/include/duckdb/web/config.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ struct WebDBConfig {
106106
/// Whether to allow unsigned extensions
107107
bool allow_unsigned_extensions = false;
108108

109+
/// Whether to use alternate Arrow conversion that preserves full range and precision of data.
110+
bool arrow_lossless_conversion = false;
111+
109112
std::string custom_user_agent = "";
110113

111114
/// Read from a document

lib/include/duckdb/web/io/buffered_filesystem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ class BufferedFileSystem : public duckdb::FileSystem {
137137
void RemoveFile(const std::string &filename, optional_ptr<FileOpener> opener = nullptr) override;
138138

139139
/// Runs a glob on the file system, returning a list of matching files
140-
vector<std::string> Glob(const std::string &path, FileOpener *opener = nullptr) override {
140+
vector<OpenFileInfo> Glob(const std::string &path, FileOpener *opener = nullptr) override {
141141
return filesystem_.Glob(PatchFilenameOwned(path), opener);
142142
}
143143

lib/include/duckdb/web/io/memory_filesystem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class MemoryFileSystem : public duckdb::FileSystem {
114114
void FileSync(duckdb::FileHandle &handle) override;
115115

116116
/// Runs a glob on the file system, returning a list of matching files
117-
vector<std::string> Glob(const std::string &path, FileOpener *opener = nullptr) override;
117+
vector<OpenFileInfo> Glob(const std::string &path, FileOpener *opener = nullptr) override;
118118

119119
/// Set the file pointer of a file handle to a specified location. Reads and writes will happen from this location
120120
void Seek(duckdb::FileHandle &handle, idx_t location) override;

lib/include/duckdb/web/io/web_filesystem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ class WebFileSystem : public duckdb::FileSystem {
276276
void FileSync(duckdb::FileHandle &handle) override;
277277

278278
/// Runs a glob on the file system, returning a list of matching files
279-
vector<std::string> Glob(const std::string &path, FileOpener *opener = nullptr) override;
279+
vector<OpenFileInfo> Glob(const std::string &path, FileOpener *opener = nullptr) override;
280280

281281
/// Set the file pointer of a file handle to a specified location. Reads and writes will happen from this location
282282
void Seek(FileHandle &handle, idx_t location) override;

lib/include/duckdb/web/utils/wasm_response.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
namespace duckdb {
99
namespace web {
1010

11+
struct DuckDBWasmResultsWrapper;
12+
1113
struct WASMResponse {
1214
/// The status code
1315
double statusCode = 1;
@@ -35,6 +37,8 @@ class WASMResponseBuffer {
3537
/// Store the arrow status.
3638
/// Returns wheather the result was OK
3739
bool Store(WASMResponse& response, arrow::Status status);
40+
/// Store a DuckDBWasmResultsWrapper
41+
void Store(WASMResponse& response, DuckDBWasmResultsWrapper& value);
3842
/// Store a string
3943
void Store(WASMResponse& response, std::string value);
4044
/// Store a string view

lib/include/duckdb/web/webdb.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ namespace web {
2929

3030
struct BufferingArrowIPCStreamDecoder;
3131

32+
struct DuckDBWasmResultsWrapper {
33+
// Additional ResponseStatuses to be >= 256, and mirrored to packages/duckdb-wasm/src/status.ts
34+
// Missing mapping result in a throw, but they should eventually align (it's fine if typescript side only has a
35+
// subset)
36+
enum ResponseStatus : uint32_t { ARROW_BUFFER = 0, MAX_ARROW_ERROR = 255, DUCKDB_WASM_RETRY = 256 };
37+
DuckDBWasmResultsWrapper(arrow::Result<std::shared_ptr<arrow::Buffer>> res,
38+
ResponseStatus status = ResponseStatus::ARROW_BUFFER)
39+
: arrow_buffer(res), status(status) {}
40+
DuckDBWasmResultsWrapper(arrow::Status res, ResponseStatus status = ResponseStatus::ARROW_BUFFER)
41+
: arrow_buffer(res), status(status) {}
42+
DuckDBWasmResultsWrapper(ResponseStatus status = ResponseStatus::ARROW_BUFFER)
43+
: DuckDBWasmResultsWrapper(nullptr, status) {}
44+
arrow::Result<std::shared_ptr<arrow::Buffer>> arrow_buffer;
45+
ResponseStatus status;
46+
};
47+
3248
class WebDB {
3349
public:
3450
/// A connection
@@ -93,7 +109,7 @@ class WebDB {
93109
/// Cancel a pending query
94110
bool CancelPendingQuery();
95111
/// Fetch a data chunk from a pending query
96-
arrow::Result<std::shared_ptr<arrow::Buffer>> FetchQueryResults();
112+
DuckDBWasmResultsWrapper FetchQueryResults();
97113
/// Get table names
98114
arrow::Result<std::string> GetTableNames(std::string_view text);
99115

lib/src/config.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,10 @@ WebDBConfig WebDBConfig::ReadFrom(std::string_view args_json) {
6060
.s3_session_token = "",
6161
},
6262
.allow_unsigned_extensions = false,
63+
.arrow_lossless_conversion = false,
6364
.custom_user_agent = ""};
6465
rapidjson::Document doc;
65-
rapidjson::ParseResult ok = doc.Parse(args_json.begin(), args_json.size());
66+
rapidjson::ParseResult ok = doc.Parse(args_json.data(), args_json.size());
6667
if (ok) {
6768
if (doc.HasMember("path") && doc["path"].IsString()) {
6869
config.path = doc["path"].GetString();
@@ -76,6 +77,9 @@ WebDBConfig WebDBConfig::ReadFrom(std::string_view args_json) {
7677
if (doc.HasMember("allowUnsignedExtensions") && doc["allowUnsignedExtensions"].IsBool()) {
7778
config.allow_unsigned_extensions = doc["allowUnsignedExtensions"].GetBool();
7879
}
80+
if (doc.HasMember("arrowLosslessConversion") && doc["arrowLosslessConversion"].IsBool()) {
81+
config.arrow_lossless_conversion = doc["arrowLosslessConversion"].GetBool();
82+
}
7983
if (doc.HasMember("useDirectIO") && doc["useDirectIO"].IsBool()) {
8084
config.use_direct_io = doc["useDirectIO"].GetBool();
8185
}

lib/src/io/memory_filesystem.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ void MemoryFileSystem::RemoveFile(const std::string &filename, optional_ptr<File
182182
void MemoryFileSystem::FileSync(duckdb::FileHandle &handle) {}
183183

184184
/// Runs a glob on the file system, returning a list of matching files
185-
vector<std::string> MemoryFileSystem::Glob(const std::string &path, FileOpener *opener) {
185+
vector<OpenFileInfo> MemoryFileSystem::Glob(const std::string &path, FileOpener *opener) {
186186
// For now, just do exact matches
187187
auto file_paths_iter = file_paths.find(path);
188188
if (file_paths_iter == file_paths.end()) return {};

lib/src/io/web_filesystem.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,9 +1014,9 @@ void WebFileSystem::FileSync(duckdb::FileHandle &handle) {
10141014
}
10151015

10161016
/// Runs a glob on the file system, returning a list of matching files
1017-
vector<std::string> WebFileSystem::Glob(const std::string &path, FileOpener *opener) {
1017+
vector<OpenFileInfo> WebFileSystem::Glob(const std::string &path, FileOpener *opener) {
10181018
std::unique_lock<LightMutex> fs_guard{fs_mutex_};
1019-
std::vector<std::string> results;
1019+
std::vector<string> results;
10201020
if (!FileSystem::IsRemoteFile(path)) {
10211021
auto glob = glob_to_regex(path);
10221022
for (auto [name, file] : files_by_name_) {
@@ -1033,7 +1033,11 @@ vector<std::string> WebFileSystem::Glob(const std::string &path, FileOpener *ope
10331033
}
10341034
std::sort(results.begin(), results.end());
10351035
results.erase(std::unique(results.begin(), results.end()), results.end());
1036-
return std::move(results);
1036+
std::vector<OpenFileInfo> res;
1037+
for (auto &r : results) {
1038+
res.push_back(r);
1039+
}
1040+
return std::move(res);
10371041
}
10381042

10391043
/// Set the file pointer of a file handle to a specified location. Reads and writes will happen from this location

lib/src/json_parser.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,7 @@ arrow::Result<std::shared_ptr<arrow::Array>> ArrayFromJSON(const std::shared_ptr
898898
std::string_view json) {
899899
rapidjson::Document json_doc;
900900
try {
901-
json_doc.Parse<rapidjson::kParseNanAndInfFlag>(json.begin(), json.size());
901+
json_doc.Parse<rapidjson::kParseNanAndInfFlag>(json.data(), json.size());
902902
} catch (...) {
903903
return arrow::Status::Invalid("invalid json document: ", json);
904904
}

0 commit comments

Comments
 (0)