Skip to content

Commit

Permalink
subtract 1 from on conflict clauses that set the seq
Browse files Browse the repository at this point in the history
The `select` portion is _always_ run.

The `on conflict` clause might be run. Since the select is always run (conditional on the where clause matching) then the seq is already incremented. The conflict clause needs to get the previous seq number rather than current.
  • Loading branch information
tantaman committed Jun 18, 2023
1 parent 018ebc8 commit a08bb74
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 7 deletions.
10 changes: 5 additions & 5 deletions core/src/triggers.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ char *crsql_insertTriggerQuery(crsql_TableInfo *tableInfo, char *pkList,
WHERE crsql_internal_sync_bit() = 0 ON CONFLICT DO UPDATE SET\
__crsql_col_version = __crsql_col_version + 1,\
__crsql_db_version = crsql_nextdbversion(),\
__crsql_seq = crsql_get_seq(),\
__crsql_seq = crsql_get_seq() - 1,\
__crsql_site_id = NULL;\n",
tableInfo->tblName, pkList, pkNewList, PKS_ONLY_CID_SENTINEL);
}
Expand All @@ -92,7 +92,7 @@ char *crsql_insertTriggerQuery(crsql_TableInfo *tableInfo, char *pkList,
WHERE crsql_internal_sync_bit() = 0 ON CONFLICT DO UPDATE SET\
__crsql_col_version = __crsql_col_version + 1,\
__crsql_db_version = crsql_nextdbversion(),\
__crsql_seq = crsql_get_seq(),\
__crsql_seq = crsql_get_seq() - 1,\
__crsql_site_id = NULL;\n",
tableInfo->tblName, pkList, pkNewList, tableInfo->nonPks[i].name);
}
Expand Down Expand Up @@ -160,7 +160,7 @@ int crsql_createUpdateTrigger(sqlite3 *db, crsql_TableInfo *tableInfo,
WHERE crsql_internal_sync_bit() = 0 ON CONFLICT DO UPDATE SET\
__crsql_col_version = __crsql_col_version + 1,\
__crsql_db_version = crsql_nextdbversion(),\
__crsql_seq = crsql_get_seq(),\
__crsql_seq = crsql_get_seq() - 1,\
__crsql_site_id = NULL;\n",
tableInfo->tblName, pkList, pkNewList, PKS_ONLY_CID_SENTINEL);
}
Expand All @@ -176,7 +176,7 @@ int crsql_createUpdateTrigger(sqlite3 *db, crsql_TableInfo *tableInfo,
__crsql_db_version,\
__crsql_seq,\
__crsql_site_id\
) SELECT %s, %Q, 1, crsql_nextdbversion(), crsql_increment_and_get_seq() - 1, NULL WHERE crsql_internal_sync_bit() = 0 AND NEW.\"%w\" IS NOT OLD.\"%w\"\
) SELECT %s, %Q, 1, crsql_nextdbversion(), crsql_increment_and_get_seq(), NULL WHERE crsql_internal_sync_bit() = 0 AND NEW.\"%w\" IS NOT OLD.\"%w\"\
ON CONFLICT DO UPDATE SET\
__crsql_col_version = __crsql_col_version + 1,\
__crsql_db_version = crsql_nextdbversion(),\
Expand Down Expand Up @@ -251,7 +251,7 @@ char *crsql_deleteTriggerQuery(crsql_TableInfo *tableInfo) {
WHERE crsql_internal_sync_bit() = 0 ON CONFLICT DO UPDATE SET\
__crsql_col_version = __crsql_col_version + 1,\
__crsql_db_version = crsql_nextdbversion(),\
__crsql_seq = crsql_get_seq(),\
__crsql_seq = crsql_get_seq() - 1,\
__crsql_site_id = NULL;\
\
DELETE FROM \"%w__crsql_clock\" WHERE crsql_internal_sync_bit() = 0 AND %s AND __crsql_col_name != '__crsql_del';\
Expand Down
4 changes: 2 additions & 2 deletions core/src/triggers.test.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ static void testDeleteTriggerQuery() {
"NULL WHERE crsql_internal_sync_bit() = 0 ON CONFLICT DO UPDATE "
"SET __crsql_col_version = __crsql_col_version + 1, "
"__crsql_db_version = crsql_nextdbversion(), __crsql_seq = "
"crsql_get_seq(), __crsql_site_id = NULL; "
"crsql_get_seq() - 1, __crsql_site_id = NULL; "
" DELETE FROM \"foo__crsql_clock\" WHERE crsql_internal_sync_bit() "
"= 0 AND \"a\" = OLD.\"a\" AND __crsql_col_name != '__crsql_del'; "
" END; ",
Expand Down Expand Up @@ -117,7 +117,7 @@ static void testInsertTriggerQuery() {
"NULL WHERE crsql_internal_sync_bit() = 0 ON CONFLICT DO UPDATE SET "
" __crsql_col_version = __crsql_col_version + 1, "
"__crsql_db_version = crsql_nextdbversion(), __crsql_seq = "
"crsql_get_seq(), __crsql_site_id = "
"crsql_get_seq() - 1, __crsql_site_id = "
"NULL;\n";

assert(strcmp(expected, query) == 0);
Expand Down

0 comments on commit a08bb74

Please sign in to comment.