Skip to content

Commit 0fa810d

Browse files
committed
import MySQL completion candidates from pygments
* remove LEN and TOP, which are not MySQL reserved words * preserve completion candidates containing space, such as "ORDER BY"
1 parent 4517f49 commit 0fa810d

File tree

4 files changed

+100
-39
lines changed

4 files changed

+100
-39
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Features:
1010
* Allow customization of Pygments SQL syntax-highlighting styles.
1111
* Add a `\clip` special command to copy queries to the system clipboard.
1212
* Add a special command `\pipe_once` to pipe output to a subprocess.
13+
* More complete and up-to-date set of MySQL reserved words for completions.
1314

1415

1516
Bug Fixes:

mycli/sqlcompleter.py

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
from collections import Counter
44

55
from prompt_toolkit.completion import Completer, Completion
6+
from pygments.lexers._mysql_builtins import \
7+
MYSQL_DATATYPES, \
8+
MYSQL_FUNCTIONS, \
9+
MYSQL_KEYWORDS
610

711
from .packages.completion_engine import suggest_type
812
from .packages.parseutils import last_word
@@ -13,33 +17,11 @@
1317

1418

1519
class SQLCompleter(Completer):
16-
keywords = ['ACCESS', 'ADD', 'ALL', 'ALTER TABLE', 'AND', 'ANY', 'AS',
17-
'ASC', 'AUTO_INCREMENT', 'BEFORE', 'BEGIN', 'BETWEEN',
18-
'BIGINT', 'BINARY', 'BY', 'CASE', 'CHANGE MASTER TO', 'CHAR',
19-
'CHARACTER SET', 'CHECK', 'COLLATE', 'COLUMN', 'COMMENT',
20-
'COMMIT', 'CONSTRAINT', 'CREATE', 'CURRENT',
21-
'CURRENT_TIMESTAMP', 'DATABASE', 'DATE', 'DECIMAL', 'DEFAULT',
22-
'DELETE FROM', 'DESC', 'DESCRIBE', 'DROP',
23-
'ELSE', 'END', 'ENGINE', 'ESCAPE', 'EXISTS', 'FILE', 'FLOAT',
24-
'FOR', 'FOREIGN KEY', 'FORMAT', 'FROM', 'FULL', 'FUNCTION',
25-
'GRANT', 'GROUP BY', 'HAVING', 'HOST', 'IDENTIFIED', 'IN',
26-
'INCREMENT', 'INDEX', 'INSERT INTO', 'INT', 'INTEGER',
27-
'INTERVAL', 'INTO', 'IS', 'JOIN', 'KEY', 'LEFT', 'LEVEL',
28-
'LIKE', 'LIMIT', 'LOCK', 'LOGS', 'LONG', 'MASTER',
29-
'MEDIUMINT', 'MODE', 'MODIFY', 'NOT', 'NULL', 'NUMBER',
30-
'OFFSET', 'ON', 'OPTION', 'OR', 'ORDER BY', 'OUTER', 'OWNER',
31-
'PASSWORD', 'PORT', 'PRIMARY', 'PRIVILEGES', 'PROCESSLIST',
32-
'PURGE', 'REFERENCES', 'REGEXP', 'RENAME', 'REPAIR', 'RESET',
33-
'REVOKE', 'RIGHT', 'ROLLBACK', 'ROW', 'ROWS', 'ROW_FORMAT',
34-
'SAVEPOINT', 'SELECT', 'SESSION', 'SET', 'SHARE', 'SHOW',
35-
'SLAVE', 'SMALLINT', 'SMALLINT', 'START', 'STOP', 'TABLE',
36-
'THEN', 'TINYINT', 'TO', 'TRANSACTION', 'TRIGGER', 'TRUNCATE',
37-
'UNION', 'UNIQUE', 'UNSIGNED', 'UPDATE', 'USE', 'USER',
38-
'USING', 'VALUES', 'VARCHAR', 'VIEW', 'WHEN', 'WHERE', 'WITH']
39-
40-
functions = ['AVG', 'CONCAT', 'COUNT', 'DISTINCT', 'FIRST', 'FORMAT',
41-
'FROM_UNIXTIME', 'LAST', 'LCASE', 'LEN', 'MAX', 'MID',
42-
'MIN', 'NOW', 'ROUND', 'SUM', 'TOP', 'UCASE', 'UNIX_TIMESTAMP']
20+
keywords = [x.upper() for x in MYSQL_DATATYPES + MYSQL_KEYWORDS +
21+
['ALTER TABLE', 'CHANGE MASTER TO', 'CHARACTER SET', 'DELETE FROM',
22+
'FOREIGN KEY', 'GROUP BY', 'INSERT INTO', 'ORDER BY']]
23+
24+
functions = [x.upper() for x in MYSQL_FUNCTIONS]
4325

