@@ -3,7 +3,7 @@ namespace PowerSync.Common.Tests.Client;
33using System . Diagnostics ;
44
55using Microsoft . Data . Sqlite ;
6-
6+ using Newtonsoft . Json ;
77using PowerSync . Common . Client ;
88using PowerSync . Common . DB . Schema ;
99
@@ -700,6 +700,7 @@ public async Task WatchSchemaResetTest()
700700 {
701701 Name = "assets_local" ,
702702 ViewName = "assets" ,
703+ LocalOnly = true ,
703704 Columns =
704705 {
705706 [ "make" ] = ColumnType . Text ,
@@ -711,6 +712,7 @@ public async Task WatchSchemaResetTest()
711712 {
712713 Name = "assets_synced" ,
713714 ViewName = "assets_synced_inactive" ,
715+ LocalOnly = false ,
714716 Columns =
715717 {
716718 [ "make" ] = ColumnType . Text ,
@@ -724,6 +726,7 @@ public async Task WatchSchemaResetTest()
724726 {
725727 Name = "assets_local" ,
726728 ViewName = "assets_local_inactive" ,
729+ LocalOnly = true ,
727730 Columns =
728731 {
729732 [ "make" ] = ColumnType . Text ,
@@ -734,6 +737,7 @@ public async Task WatchSchemaResetTest()
734737 {
735738 Name = "assets_synced" ,
736739 ViewName = "assets" ,
740+ LocalOnly = false ,
737741 Columns =
738742 {
739743 [ "make" ] = ColumnType . Text ,
@@ -755,7 +759,8 @@ public async Task WatchSchemaResetTest()
755759 var sem = new SemaphoreSlim ( 0 ) ;
756760 long lastCount = - 1 ;
757761
758- var query = await db . Watch ( "SELECT COUNT(*) AS count FROM assets" , [ ] , new WatchHandler < CountResult >
762+ string querySql = "SELECT COUNT(*) AS count FROM assets" ;
763+ var query = await db . Watch ( querySql , [ ] , new WatchHandler < CountResult >
759764 {
760765 OnResult = ( result ) =>
761766 {
@@ -767,6 +772,10 @@ public async Task WatchSchemaResetTest()
767772 Assert . True ( await sem . WaitAsync ( 100 ) ) ;
768773 Assert . Equal ( 0 , lastCount ) ;
769774
775+ var initialResolved = await GetSourceTables ( db , querySql ) ;
776+ Assert . Contains ( "ps_data_local__assets_local" , initialResolved ) ;
777+ Assert . DoesNotContain ( "ps_data__assets_synced" , initialResolved ) ;
778+
770779 for ( int i = 0 ; i < 3 ; i ++ )
771780 {
772781 await db . Execute (
@@ -779,6 +788,11 @@ await db.Execute(
779788 Assert . Equal ( 3 , lastCount ) ;
780789
781790 await db . UpdateSchema ( updatedSchema ) ;
791+
792+ var updatedResolved = await GetSourceTables ( db , querySql ) ;
793+ Assert . Contains ( "ps_data__assets_synced" , updatedResolved ) ;
794+ Assert . DoesNotContain ( "ps_data_local__assets_local" , updatedResolved ) ;
795+
782796 Assert . True ( await sem . WaitAsync ( 100 ) ) ;
783797 Assert . Equal ( 0 , lastCount ) ;
784798
@@ -792,4 +806,34 @@ await db.Execute(
792806 Assert . False ( await sem . WaitAsync ( 100 ) ) ;
793807 Assert . Equal ( 3 , lastCount ) ;
794808 }
809+
810+ private class ExplainedResult
811+ {
812+ public int addr = 0 ;
813+ public string opcode = "" ;
814+ public int p1 = 0 ;
815+ public int p2 = 0 ;
816+ public int p3 = 0 ;
817+ public string p4 = "" ;
818+ public int p5 = 0 ;
819+ }
820+ private record TableSelectResult ( string tbl_name ) ;
821+ private async Task < List < string > > GetSourceTables ( PowerSyncDatabase db , string sql , object ? [ ] ? parameters = null )
822+ {
823+ var explained = await db . GetAll < ExplainedResult > (
824+ $ "EXPLAIN { sql } ", parameters
825+ ) ;
826+
827+ var rootPages = explained
828+ . Where ( row => row . opcode == "OpenRead" && row . p3 == 0 )
829+ . Select ( row => row . p2 )
830+ . ToList ( ) ;
831+
832+ var tables = await db . GetAll < TableSelectResult > (
833+ "SELECT DISTINCT tbl_name FROM sqlite_master WHERE rootpage IN (SELECT json_each.value FROM json_each(?))" ,
834+ [ JsonConvert . SerializeObject ( rootPages ) ]
835+ ) ;
836+
837+ return tables . Select ( row => row . tbl_name ) . ToList ( ) ;
838+ }
795839}
0 commit comments