@@ -938,11 +938,23 @@ int dbsync_register_pure_function (sqlite3 *db, const char *name, void (*xfunc)(
938938 return dbsync_register_with_flags (db , name , xfunc , NULL , NULL , nargs , FLAGS_PURE , pzErrMsg , ctx , ctx_free );
939939}
940940
941+ int dbsync_register_trigger_function (sqlite3 * db , const char * name , void (* xfunc )(sqlite3_context * ,int ,sqlite3_value * * ), int nargs , char * * pzErrMsg , void * ctx , void (* ctx_free )(void * )) {
942+ const int FLAGS_TRIGGER = SQLITE_UTF8 | SQLITE_INNOCUOUS ;
943+ DEBUG_DBFUNCTION ("dbsync_register_trigger_function %s" , name );
944+ return dbsync_register_with_flags (db , name , xfunc , NULL , NULL , nargs , FLAGS_TRIGGER , pzErrMsg , ctx , ctx_free );
945+ }
946+
941947int dbsync_register_aggregate (sqlite3 * db , const char * name , void (* xstep )(sqlite3_context * ,int ,sqlite3_value * * ), void (* xfinal )(sqlite3_context * ), int nargs , char * * pzErrMsg , void * ctx , void (* ctx_free )(void * )) {
942948 DEBUG_DBFUNCTION ("dbsync_register_aggregate %s" , name );
943949 return dbsync_register (db , name , NULL , xstep , xfinal , nargs , pzErrMsg , ctx , ctx_free );
944950}
945951
952+ int dbsync_register_trigger_aggregate (sqlite3 * db , const char * name , void (* xstep )(sqlite3_context * ,int ,sqlite3_value * * ), void (* xfinal )(sqlite3_context * ), int nargs , char * * pzErrMsg , void * ctx , void (* ctx_free )(void * )) {
953+ const int FLAGS_TRIGGER = SQLITE_UTF8 | SQLITE_INNOCUOUS ;
954+ DEBUG_DBFUNCTION ("dbsync_register_trigger_aggregate %s" , name );
955+ return dbsync_register_with_flags (db , name , NULL , xstep , xfinal , nargs , FLAGS_TRIGGER , pzErrMsg , ctx , ctx_free );
956+ }
957+
946958// MARK: - Row Filter -
947959
948960void dbsync_set_filter (sqlite3_context * context , int argc , sqlite3_value * * argv ) {
@@ -1117,17 +1129,17 @@ int dbsync_register_functions (sqlite3 *db, char **pzErrMsg) {
11171129 if (rc != SQLITE_OK ) return rc ;
11181130 #endif
11191131
1120- // PRIVATE functions
1121- rc = dbsync_register_function (db , "cloudsync_is_sync" , dbsync_is_sync , 1 , pzErrMsg , ctx , NULL );
1132+ // PRIVATE functions (used inside triggers — require SQLITE_INNOCUOUS)
1133+ rc = dbsync_register_trigger_function (db , "cloudsync_is_sync" , dbsync_is_sync , 1 , pzErrMsg , ctx , NULL );
11221134 if (rc != SQLITE_OK ) return rc ;
1123-
1124- rc = dbsync_register_function (db , "cloudsync_insert" , dbsync_insert , -1 , pzErrMsg , ctx , NULL );
1135+
1136+ rc = dbsync_register_trigger_function (db , "cloudsync_insert" , dbsync_insert , -1 , pzErrMsg , ctx , NULL );
11251137 if (rc != SQLITE_OK ) return rc ;
1126-
1127- rc = dbsync_register_aggregate (db , "cloudsync_update" , dbsync_update_step , dbsync_update_final , 3 , pzErrMsg , ctx , NULL );
1138+
1139+ rc = dbsync_register_trigger_aggregate (db , "cloudsync_update" , dbsync_update_step , dbsync_update_final , 3 , pzErrMsg , ctx , NULL );
11281140 if (rc != SQLITE_OK ) return rc ;
1129-
1130- rc = dbsync_register_function (db , "cloudsync_delete" , dbsync_delete , -1 , pzErrMsg , ctx , NULL );
1141+
1142+ rc = dbsync_register_trigger_function (db , "cloudsync_delete" , dbsync_delete , -1 , pzErrMsg , ctx , NULL );
11311143 if (rc != SQLITE_OK ) return rc ;
11321144
11331145 rc = dbsync_register_function (db , "cloudsync_col_value" , dbsync_col_value , 3 , pzErrMsg , ctx , NULL );
0 commit comments