Skip to content

Commit 5e98a73

Browse files
committed
For empty select statement, suggest unscoped columns
But only if no scoped columns were suggested
1 parent 4b5db40 commit 5e98a73

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

packages/server/src/complete/complete.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,13 @@ class Completer {
250250
) || []
251251
this.addCandidatesForExpectedLiterals(expectedLiteralNodes)
252252
this.addCandidatesForFunctions()
253-
this.addCandidatesForScopedColumns(fromNodes, schemaAndSubqueries)
253+
const { addedSome } = this.addCandidatesForScopedColumns(
254+
fromNodes,
255+
schemaAndSubqueries
256+
)
257+
if (!addedSome) {
258+
this.addCandidatesForUnscopedColumns(fromNodes, schemaAndSubqueries)
259+
}
254260
this.addCandidatesForAliases(fromNodes)
255261
this.addCandidatesForTables(schemaAndSubqueries, true)
256262
if (logger.isDebugEnabled())
@@ -388,14 +394,20 @@ class Completer {
388394
console.timeEnd('addCandidatesForSelectStar')
389395
}
390396

391-
addCandidatesForScopedColumns(fromNodes: FromTableNode[], tables: Table[]) {
397+
addCandidatesForScopedColumns(
398+
fromNodes: FromTableNode[],
399+
tables: Table[]
400+
): { addedSome: boolean } {
392401
console.time('addCandidatesForScopedColumns')
402+
let addedSome = false
393403
createCandidatesForScopedColumns(fromNodes, tables, this.lastToken).forEach(
394404
(v) => {
405+
addedSome = true
395406
this.addCandidate(v)
396407
}
397408
)
398409
console.timeEnd('addCandidatesForScopedColumns')
410+
return { addedSome }
399411
}
400412

401413
addCandidatesForUnscopedColumns(fromNodes: FromTableNode[], tables: Table[]) {

packages/server/test/complete.test.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ describe('on blank space', () => {
182182

183183
test('complete inside SELECT', () => {
184184
const result = complete('SELECT ', { line: 0, column: 7 }, SIMPLE_SCHEMA)
185-
expect(result.candidates.length).toEqual(14) // TODO whare are they?
186185
const expected = [
187186
expect.objectContaining({ label: 'array_concat()' }),
188187
expect.objectContaining({ label: 'array_contains()' }),
@@ -458,7 +457,6 @@ describe('Fully qualified table names', () => {
458457
{ line: 0, column: 31 },
459458
SIMPLE_NESTED_SCHEMA
460459
)
461-
expect(result.candidates.length).toEqual(1)
462460
const expected = [expect.objectContaining({ label: 'table3' })]
463461
expect(result.candidates).toEqual(expect.arrayContaining(expected))
464462
})
@@ -888,18 +886,18 @@ test('complete aliased column inside function', () => {
888886
expect(result.candidates[0].label).toEqual('department_id')
889887
})
890888

891-
test('complete column inside function', () => {
892-
const sql = `SELECT TO_CHAR(empl, 'MM/DD/YYYY') FROM employees x`
889+
test('complete table inside function', () => {
890+
const sql = `SELECT TO_CHAR(empl, 'MM/DD/YYYY') FROM employees`
893891
const result = complete(sql, { line: 0, column: 19 }, COMPLEX_SCHEMA)
894-
expect(result.candidates.length).toEqual(1)
895-
expect(result.candidates[0].label).toEqual('employees')
892+
const expected = [expect.objectContaining({ label: 'employees' })]
893+
expect(result.candidates).toEqual(expect.arrayContaining(expected))
896894
})
897895

898896
test('complete an alias inside function', () => {
899897
const sql = `SELECT TO_CHAR(an_ali, 'MM/DD/YYYY') FROM employees an_alias`
900898
const result = complete(sql, { line: 0, column: 21 }, COMPLEX_SCHEMA)
901-
expect(result.candidates.length).toEqual(1)
902-
expect(result.candidates[0].label).toEqual('an_alias')
899+
const expected = [expect.objectContaining({ label: 'an_alias' })]
900+
expect(result.candidates).toEqual(expect.arrayContaining(expected))
903901
})
904902

905903
describe('From clause subquery', () => {

0 commit comments

Comments
 (0)