@@ -3,19 +3,34 @@ extern crate alloc;
33use alloc:: string:: { String , ToString } ;
44use core:: ffi:: c_int;
55
6+ use crate :: constants:: SUBTYPE_JSON ;
7+ use crate :: create_sqlite_text_fn;
8+ use crate :: error:: PowerSyncError ;
69use sqlite:: ResultCode ;
710use sqlite_nostd as sqlite;
11+ use sqlite_nostd:: bindings:: { SQLITE_RESULT_SUBTYPE , SQLITE_SUBTYPE } ;
812use sqlite_nostd:: { Connection , Context , Value } ;
913
10- use crate :: create_sqlite_text_fn;
11- use crate :: error:: PowerSyncError ;
14+ extern "C" fn powersync_strip_subtype (
15+ ctx : * mut sqlite:: context ,
16+ argc : c_int ,
17+ argv : * mut * mut sqlite:: value ,
18+ ) {
19+ if argc != 1 {
20+ return ;
21+ }
22+
23+ let arg = unsafe { * argv } ;
24+ ctx. result_value ( arg) ;
25+ ctx. result_subtype ( 0 ) ;
26+ }
1227
1328/// Given any number of JSON TEXT arguments, merge them into a single JSON object.
1429///
1530/// This assumes each argument is a valid JSON object, with no duplicate keys.
1631/// No JSON parsing or validation is performed - this performs simple string concatenation.
1732fn powersync_json_merge_impl (
18- _ctx : * mut sqlite:: context ,
33+ ctx : * mut sqlite:: context ,
1934 args : & [ * mut sqlite:: value ] ,
2035) -> Result < String , PowerSyncError > {
2136 if args. is_empty ( ) {
@@ -42,6 +57,7 @@ fn powersync_json_merge_impl(
4257
4358 // Close the outer brace
4459 result. push ( '}' ) ;
60+ ctx. result_subtype ( SUBTYPE_JSON ) ;
4561 Ok ( result)
4662}
4763
@@ -55,13 +71,24 @@ pub fn register(db: *mut sqlite::sqlite3) -> Result<(), ResultCode> {
5571 db. create_function_v2 (
5672 "powersync_json_merge" ,
5773 -1 ,
58- sqlite:: UTF8 | sqlite:: DETERMINISTIC ,
74+ sqlite:: UTF8 | sqlite:: DETERMINISTIC | SQLITE_RESULT_SUBTYPE ,
5975 None ,
6076 Some ( powersync_json_merge) ,
6177 None ,
6278 None ,
6379 None ,
6480 ) ?;
6581
82+ db. create_function_v2 (
83+ "powersync_strip_subtype" ,
84+ -1 ,
85+ sqlite:: UTF8 | sqlite:: DETERMINISTIC | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE ,
86+ None ,
87+ Some ( powersync_strip_subtype) ,
88+ None ,
89+ None ,
90+ None ,
91+ ) ?;
92+
6693 Ok ( ( ) )
6794}
0 commit comments