kaqing 2.0.59__tar.gz → 2.0.60__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kaqing-2.0.59 → kaqing-2.0.60}/PKG-INFO +1 -1
- kaqing-2.0.60/adam/sql/sql_completer.py +543 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sql/term_completer.py +1 -1
- kaqing-2.0.60/adam/version.py +5 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/kaqing.egg-info/PKG-INFO +1 -1
- {kaqing-2.0.59 → kaqing-2.0.60}/setup.py +1 -1
- kaqing-2.0.59/adam/sql/sql_completer.py +0 -710
- kaqing-2.0.59/adam/version.py +0 -5
- {kaqing-2.0.59 → kaqing-2.0.60}/README +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/app_session.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/apps.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/batch.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/check.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/check_context.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/check_result.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/check_utils.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/compactionstats.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/cpu.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/disk.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/gossip.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/issue.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/memory.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/checks/status.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/cli.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/cli_group.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/column.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/columns.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/compactions.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/cpu.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/dir_data.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/dir_snapshots.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/gossip.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/host_id.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/memory.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/node_address.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/node_load.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/node_owns.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/node_status.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/node_tokens.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/node_utils.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/pod_name.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/volume_cassandra.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/columns/volume_root.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/alter_tables.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/app.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/app_ping.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/bash.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/cd.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/check.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/cli_commands.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/command.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/command_helpers.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/commands_utils.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/cp.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/cql/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/cql/cql_completions.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/cql/cql_table_completer.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/cql/cql_utils.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/cql/cqlsh.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/code_start.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/code_stop.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/code_utils.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/deploy.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/deploy_frontend.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/deploy_pg_agent.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/deploy_pod.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/deploy_utils.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/undeploy.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/undeploy_frontend.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/undeploy_pg_agent.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/deploy/undeploy_pod.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/describe/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/describe/describe.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/describe/describe_keyspace.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/describe/describe_keyspaces.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/describe/describe_table.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/describe/describe_tables.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/devices.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/exit.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/help.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/issues.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/login.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/logs.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/ls.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/medusa/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/medusa/medusa.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/medusa/medusa_backup.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/medusa/medusa_restore.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/medusa/medusa_show_backupjobs.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/medusa/medusa_show_restorejobs.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/nodetool.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/nodetool_commands.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/param_get.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/param_set.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/postgres/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/postgres/postgres.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/postgres/postgres_ls.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/postgres/postgres_preview.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/postgres/postgres_session.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/postgres/postgres_utils.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/postgres/psql_completions.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/postgres/psql_table_completer.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/preview_table.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/pwd.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_forward.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_forward_stop.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_restart.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_run_abort.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_runs.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_runs_abort.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_schedule_activate.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_schedule_start.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_schedule_stop.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_schedules.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_session.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/reaper/reaper_status.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/repair/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/repair/repair.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/repair/repair_log.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/repair/repair_run.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/repair/repair_scan.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/repair/repair_stop.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/report.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/restart.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/rollout.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/shell.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_adam.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_app_actions.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_app_id.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_app_queues.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_cassandra_status.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_cassandra_version.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_commands.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_login.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_params.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_processes.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_repairs.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/show/show_storage.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/commands/watch.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/config.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/embedded_apps.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/embedded_params.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/cassandra_clusters.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/cassandra_nodes.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/config_maps.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/custom_resources.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/deployment.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/ingresses.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/jobs.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/kube_context.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/pods.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/secrets.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/service_accounts.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/services.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/statefulsets.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/k8s_utils/volumes.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/log.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/pod_exec_result.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/repl.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/repl_commands.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/repl_session.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/repl_state.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sql/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/__init__.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/authenticator.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/authn_ad.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/authn_okta.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/cred_cache.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/id_token.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/idp.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/idp_login.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/idp_session.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/sso/sso_config.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/adam/utils.py +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/kaqing.egg-info/SOURCES.txt +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/kaqing.egg-info/dependency_links.txt +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/kaqing.egg-info/entry_points.txt +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/kaqing.egg-info/top_level.txt +0 -0
- {kaqing-2.0.59 → kaqing-2.0.60}/setup.cfg +0 -0
@@ -0,0 +1,543 @@
|
|
1
|
+
from typing import Callable, Iterable
|
2
|
+
from prompt_toolkit.completion import CompleteEvent, Completer, Completion
|
3
|
+
from prompt_toolkit.document import Document
|
4
|
+
import sqlparse
|
5
|
+
from sqlparse.sql import Statement, Token
|
6
|
+
from sqlparse import tokens as T
|
7
|
+
|
8
|
+
from adam.sql.term_completer import TermCompleter
|
9
|
+
|
10
|
+
columns = TermCompleter(['id', 'x.', 'y.', 'z.'])
|
11
|
+
|
12
|
+
def fr(*args):
|
13
|
+
for arg in args:
|
14
|
+
pass
|
15
|
+
|
16
|
+
class SqlCompleter(Completer):
|
17
|
+
# <select_statement> ::= SELECT <select_list>
|
18
|
+
# FROM <table_expression>
|
19
|
+
# [WHERE <search_condition>]
|
20
|
+
# [<group_by_clause>]
|
21
|
+
# [<having_clause>]
|
22
|
+
# [<order_by_clause>]
|
23
|
+
# [<limit_clause>]
|
24
|
+
|
25
|
+
# <search_condition> ::= <boolean_term>
|
26
|
+
# | <search_condition> OR <boolean_term>
|
27
|
+
|
28
|
+
# <boolean_term> ::= <boolean_factor>
|
29
|
+
# | <boolean_term> AND <boolean_factor>
|
30
|
+
|
31
|
+
# <boolean_factor> ::= [NOT] <predicate>
|
32
|
+
# | ([NOT] <search_condition>)
|
33
|
+
|
34
|
+
# <predicate> ::= <comparison_predicate>
|
35
|
+
# | <between_predicate>
|
36
|
+
# | <in_predicate>
|
37
|
+
# | <like_predicate>
|
38
|
+
# | <null_predicate>
|
39
|
+
# | <exists_predicate>
|
40
|
+
# | <quantified_predicate>
|
41
|
+
# | <unique_predicate>
|
42
|
+
# | <match_predicate>
|
43
|
+
# | <overlaps_predicate>
|
44
|
+
# | <distinct_predicate>
|
45
|
+
# | <member_predicate>
|
46
|
+
# | <submultiset_predicate>
|
47
|
+
# | <set_predicate>
|
48
|
+
|
49
|
+
# <comparison_predicate> ::= <row_value_expression> <comparison_operator> <row_value_expression>
|
50
|
+
# <comparison_operator> ::= '=' | '<>' | '<' | '<=' | '>' | '>='
|
51
|
+
|
52
|
+
# <row_value_expression> ::= <value_expression>
|
53
|
+
# | (<value_expression> [ { <comma> <value_expression> }... ])
|
54
|
+
|
55
|
+
# <value_expression> ::= <numeric_value_expression>
|
56
|
+
# | <string_value_expression>
|
57
|
+
# | <datetime_value_expression>
|
58
|
+
# | <interval_value_expression>
|
59
|
+
# | <boolean_value_expression>
|
60
|
+
# | <user_defined_type_value_expression>
|
61
|
+
# | <reference_value_expression>
|
62
|
+
# | <collection_value_expression>
|
63
|
+
# | <row_value_constructor>
|
64
|
+
# | <case_expression>
|
65
|
+
# | <cast_expression>
|
66
|
+
# | <subquery>
|
67
|
+
# | NULL
|
68
|
+
# | DEFAULT
|
69
|
+
# | <identifier>
|
70
|
+
# | <literal>
|
71
|
+
|
72
|
+
# <insert_statement> ::= INSERT INTO <table_name> [ ( <column_list> ) ]
|
73
|
+
# VALUES ( <value_list> )
|
74
|
+
# | INSERT INTO <table_name> [ ( <column_list> ) ]
|
75
|
+
# <query_expression>
|
76
|
+
|
77
|
+
# <table_name> ::= <identifier>
|
78
|
+
|
79
|
+
# <column_list> ::= <column_name> [ , <column_list> ]
|
80
|
+
|
81
|
+
# <column_name> ::= <identifier>
|
82
|
+
|
83
|
+
# <value_list> ::= <expression> [ , <value_list> ]
|
84
|
+
|
85
|
+
# <query_expression> ::= SELECT <select_list> FROM <table_reference_list> [ WHERE <search_condition> ] [ GROUP BY <grouping_column_list> ] [ HAVING <search_condition> ] [ ORDER BY <sort_specification_list> ]
|
86
|
+
|
87
|
+
# <update_statement> ::= UPDATE <table_name>
|
88
|
+
# SET <set_clause_list>
|
89
|
+
# [WHERE <search_condition>]
|
90
|
+
|
91
|
+
# <set_clause_list> ::= <set_clause> { , <set_clause> }
|
92
|
+
|
93
|
+
# <set_clause> ::= <column_name> = <update_value>
|
94
|
+
|
95
|
+
# <update_value> ::= <expression> | NULL | DEFAULT
|
96
|
+
|
97
|
+
# <search_condition> ::= <boolean_expression>
|
98
|
+
|
99
|
+
# <delete_statement> ::= DELETE FROM <table_name> [ WHERE <search_condition> ]
|
100
|
+
|
101
|
+
# <table_name> ::= <identifier>
|
102
|
+
|
103
|
+
# <search_condition> ::= <boolean_expression>
|
104
|
+
|
105
|
+
# <boolean_expression> ::= <predicate>
|
106
|
+
# | <boolean_expression> AND <predicate>
|
107
|
+
# | <boolean_expression> OR <predicate>
|
108
|
+
# | NOT <predicate>
|
109
|
+
# | ( <boolean_expression> )
|
110
|
+
|
111
|
+
# <predicate> ::= <expression> <comparison_operator> <expression>
|
112
|
+
# | <expression> IS NULL
|
113
|
+
# | <expression> IS NOT NULL
|
114
|
+
# | <expression> LIKE <pattern> [ ESCAPE <escape_character> ]
|
115
|
+
# | <expression> IN ( <expression_list> )
|
116
|
+
# | EXISTS ( <select_statement> )
|
117
|
+
# | ... (other predicates)
|
118
|
+
|
119
|
+
# <comparison_operator> ::= = | <> | != | > | < | >= | <=
|
120
|
+
|
121
|
+
# <expression> ::= <literal>
|
122
|
+
# | <column_name>
|
123
|
+
# | <function_call>
|
124
|
+
# | ( <expression> )
|
125
|
+
# | <expression> <arithmetic_operator> <expression>
|
126
|
+
# | ... (other expressions)
|
127
|
+
|
128
|
+
# <literal> ::= <numeric_literal> | <string_literal> | <boolean_literal> | <date_literal> | ...
|
129
|
+
|
130
|
+
# <column_name> ::= <identifier>
|
131
|
+
|
132
|
+
# <identifier> ::= <letter> { <letter> | <digit> | _ }...
|
133
|
+
|
134
|
+
# <pattern> ::= <string_literal>
|
135
|
+
|
136
|
+
# <escape_character> ::= <string_literal> (single character)
|
137
|
+
|
138
|
+
# <expression_list> ::= <expression> { , <expression> }...
|
139
|
+
def __init__(self, tables: Callable[[], list[str]], dml: str = None, debug = False):
|
140
|
+
super().__init__()
|
141
|
+
self.dml = dml
|
142
|
+
self.tables = tables
|
143
|
+
self.debug = debug
|
144
|
+
self.machine = self.automata()
|
145
|
+
|
146
|
+
def get_completions(
|
147
|
+
self, document: Document, complete_event: CompleteEvent
|
148
|
+
) -> Iterable[Completion]:
|
149
|
+
text = document.text_before_cursor.lstrip()
|
150
|
+
if self.dml:
|
151
|
+
state = f'{self.dml}_'
|
152
|
+
text = f'{self.dml} {text}'
|
153
|
+
|
154
|
+
completer = None
|
155
|
+
stmts = sqlparse.parse(text)
|
156
|
+
if not stmts:
|
157
|
+
completer = TermCompleter(['select', 'insert', 'delete', 'update'])
|
158
|
+
else:
|
159
|
+
statement: Statement = stmts[0]
|
160
|
+
state = self.traverse_tokens(text, statement.tokens)
|
161
|
+
if self.debug:
|
162
|
+
print('\n =>', state)
|
163
|
+
if state == '':
|
164
|
+
completer = TermCompleter(['select', 'insert', 'delete', 'update'])
|
165
|
+
|
166
|
+
elif state == 'select_':
|
167
|
+
completer = TermCompleter(['*'])
|
168
|
+
elif state == 'select_a':
|
169
|
+
completer = TermCompleter(['from'])
|
170
|
+
elif state == 'select_a_comma_':
|
171
|
+
completer = TermCompleter(['*'])
|
172
|
+
elif state == 'select_a_':
|
173
|
+
completer = TermCompleter(['from'])
|
174
|
+
elif state == "select_from_":
|
175
|
+
completer = TermCompleter(self.tables())
|
176
|
+
elif state == "select_from_x_":
|
177
|
+
completer = TermCompleter(['as', 'where', 'inner', 'left', 'right', 'full', 'group', 'limit'])
|
178
|
+
elif state == "select_from_x_as_x_":
|
179
|
+
completer = TermCompleter(['where', 'inner', 'left', 'right', 'full', 'group', 'limit'])
|
180
|
+
elif state == "select_from_x_comma_":
|
181
|
+
completer = TermCompleter(self.tables())
|
182
|
+
elif state == "select_from_x_as_":
|
183
|
+
completer = TermCompleter(['x', 'y', 'z'])
|
184
|
+
elif state == "select_from_x_as_x_comma_":
|
185
|
+
completer = TermCompleter(self.tables())
|
186
|
+
elif state == "select_where_":
|
187
|
+
completer = columns
|
188
|
+
elif state in ["select_where_a", "select_where_a_"]:
|
189
|
+
completer = TermCompleter(['=', '<', '<=', '>', '>=', '<>', 'like', 'not', 'in'])
|
190
|
+
elif state == "select_where_a_not_":
|
191
|
+
completer = TermCompleter(['like', 'in'])
|
192
|
+
elif state == "select_where_a_in":
|
193
|
+
completer = TermCompleter(['('])
|
194
|
+
elif state == "select_where_a_in_lp_":
|
195
|
+
completer = TermCompleter(["'", ')'])
|
196
|
+
elif state == "select_where_a_in_lp_a_comma_":
|
197
|
+
completer = TermCompleter(["'"])
|
198
|
+
elif state == "select_where_a_op":
|
199
|
+
completer = TermCompleter(["'"])
|
200
|
+
elif state == "select_where_sc_":
|
201
|
+
completer = TermCompleter(['and', 'or', 'group', 'limit'])
|
202
|
+
elif state == "select_where_sc_limit_":
|
203
|
+
completer = TermCompleter(['1'])
|
204
|
+
elif state == "select_group_":
|
205
|
+
completer = TermCompleter(['by'])
|
206
|
+
elif state == "select_group_by_":
|
207
|
+
completer = columns
|
208
|
+
elif state == "select_group_by_a_comma_":
|
209
|
+
completer = columns
|
210
|
+
elif state == "select_group_by_a_":
|
211
|
+
completer = TermCompleter(['limit'])
|
212
|
+
elif state == "select_group_by_a_limit_":
|
213
|
+
completer = TermCompleter(['1'])
|
214
|
+
elif state == "select_from_x_inner_":
|
215
|
+
completer = TermCompleter(['join'])
|
216
|
+
elif state in ["select_join_", "select_from_x_left_join_"]:
|
217
|
+
completer = TermCompleter(self.tables())
|
218
|
+
elif state == "select_x_join_y,":
|
219
|
+
completer = TermCompleter(self.tables())
|
220
|
+
elif state == "select_x_join_y_":
|
221
|
+
completer = TermCompleter(['on'])
|
222
|
+
elif state == "select_x_join_y_on_":
|
223
|
+
completer = columns
|
224
|
+
elif state == "select_x_join_y_on_a":
|
225
|
+
completer = TermCompleter(['='])
|
226
|
+
elif state == "select_x_join_y_on_a_op":
|
227
|
+
completer = columns
|
228
|
+
elif state == "select_x_join_y_on_a_op_b_":
|
229
|
+
completer = TermCompleter(['where', 'group', 'limit'])
|
230
|
+
elif state == "select_from_x_left_":
|
231
|
+
completer = TermCompleter(['outer', 'join'])
|
232
|
+
elif state == "select_from_x_left_outer_":
|
233
|
+
completer = TermCompleter(['join'])
|
234
|
+
elif state == "select_from_x_right_":
|
235
|
+
completer = TermCompleter(['outer', 'join'])
|
236
|
+
elif state == "select_from_x_right_outer_":
|
237
|
+
completer = TermCompleter(['join'])
|
238
|
+
elif state == "select_from_x_full_":
|
239
|
+
completer = TermCompleter(['outer'])
|
240
|
+
elif state == "select_from_x_full_outer_":
|
241
|
+
completer = TermCompleter(['join'])
|
242
|
+
|
243
|
+
elif state == "insert_":
|
244
|
+
completer = TermCompleter(['into'])
|
245
|
+
elif state == "insert_into_":
|
246
|
+
completer = TermCompleter(self.tables())
|
247
|
+
elif state == "insert_into_x_":
|
248
|
+
completer = TermCompleter(['values(', 'select'])
|
249
|
+
elif state == "insert_into_x_lp_":
|
250
|
+
completer = columns
|
251
|
+
elif state == "insert_into_x_lp_a_comma_":
|
252
|
+
completer = columns
|
253
|
+
elif state == "insert_into_x_lp_a_rp__":
|
254
|
+
completer = TermCompleter(['values(', 'select'])
|
255
|
+
elif state == "insert_values":
|
256
|
+
completer = TermCompleter(['('])
|
257
|
+
elif state == "insert_values_lp_":
|
258
|
+
completer = TermCompleter(["'"])
|
259
|
+
|
260
|
+
elif state == "update_":
|
261
|
+
completer = TermCompleter(self.tables())
|
262
|
+
elif state == "update_x_":
|
263
|
+
completer = TermCompleter(['set'])
|
264
|
+
elif state in ["update_set_", "update_set_sc_comma_"]:
|
265
|
+
completer = columns
|
266
|
+
elif state == "update_set_a":
|
267
|
+
completer = TermCompleter(['='])
|
268
|
+
elif state == "update_set_a_op":
|
269
|
+
completer = TermCompleter(["'"])
|
270
|
+
elif state == "update_set_sc_":
|
271
|
+
completer = TermCompleter(['where'])
|
272
|
+
elif state == "update_where_":
|
273
|
+
completer = columns
|
274
|
+
elif state == "update_where_a":
|
275
|
+
completer = TermCompleter(['='])
|
276
|
+
elif state == "update_where_sc_":
|
277
|
+
completer = TermCompleter(['and', 'or'])
|
278
|
+
|
279
|
+
elif state == "delete_":
|
280
|
+
completer = TermCompleter(['from'])
|
281
|
+
elif state == "delete_from_":
|
282
|
+
completer = TermCompleter(self.tables())
|
283
|
+
elif state == "delete_from_x_":
|
284
|
+
completer = TermCompleter(['where'])
|
285
|
+
elif state == "delete_where_":
|
286
|
+
completer = columns
|
287
|
+
elif state == "delete_where_a":
|
288
|
+
completer = TermCompleter(['='])
|
289
|
+
elif state == "delete_where_a_op":
|
290
|
+
completer = TermCompleter(["'"])
|
291
|
+
elif state == "delete_where_sc_":
|
292
|
+
completer = TermCompleter(['and', 'or'])
|
293
|
+
|
294
|
+
if completer:
|
295
|
+
for c in completer.get_completions(document, complete_event):
|
296
|
+
yield c
|
297
|
+
|
298
|
+
def automata(self):
|
299
|
+
y = [
|
300
|
+
' > select > select',
|
301
|
+
'select_ > name|* > select_a',
|
302
|
+
'select_a > , > select_a_comma_',
|
303
|
+
'select_a_comma_ > name|* > select_a',
|
304
|
+
'select_a_ > from > select_from',
|
305
|
+
'select_from_ > name > select_from_x',
|
306
|
+
'select_from_x > , > select_from_x_comma_',
|
307
|
+
'select_from_x_comma_ > name > select_from_x',
|
308
|
+
'select_from_x_',
|
309
|
+
'select_from_x_as_x_ > , > select_from_x_comma_',
|
310
|
+
'- > as > select_from_x_as',
|
311
|
+
'- > where > select_where',
|
312
|
+
'- > limit > select_where_sc_limit',
|
313
|
+
'- > group > select_group',
|
314
|
+
'- > group by > select_group_by',
|
315
|
+
'- > inner > select_from_x_inner',
|
316
|
+
'- > inner join > select_join',
|
317
|
+
'- > left > select_from_x_left',
|
318
|
+
'- > left join > select_join',
|
319
|
+
'- > left outer join > select_join',
|
320
|
+
'- > right > select_from_x_right',
|
321
|
+
'- > right join > select_join',
|
322
|
+
'- > right outer join > select_join',
|
323
|
+
'- > full > select_from_x_full',
|
324
|
+
'- > full outer join > select_join',
|
325
|
+
'select_from_x_as_ > name > select_from_x_as_x',
|
326
|
+
'select_from_x_as_x > , > select_from_x_as_x_comma_',
|
327
|
+
'select_from_x_as_x_comma_ > name > select_from_x_as_x',
|
328
|
+
'select_where_ > name > select_where_a',
|
329
|
+
'select_where_a > comparison > select_where_a_op',
|
330
|
+
'select_where_a_ > comparison > select_where_a_op',
|
331
|
+
'- > not > select_where_a_not',
|
332
|
+
'- > in > select_where_a_in',
|
333
|
+
'select_where_a_not_ > comparison > select_where_a_not_op',
|
334
|
+
'- > in > select_where_a_in',
|
335
|
+
'select_where_a_in > ( > select_where_a_in_lp_',
|
336
|
+
'select_where_a_in_lp_ > name|single > select_where_a_in_lp_a',
|
337
|
+
'select_where_a_in_lp_a > , > select_where_a_in_lp_a_comma_',
|
338
|
+
'- > ) > select_where_sc',
|
339
|
+
'select_where_a_in_lp_a_comma_ > name|single > select_where_a_in_lp_a',
|
340
|
+
'select_where_a_not_op > name|single > select_where_sc',
|
341
|
+
'select_where_a_op > name|single > select_where_sc',
|
342
|
+
'select_where_sc_ > and|or > select_where',
|
343
|
+
'- > group > select_group',
|
344
|
+
'- > group by > select_group_by',
|
345
|
+
'- > limit > select_where_sc_limit',
|
346
|
+
'select_group_ > by > select_group_by',
|
347
|
+
'select_group_by_ > name > select_group_by_a',
|
348
|
+
'select_group_by_a > , > select_group_by_a_comma_',
|
349
|
+
'select_group_by_a_comma_ > name > select_group_by_a',
|
350
|
+
'select_group_by_a_ > limit > select_where_sc_limit',
|
351
|
+
'select_where_sc_limit > _ > select_where_sc_limit_',
|
352
|
+
'select_where_x_inner_ > join > select_join',
|
353
|
+
'select_join_ > name > select_x_join_y',
|
354
|
+
'select_from_x_left_ > join > select_join',
|
355
|
+
'- > outer > select_from_x_left_outer',
|
356
|
+
'select_from_x_left_outer_ > join > select_join',
|
357
|
+
'select_from_x_ > left outer join > select_join',
|
358
|
+
'select_from_x_right_ > join > select_join',
|
359
|
+
'- > outer > select_from_x_right_outer',
|
360
|
+
'select_from_x_right_outer_ > join > select_join',
|
361
|
+
'select_from_x_full_ > join > select_join',
|
362
|
+
'- > outer > select_from_x_full_outer',
|
363
|
+
'select_from_x_full_outer_ > join > select_join',
|
364
|
+
'select_x_join_y > , > select_x_join_y_comma_',
|
365
|
+
'select_x_join_y_comma_ > name > select_x_join_y',
|
366
|
+
'select_x_join_y_ > on > select_x_join_y_on',
|
367
|
+
'select_x_join_y_on_ > name > select_x_join_y_on_a',
|
368
|
+
'select_x_join_y_on_a > comparison > select_x_join_y_on_a_op',
|
369
|
+
'select_x_join_y_on_a_op > name|single > select_x_join_y_on_a_op_b',
|
370
|
+
'select_x_join_y_on_a_op_b > , > select_x_join_y_on_',
|
371
|
+
'select_x_join_y_on_a_op_b_ > and|or > select_join',
|
372
|
+
'- > where > select_where',
|
373
|
+
'- > group > select_group',
|
374
|
+
'- > group by > select_group_by',
|
375
|
+
'- > limit > select_where_sc_limit',
|
376
|
+
|
377
|
+
|
378
|
+
' > insert > insert',
|
379
|
+
'insert_ > into > insert_into',
|
380
|
+
'insert_into_ > name > insert_into_x',
|
381
|
+
'insert_into_x > ( > insert_into_x_lp_',
|
382
|
+
'insert_into_x_ > ( > insert_into_x_lp_',
|
383
|
+
'- > values > insert_values',
|
384
|
+
'insert_into_x_lp_ > name > insert_into_x_lp_a',
|
385
|
+
'insert_into_x_lp_a > , > insert_into_x_lp_a_comma_',
|
386
|
+
'- > ) > insert_into_x_lp_a_rp_',
|
387
|
+
'insert_into_x_lp_a_comma_ > name > insert_into_x_lp_a',
|
388
|
+
'insert_into_x_lp_a_rp__ > values > insert_values',
|
389
|
+
'- > select > select',
|
390
|
+
'insert_values > ( > insert_values_lp_',
|
391
|
+
'insert_values_lp_ > name|single > insert_values_lp_v',
|
392
|
+
'insert_values_lp_v > , > insert_values_lp_v_comma_',
|
393
|
+
'insert_values_lp_v_comma_ > name|single > insert_values_lp_v',
|
394
|
+
|
395
|
+
|
396
|
+
' > update > update',
|
397
|
+
'update_ > name > update_x',
|
398
|
+
'update_x_ > set > update_set',
|
399
|
+
'update_set_ > name > update_set_a',
|
400
|
+
'update_set_a > comparison > update_set_a_op',
|
401
|
+
'update_set_a_op > name|single > update_set_sc',
|
402
|
+
'update_set_sc > , > update_set_sc_comma_',
|
403
|
+
'update_set_sc_comma_ > name > update_set_a',
|
404
|
+
'update_set_sc_ > , > update_set_sc_comma_',
|
405
|
+
'- > where > update_where',
|
406
|
+
'update_where_ > name > update_where_a',
|
407
|
+
'update_where_a > comparison > update_where_a_op',
|
408
|
+
'update_where_a_op > name|single > update_where_sc',
|
409
|
+
'update_where_sc_ > and|or > update_where',
|
410
|
+
|
411
|
+
|
412
|
+
' > delete > delete',
|
413
|
+
'delete_ > from > delete_from',
|
414
|
+
'delete_from_ > name > delete_from_x',
|
415
|
+
'delete_from_x_ > where > delete_where',
|
416
|
+
'delete_where_ > name > delete_where_a',
|
417
|
+
'delete_where_a > comparison > delete_where_a_op',
|
418
|
+
'delete_where_a_op > name|single > delete_where_sc',
|
419
|
+
'delete_where_sc_ > and|or > delete_where',
|
420
|
+
]
|
421
|
+
|
422
|
+
def add_space_transition(from_s: str):
|
423
|
+
# add whitespace transition if a state with trailing whitespace is found from from states, for example, select > _ > select_
|
424
|
+
if from_s.endswith('_') and not from_s.endswith('_comma_') and not from_s.endswith('_lp_') and not from_s.endswith('_rp_'):
|
425
|
+
if self.debug:
|
426
|
+
print(f'{from_s[:-1]} > _ = {to_s}')
|
427
|
+
machine[f'{from_s[:-1]} > _'] = from_s
|
428
|
+
|
429
|
+
machine: dict[str, str] = {}
|
430
|
+
|
431
|
+
from_ss_to_add = []
|
432
|
+
from_ss = ['']
|
433
|
+
token = None
|
434
|
+
tokens = []
|
435
|
+
to_s = None
|
436
|
+
for l in y:
|
437
|
+
tks = l.split('>')
|
438
|
+
if l.startswith('-'):
|
439
|
+
token = tks[1].strip(' ')
|
440
|
+
if len(tks) > 2:
|
441
|
+
to_s = tks[2].strip(' ')
|
442
|
+
for from_s in from_ss:
|
443
|
+
tokens = [token]
|
444
|
+
if '|' in token:
|
445
|
+
tokens = token.strip(' ').split('|')
|
446
|
+
|
447
|
+
for t in tokens:
|
448
|
+
if self.debug:
|
449
|
+
print(f'{from_s} > {t} = {to_s}')
|
450
|
+
machine[f'{from_s} > {t}'] = to_s
|
451
|
+
else:
|
452
|
+
if len(tks) == 1:
|
453
|
+
from_s = tks[0].strip(' ')
|
454
|
+
add_space_transition(from_s)
|
455
|
+
from_ss_to_add.append(f'{from_s}')
|
456
|
+
continue
|
457
|
+
|
458
|
+
from_ss = []
|
459
|
+
from_ss.extend(from_ss_to_add)
|
460
|
+
from_ss_to_add = []
|
461
|
+
from_ss.append(f'{tks[0].strip(" ")}')
|
462
|
+
for from_s in from_ss:
|
463
|
+
add_space_transition(from_s)
|
464
|
+
token = tks[1].strip(' ')
|
465
|
+
tokens = [token]
|
466
|
+
if len(tks) > 2:
|
467
|
+
to_s = tks[2].strip(' ')
|
468
|
+
|
469
|
+
if '|' in token:
|
470
|
+
tokens = token.split('|')
|
471
|
+
|
472
|
+
for t in tokens:
|
473
|
+
if self.debug:
|
474
|
+
print(f'{from_s} > {t} = {to_s}')
|
475
|
+
machine[f'{from_s} > {t}'] = to_s
|
476
|
+
|
477
|
+
return machine
|
478
|
+
|
479
|
+
def traverse_tokens(self, text: str, tokens: list[Token], state: str = '', indent=0):
|
480
|
+
keywords = [
|
481
|
+
'select', 'from', 'as', 'not', 'in', 'where',
|
482
|
+
'and', 'or', 'group', 'by', 'group by', 'limit',
|
483
|
+
'inner join', 'on', 'left', 'right', 'full', 'outer', 'left outer join',
|
484
|
+
'left join', 'right outer join', 'right join', 'full join', 'full outer join',
|
485
|
+
|
486
|
+
'insert', 'into', 'values',
|
487
|
+
|
488
|
+
'update', 'where', 'set',
|
489
|
+
|
490
|
+
'delete'
|
491
|
+
]
|
492
|
+
|
493
|
+
for token in tokens:
|
494
|
+
if self.debug:
|
495
|
+
if token.ttype == T.Whitespace:
|
496
|
+
print('_ ', end='')
|
497
|
+
elif token.ttype in [T.DML, T.Wildcard, T.Punctuation]:
|
498
|
+
print(f'{token.value} ', end='')
|
499
|
+
elif token.ttype:
|
500
|
+
tks = str(token.ttype).split('.')
|
501
|
+
typ = tks[len(tks) - 1]
|
502
|
+
if ' ' in token.value:
|
503
|
+
print(f'"{token.value}:{typ}" ', end='')
|
504
|
+
else:
|
505
|
+
print(f'{token.value}:{typ} ', end='')
|
506
|
+
# print(" " * indent + f"Token: {token.value}, Type: {token.ttype}@{token.ttype.__class__}")
|
507
|
+
|
508
|
+
if token.is_group:
|
509
|
+
state = self.traverse_tokens(text, token.tokens, state, indent + 1)
|
510
|
+
else:
|
511
|
+
it = ''
|
512
|
+
if (t := token.value.lower()) in keywords:
|
513
|
+
it = t
|
514
|
+
elif token.ttype == T.Text.Whitespace:
|
515
|
+
it = '_'
|
516
|
+
elif token.ttype in [T.Name, T.Literal.String.Single]:
|
517
|
+
it = 'name'
|
518
|
+
elif token.ttype == T.Wildcard:
|
519
|
+
it = '*'
|
520
|
+
elif token.ttype == T.Punctuation:
|
521
|
+
if token.value == ',':
|
522
|
+
it = ','
|
523
|
+
elif token.value == '(':
|
524
|
+
it = '('
|
525
|
+
elif token.value == ')':
|
526
|
+
it = ')'
|
527
|
+
elif token.ttype == T.Operator.Comparison:
|
528
|
+
it = 'comparison'
|
529
|
+
|
530
|
+
try:
|
531
|
+
state = self.machine[f'{state} > {it}']
|
532
|
+
except:
|
533
|
+
pass
|
534
|
+
|
535
|
+
return state
|
536
|
+
|
537
|
+
def completions(table_names: Callable[[], list[str]]):
|
538
|
+
return {
|
539
|
+
'delete': SqlCompleter(table_names, 'delete'),
|
540
|
+
'insert': SqlCompleter(table_names, 'insert'),
|
541
|
+
'select': SqlCompleter(table_names, 'select'),
|
542
|
+
'update': SqlCompleter(table_names, 'update'),
|
543
|
+
}
|
@@ -52,7 +52,7 @@ class TermCompleter(WordCompleter):
|
|
52
52
|
return word.startswith(word_before_cursor)
|
53
53
|
|
54
54
|
for a in words:
|
55
|
-
if word_before_cursor in ['(', ',', '=']:
|
55
|
+
if word_before_cursor in ['(', ',', '=', 'in', "',"]:
|
56
56
|
display = self.display_dict.get(a, a)
|
57
57
|
display_meta = self.meta_dict.get(a, "")
|
58
58
|
yield Completion(
|