From 738d67632a421b7f068a8995cf499a6d4e38e439 Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Tue, 9 Sep 2025 16:03:39 +0400 Subject: [PATCH 1/5] bundle regexp to the libsql-ffi --- libsql-ffi/Cargo.toml | 2 ++ libsql-ffi/build.rs | 5 +++++ libsql-ffi/bundled/bindings/bindgen.rs | 20 +++++--------------- libsql-sys/Cargo.toml | 1 + 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/libsql-ffi/Cargo.toml b/libsql-ffi/Cargo.toml index f769cacf1c..ad78acafe1 100644 --- a/libsql-ffi/Cargo.toml +++ b/libsql-ffi/Cargo.toml @@ -40,6 +40,7 @@ sqlean-extension-fuzzy = [] sqlean-extension-math = [] sqlean-extension-stats = [] sqlean-extension-text = [] +sqlean-extension-regexp = [] sqlean-extensions = [ "sqlean-extension-uuid", "sqlean-extension-crypto", @@ -47,6 +48,7 @@ sqlean-extensions = [ "sqlean-extension-math", "sqlean-extension-stats", "sqlean-extension-text", + "sqlean-extension-regexp", ] libsql-disable-checkpoint-downgrade = [] libsql-checkpoint-only-full= [] diff --git a/libsql-ffi/build.rs b/libsql-ffi/build.rs index a5aab595c4..28ef1df552 100644 --- a/libsql-ffi/build.rs +++ b/libsql-ffi/build.rs @@ -252,6 +252,11 @@ pub fn build_bundled(out_dir: &str, out_path: &Path) { sqlean_patterns.push("uuid/*.c"); } + if cfg!(feature = "sqlean-extension-regexp") { + enabled_extensions.push("regexp"); + sqlean_patterns.push("regexp/*.c"); + } + if sqlean_patterns.is_empty() { cfg.file(format!("{BUNDLED_DIR}/src/sqlite3.c")); } else { diff --git a/libsql-ffi/bundled/bindings/bindgen.rs b/libsql-ffi/bundled/bindings/bindgen.rs index 343361ba38..cf25a88564 100644 --- a/libsql-ffi/bundled/bindings/bindgen.rs +++ b/libsql-ffi/bundled/bindings/bindgen.rs @@ -23,7 +23,6 @@ extern "C" { ) -> ::std::os::raw::c_int; } -pub const __GNUC_VA_LIST: i32 = 1; pub const SQLITE_VERSION: &[u8; 7] = b"3.45.1\0"; pub const SQLITE_VERSION_NUMBER: i32 = 3045001; pub const SQLITE_SOURCE_ID: &[u8; 85] = @@ -502,8 +501,8 @@ pub const FTS5_TOKENIZE_DOCUMENT: i32 = 4; pub const FTS5_TOKENIZE_AUX: i32 = 8; pub const FTS5_TOKEN_COLOCATED: i32 = 1; pub const WAL_SAVEPOINT_NDATA: i32 = 4; -pub type va_list = __builtin_va_list; -pub type __gnuc_va_list = __builtin_va_list; +pub type __gnuc_va_list = [u64; 4usize]; +pub type va_list = [u64; 4usize]; extern "C" { pub static sqlite3_version: [::std::os::raw::c_char; 0usize]; } @@ -940,7 +939,7 @@ extern "C" { extern "C" { pub fn sqlite3_vmprintf( arg1: *const ::std::os::raw::c_char, - arg2: *mut __va_list_tag, + arg2: va_list, ) -> *mut ::std::os::raw::c_char; } extern "C" { @@ -956,7 +955,7 @@ extern "C" { arg1: ::std::os::raw::c_int, arg2: *mut ::std::os::raw::c_char, arg3: *const ::std::os::raw::c_char, - arg4: *mut __va_list_tag, + arg4: va_list, ) -> *mut ::std::os::raw::c_char; } extern "C" { @@ -2506,7 +2505,7 @@ extern "C" { pub fn sqlite3_str_vappendf( arg1: *mut sqlite3_str, zFormat: *const ::std::os::raw::c_char, - arg2: *mut __va_list_tag, + arg2: va_list, ); } extern "C" { @@ -3574,12 +3573,3 @@ extern "C" { extern "C" { pub static sqlite3_wal_manager: libsql_wal_manager; } -pub type __builtin_va_list = [__va_list_tag; 1usize]; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __va_list_tag { - pub gp_offset: ::std::os::raw::c_uint, - pub fp_offset: ::std::os::raw::c_uint, - pub overflow_arg_area: *mut ::std::os::raw::c_void, - pub reg_save_area: *mut ::std::os::raw::c_void, -} diff --git a/libsql-sys/Cargo.toml b/libsql-sys/Cargo.toml index 69839292d2..24d2e1465b 100644 --- a/libsql-sys/Cargo.toml +++ b/libsql-sys/Cargo.toml @@ -31,4 +31,5 @@ sqlean-extension-fuzzy = ["libsql-ffi/sqlean-extension-fuzzy"] sqlean-extension-math = ["libsql-ffi/sqlean-extension-math"] sqlean-extension-stats = ["libsql-ffi/sqlean-extension-stats"] sqlean-extension-text = ["libsql-ffi/sqlean-extension-text"] +sqlean-extension-regexp = ["libsql-ffi/sqlean-extension-regexp"] sqlean-extensions = ["libsql-ffi/sqlean-extensions"] From 03f8c22dc0e0342e0e99d1149d9e6e327935ea4d Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Tue, 9 Sep 2025 16:25:05 +0400 Subject: [PATCH 2/5] include constants.h for regexp build --- libsql-ffi/build.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libsql-ffi/build.rs b/libsql-ffi/build.rs index 28ef1df552..0a5b747380 100644 --- a/libsql-ffi/build.rs +++ b/libsql-ffi/build.rs @@ -268,6 +268,11 @@ pub fn build_bundled(out_dir: &str, out_path: &Path) { sqlean_sources.extend(glob(&full_pattern).unwrap().filter_map(Result::ok)); } + if cfg!(feature = "sqlean-extension-regexp") { + cfg.flag("-include") + .flag(format!("{BUNDLED_DIR}/sqlean/regexp/constants.h")); + } + cfg.files(sqlean_sources); let sqlean = Path::new(&env::var("OUT_DIR").unwrap()).join("sqlite3-sqlean-generated.c"); From f37d0b0984f1da5ae4d95d4b30fe6975935fd1a9 Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Tue, 9 Sep 2025 16:27:51 +0400 Subject: [PATCH 3/5] add pcre2 sources --- libsql-ffi/build.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libsql-ffi/build.rs b/libsql-ffi/build.rs index 0a5b747380..102d46917c 100644 --- a/libsql-ffi/build.rs +++ b/libsql-ffi/build.rs @@ -255,6 +255,8 @@ pub fn build_bundled(out_dir: &str, out_path: &Path) { if cfg!(feature = "sqlean-extension-regexp") { enabled_extensions.push("regexp"); sqlean_patterns.push("regexp/*.c"); + sqlean_patterns.push("regexp/pcre2/*.c"); + sqlean_patterns.push("regexp/pcre2/*.h"); } if sqlean_patterns.is_empty() { From a35fd1a7da2496993d9977d2279864df640b9fc9 Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Tue, 9 Sep 2025 16:35:14 +0400 Subject: [PATCH 4/5] add pcre2 header --- libsql-ffi/build.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libsql-ffi/build.rs b/libsql-ffi/build.rs index 102d46917c..b4b5036fbc 100644 --- a/libsql-ffi/build.rs +++ b/libsql-ffi/build.rs @@ -255,8 +255,8 @@ pub fn build_bundled(out_dir: &str, out_path: &Path) { if cfg!(feature = "sqlean-extension-regexp") { enabled_extensions.push("regexp"); sqlean_patterns.push("regexp/*.c"); + sqlean_patterns.push("regexp/pcre2/pcre2_internal.h"); sqlean_patterns.push("regexp/pcre2/*.c"); - sqlean_patterns.push("regexp/pcre2/*.h"); } if sqlean_patterns.is_empty() { @@ -271,6 +271,7 @@ pub fn build_bundled(out_dir: &str, out_path: &Path) { } if cfg!(feature = "sqlean-extension-regexp") { + // PCRE2 needs some macroses defined externally in constants.h file cfg.flag("-include") .flag(format!("{BUNDLED_DIR}/sqlean/regexp/constants.h")); } From b16577ae7eceafe577be9b8b41af4099274ad831 Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Tue, 9 Sep 2025 16:44:49 +0400 Subject: [PATCH 5/5] rollback unnecessary changes --- libsql-ffi/bundled/bindings/bindgen.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/libsql-ffi/bundled/bindings/bindgen.rs b/libsql-ffi/bundled/bindings/bindgen.rs index cf25a88564..343361ba38 100644 --- a/libsql-ffi/bundled/bindings/bindgen.rs +++ b/libsql-ffi/bundled/bindings/bindgen.rs @@ -23,6 +23,7 @@ extern "C" { ) -> ::std::os::raw::c_int; } +pub const __GNUC_VA_LIST: i32 = 1; pub const SQLITE_VERSION: &[u8; 7] = b"3.45.1\0"; pub const SQLITE_VERSION_NUMBER: i32 = 3045001; pub const SQLITE_SOURCE_ID: &[u8; 85] = @@ -501,8 +502,8 @@ pub const FTS5_TOKENIZE_DOCUMENT: i32 = 4; pub const FTS5_TOKENIZE_AUX: i32 = 8; pub const FTS5_TOKEN_COLOCATED: i32 = 1; pub const WAL_SAVEPOINT_NDATA: i32 = 4; -pub type __gnuc_va_list = [u64; 4usize]; -pub type va_list = [u64; 4usize]; +pub type va_list = __builtin_va_list; +pub type __gnuc_va_list = __builtin_va_list; extern "C" { pub static sqlite3_version: [::std::os::raw::c_char; 0usize]; } @@ -939,7 +940,7 @@ extern "C" { extern "C" { pub fn sqlite3_vmprintf( arg1: *const ::std::os::raw::c_char, - arg2: va_list, + arg2: *mut __va_list_tag, ) -> *mut ::std::os::raw::c_char; } extern "C" { @@ -955,7 +956,7 @@ extern "C" { arg1: ::std::os::raw::c_int, arg2: *mut ::std::os::raw::c_char, arg3: *const ::std::os::raw::c_char, - arg4: va_list, + arg4: *mut __va_list_tag, ) -> *mut ::std::os::raw::c_char; } extern "C" { @@ -2505,7 +2506,7 @@ extern "C" { pub fn sqlite3_str_vappendf( arg1: *mut sqlite3_str, zFormat: *const ::std::os::raw::c_char, - arg2: va_list, + arg2: *mut __va_list_tag, ); } extern "C" { @@ -3573,3 +3574,12 @@ extern "C" { extern "C" { pub static sqlite3_wal_manager: libsql_wal_manager; } +pub type __builtin_va_list = [__va_list_tag; 1usize]; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct __va_list_tag { + pub gp_offset: ::std::os::raw::c_uint, + pub fp_offset: ::std::os::raw::c_uint, + pub overflow_arg_area: *mut ::std::os::raw::c_void, + pub reg_save_area: *mut ::std::os::raw::c_void, +}