Skip to content

Commit b1ff8b8

Browse files
committed
Fix enabling metadata
1 parent 9f69679 commit b1ff8b8

File tree

2 files changed

+79
-2
lines changed

2 files changed

+79
-2
lines changed

crates/core/src/view_admin.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ fn setup_internal_views(db: *mut sqlite::sqlite3) -> Result<(), ResultCode> {
213213
AS SELECT
214214
view.name name,
215215
view.sql sql,
216-
ifnull(trigger1.sql, '') delete_trigger_sql,
216+
ifnull(group_concat(trigger1.sql, ';\n' ORDER BY trigger1.name DESC), '') delete_trigger_sql,
217217
ifnull(trigger2.sql, '') insert_trigger_sql,
218218
ifnull(trigger3.sql, '') update_trigger_sql
219219
FROM sqlite_master view
@@ -223,7 +223,8 @@ fn setup_internal_views(db: *mut sqlite::sqlite3) -> Result<(), ResultCode> {
223223
ON trigger2.tbl_name = view.name AND trigger2.type = 'trigger' AND trigger2.name GLOB 'ps_view_insert*'
224224
LEFT JOIN sqlite_master trigger3
225225
ON trigger3.tbl_name = view.name AND trigger3.type = 'trigger' AND trigger3.name GLOB 'ps_view_update*'
226-
WHERE view.type = 'view' AND view.sql GLOB '*-- powersync-auto-generated';
226+
WHERE view.type = 'view' AND view.sql GLOB '*-- powersync-auto-generated'
227+
GROUP BY view.name;
227228
228229
CREATE TRIGGER IF NOT EXISTS powersync_views_insert
229230
INSTEAD OF INSERT ON powersync_views

dart/test/schema_test.dart

+76
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,82 @@ void main() {
4444
expect(versionAfter3['schema_version'],
4545
greaterThan(versionAfter2['schema_version'] as int));
4646
});
47+
48+
group('metadata', () {
49+
// This is a special because we have two delete triggers when
50+
// include_metadata is true (one for actual `DELETE` statements and one
51+
// for `UPDATE ... SET _deleted = TRUE` that allows attaching metadata).
52+
Object createSchema(bool withMetadata) {
53+
return {
54+
"tables": [
55+
{
56+
"name": "customers",
57+
"view_name": null,
58+
"local_only": false,
59+
"insert_only": false,
60+
"include_metadata": withMetadata,
61+
"columns": [
62+
{"name": "name", "type": "TEXT"},
63+
{"name": "email", "type": "TEXT"}
64+
],
65+
"indexes": []
66+
},
67+
]
68+
};
69+
}
70+
71+
test('enabling', () {
72+
db.execute('SELECT powersync_replace_schema(?)',
73+
[json.encode(createSchema(false))]);
74+
expect(
75+
db.select("select * from sqlite_schema where type = 'trigger' "
76+
"AND tbl_name = 'customers' "
77+
"AND name GLOB 'ps_view_delete*'"),
78+
hasLength(1),
79+
);
80+
81+
db.execute('SELECT powersync_replace_schema(?)',
82+
[json.encode(createSchema(true))]);
83+
expect(
84+
db.select("select * from sqlite_schema where type = 'trigger' "
85+
"AND tbl_name = 'customers' "
86+
"AND name GLOB 'ps_view_delete*'"),
87+
hasLength(2),
88+
);
89+
});
90+
91+
test('unchanged', () {
92+
final schema = createSchema(true);
93+
db.execute('SELECT powersync_replace_schema(?)', [json.encode(schema)]);
94+
95+
final [versionBefore] = db.select('PRAGMA schema_version');
96+
db.execute('SELECT powersync_replace_schema(?)', [json.encode(schema)]);
97+
final [versionAfter] = db.select('PRAGMA schema_version');
98+
99+
expect(versionAfter['schema_version'],
100+
equals(versionBefore['schema_version']));
101+
});
102+
103+
test('disabling', () {
104+
db.execute('SELECT powersync_replace_schema(?)',
105+
[json.encode(createSchema(true))]);
106+
expect(
107+
db.select("select * from sqlite_schema where type = 'trigger' "
108+
"AND tbl_name = 'customers' "
109+
"AND name GLOB 'ps_view_delete*'"),
110+
hasLength(2),
111+
);
112+
113+
db.execute('SELECT powersync_replace_schema(?)',
114+
[json.encode(createSchema(false))]);
115+
expect(
116+
db.select("select * from sqlite_schema where type = 'trigger' "
117+
"AND tbl_name = 'customers' "
118+
"AND name GLOB 'ps_view_delete*'"),
119+
hasLength(1),
120+
);
121+
});
122+
});
47123
});
48124
}
49125

0 commit comments

Comments
 (0)