4426
show_items = []
4527

test/test_naive_completion.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,47 @@ def test_function_name_completion(completer, complete_event):
4040
Document(text=text, cursor_position=position),
4141
complete_event))
4242
assert result == list([
43+
Completion(text='MAKEDATE', start_position=-2),
44+
Completion(text='MAKETIME', start_position=-2),
45+
Completion(text='MAKE_SET', start_position=-2),
4346
Completion(text='MASTER', start_position=-2),
44-
Completion(text='MAX', start_position=-2)])
47+
Completion(text='MASTER_AUTO_POSITION', start_position=-2),
48+
Completion(text='MASTER_BIND', start_position=-2),
49+
Completion(text='MASTER_COMPRESSION_ALGORITHMS', start_position=-2),
50+
Completion(text='MASTER_CONNECT_RETRY', start_position=-2),
51+
Completion(text='MASTER_DELAY', start_position=-2),
52+
Completion(text='MASTER_HEARTBEAT_PERIOD', start_position=-2),
53+
Completion(text='MASTER_HOST', start_position=-2),
54+
Completion(text='MASTER_LOG_FILE', start_position=-2),
55+
Completion(text='MASTER_LOG_POS', start_position=-2),
56+
Completion(text='MASTER_PASSWORD', start_position=-2),
57+
Completion(text='MASTER_PORT', start_position=-2),
58+
Completion(text='MASTER_POS_WAIT', start_position=-2),
59+
Completion(text='MASTER_PUBLIC_KEY_PATH', start_position=-2),
60+
Completion(text='MASTER_RETRY_COUNT', start_position=-2),
61+
Completion(text='MASTER_SERVER_ID', start_position=-2),
62+
Completion(text='MASTER_SSL', start_position=-2),
63+
Completion(text='MASTER_SSL_CA', start_position=-2),
64+
Completion(text='MASTER_SSL_CAPATH', start_position=-2),
65+
Completion(text='MASTER_SSL_CERT', start_position=-2),
66+
Completion(text='MASTER_SSL_CIPHER', start_position=-2),
67+
Completion(text='MASTER_SSL_CRL', start_position=-2),
68+
Completion(text='MASTER_SSL_CRLPATH', start_position=-2),
69+
Completion(text='MASTER_SSL_KEY', start_position=-2),
70+
Completion(text='MASTER_SSL_VERIFY_SERVER_CERT', start_position=-2),
71+
Completion(text='MASTER_TLS_CIPHERSUITES', start_position=-2),
72+
Completion(text='MASTER_TLS_VERSION', start_position=-2),
73+
Completion(text='MASTER_USER', start_position=-2),
74+
Completion(text='MASTER_ZSTD_COMPRESSION_LEVEL', start_position=-2),
75+
Completion(text='MATCH', start_position=-2),
76+
Completion(text='MAX', start_position=-2),
77+
Completion(text='MAXVALUE', start_position=-2),
78+
Completion(text='MAX_CONNECTIONS_PER_HOUR', start_position=-2),
79+
Completion(text='MAX_QUERIES_PER_HOUR', start_position=-2),
80+
Completion(text='MAX_ROWS', start_position=-2),
81+
Completion(text='MAX_SIZE', start_position=-2),
82+
Completion(text='MAX_UPDATES_PER_HOUR', start_position=-2),
83+
Completion(text='MAX_USER_CONNECTIONS', start_position=-2)])
4584

4685

4786
def test_column_name_completion(completer, complete_event):

