1
0
Fork 0

Merging upstream version 1.27.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-09 19:09:59 +01:00
parent f9b72e95f7
commit c3fea970b3
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
18 changed files with 474 additions and 94 deletions

View file

@ -1 +1 @@
__version__ = '1.26.1'
__version__ = '1.27.0'

View file

@ -3,7 +3,7 @@ from .packages.special.main import COMMANDS
from collections import OrderedDict
from .sqlcompleter import SQLCompleter
from .sqlexecute import SQLExecute
from .sqlexecute import SQLExecute, ServerSpecies
class CompletionRefresher(object):
@ -113,6 +113,8 @@ def refresh_users(completer, executor):
@refresher('functions')
def refresh_functions(completer, executor):
completer.extend_functions(executor.functions())
if executor.server_info.species == ServerSpecies.TiDB:
completer.extend_functions(completer.tidb_functions, builtin=True)
@refresher('special_commands')
def refresh_special(completer, executor):
@ -121,3 +123,8 @@ def refresh_special(completer, executor):
@refresher('show_commands')
def refresh_show_commands(completer, executor):
completer.extend_show_items(executor.show_candidates())
@refresher('keywords')
def refresh_keywords(completer, executor):
if executor.server_info.species == ServerSpecies.TiDB:
completer.extend_keywords(completer.tidb_keywords, replace=True)

View file

@ -1,6 +1,6 @@
import logging
from prompt_toolkit.enums import EditingMode
from prompt_toolkit.filters import completion_is_selected, emacs_mode, vi_mode
from prompt_toolkit.filters import completion_is_selected, emacs_mode
from prompt_toolkit.key_binding import KeyBindings
_logger = logging.getLogger(__name__)
@ -61,7 +61,6 @@ def mycli_bindings(mycli):
else:
b.start_completion(select_first=False)
@kb.add('>', filter=vi_mode)
@kb.add('c-x', 'p', filter=emacs_mode)
def _(event):
"""
@ -72,7 +71,7 @@ def mycli_bindings(mycli):
_logger.debug('Detected <C-x p>/> key.')
b = event.app.current_buffer
cursorpos_relative = b.cursor_position / len(b.text)
cursorpos_relative = b.cursor_position / max(1, len(b.text))
pretty_text = mycli.handle_prettify_binding(b.text)
if len(pretty_text) > 0:
b.text = pretty_text
@ -82,7 +81,6 @@ def mycli_bindings(mycli):
cursorpos_abs -= 1
b.cursor_position = min(cursorpos_abs, len(b.text))
@kb.add('<', filter=vi_mode)
@kb.add('c-x', 'u', filter=emacs_mode)
def _(event):
"""
@ -93,7 +91,7 @@ def mycli_bindings(mycli):
_logger.debug('Detected <C-x u>/< key.')
b = event.app.current_buffer
cursorpos_relative = b.cursor_position / len(b.text)
cursorpos_relative = b.cursor_position / max(1, len(b.text))
unpretty_text = mycli.handle_unprettify_binding(b.text)
if len(unpretty_text) > 0:
b.text = unpretty_text

View file

@ -19,8 +19,16 @@ def load_ipython_extension(ipython):
def mycli_line_magic(line):
_logger.debug('mycli magic called: %r', line)
parsed = sql.parse.parse(line, {})
conn = sql.connection.Connection(parsed['connection'])
# "get" was renamed to "set" in ipython-sql:
# https://github.com/catherinedevlin/ipython-sql/commit/f4283c65aaf68f961e84019e8b939e4a3c501d43
if hasattr(sql.connection.Connection, "get"):
conn = sql.connection.Connection.get(parsed["connection"])
else:
try:
conn = sql.connection.Connection.set(parsed["connection"])
# a new positional argument was added to Connection.set in version 0.4.0 of ipython-sql
except TypeError:
conn = sql.connection.Connection.set(parsed["connection"], False)
try:
# A corresponding mycli object already exists
mycli = conn._mycli

View file

