@@ -17,6 +17,8 @@ type Pos = { line: number, column: number }
1717
1818const logger = log4js . getLogger ( )
1919
20+ const FROM_KEYWORD = { label : 'FROM' , kind : CompletionItemKind . Text }
21+
2022const CLAUSES : CompletionItem [ ] = [
2123 { label : 'WHERE' , kind : CompletionItemKind . Text } ,
2224 { label : 'ORDER BY' , kind : CompletionItemKind . Text } ,
@@ -191,6 +193,22 @@ function completeDeleteStatement (ast: DeleteStatement, pos: Pos, schema: Schema
191193 return [ ]
192194}
193195
196+ function completeSelectStatement ( ast : SelectStatement , _pos : Pos , _schema : Schema ) : CompletionItem [ ] {
197+ let candidates : CompletionItem [ ] = [ ]
198+ if ( Array . isArray ( ast . columns ) ) {
199+ const first = ast . columns [ 0 ]
200+ const rest = ast . columns . slice ( 1 , ast . columns . length )
201+ const lastColumn = rest . reduce ( ( p , c ) => p . location . end . offset < c . location . end . offset ? c : p , first )
202+ if (
203+ FROM_KEYWORD . label . startsWith ( lastColumn . expr . column ) ||
204+ ( lastColumn . as && FROM_KEYWORD . label . startsWith ( lastColumn . as ) )
205+ ) {
206+ candidates . push ( FROM_KEYWORD )
207+ }
208+ }
209+ return candidates
210+ }
211+
194212export default function complete ( sql : string , pos : Pos , schema : Schema = [ ] ) {
195213 logger . debug ( `complete: ${ sql } , ${ JSON . stringify ( pos ) } ` )
196214 let candidates : CompletionItem [ ] = [ ]
@@ -208,6 +226,9 @@ export default function complete(sql: string, pos: Pos, schema: Schema = []) {
208226 if ( ast . type === 'select' && ! ast . distinct ) {
209227 candidates . push ( { label : 'DISTINCT' , kind : CompletionItemKind . Text } )
210228 }
229+ if ( ast . type === 'select' ) {
230+ candidates = candidates . concat ( completeSelectStatement ( ast , pos , schema ) )
231+ }
211232 const columns = ast . columns
212233 if ( Array . isArray ( columns ) ) {
213234 const selectColumnRefs = ( columns as any ) . map ( ( v : any ) => v . expr ) . filter ( ( v : any ) => ! ! v )
0 commit comments