test/test_smart_completion_public_schema_only.py

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,48 @@ def test_function_name_completion(completer, complete_event):
8686
position = len('SELECT MA')
8787
result = completer.get_completions(
8888
Document(text=text, cursor_position=position), complete_event)
89-
assert list(result) == list([Completion(text='MAX', start_position=-2),
90-
Completion(text='MASTER', start_position=-2),
91-
])
89+
assert list(result) == list([
90+
Completion(text='MAKEDATE', start_position=-2),
91+
Completion(text='MAKETIME', start_position=-2),
92+
Completion(text='MAKE_SET', start_position=-2),
93+
Completion(text='MASTER_POS_WAIT', start_position=-2),
94+
Completion(text='MAX', start_position=-2),
95+
Completion(text='MASTER', start_position=-2),
96+
Completion(text='MASTER_AUTO_POSITION', start_position=-2),
97+
Completion(text='MASTER_BIND', start_position=-2),
98+
Completion(text='MASTER_COMPRESSION_ALGORITHMS', start_position=-2),
99+
Completion(text='MASTER_CONNECT_RETRY', start_position=-2),
100+
Completion(text='MASTER_DELAY', start_position=-2),
101+
Completion(text='MASTER_HEARTBEAT_PERIOD', start_position=-2),
102+
Completion(text='MASTER_HOST', start_position=-2),
103+
Completion(text='MASTER_LOG_FILE', start_position=-2),
104+
Completion(text='MASTER_LOG_POS', start_position=-2),
105+
Completion(text='MASTER_PASSWORD', start_position=-2),
106+
Completion(text='MASTER_PORT', start_position=-2),
107+
Completion(text='MASTER_PUBLIC_KEY_PATH', start_position=-2),
108+
Completion(text='MASTER_RETRY_COUNT', start_position=-2),
109+
Completion(text='MASTER_SERVER_ID', start_position=-2),
110+
Completion(text='MASTER_SSL', start_position=-2),
111+
Completion(text='MASTER_SSL_CA', start_position=-2),
112+
Completion(text='MASTER_SSL_CAPATH', start_position=-2),
113+
Completion(text='MASTER_SSL_CERT', start_position=-2),
114+
Completion(text='MASTER_SSL_CIPHER', start_position=-2),
115+
Completion(text='MASTER_SSL_CRL', start_position=-2),
116+
Completion(text='MASTER_SSL_CRLPATH', start_position=-2),
117+
Completion(text='MASTER_SSL_KEY', start_position=-2),
118+
Completion(text='MASTER_SSL_VERIFY_SERVER_CERT', start_position=-2),
119+
Completion(text='MASTER_TLS_CIPHERSUITES', start_position=-2),
120+
Completion(text='MASTER_TLS_VERSION', start_position=-2),
121+
Completion(text='MASTER_USER', start_position=-2),
122+
Completion(text='MASTER_ZSTD_COMPRESSION_LEVEL', start_position=-2),
123+
Completion(text='MATCH', start_position=-2),
124+
Completion(text='MAXVALUE', start_position=-2),
125+
Completion(text='MAX_CONNECTIONS_PER_HOUR', start_position=-2),
126+
Completion(text='MAX_QUERIES_PER_HOUR', start_position=-2),
127+
Completion(text='MAX_ROWS', start_position=-2),
128+
Completion(text='MAX_SIZE', start_position=-2),
129+
Completion(text='MAX_UPDATES_PER_HOUR', start_position=-2),
130+
Completion(text='MAX_USER_CONNECTIONS', start_position=-2)])
92131

93132

94133
def test_suggested_column_names(completer, complete_event):
@@ -111,9 +150,9 @@ def test_suggested_column_names(completer, complete_event):
111150
Completion(text='id', start_position=0),
112151
Completion(text='last_name', start_position=0),
113152
] +
114-
list(map(Completion, completer.functions)) +
153+
list(map(Completion, sorted(completer.functions))) +
115154
[Completion(text='users', start_position=0)] +
116-
list(map(Completion, completer.keywords)))
155+
list(map(Completion, sorted(completer.keywords))))
117156

118157

119158
def test_suggested_column_names_in_function(completer, complete_event):
@@ -200,9 +239,9 @@ def test_suggested_multiple_column_names(completer, complete_event):
200239
Completion(text='first_name', start_position=0),
201240
Completion(text='id', start_position=0),
202241
Completion(text='last_name', start_position=0)] +
203-
list(map(Completion, completer.functions)) +
242+
list(map(Completion, sorted(completer.functions))) +
204243
[Completion(text='u', start_position=0)] +
205-
list(map(Completion, completer.keywords)))
244+
list(map(Completion, sorted(completer.keywords))))
206245

207246

208247
def test_suggested_multiple_column_names_with_alias(completer, complete_event):
@@ -321,9 +360,9 @@ def test_auto_escaped_col_names(completer, complete_event):
321360
Completion(text='`insert`', start_position=0),
322361
Completion(text='id', start_position=0),
323362
] + \
324-
list(map(Completion, completer.functions)) + \
363+
list(map(Completion, sorted(completer.functions))) + \
325364
[Completion(text='`select`', start_position=0)] + \
326-
list(map(Completion, completer.keywords))
365+
list(map(Completion, sorted(completer.keywords)))
327366

328367

329368
def test_un_escaped_table_names(completer, complete_event):
@@ -338,9 +377,9 @@ def test_un_escaped_table_names(completer, complete_event):
338377
Completion(text='`insert`', start_position=0),
339378
Completion(text='id', start_position=0),
340379
] +
341-
list(map(Completion, completer.functions)) +
380+
list(map(Completion, sorted(completer.functions))) +
342381
[Completion(text='réveillé', start_position=0)] +
343-
list(map(Completion, completer.keywords)))
382+
list(map(Completion, sorted(completer.keywords))))
344383

345384

346385
def dummy_list_path(dir_name):

0 commit comments

Comments
 (0)