@@ -149,4 +149,112 @@ describe('TableName completion', () => {
149149 const TABLE_KIND = 21
150150 expect ( result . candidates . every ( ( c ) => c . kind === TABLE_KIND ) ) . toBe ( true )
151151 } )
152+
153+ test ( 'complete table name with database-qualified tables' , ( ) => {
154+ const schema = {
155+ tables : [
156+ {
157+ catalog : null ,
158+ database : 'squeal' ,
159+ tableName : 'actor' ,
160+ columns : [ { columnName : 'actor_id' , description : '' } ] ,
161+ } ,
162+ {
163+ catalog : null ,
164+ database : 'squeal' ,
165+ tableName : 'actor_info' ,
166+ columns : [ { columnName : 'actor_id' , description : '' } ] ,
167+ } ,
168+ {
169+ catalog : null ,
170+ database : 'squeal' ,
171+ tableName : 'film' ,
172+ columns : [ { columnName : 'film_id' , description : '' } ] ,
173+ } ,
174+ ] ,
175+ functions : [ ] ,
176+ }
177+
178+ // Test: typing 'a' after FROM should match 'actor' and 'actor_info'
179+ const result = complete ( 'SELECT * FROM a' , { line : 0 , column : 15 } , schema )
180+
181+ const labels = result . candidates . map ( ( c ) => c . label )
182+ expect ( labels ) . toContain ( 'actor' )
183+ expect ( labels ) . toContain ( 'actor_info' )
184+ expect ( labels ) . not . toContain ( 'film' )
185+ } )
186+
187+ test ( 'complete table name when SQL parses successfully' , ( ) => {
188+ // This tests Issue 1 - when the parser treats partial table name as valid
189+ const schema = {
190+ tables : [
191+ { catalog : null , database : null , tableName : 'actor' , columns : [ ] } ,
192+ { catalog : null , database : null , tableName : 'actor_info' , columns : [ ] } ,
193+ { catalog : null , database : null , tableName : 'film' , columns : [ ] } ,
194+ ] ,
195+ functions : [ ] ,
196+ }
197+
198+ const result = complete (
199+ 'SELECT * FROM act' ,
200+ { line : 0 , column : 17 } ,
201+ schema
202+ )
203+
204+ const labels = result . candidates . map ( ( c ) => c . label )
205+ expect ( labels ) . toContain ( 'actor' )
206+ expect ( labels ) . toContain ( 'actor_info' )
207+ expect ( labels ) . not . toContain ( 'film' )
208+ } )
209+
210+ test ( 'complete table name with partial input after typing more characters' , ( ) => {
211+ const schema = {
212+ tables : [
213+ {
214+ catalog : null ,
215+ database : 'squeal' ,
216+ tableName : 'actor' ,
217+ columns : [ ] ,
218+ } ,
219+ {
220+ catalog : null ,
221+ database : 'squeal' ,
222+ tableName : 'actor_info' ,
223+ columns : [ ] ,
224+ } ,
225+ {
226+ catalog : null ,
227+ database : 'squeal' ,
228+ tableName : 'film' ,
229+ columns : [ ] ,
230+ } ,
231+ {
232+ catalog : null ,
233+ database : 'squeal' ,
234+ tableName : 'film_actor' ,
235+ columns : [ ] ,
236+ } ,
237+ {
238+ catalog : null ,
239+ database : 'squeal' ,
240+ tableName : 'customer' ,
241+ columns : [ ] ,
242+ } ,
243+ ] ,
244+ functions : [ ] ,
245+ }
246+
247+ // Test: typing 'fil' should match 'film' and 'film_actor'
248+ const result = complete (
249+ 'SELECT * FROM fil' ,
250+ { line : 0 , column : 17 } ,
251+ schema
252+ )
253+
254+ const labels = result . candidates . map ( ( c ) => c . label )
255+ expect ( labels ) . toContain ( 'film' )
256+ expect ( labels ) . toContain ( 'film_actor' )
257+ expect ( labels ) . not . toContain ( 'actor' )
258+ expect ( labels ) . not . toContain ( 'customer' )
259+ } )
152260} )
0 commit comments