Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
TBD
==============

Features
--------
* More complete and up-to-date set of MySQL reserved words for completions.


1.44.2 (2026/01/13)
==============

Expand Down
175 changes: 21 additions & 154 deletions mycli/sqlcompleter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from prompt_toolkit.completion import CompleteEvent, Completer, Completion
from prompt_toolkit.completion.base import Document
from pygments.lexers._mysql_builtins import MYSQL_DATATYPES, MYSQL_FUNCTIONS, MYSQL_KEYWORDS

from mycli.packages.completion_engine import suggest_type
from mycli.packages.filepaths import complete_path, parse_path, suggest_path
Expand All @@ -18,141 +19,27 @@


class SQLCompleter(Completer):
favorite_keywords = [
'SELECT',
'FROM',
'WHERE',
'UPDATE',
'DELETE FROM',
'GROUP BY',
'ORDER BY',
'JOIN',
'INSERT INTO',
'LIKE',
'LIMIT',
]
keywords = [
"SELECT",
"FROM",
"WHERE",
"UPDATE",
"DELETE FROM",
"GROUP BY",
"JOIN",
"INSERT INTO",
"LIKE",
"LIMIT",
"ACCESS",
"ADD",
"ALL",
"ALTER TABLE",
"AND",
"ANY",
"AS",
"ASC",
"AUTO_INCREMENT",
"BEFORE",
"BEGIN",
"BETWEEN",
"BIGINT",
"BINARY",
"BY",
"CASE",
"CHANGE MASTER TO",
"CHAR",
"CHARACTER SET",
"CHECK",
"COLLATE",
"COLUMN",
"COMMENT",
"COMMIT",
"CONSTRAINT",
"CREATE",
"CURRENT",
"CURRENT_TIMESTAMP",
"DATABASE",
"DATE",
"DECIMAL",
"DEFAULT",
"DESC",
"DESCRIBE",
"DROP",
"ELSE",
"END",
"ENGINE",
"ESCAPE",
"EXISTS",
"FILE",
"FLOAT",
"FOR",
"FOREIGN KEY",
"FORMAT",
"FULL",
"FUNCTION",
"GRANT",
"HAVING",
"HOST",
"IDENTIFIED",
"IN",
"INCREMENT",
"INDEX",
"INT",
"INTEGER",
"INTERVAL",
"INTO",
"IS",
"KEY",
"LEFT",
"LEVEL",
"LOCK",
"LOGS",
"LONG",
"MASTER",
"MEDIUMINT",
"MODE",
"MODIFY",
"NOT",
"NULL",
"NUMBER",
"OFFSET",
"ON",
"OPTION",
"OR",
"ORDER BY",
"OUTER",
"OWNER",
"PASSWORD",
"PORT",
"PRIMARY",
"PRIVILEGES",
"PROCESSLIST",
"PURGE",
"REFERENCES",
"REGEXP",
"RENAME",
"REPAIR",
"RESET",
"REVOKE",
"RIGHT",
"ROLLBACK",
"ROW",
"ROWS",
"ROW_FORMAT",
"SAVEPOINT",
"SESSION",
"SET",
"SHARE",
"SHOW",
"SLAVE",
"SMALLINT",
"START",
"STOP",
"TABLE",
"THEN",
"TINYINT",
"TO",
"TRANSACTION",
"TRIGGER",
"TRUNCATE",
"UNION",
"UNIQUE",
"UNSIGNED",
"USE",
"USER",
"USING",
"VALUES",
"VARCHAR",
"VIEW",
"WHEN",
"WITH",
x.upper()
for x in favorite_keywords
+ list(MYSQL_DATATYPES)
+ list(MYSQL_KEYWORDS)
+ ['ALTER TABLE', 'CHANGE MASTER TO', 'CHARACTER SET', 'FOREIGN KEY']
]
keywords = list(dict.fromkeys(keywords))

tidb_keywords = [
"SELECT",
Expand Down Expand Up @@ -838,27 +725,7 @@ class SQLCompleter(Completer):
"ZEROFILL",
]

functions = [
"AVG",
"CONCAT",
"COUNT",
"DISTINCT",
"FIRST",
"FORMAT",
"FROM_UNIXTIME",
"LAST",
"LCASE",
"LEN",
"MAX",
"MID",
"MIN",
"NOW",
"ROUND",
"SUM",
"TOP",
"UCASE",
"UNIX_TIMESTAMP",
]
functions = [x.upper() for x in MYSQL_FUNCTIONS]

# https://docs.pingcap.com/tidb/dev/tidb-functions
tidb_functions = [
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ urls = { homepage = "http://mycli.net" }
dependencies = [
"click >= 8.3.1",
"cryptography >= 1.0.0",
"Pygments>=1.6",
"Pygments ~= 2.19.2",
"prompt_toolkit>=3.0.6,<4.0.0",
"PyMySQL >= 0.9.2",
"sqlparse>=0.3.0,<0.6.0",
Expand Down
43 changes: 42 additions & 1 deletion test/test_naive_completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,48 @@ def test_function_name_completion(completer, complete_event):
text = "SELECT MA"
position = len("SELECT MA")
result = list(completer.get_completions(Document(text=text, cursor_position=position), complete_event))
assert sorted(x.text for x in result) == ["MASTER", "MAX"]
assert sorted(x.text for x in result) == [
'MAKEDATE',
'MAKETIME',
'MAKE_SET',
'MASTER',
'MASTER_AUTO_POSITION',
'MASTER_BIND',
'MASTER_COMPRESSION_ALGORITHMS',
'MASTER_CONNECT_RETRY',
'MASTER_DELAY',
'MASTER_HEARTBEAT_PERIOD',
'MASTER_HOST',
'MASTER_LOG_FILE',
'MASTER_LOG_POS',
'MASTER_PASSWORD',
'MASTER_PORT',
'MASTER_POS_WAIT',
'MASTER_PUBLIC_KEY_PATH',
'MASTER_RETRY_COUNT',
'MASTER_SSL',
'MASTER_SSL_CA',
'MASTER_SSL_CAPATH',
'MASTER_SSL_CERT',
'MASTER_SSL_CIPHER',
'MASTER_SSL_CRL',
'MASTER_SSL_CRLPATH',
'MASTER_SSL_KEY',
'MASTER_SSL_VERIFY_SERVER_CERT',
'MASTER_TLS_CIPHERSUITES',
'MASTER_TLS_VERSION',
'MASTER_USER',
'MASTER_ZSTD_COMPRESSION_LEVEL',
'MATCH',
'MAX',
'MAXVALUE',
'MAX_CONNECTIONS_PER_HOUR',
'MAX_QUERIES_PER_HOUR',
'MAX_ROWS',
'MAX_SIZE',
'MAX_UPDATES_PER_HOUR',
'MAX_USER_CONNECTIONS',
]


def test_column_name_completion(completer, complete_event):
Expand Down
Loading