Skip to content

Commit 9d93830

Browse files
authored
support column completion for alter table statement (joe-re#125)
1 parent 2b1e103 commit 9d93830

File tree

8 files changed

+1753
-1528
lines changed

8 files changed

+1753
-1528
lines changed

packages/server/src/complete/candidates/createColumnCandidates.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ export function createCandidatesForColumnsOfAnyTable(
1717
lastToken,
1818
column.columnName,
1919
column.description,
20-
ICONS.TABLE,
21-
'FROM'
20+
ICONS.TABLE
2221
)
2322
})
2423
.filter((item) => item.matchesLastToken())

packages/server/src/complete/complete.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
ParseError,
1010
ExpectedLiteralNode,
1111
AST,
12+
AlterTableStatement,
1213
} from '@joe-re/sql-parser'
1314
import log4js from 'log4js'
1415
import { CompletionItem } from 'vscode-languageserver-types'
@@ -281,6 +282,17 @@ class Completer {
281282
}
282283
}
283284

285+
addCandidatesForParsedAlterTableStatement(ast: AlterTableStatement) {
286+
if (ast.command.type === 'alter_table_drop_column') {
287+
if (isPosInLocation(ast.command.column.location, this.pos)) {
288+
const table = this.schema.tables.find((v) => v.tableName === ast.table)
289+
this.addCandidatesForColumnsOfAnyTable(
290+
table ? [table] : this.schema.tables
291+
)
292+
}
293+
}
294+
}
295+
284296
addCandidatesForParsedSelectQuery(ast: SelectStatement) {
285297
this.addCandidatesForBasicKeyword()
286298
if (Array.isArray(ast.columns)) {
@@ -325,6 +337,8 @@ class Completer {
325337
this.addCandidatesForParsedDeleteStatement(ast)
326338
} else if (ast.type === 'select') {
327339
this.addCandidatesForParsedSelectQuery(ast)
340+
} else if (ast.type === 'alter_table') {
341+
this.addCandidatesForParsedAlterTableStatement(ast)
328342
} else {
329343
console.log(`AST type not supported yet: ${ast.type}`)
330344
}

packages/server/test/complete/alter_table.test.ts

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,72 @@ describe('complete ALTER TABLE statement', () => {
5656
})
5757

5858
describe('Column name completion', () => {
59-
// TODO: Deal with column completion
60-
it.skip('completes column name', () => {
61-
const sql = 'ALTER TABLE TABLE1 MODIFY C'
62-
const result = complete(
63-
sql,
64-
{ line: 0, column: sql.length },
65-
SIMPLE_SCHEMA
66-
)
67-
expect(result.candidates.length).toEqual(2)
68-
expect(result.candidates[0].label).toEqual('COLUMN1')
69-
expect(result.candidates[0].insertText).toEqual('COLUMN1')
59+
describe('ADD command keyword', () => {
60+
it("doen't completes column name", () => {
61+
const sql = 'ALTER TABLE TABLE1 ADD C'
62+
const result = complete(
63+
sql,
64+
{ line: 0, column: sql.length },
65+
SIMPLE_SCHEMA
66+
)
67+
expect(result.candidates.length).toEqual(0)
68+
})
69+
})
70+
71+
describe('DROP COLUMN command keyword', () => {
72+
it("doen't completes column name", () => {
73+
const sql = 'ALTER TABLE TABLE1 DROP COLUMN C'
74+
const result = complete(
75+
sql,
76+
{ line: 0, column: sql.length },
77+
SIMPLE_SCHEMA
78+
)
79+
expect(result.candidates.length).toEqual(2)
80+
expect(result.candidates[0].label).toEqual('COLUMN1')
81+
expect(result.candidates[0].insertText).toEqual('COLUMN1')
82+
})
83+
})
84+
85+
describe('MODIFY command keyword', () => {
86+
it('completes column name', () => {
87+
const sql = 'ALTER TABLE TABLE1 MODIFY C'
88+
const result = complete(
89+
sql,
90+
{ line: 0, column: sql.length },
91+
SIMPLE_SCHEMA
92+
)
93+
expect(result.candidates.length).toEqual(2)
94+
expect(result.candidates[0].label).toEqual('COLUMN1')
95+
expect(result.candidates[0].insertText).toEqual('COLUMN1')
96+
})
97+
})
98+
99+
describe('MODIFY COLUMN command keyword', () => {
100+
it('completes column name', () => {
101+
const sql = 'ALTER TABLE TABLE1 MODIFY COLUMN C'
102+
const result = complete(
103+
sql,
104+
{ line: 0, column: sql.length },
105+
SIMPLE_SCHEMA
106+
)
107+
expect(result.candidates.length).toEqual(2)
108+
expect(result.candidates[0].label).toEqual('COLUMN1')
109+
expect(result.candidates[0].insertText).toEqual('COLUMN1')
110+
})
111+
})
112+
113+
describe('ALTER COLUMN command keyword', () => {
114+
it('completes column name', () => {
115+
const sql = 'ALTER TABLE TABLE1 ALTER COLUMN C'
116+
const result = complete(
117+
sql,
118+
{ line: 0, column: sql.length },
119+
SIMPLE_SCHEMA
120+
)
121+
expect(result.candidates.length).toEqual(2)
122+
expect(result.candidates[0].label).toEqual('COLUMN1')
123+
expect(result.candidates[0].insertText).toEqual('COLUMN1')
124+
})
70125
})
71126
})
72127
})

0 commit comments

Comments
 (0)