Skip to content

Commit

Permalink
add tie-breaker test
Browse files Browse the repository at this point in the history
  • Loading branch information
jeromegn committed Dec 21, 2023
1 parent 2818492 commit 4241005
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 20 deletions.
2 changes: 1 addition & 1 deletion core/rs/core/src/c.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ pub struct crsql_ExtData {
pub pSetSiteIdOrdinalStmt: *mut sqlite::stmt,
pub pSelectSiteIdOrdinalStmt: *mut sqlite::stmt,
pub pSelectClockTablesStmt: *mut sqlite::stmt,
pub tieBreakSameColValue: bool,
pub tieBreakSameColValue: ::core::ffi::c_int,
}

#[repr(C)]
Expand Down
2 changes: 1 addition & 1 deletion core/rs/core/src/changes_vtab_write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ fn did_cid_win(
let local_value = col_val_stmt.column_value(0)?;
let mut ret = crsql_compare_sqlite_values(insert_val, local_value);
reset_cached_stmt(col_val_stmt.stmt)?;
if ret == 0 && unsafe { (*ext_data).tieBreakSameColValue } {
if ret == 0 && unsafe { (*ext_data).tieBreakSameColValue == 1 } {
// values are the same (ret == 0) and the option to tie break on site_id is true
ret = unsafe {
let my_site_id = core::slice::from_raw_parts((*ext_data).siteId, 16);
Expand Down
4 changes: 2 additions & 2 deletions core/rs/core/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ pub extern "C" fn crsql_config_set(
let name = args[0].text();

match name {
"always-declare-winner" => {
let value = args[1].int() == 1;
"merge-equal-values" => {
let value = args[1].int();
let ext_data = ctx.user_data() as *mut crsql_ExtData;
unsafe { (*ext_data).tieBreakSameColValue = value };
}
Expand Down
32 changes: 16 additions & 16 deletions core/rs/core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,22 +155,6 @@ pub extern "C" fn sqlite3_crsqlcore_init(
return null_mut();
}

let rc = db
.create_function_v2(
"crsql_config_set",
2,
sqlite::UTF8,
None,
Some(crsql_config_set),
None,
None,
None,
)
.unwrap_or(sqlite::ResultCode::ERROR);
if rc != ResultCode::OK {
return null_mut();
}

let rc = unpack_columns_vtab::create_module(db).unwrap_or(sqlite::ResultCode::ERROR);
if rc != ResultCode::OK {
return null_mut();
Expand Down Expand Up @@ -454,6 +438,22 @@ pub extern "C" fn sqlite3_crsqlcore_init(
return null_mut();
}

let rc = db
.create_function_v2(
"crsql_config_set",
2,
sqlite::UTF8,
Some(ext_data as *mut c_void),
Some(crsql_config_set),
None,
None,
None,
)
.unwrap_or(sqlite::ResultCode::ERROR);
if rc != ResultCode::OK {
return null_mut();
}

return ext_data as *mut c_void;
}

Expand Down
3 changes: 3 additions & 0 deletions py/correctness/src/crsql_correctness.egg-info/SOURCES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ src/crsql_correctness.egg-info/top_level.txt
tests/test_as_ordered.py
tests/test_cl_merging.py
tests/test_cl_triggers.py
tests/test_commit_alter_perf.py
tests/test_crsql_changes_filters.py
tests/test_dbversion.py
tests/test_insert_new_rows.py
tests/test_lookaside_key_creation.py
tests/test_prior_versions.py
tests/test_sandbox.py
tests/test_schema_modification.py
Expand All @@ -18,5 +20,6 @@ tests/test_seq.py
tests/test_site_id_lookaside.py
tests/test_siteid.py
tests/test_sync.py
tests/test_sync_bit.py
tests/test_sync_prop.py
tests/test_update_rows.py
42 changes: 42 additions & 0 deletions py/correctness/tests/test_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,48 @@ def make_dbs():
site_id = get_site_id(db2)
assert (changes == [('foo', b'\x01\t\x01', 'b', 2, 1, 1, site_id, 1, 0)])

def test_merge_same_w_tie_breaker():
def make_dbs():
db1 = create_basic_db()
db2 = create_basic_db()

db1.execute("INSERT INTO foo (a,b) VALUES (1,2);")
db1.execute("SELECT crsql_config_set('merge-equal-values', 1);")
db1.commit()

db2.execute("INSERT INTO foo (a,b) VALUES (1,2);")
db2.execute("SELECT crsql_config_set('merge-equal-values', 1);")
db2.commit()
return (db1, db2)

(db1, db2) = make_dbs()
sync_left_to_right(db1, db2, 0)
changes = db2.execute("SELECT * FROM crsql_changes").fetchall()

site_id1 = get_site_id(db1)
site_id2 = get_site_id(db2)

max_site_id = max(site_id1, site_id2)
version = 1;
if max_site_id != site_id1:
version = 2

assert (changes == [('foo', b'\x01\t\x01', 'b', 2, 1, version, max_site_id, 1, 0)])

(db1, db2) = make_dbs()
sync_left_to_right(db2, db1, 0)
changes = db2.execute("SELECT * FROM crsql_changes").fetchall()

site_id1 = get_site_id(db1)
site_id2 = get_site_id(db2)

max_site_id = max(site_id1, site_id2)
version = 1;
if max_site_id != site_id2:
version = 2

assert (changes == [('foo', b'\x01\t\x01', 'b', 2, 1, version, max_site_id, 1, 0)])


def test_merge_matching_clocks_lesser_value():
def make_dbs():
Expand Down

0 comments on commit 4241005

Please sign in to comment.