Skip to content

Commit bec9efd

Browse files
committed
For empty select statement, suggest unscoped columns
But only if no scoped columns were suggested
1 parent 7709ae7 commit bec9efd

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
@@ -249,7 +249,13 @@ class Completer {
249249
) || []
250250
this.addCandidatesForExpectedLiterals(expectedLiteralNodes)
251251
this.addCandidatesForFunctions()
252-
this.addCandidatesForScopedColumns(fromNodes, schemaAndSubqueries)
252+
const { addedSome } = this.addCandidatesForScopedColumns(
253+
fromNodes,
254+
schemaAndSubqueries
255+
)
256+
if (!addedSome) {
257+
this.addCandidatesForUnscopedColumns(fromNodes, schemaAndSubqueries)
258+
}
253259
this.addCandidatesForAliases(fromNodes)
254260
this.addCandidatesForTables(schemaAndSubqueries, true)
255261
if (logger.isDebugEnabled())
@@ -379,14 +385,20 @@ class Completer {
379385
console.timeEnd('addCandidatesForSelectStar')
380386
}
381387

382-
addCandidatesForScopedColumns(fromNodes: FromTableNode[], tables: Table[]) {
388+
addCandidatesForScopedColumns(
389+
fromNodes: FromTableNode[],
390+
tables: Table[]
391+
): { addedSome: boolean } {
383392
console.time('addCandidatesForScopedColumns')
393+
let addedSome = false
384394
createCandidatesForScopedColumns(fromNodes, tables, this.lastToken).forEach(
385395
(v) => {
396+
addedSome = true
386397
this.addCandidate(v)
387398
}
388399
)
389400
console.timeEnd('addCandidatesForScopedColumns')
401+
return { addedSome }
390402
}
391403

392404
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
@@ -174,7 +174,6 @@ describe('on blank space', () => {
174174

175175
test('complete inside SELECT', () => {
176176
const result = complete('SELECT ', { line: 0, column: 7 }, SIMPLE_SCHEMA)
177-
expect(result.candidates.length).toEqual(12) // TODO whare are they?
178177
const expected = [
179178
expect.objectContaining({ label: 'array_concat()' }),
180179
expect.objectContaining({ label: 'array_contains()' }),
@@ -450,7 +449,6 @@ describe('Fully qualified table names', () => {
450449
{ line: 0, column: 31 },
451450
SIMPLE_NESTED_SCHEMA
452451
)
453-
expect(result.candidates.length).toEqual(1)
454452
const expected = [expect.objectContaining({ label: 'table3' })]
455453
expect(result.candidates).toEqual(expect.arrayContaining(expected))
456454
})
@@ -880,18 +878,18 @@ test('complete aliased column inside function', () => {
880878
expect(result.candidates[0].label).toEqual('department_id')
881879
})
882880

883-
test('complete column inside function', () => {
884-
const sql = `SELECT TO_CHAR(empl, 'MM/DD/YYYY') FROM employees x`
881+
test('complete table inside function', () => {
882+
const sql = `SELECT TO_CHAR(empl, 'MM/DD/YYYY') FROM employees`
885883
const result = complete(sql, { line: 0, column: 19 }, COMPLEX_SCHEMA)
886-
expect(result.candidates.length).toEqual(1)
887-
expect(result.candidates[0].label).toEqual('employees')
884+
const expected = [expect.objectContaining({ label: 'employees' })]
885+
expect(result.candidates).toEqual(expect.arrayContaining(expected))
888886
})
889887

890888
test('complete an alias inside function', () => {
891889
const sql = `SELECT TO_CHAR(an_ali, 'MM/DD/YYYY') FROM employees an_alias`
892890
const result = complete(sql, { line: 0, column: 21 }, COMPLEX_SCHEMA)
893-
expect(result.candidates.length).toEqual(1)
894-
expect(result.candidates[0].label).toEqual('an_alias')
891+
const expected = [expect.objectContaining({ label: 'an_alias' })]
892+
expect(result.candidates).toEqual(expect.arrayContaining(expected))
895893
})
896894

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

0 commit comments

Comments
 (0)