@@ -48,6 +48,7 @@ interface FakeServiceHarness {
4848 readonly completeSignals : AbortSignal [ ] ;
4949 readonly emit : ( event : SqlSessionChangeEvent ) => void ;
5050 readonly getLastToken : ( ) => SqlCompletionRefreshToken | null ;
51+ readonly invalidations : ( ) => number ;
5152 readonly service : SqlLanguageService < TestContext > ;
5253 readonly sessionDisposals : ( ) => number ;
5354 readonly statementBoundaryCalls : ( ) => number ;
@@ -138,6 +139,7 @@ function fakeService(
138139 | ( ( event : SqlSessionChangeEvent ) => void )
139140 | null = null ;
140141 let lastToken : SqlCompletionRefreshToken | null = null ;
142+ let invalidationCount = 0 ;
141143 let sessionDisposalCount = 0 ;
142144 let statementBoundaryCallCount = 0 ;
143145 let statementIntersectionCallCount = 0 ;
@@ -162,6 +164,7 @@ function fakeService(
162164 sessionDisposalCount += 1 ;
163165 } ,
164166 invalidateCatalog : ( ) => {
167+ invalidationCount += 1 ;
165168 revision = createSqlRevisionToken ( ) ;
166169 return revision ;
167170 } ,
@@ -243,6 +246,7 @@ function fakeService(
243246 completeSignals,
244247 emit : ( event ) => listener ?.( event ) ,
245248 getLastToken : ( ) => lastToken ,
249+ invalidations : ( ) => invalidationCount ,
246250 service,
247251 sessionDisposals : ( ) => sessionDisposalCount ,
248252 statementBoundaryCalls : ( ) => statementBoundaryCallCount ,
@@ -360,7 +364,7 @@ async function resolveCompletionInfo(
360364}
361365
362366describe ( "sqlEditor" , ( ) => {
363- it ( "exposes current statement boundaries only for owned views" , ( ) => {
367+ it ( "exposes session controls only for owned views" , ( ) => {
364368 const service = createSqlLanguageService < TestContext > ( {
365369 dialects : [ duckdbDialect ( ) ] ,
366370 } ) ;
@@ -383,6 +387,8 @@ describe("sqlEditor", () => {
383387 from : 0 ,
384388 to : view . state . doc . length ,
385389 } ) ?. boundaries ) . toHaveLength ( 2 ) ;
390+ expect ( support . invalidateCatalog ( view ) ) . not . toBeNull ( ) ;
391+ expect ( support . invalidateCatalog ( foreign ) ) . toBeNull ( ) ;
386392 expect ( support . statementBoundaryAt ( foreign , {
387393 affinity : "left" ,
388394 position : 0 ,
@@ -397,6 +403,7 @@ describe("sqlEditor", () => {
397403 } ) ) . toBeNull ( ) ;
398404
399405 view . destroy ( ) ;
406+ expect ( support . invalidateCatalog ( view ) ) . toBeNull ( ) ;
400407 expect ( support . statementBoundaryAt ( view , {
401408 affinity : "left" ,
402409 position : 0 ,
@@ -408,6 +415,24 @@ describe("sqlEditor", () => {
408415 service . dispose ( ) ;
409416 } ) ;
410417
418+ it ( "proxies catalog invalidation only to its owned live session" , ( ) => {
419+ const harness = fakeService ( ( revision ) => readyResult ( revision , [ ] ) ) ;
420+ const support = sqlEditor ( {
421+ initialContext : context ( ) ,
422+ service : harness . service ,
423+ } ) ;
424+ const view = createView ( support . extension ) ;
425+ const foreign = createView ( [ ] ) ;
426+
427+ expect ( support . invalidateCatalog ( view ) ) . not . toBeNull ( ) ;
428+ expect ( harness . invalidations ( ) ) . toBe ( 1 ) ;
429+ expect ( support . invalidateCatalog ( foreign ) ) . toBeNull ( ) ;
430+ expect ( harness . invalidations ( ) ) . toBe ( 1 ) ;
431+ view . destroy ( ) ;
432+ expect ( support . invalidateCatalog ( view ) ) . toBeNull ( ) ;
433+ expect ( harness . invalidations ( ) ) . toBe ( 1 ) ;
434+ } ) ;
435+
411436 it ( "renders an opt-in visible-line statement gutter" , async ( ) => {
412437 const service = createSqlLanguageService < TestContext > ( {
413438 dialects : [ duckdbDialect ( ) ] ,
0 commit comments