@ -589,7 +589,7 @@ class MyCli(object):
statements = sqlglot.parse(text, read='mysql')
except Exception as e:
statements = []
if len(statements) == 1:
if len(statements) == 1 and statements[0]:
pretty_text = statements[0].sql(pretty=True, pad=4, dialect='mysql')
else:
pretty_text = ''
@ -603,7 +603,7 @@ class MyCli(object):
statements = sqlglot.parse(text, read='mysql')
except Exception as e:
statements = []
if len(statements) == 1:
if len(statements) == 1 and statements[0]:
unpretty_text = statements[0].sql(pretty=False, dialect='mysql')
else:
unpretty_text = ''
@ -1038,7 +1038,7 @@ class MyCli(object):
for result in results:
title, cur, headers, status = result
self.formatter.query = query
output = self.format_output(title, cur, headers)
output = self.format_output(title, cur, headers, special.is_expanded_output())
for line in output:
click.echo(line, nl=new_line)
@ -1331,7 +1331,12 @@ def cli(database, user, host, port, socket, password, dbname,
try:
if csv:
mycli.formatter.format_name = 'csv'
elif not table:
if execute.endswith(r'\G'):
execute = execute[:-2]
elif table:
if execute.endswith(r'\G'):
execute = execute[:-2]
else:
mycli.formatter.format_name = 'tsv'
mycli.run_query(execute)

View file

@ -13,33 +13,178 @@ _logger = logging.getLogger(__name__)
class SQLCompleter(Completer):
keywords = ['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',
'DELETE FROM', 'DESC', 'DESCRIBE', 'DROP',
'ELSE', 'END', 'ENGINE', 'ESCAPE', 'EXISTS', 'FILE', 'FLOAT',
'FOR', 'FOREIGN KEY', 'FORMAT', 'FROM', 'FULL', 'FUNCTION',
'GRANT', 'GROUP BY', 'HAVING', 'HOST', 'IDENTIFIED', 'IN',
'INCREMENT', 'INDEX', 'INSERT INTO', 'INT', 'INTEGER',
'INTERVAL', 'INTO', 'IS', 'JOIN', 'KEY', 'LEFT', 'LEVEL',
'LIKE', 'LIMIT', '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', 'SELECT', 'SESSION', 'SET', 'SHARE', 'SHOW',
'SLAVE', 'SMALLINT', 'SMALLINT', 'START', 'STOP', 'TABLE',
'THEN', 'TINYINT', 'TO', 'TRANSACTION', 'TRIGGER', 'TRUNCATE',
'UNION', 'UNIQUE', 'UNSIGNED', 'UPDATE', 'USE', 'USER',
'USING', 'VALUES', 'VARCHAR', 'VIEW', 'WHEN', 'WHERE', 'WITH']
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', 'SMALLINT',
'START', 'STOP', 'TABLE', 'THEN', 'TINYINT', 'TO', 'TRANSACTION',
'TRIGGER', 'TRUNCATE', 'UNION', 'UNIQUE', 'UNSIGNED', 'USE',
'USER', 'USING', 'VALUES', 'VARCHAR', 'VIEW', 'WHEN', 'WITH'
]
tidb_keywords = [
"SELECT", "FROM", "WHERE", "DELETE FROM", "UPDATE", "GROUP BY",
"JOIN", "INSERT INTO", "LIKE", "LIMIT", "ACCOUNT", "ACTION", "ADD",
"ADDDATE", "ADMIN", "ADVISE", "AFTER", "AGAINST", "AGO",
"ALGORITHM", "ALL", "ALTER", "ALWAYS", "ANALYZE", "AND", "ANY",
"APPROX_COUNT_DISTINCT", "APPROX_PERCENTILE", "AS", "ASC", "ASCII",
"ATTRIBUTES", "AUTO_ID_CACHE", "AUTO_INCREMENT", "AUTO_RANDOM",
"AUTO_RANDOM_BASE", "AVG", "AVG_ROW_LENGTH", "BACKEND", "BACKUP",
"BACKUPS", "BATCH", "BEGIN", "BERNOULLI", "BETWEEN", "BIGINT",
"BINARY", "BINDING", "BINDINGS", "BINDING_CACHE", "BINLOG", "BIT",
"BIT_AND", "BIT_OR", "BIT_XOR", "BLOB", "BLOCK", "BOOL", "BOOLEAN",
"BOTH", "BOUND", "BRIEF", "BTREE", "BUCKETS", "BUILTINS", "BY",
"BYTE", "CACHE", "CALL", "CANCEL", "CAPTURE", "CARDINALITY",
"CASCADE", "CASCADED", "CASE", "CAST", "CAUSAL", "CHAIN", "CHANGE",
"CHAR", "CHARACTER", "CHARSET", "CHECK", "CHECKPOINT", "CHECKSUM",
"CIPHER", "CLEANUP", "CLIENT", "CLIENT_ERRORS_SUMMARY",
"CLUSTERED", "CMSKETCH", "COALESCE", "COLLATE", "COLLATION",
"COLUMN", "COLUMNS", "COLUMN_FORMAT", "COLUMN_STATS_USAGE",
"COMMENT", "COMMIT", "COMMITTED", "COMPACT", "COMPRESSED",
"COMPRESSION", "CONCURRENCY", "CONFIG", "CONNECTION",
"CONSISTENCY", "CONSISTENT", "CONSTRAINT", "CONSTRAINTS",
"CONTEXT", "CONVERT", "COPY", "CORRELATION", "CPU", "CREATE",
"CROSS", "CSV_BACKSLASH_ESCAPE", "CSV_DELIMITER", "CSV_HEADER",
"CSV_NOT_NULL", "CSV_NULL", "CSV_SEPARATOR",
"CSV_TRIM_LAST_SEPARATORS", "CUME_DIST", "CURRENT", "CURRENT_DATE",
"CURRENT_ROLE", "CURRENT_TIME", "CURRENT_TIMESTAMP",
"CURRENT_USER", "CURTIME", "CYCLE", "DATA", "DATABASE",
"DATABASES", "DATE", "DATETIME", "DATE_ADD", "DATE_SUB", "DAY",
"DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE", "DAY_SECOND", "DDL",
"DEALLOCATE", "DECIMAL", "DEFAULT", "DEFINER", "DELAYED",
"DELAY_KEY_WRITE", "DENSE_RANK", "DEPENDENCY", "DEPTH", "DESC",
"DESCRIBE", "DIRECTORY", "DISABLE", "DISABLED", "DISCARD", "DISK",
"DISTINCT", "DISTINCTROW", "DIV", "DO", "DOT", "DOUBLE", "DRAINER",
"DROP", "DRY", "DUAL", "DUMP", "DUPLICATE", "DYNAMIC", "ELSE",
"ENABLE", "ENABLED", "ENCLOSED", "ENCRYPTION", "END", "ENFORCED",
"ENGINE", "ENGINES", "ENUM", "ERROR", "ERRORS", "ESCAPE",
"ESCAPED", "EVENT", "EVENTS", "EVOLVE", "EXACT", "EXCEPT",
"EXCHANGE", "EXCLUSIVE", "EXECUTE", "EXISTS", "EXPANSION",
"EXPIRE", "EXPLAIN", "EXPR_PUSHDOWN_BLACKLIST", "EXTENDED",
"EXTRACT", "FALSE", "FAST", "FAULTS", "FETCH", "FIELDS", "FILE",
"FIRST", "FIRST_VALUE", "FIXED", "FLASHBACK", "FLOAT", "FLUSH",
"FOLLOWER", "FOLLOWERS", "FOLLOWER_CONSTRAINTS", "FOLLOWING",
"FOR", "FORCE", "FOREIGN", "FORMAT", "FULL", "FULLTEXT",
"FUNCTION", "GENERAL", "GENERATED", "GET_FORMAT", "GLOBAL",
"GRANT", "GRANTS", "GROUPS", "GROUP_CONCAT", "HASH", "HAVING",
"HELP", "HIGH_PRIORITY", "HISTOGRAM", "HISTOGRAMS_IN_FLIGHT",
"HISTORY", "HOSTS", "HOUR", "HOUR_MICROSECOND", "HOUR_MINUTE",
"HOUR_SECOND", "IDENTIFIED", "IF", "IGNORE", "IMPORT", "IMPORTS",
"IN", "INCREMENT", "INCREMENTAL", "INDEX", "INDEXES", "INFILE",
"INNER", "INPLACE", "INSERT_METHOD", "INSTANCE",
"INSTANT", "INT", "INT1", "INT2", "INT3", "INT4", "INT8",
"INTEGER", "INTERNAL", "INTERSECT", "INTERVAL", "INTO",
"INVISIBLE", "INVOKER", "IO", "IPC", "IS", "ISOLATION", "ISSUER",
"JOB", "JOBS", "JSON", "JSON_ARRAYAGG", "JSON_OBJECTAGG", "KEY",
"KEYS", "KEY_BLOCK_SIZE", "KILL", "LABELS", "LAG", "LANGUAGE",
"LAST", "LASTVAL", "LAST_BACKUP", "LAST_VALUE", "LEAD", "LEADER",
"LEADER_CONSTRAINTS", "LEADING", "LEARNER", "LEARNERS",
"LEARNER_CONSTRAINTS", "LEFT", "LESS", "LEVEL", "LINEAR", "LINES",
"LIST", "LOAD", "LOCAL", "LOCALTIME", "LOCALTIMESTAMP", "LOCATION",
"LOCK", "LOCKED", "LOGS", "LONG", "LONGBLOB", "LONGTEXT",
"LOW_PRIORITY", "MASTER", "MATCH", "MAX", "MAXVALUE",
"MAX_CONNECTIONS_PER_HOUR", "MAX_IDXNUM", "MAX_MINUTES",
"MAX_QUERIES_PER_HOUR", "MAX_ROWS", "MAX_UPDATES_PER_HOUR",
"MAX_USER_CONNECTIONS", "MB", "MEDIUMBLOB", "MEDIUMINT",
"MEDIUMTEXT", "MEMORY", "MERGE", "MICROSECOND", "MIN", "MINUTE",
"MINUTE_MICROSECOND", "MINUTE_SECOND", "MINVALUE", "MIN_ROWS",
"MOD", "MODE", "MODIFY", "MONTH", "NAMES", "NATIONAL", "NATURAL",
"NCHAR", "NEVER", "NEXT", "NEXTVAL", "NEXT_ROW_ID", "NO",
"NOCACHE", "NOCYCLE", "NODEGROUP", "NODE_ID", "NODE_STATE",
"NOMAXVALUE", "NOMINVALUE", "NONCLUSTERED", "NONE", "NORMAL",
"NOT", "NOW", "NOWAIT", "NO_WRITE_TO_BINLOG", "NTH_VALUE", "NTILE",
"NULL", "NULLS", "NUMERIC", "NVARCHAR", "OF", "OFF", "OFFSET",
"ON", "ONLINE", "ONLY", "ON_DUPLICATE", "OPEN", "OPTIMISTIC",
"OPTIMIZE", "OPTION", "OPTIONAL", "OPTIONALLY",
"OPT_RULE_BLACKLIST", "OR", "ORDER", "OUTER", "OUTFILE", "OVER",
"PACK_KEYS", "PAGE", "PARSER", "PARTIAL", "PARTITION",
"PARTITIONING", "PARTITIONS", "PASSWORD", "PERCENT",
"PERCENT_RANK", "PER_DB", "PER_TABLE", "PESSIMISTIC", "PLACEMENT",
"PLAN", "PLAN_CACHE", "PLUGINS", "POLICY", "POSITION", "PRECEDING",
"PRECISION", "PREDICATE", "PREPARE", "PRESERVE",
"PRE_SPLIT_REGIONS", "PRIMARY", "PRIMARY_REGION", "PRIVILEGES",
"PROCEDURE", "PROCESS", "PROCESSLIST", "PROFILE", "PROFILES",
"PROXY", "PUMP", "PURGE", "QUARTER", "QUERIES", "QUERY", "QUICK",
"RANGE", "RANK", "RATE_LIMIT", "READ", "REAL", "REBUILD", "RECENT",
"RECOVER", "RECURSIVE", "REDUNDANT", "REFERENCES", "REGEXP",
"REGION", "REGIONS", "RELEASE", "RELOAD", "REMOVE", "RENAME",
"REORGANIZE", "REPAIR", "REPEAT", "REPEATABLE", "REPLACE",
"REPLAYER", "REPLICA", "REPLICAS", "REPLICATION", "REQUIRE",
"REQUIRED", "RESET", "RESPECT", "RESTART", "RESTORE", "RESTORES",
"RESTRICT", "RESUME", "REVERSE", "REVOKE", "RIGHT", "RLIKE",
"ROLE", "ROLLBACK", "ROUTINE", "ROW", "ROWS", "ROW_COUNT",
"ROW_FORMAT", "ROW_NUMBER", "RTREE", "RUN", "RUNNING", "S3",
"SAMPLERATE", "SAMPLES", "SAN", "SAVEPOINT", "SCHEDULE", "SECOND",
"SECONDARY_ENGINE", "SECONDARY_LOAD", "SECONDARY_UNLOAD",
"SECOND_MICROSECOND", "SECURITY", "SEND_CREDENTIALS_TO_TIKV",
"SEPARATOR", "SEQUENCE", "SERIAL", "SERIALIZABLE", "SESSION",
"SESSION_STATES", "SET", "SETVAL", "SHARD_ROW_ID_BITS", "SHARE",
"SHARED", "SHOW", "SHUTDOWN", "SIGNED", "SIMPLE", "SKIP",
"SKIP_SCHEMA_FILES", "SLAVE", "SLOW", "SMALLINT", "SNAPSHOT",
"SOME", "SOURCE", "SPATIAL", "SPLIT", "SQL", "SQL_BIG_RESULT",
"SQL_BUFFER_RESULT", "SQL_CACHE", "SQL_CALC_FOUND_ROWS",
"SQL_NO_CACHE", "SQL_SMALL_RESULT", "SQL_TSI_DAY", "SQL_TSI_HOUR",
"SQL_TSI_MINUTE", "SQL_TSI_MONTH", "SQL_TSI_QUARTER",
"SQL_TSI_SECOND", "SQL_TSI_WEEK", "SQL_TSI_YEAR", "SSL",
"STALENESS", "START", "STARTING", "STATISTICS", "STATS",
"STATS_AUTO_RECALC", "STATS_BUCKETS", "STATS_COL_CHOICE",
"STATS_COL_LIST", "STATS_EXTENDED", "STATS_HEALTHY",
"STATS_HISTOGRAMS", "STATS_META", "STATS_OPTIONS",
"STATS_PERSISTENT", "STATS_SAMPLE_PAGES", "STATS_SAMPLE_RATE",
"STATS_TOPN", "STATUS", "STD", "STDDEV", "STDDEV_POP",
"STDDEV_SAMP", "STOP", "STORAGE", "STORED", "STRAIGHT_JOIN",
"STRICT", "STRICT_FORMAT", "STRONG", "SUBDATE", "SUBJECT",
"SUBPARTITION", "SUBPARTITIONS", "SUBSTRING", "SUM", "SUPER",
"SWAPS", "SWITCHES", "SYSTEM", "SYSTEM_TIME", "TABLE", "TABLES",
"TABLESAMPLE", "TABLESPACE", "TABLE_CHECKSUM", "TARGET",
"TELEMETRY", "TELEMETRY_ID", "TEMPORARY", "TEMPTABLE",
"TERMINATED", "TEXT", "THAN", "THEN", "TIDB", "TIFLASH",
"TIKV_IMPORTER", "TIME", "TIMESTAMP", "TIMESTAMPADD",
"TIMESTAMPDIFF", "TINYBLOB", "TINYINT", "TINYTEXT", "TLS", "TO",
"TOKUDB_DEFAULT", "TOKUDB_FAST", "TOKUDB_LZMA", "TOKUDB_QUICKLZ",
"TOKUDB_SMALL", "TOKUDB_SNAPPY", "TOKUDB_UNCOMPRESSED",
"TOKUDB_ZLIB", "TOP", "TOPN", "TRACE", "TRADITIONAL", "TRAILING",
"TRANSACTION", "TRIGGER", "TRIGGERS", "TRIM", "TRUE",
"TRUE_CARD_COST", "TRUNCATE", "TYPE", "UNBOUNDED", "UNCOMMITTED",
"UNDEFINED", "UNICODE", "UNION", "UNIQUE", "UNKNOWN", "UNLOCK",
"UNSIGNED", "USAGE", "USE", "USER", "USING", "UTC_DATE",
"UTC_TIME", "UTC_TIMESTAMP", "VALIDATION", "VALUE", "VALUES",
"VARBINARY", "VARCHAR", "VARCHARACTER", "VARIABLES", "VARIANCE",
"VARYING", "VAR_POP", "VAR_SAMP", "VERBOSE", "VIEW", "VIRTUAL",
"VISIBLE", "VOTER", "VOTERS", "VOTER_CONSTRAINTS", "WAIT",
"WARNINGS", "WEEK", "WEIGHT_STRING", "WHEN", "WIDTH", "WINDOW",
"WITH", "WITHOUT", "WRITE", "X509", "XOR", "YEAR", "YEAR_MONTH",
"ZEROFILL"
]
functions = ['AVG', 'CONCAT', 'COUNT', 'DISTINCT', 'FIRST', 'FORMAT',
'FROM_UNIXTIME', 'LAST', 'LCASE', 'LEN', 'MAX', 'MID',
'MIN', 'NOW', 'ROUND', 'SUM', 'TOP', 'UCASE', 'UNIX_TIMESTAMP']
'MIN', 'NOW', 'ROUND', 'SUM', 'TOP', 'UCASE',
'UNIX_TIMESTAMP'
]
# https://docs.pingcap.com/tidb/dev/tidb-functions
tidb_functions = [
'TIDB_BOUNDED_STALENESS', 'TIDB_DECODE_KEY', 'TIDB_DECODE_PLAN',
'TIDB_IS_DDL_OWNER', 'TIDB_PARSE_TSO', 'TIDB_VERSION',
'TIDB_DECODE_SQL_DIGESTS', 'VITESS_HASH', 'TIDB_SHARD'
]
show_items = []
@ -94,9 +239,12 @@ class SQLCompleter(Completer):
def extend_database_names(self, databases):
self.databases.extend(databases)
def extend_keywords(self, additional_keywords):
self.keywords.extend(additional_keywords)
self.all_completions.update(additional_keywords)
def extend_keywords(self, keywords, replace=False):
if replace:
self.keywords = keywords
else:
self.keywords.extend(keywords)
self.all_completions.update(keywords)
def extend_show_items(self, show_items):
for show_item in show_items:
@ -172,7 +320,12 @@ class SQLCompleter(Completer):
metadata[self.dbname][relname].append(column)
self.all_completions.add(column)
def extend_functions(self, func_data):
def extend_functions(self, func_data, builtin=False):
# if 'builtin' is set this is extending the list of builtin functions
if builtin:
self.functions.extend(func_data)
return
# 'func_data' is a generator object. It can throw an exception while
# being consumed. This could happen if the user has launched the app
# without specifying a database name. This exception must be handled to
@ -224,13 +377,13 @@ class SQLCompleter(Completer):
if fuzzy:
regex = '.*?'.join(map(escape, text))
pat = compile('(%s)' % regex)
for item in sorted(collection):
for item in collection:
r = pat.search(item.lower())
if r:
completions.append((len(r.group()), r.start(), item))
else:
match_end_limit = len(text) if start_only else None
for item in sorted(collection):
for item in collection:
match_point = item.lower().find(text, 0, match_end_limit)
if match_point >= 0:
completions.append((len(text), match_point, item))
@ -244,7 +397,7 @@ class SQLCompleter(Completer):
return kw.lower()
return (Completion(z if casing is None else apply_case(z), -len(text))
for x, y, z in sorted(completions))
for x, y, z in completions)
def get_completions(self, document, complete_event, smart_completion=None):
word_before_cursor = document.get_word_before_cursor(WORD=True)

View file

@ -56,7 +56,7 @@ class ServerInfo:
re_species = (
(r'(?P<version>[0-9\.]+)-MariaDB', ServerSpecies.MariaDB),
(r'(?P<version>[0-9\.]+)[a-z0-9]*-TiDB', ServerSpecies.TiDB),
(r'[0-9\.]*-TiDB-v(?P<version>[0-9\.]+)-?(?P<comment>[a-z0-9\-]*)', ServerSpecies.TiDB),
(r'(?P<version>[0-9\.]+)[a-z0-9]*-(?P<comment>[0-9]+$)',
ServerSpecies.Percona),
(r'(?P<version>[0-9\.]+)[a-z0-9]*-(?P<comment>[A-Za-z0-9_]+)',