kaqing 2.0.52__py3-none-any.whl → 2.0.184__py3-none-any.whl

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.

Potentially problematic release.


This version of kaqing might be problematic. Click here for more details.

Files changed (223) hide show
  1. adam/__init__.py +0 -2
  2. adam/app_session.py +9 -12
  3. adam/apps.py +20 -6
  4. adam/batch.py +15 -19
  5. adam/checks/check_utils.py +19 -49
  6. adam/checks/compactionstats.py +1 -1
  7. adam/checks/cpu.py +9 -3
  8. adam/checks/cpu_metrics.py +52 -0
  9. adam/checks/disk.py +3 -4
  10. adam/checks/gossip.py +1 -1
  11. adam/checks/memory.py +3 -3
  12. adam/checks/status.py +1 -1
  13. adam/columns/columns.py +3 -1
  14. adam/columns/cpu.py +3 -1
  15. adam/columns/cpu_metrics.py +22 -0
  16. adam/columns/memory.py +3 -4
  17. adam/commands/__init__.py +24 -0
  18. adam/commands/alter_tables.py +37 -63
  19. adam/commands/app/app.py +38 -0
  20. adam/commands/{app_ping.py → app/app_ping.py} +8 -14
  21. adam/commands/app/show_app_actions.py +49 -0
  22. adam/commands/{show → app}/show_app_id.py +9 -12
  23. adam/commands/{show → app}/show_app_queues.py +8 -14
  24. adam/commands/app/utils_app.py +98 -0
  25. adam/commands/audit/audit.py +81 -0
  26. adam/commands/audit/audit_repair_tables.py +72 -0
  27. adam/commands/audit/audit_run.py +50 -0
  28. adam/commands/audit/show_last10.py +37 -0
  29. adam/commands/audit/show_slow10.py +36 -0
  30. adam/commands/audit/show_top10.py +36 -0
  31. adam/commands/audit/utils_show_top10.py +71 -0
  32. adam/commands/bash/__init__.py +5 -0
  33. adam/commands/bash/bash.py +36 -0
  34. adam/commands/bash/bash_completer.py +93 -0
  35. adam/commands/bash/utils_bash.py +16 -0
  36. adam/commands/cat.py +36 -0
  37. adam/commands/cd.py +14 -89
  38. adam/commands/check.py +18 -21
  39. adam/commands/cli_commands.py +5 -6
  40. adam/commands/clipboard_copy.py +86 -0
  41. adam/commands/code.py +57 -0
  42. adam/commands/command.py +197 -35
  43. adam/commands/commands_utils.py +15 -31
  44. adam/commands/cql/cql_completions.py +29 -8
  45. adam/commands/cql/cqlsh.py +12 -27
  46. adam/commands/cql/utils_cql.py +297 -0
  47. adam/commands/deploy/code_start.py +7 -10
  48. adam/commands/deploy/code_stop.py +4 -21
  49. adam/commands/deploy/code_utils.py +5 -5
  50. adam/commands/deploy/deploy.py +4 -21
  51. adam/commands/deploy/deploy_frontend.py +14 -17
  52. adam/commands/deploy/deploy_pg_agent.py +3 -6
  53. adam/commands/deploy/deploy_pod.py +71 -79
  54. adam/commands/deploy/deploy_utils.py +16 -26
  55. adam/commands/deploy/undeploy.py +4 -21
  56. adam/commands/deploy/undeploy_frontend.py +4 -7
  57. adam/commands/deploy/undeploy_pg_agent.py +6 -8
  58. adam/commands/deploy/undeploy_pod.py +15 -16
  59. adam/commands/devices/__init__.py +0 -0
  60. adam/commands/devices/device.py +123 -0
  61. adam/commands/devices/device_app.py +163 -0
  62. adam/commands/devices/device_auit_log.py +49 -0
  63. adam/commands/devices/device_cass.py +179 -0
  64. adam/commands/devices/device_export.py +84 -0
  65. adam/commands/devices/device_postgres.py +150 -0
  66. adam/commands/devices/devices.py +25 -0
  67. adam/commands/download_file.py +47 -0
  68. adam/commands/exit.py +1 -4
  69. adam/commands/export/__init__.py +0 -0
  70. adam/commands/export/clean_up_all_export_sessions.py +37 -0
  71. adam/commands/export/clean_up_export_sessions.py +39 -0
  72. adam/commands/export/download_export_session.py +39 -0
  73. adam/commands/export/drop_export_database.py +39 -0
  74. adam/commands/export/drop_export_databases.py +37 -0
  75. adam/commands/export/export.py +53 -0
  76. adam/commands/export/export_databases.py +245 -0
  77. adam/commands/export/export_select.py +59 -0
  78. adam/commands/export/export_select_x.py +54 -0
  79. adam/commands/export/export_sessions.py +209 -0
  80. adam/commands/export/export_use.py +49 -0
  81. adam/commands/export/exporter.py +332 -0
  82. adam/commands/export/import_files.py +44 -0
  83. adam/commands/export/import_session.py +44 -0
  84. adam/commands/export/importer.py +81 -0
  85. adam/commands/export/importer_athena.py +177 -0
  86. adam/commands/export/importer_sqlite.py +67 -0
  87. adam/commands/export/show_column_counts.py +45 -0
  88. adam/commands/export/show_export_databases.py +38 -0
  89. adam/commands/export/show_export_session.py +39 -0
  90. adam/commands/export/show_export_sessions.py +37 -0
  91. adam/commands/export/utils_export.py +343 -0
  92. adam/commands/find_files.py +51 -0
  93. adam/commands/find_processes.py +76 -0
  94. adam/commands/head.py +36 -0
  95. adam/commands/help.py +14 -9
  96. adam/commands/intermediate_command.py +49 -0
  97. adam/commands/issues.py +14 -40
  98. adam/commands/kubectl.py +38 -0
  99. adam/commands/login.py +26 -25
  100. adam/commands/logs.py +5 -7
  101. adam/commands/ls.py +11 -110
  102. adam/commands/medusa/medusa.py +4 -22
  103. adam/commands/medusa/medusa_backup.py +22 -29
  104. adam/commands/medusa/medusa_restore.py +40 -39
  105. adam/commands/medusa/medusa_show_backupjobs.py +19 -20
  106. adam/commands/medusa/medusa_show_restorejobs.py +15 -20
  107. adam/commands/nodetool.py +11 -15
  108. adam/commands/param_get.py +11 -14
  109. adam/commands/param_set.py +8 -12
  110. adam/commands/postgres/postgres.py +45 -46
  111. adam/commands/postgres/postgres_databases.py +269 -0
  112. adam/commands/postgres/postgres_ls.py +4 -8
  113. adam/commands/postgres/postgres_preview.py +5 -9
  114. adam/commands/postgres/psql_completions.py +4 -3
  115. adam/commands/postgres/utils_postgres.py +70 -0
  116. adam/commands/preview_table.py +10 -61
  117. adam/commands/pwd.py +14 -43
  118. adam/commands/reaper/reaper.py +4 -24
  119. adam/commands/reaper/reaper_forward.py +49 -56
  120. adam/commands/reaper/reaper_forward_session.py +6 -0
  121. adam/commands/reaper/reaper_forward_stop.py +10 -16
  122. adam/commands/reaper/reaper_restart.py +8 -15
  123. adam/commands/reaper/reaper_run_abort.py +8 -33
  124. adam/commands/reaper/reaper_runs.py +43 -58
  125. adam/commands/reaper/reaper_runs_abort.py +29 -49
  126. adam/commands/reaper/reaper_schedule_activate.py +9 -32
  127. adam/commands/reaper/reaper_schedule_start.py +9 -32
  128. adam/commands/reaper/reaper_schedule_stop.py +9 -32
  129. adam/commands/reaper/reaper_schedules.py +4 -14
  130. adam/commands/reaper/reaper_status.py +8 -16
  131. adam/commands/reaper/utils_reaper.py +194 -0
  132. adam/commands/repair/repair.py +4 -22
  133. adam/commands/repair/repair_log.py +6 -12
  134. adam/commands/repair/repair_run.py +29 -36
  135. adam/commands/repair/repair_scan.py +33 -39
  136. adam/commands/repair/repair_stop.py +6 -12
  137. adam/commands/report.py +25 -21
  138. adam/commands/restart.py +27 -28
  139. adam/commands/rollout.py +20 -25
  140. adam/commands/shell.py +12 -4
  141. adam/commands/show/show.py +11 -23
  142. adam/commands/show/show_adam.py +3 -3
  143. adam/commands/show/show_cassandra_repairs.py +35 -0
  144. adam/commands/show/show_cassandra_status.py +34 -52
  145. adam/commands/show/show_cassandra_version.py +5 -18
  146. adam/commands/show/show_commands.py +20 -25
  147. adam/commands/show/show_host.py +33 -0
  148. adam/commands/show/show_login.py +23 -27
  149. adam/commands/show/show_params.py +2 -5
  150. adam/commands/show/show_processes.py +16 -20
  151. adam/commands/show/show_storage.py +10 -20
  152. adam/commands/watch.py +27 -30
  153. adam/config.py +7 -15
  154. adam/embedded_params.py +1 -1
  155. adam/log.py +4 -4
  156. adam/pod_exec_result.py +13 -5
  157. adam/repl.py +126 -119
  158. adam/repl_commands.py +63 -29
  159. adam/repl_state.py +320 -71
  160. adam/sql/sql_completer.py +98 -383
  161. adam/sql/sql_state_machine.py +630 -0
  162. adam/sql/term_completer.py +14 -4
  163. adam/sso/authn_ad.py +6 -8
  164. adam/sso/authn_okta.py +4 -6
  165. adam/sso/cred_cache.py +4 -6
  166. adam/sso/idp.py +10 -13
  167. adam/utils.py +511 -10
  168. adam/utils_athena.py +145 -0
  169. adam/utils_audits.py +102 -0
  170. adam/utils_issues.py +32 -0
  171. adam/utils_k8s/__init__.py +0 -0
  172. adam/utils_k8s/app_clusters.py +28 -0
  173. adam/utils_k8s/app_pods.py +36 -0
  174. adam/utils_k8s/cassandra_clusters.py +44 -0
  175. adam/{k8s_utils → utils_k8s}/cassandra_nodes.py +11 -4
  176. adam/{k8s_utils → utils_k8s}/custom_resources.py +16 -17
  177. adam/{k8s_utils → utils_k8s}/deployment.py +2 -2
  178. adam/{k8s_utils → utils_k8s}/ingresses.py +2 -2
  179. adam/{k8s_utils → utils_k8s}/jobs.py +7 -11
  180. adam/utils_k8s/k8s.py +87 -0
  181. adam/{k8s_utils → utils_k8s}/kube_context.py +2 -2
  182. adam/{k8s_utils → utils_k8s}/pods.py +109 -74
  183. adam/{k8s_utils → utils_k8s}/secrets.py +7 -3
  184. adam/{k8s_utils → utils_k8s}/service_accounts.py +5 -4
  185. adam/{k8s_utils → utils_k8s}/services.py +2 -2
  186. adam/{k8s_utils → utils_k8s}/statefulsets.py +3 -14
  187. adam/utils_local.py +4 -0
  188. adam/utils_net.py +24 -0
  189. adam/utils_repl/__init__.py +0 -0
  190. adam/utils_repl/automata_completer.py +48 -0
  191. adam/utils_repl/repl_completer.py +46 -0
  192. adam/utils_repl/state_machine.py +173 -0
  193. adam/utils_sqlite.py +137 -0
  194. adam/version.py +1 -1
  195. {kaqing-2.0.52.dist-info → kaqing-2.0.184.dist-info}/METADATA +1 -1
  196. kaqing-2.0.184.dist-info/RECORD +244 -0
  197. adam/commands/app.py +0 -67
  198. adam/commands/bash.py +0 -87
  199. adam/commands/cp.py +0 -95
  200. adam/commands/cql/cql_table_completer.py +0 -8
  201. adam/commands/cql/cql_utils.py +0 -109
  202. adam/commands/describe/describe.py +0 -46
  203. adam/commands/describe/describe_keyspace.py +0 -60
  204. adam/commands/describe/describe_keyspaces.py +0 -50
  205. adam/commands/describe/describe_table.py +0 -60
  206. adam/commands/describe/describe_tables.py +0 -50
  207. adam/commands/devices.py +0 -89
  208. adam/commands/postgres/postgres_session.py +0 -240
  209. adam/commands/postgres/postgres_utils.py +0 -31
  210. adam/commands/postgres/psql_table_completer.py +0 -11
  211. adam/commands/reaper/reaper_session.py +0 -159
  212. adam/commands/show/show_app_actions.py +0 -53
  213. adam/commands/show/show_repairs.py +0 -47
  214. adam/k8s_utils/cassandra_clusters.py +0 -35
  215. adam/sql/sql_utils.py +0 -5
  216. kaqing-2.0.52.dist-info/RECORD +0 -184
  217. /adam/commands/{describe → app}/__init__.py +0 -0
  218. /adam/{k8s_utils → commands/audit}/__init__.py +0 -0
  219. /adam/{k8s_utils → utils_k8s}/config_maps.py +0 -0
  220. /adam/{k8s_utils → utils_k8s}/volumes.py +0 -0
  221. {kaqing-2.0.52.dist-info → kaqing-2.0.184.dist-info}/WHEEL +0 -0
  222. {kaqing-2.0.52.dist-info → kaqing-2.0.184.dist-info}/entry_points.txt +0 -0
  223. {kaqing-2.0.52.dist-info → kaqing-2.0.184.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,630 @@
1
+ from typing import Callable
2
+ from sqlparse.sql import Token
3
+ from sqlparse import tokens as TOKEN
4
+
5
+ from adam.utils import log_exc
6
+ from adam.utils_repl.state_machine import StateMachine, State
7
+
8
+ __all__ = [
9
+ 'SqlStateMachine', 'CqlStateMachine', 'AthenaStateMachine'
10
+ ]
11
+
12
+ SQL_SPEC = [
13
+ # <select_statement> ::= SELECT <select_list>
14
+ # FROM <table_expression>
15
+ # [WHERE <search_condition>]
16
+ # [<group_by_clause>]
17
+ # [<having_clause>]
18
+ # [<order_by_clause>]
19
+ # [<limit_clause>]
20
+
21
+ # <search_condition> ::= <boolean_term>
22
+ # | <search_condition> OR <boolean_term>
23
+
24
+ # <boolean_term> ::= <boolean_factor>
25
+ # | <boolean_term> AND <boolean_factor>
26
+
27
+ # <boolean_factor> ::= [NOT] <predicate>
28
+ # | ([NOT] <search_condition>)
29
+
30
+ # <predicate> ::= <comparison_predicate>
31
+ # | <between_predicate>
32
+ # | <in_predicate>
33
+ # | <like_predicate>
34
+ # | <null_predicate>
35
+ # | <exists_predicate>
36
+ # | <quantified_predicate>
37
+ # | <unique_predicate>
38
+ # | <match_predicate>
39
+ # | <overlaps_predicate>
40
+ # | <distinct_predicate>
41
+ # | <member_predicate>
42
+ # | <submultiset_predicate>
43
+ # | <set_predicate>
44
+
45
+ # <comparison_predicate> ::= <row_value_expression> <comparison_operator> <row_value_expression>
46
+ # <comparison_operator> ::= '=' | '<>' | '<' | '<=' | '>' | '>='
47
+
48
+ # <row_value_expression> ::= <value_expression>
49
+ # | (<value_expression> [ { <comma> <value_expression> }... ])
50
+
51
+ # <value_expression> ::= <numeric_value_expression>
52
+ # | <string_value_expression>
53
+ # | <datetime_value_expression>
54
+ # | <interval_value_expression>
55
+ # | <boolean_value_expression>
56
+ # | <user_defined_type_value_expression>
57
+ # | <reference_value_expression>
58
+ # | <collection_value_expression>
59
+ # | <row_value_constructor>
60
+ # | <case_expression>
61
+ # | <cast_expression>
62
+ # | <subquery>
63
+ # | NULL
64
+ # | DEFAULT
65
+ # | <identifier>
66
+ # | <literal>
67
+ ' > select > select ^ select,insert,update,delete,alter,preview',
68
+ 'select_ > name|* > select_a ^ *',
69
+ 'select_a > , > select_a_comma_',
70
+ 'select_a_comma_ > name|* > select_a ^ *',
71
+ 'select_a_ > from > select_from ^ from',
72
+ 'select_from_ > name|audit > select_from_x ^ (select,tables',
73
+ '- > ( > select_from_lp_',
74
+ '- < ) > select_from_sq',
75
+ 'select_from_lp_ > select > select',
76
+ 'select_from_x > , > select_from_x_comma_ ^ (select,tables',
77
+ '- > ; > ',
78
+ 'select_from_sq_ > as > select_from_x_as ^ as',
79
+ 'select_from_x_comma_ > name|audit > select_from_x ^ tables',
80
+ 'select_from_x_ ^ as,where,inner join,left outer join,right outer join,full outer join,group by,order by,limit,&',
81
+ 'select_from_x_as_x_ > , > select_from_x_comma_ ^ where,inner join,left outer join,right outer join,full outer join,group by,order by,limit,&',
82
+ '- > as > select_from_x_as',
83
+ '- > where > select_where',
84
+ '- > order > select_order',
85
+ '- > order by > select_order_by',
86
+ '- > limit > select_where_sc_limit',
87
+ '- > group > select_group',
88
+ '- > group by > select_group_by',
89
+ '- > inner > select_from_x_inner',
90
+ '- > inner join > select_join',
91
+ '- > left > select_from_x_left',
92
+ '- > left join > select_join',
93
+ '- > left outer join > select_join',
94
+ '- > right > select_from_x_right',
95
+ '- > right join > select_join',
96
+ '- > right outer join > select_join',
97
+ '- > full > select_from_x_full',
98
+ '- > full outer join > select_join',
99
+ '- > ; > ',
100
+ '- > & > select_from_x$',
101
+ 'select_from_x_as_ > name > select_from_x_as_x ^ x,y,z',
102
+ 'select_from_x_as_x > , > select_from_x_as_x_comma_',
103
+ '- > ; > ',
104
+ 'select_from_x_as_x_comma_ > name|audit > select_from_x ^ tables',
105
+ 'select_where_ > name > select_where_a ^ columns',
106
+ 'select_where_a > name > select_where_a ^ columns,=,<,<=,>,>=,<>',
107
+ '- > comparison > select_where_a_op',
108
+ 'select_where_a_ > comparison > select_where_a_op ^ =,<,<=,>,>=,<>,like,not,in',
109
+ '- > not > select_where_a_not',
110
+ '- > in > select_where_a_in',
111
+ 'select_where_a_not_ > comparison > select_where_a_not_op ^ like,in',
112
+ '- > in > select_where_a_in',
113
+ 'select_where_a_in > ( > select_where_a_in_lp_ ^ (',
114
+ '- < ) > select_where_sc',
115
+ 'select_where_a_in_lp_ > name|single|num > select_where_a_in_lp_a ^ single,select',
116
+ '- > select > select_where_a_in_lp_select',
117
+ 'select_where_a_in_lp_select_ > name > select_a ^ id',
118
+ 'select_where_a_in_lp_a > , > select_where_a_in_lp_a_comma_ ^ comma,)',
119
+ 'select_where_a_in_lp_a_comma_ > name|single|num > select_where_a_in_lp_a ^ single',
120
+ 'select_where_a_not_op > name|single|num > select_where_sc ^ single',
121
+ 'select_where_a_op > name|single|num > select_where_sc ^ single',
122
+ 'select_where_sc > ; > ',
123
+ 'select_where_sc_ > and|or > select_where ^ and,or,order by,group by,limit,&',
124
+ '- > group > select_group',
125
+ '- > group by > select_group_by',
126
+ '- > order > select_order',
127
+ '- > order by > select_order_by',
128
+ '- > limit > select_where_sc_limit',
129
+ '- > ; > ',
130
+ '- > & > select_from_x$',
131
+ 'select_group_ > by > select_group_by ^ by',
132
+ 'select_group_by_ > name > select_group_by_a ^ columns',
133
+ 'select_group_by_a > , > select_group_by_a_comma_ ^ columns',
134
+ '- > ; > ',
135
+ 'select_group_by_a_comma_ > name > select_group_by_a ^ columns',
136
+ 'select_group_by_a_ > limit > select_where_sc_limit ^ limit,order by,&',
137
+ '- > order > select_order',
138
+ '- > order by > select_order_by',
139
+ '- > ; > ',
140
+ '- > & > select_from_x$',
141
+ 'select_order_ > by > select_order_by ^ by',
142
+ 'select_order_by_ > name > select_order_by_a ^ columns',
143
+ 'select_order_by_a > , > select_order_by_a_comma_',
144
+ '- > ; > ',
145
+ 'select_order_by_a_comma_ > name > select_order_by_a ^ columns',
146
+ 'select_order_by_a_ > desc|asc > select_order_by_a_desc ^ desc,asc,limit,&',
147
+ '- > limit > select_where_sc_limit',
148
+ '- > ; > ',
149
+ '- > & > select_from_x$',
150
+ 'select_order_by_a_desc > , > select_order_by_a_comma_',
151
+ '- > ; > ',
152
+ 'select_order_by_a_desc_ > limit > select_where_sc_limit ^ limit,&',
153
+ '- > ; > ',
154
+ '- > & > select_from_x$',
155
+ 'select_where_sc_limit_ > num > select_where_sc_limit_num ^ 1',
156
+ 'select_where_sc_limit_num > ; > ',
157
+ 'select_where_sc_limit_num_rp__ > as > select_from_x_as ^ as',
158
+ 'select_where_x_inner_ > join > select_join',
159
+ 'select_join_ > name|audit > select_x_join_y ^ tables',
160
+ 'select_from_x_left_ > join > select_join ^ outer join',
161
+ '- > outer > select_from_x_left_outer',
162
+ 'select_from_x_left_outer_ > join > select_join ^ join',
163
+ 'select_from_x_right_ > join > select_join ^ outer join',
164
+ '- > outer > select_from_x_right_outer',
165
+ 'select_from_x_right_outer_ > join > select_join ^ join',
166
+ 'select_from_x_full_ > join > select_join ^ outer join',
167
+ '- > outer > select_from_x_full_outer',
168
+ 'select_from_x_full_outer_ > join > select_join ^ join',
169
+ 'select_x_join_y_ > as > select_x_join_y_as ^ as,on',
170
+ '- > on > select_x_join_y_on ^ as,on',
171
+ 'select_x_join_y_as_ > name > select_x_join_y_as_y ^ x,y,z',
172
+ 'select_x_join_y_as_y_ > on > select_x_join_y_on ^ on',
173
+ 'select_x_join_y_on_ > name > select_x_join_y_on_a ^ columns',
174
+ 'select_x_join_y_on_a > name > select_x_join_y_on_a ^ columns,=',
175
+ '- > comparison > select_x_join_y_on_a_op',
176
+ 'select_x_join_y_on_a_ > comparison > select_x_join_y_on_a_op ^ =',
177
+ 'select_x_join_y_on_a_op > name > select_x_join_y_on_a_op_b ^ columns',
178
+ 'select_x_join_y_on_a_op_b > _ > select_from_x_as_x_',
179
+ '- > ; > ',
180
+
181
+ # <insert_statement> ::= INSERT INTO <table_name> [ ( <column_list> ) ]
182
+ # VALUES ( <value_list> )
183
+ # | INSERT INTO <table_name> [ ( <column_list> ) ]
184
+ # <query_expression>
185
+
186
+ # <table_name> ::= <identifier>
187
+
188
+ # <column_list> ::= <column_name> [ , <column_list> ]
189
+
190
+ # <column_name> ::= <identifier>
191
+
192
+ # <value_list> ::= <expression> [ , <value_list> ]
193
+
194
+ # <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> ]
195
+ ' > insert > insert',
196
+ 'insert_ > into > insert_into ^ into',
197
+ 'insert_into_ > name|audit > insert_into_x ^ tables',
198
+ 'insert_into_x > ( > insert_into_x_lp_',
199
+ 'insert_into_x_ > ( > insert_into_x_lp_ ^ (,values(',
200
+ '- > values > insert_values',
201
+ 'insert_into_x_lp_ > name > insert_into_x_lp_a ^ id',
202
+ 'insert_into_x_lp_a > , > insert_into_x_lp_a_comma_',
203
+ '- > ) > insert_into_x_lp_a_rp_',
204
+ 'insert_into_x_lp_a_comma_ > name > insert_into_x_lp_a ^ id',
205
+ 'insert_into_x_lp_a_rp__ > values > insert_values ^ values(,select',
206
+ '- > select > select',
207
+ 'insert_values > ( > insert_values_lp_',
208
+ 'insert_values_lp_ > name|single|num > insert_values_lp_v ^ single',
209
+ 'insert_values_lp_v > , > insert_values_lp_v_comma_',
210
+ '- > ) > insert_values_lp_v_rp_',
211
+ 'insert_values_lp_v_comma_ > name|single|num > insert_values_lp_v',
212
+ 'insert_values_lp_v_rp__ > & > insert_values_lp_v_rp_$ ^ &',
213
+
214
+ # <update_statement> ::= UPDATE <table_name>
215
+ # SET <set_clause_list>
216
+ # [WHERE <search_condition>]
217
+
218
+ # <set_clause_list> ::= <set_clause> { , <set_clause> }
219
+
220
+ # <set_clause> ::= <column_name> = <update_value>
221
+
222
+ # <update_value> ::= <expression> | NULL | DEFAULT
223
+
224
+ # <search_condition> ::= <boolean_expression>
225
+ ' > update > update',
226
+ 'update_ > name|audit > update_x ^ tables',
227
+ 'update_x_ > set > update_set ^ set',
228
+ 'update_set_ > name > update_set_a ^ id',
229
+ 'update_set_a > comparison > update_set_a_op',
230
+ 'update_set_a_op > name|single|num > update_set_sc ^ single',
231
+ 'update_set_sc > , > update_set_sc_comma_',
232
+ 'update_set_sc_comma_ > name > update_set_a ^ id',
233
+ 'update_set_sc_ > , > update_set_sc_comma_ ^ where,&',
234
+ '- > where > update_where',
235
+ '- > & > update_set_sc$ ^ &',
236
+ 'update_where_ > name > update_where_a ^ id',
237
+ 'update_where_a > comparison > update_where_a_op',
238
+ 'update_where_a_ > comparison > update_where_a_op ^ =,<,<=,>,>=,<>,like,not,in',
239
+ '- > not > update_where_a_not',
240
+ '- > in > update_where_a_in',
241
+ 'update_where_a_not_ > comparison > update_where_a_not_op ^ like,in',
242
+ '- > in > update_where_a_in',
243
+ 'update_where_a_in > ( > update_where_a_in_lp_ ^ (',
244
+ '- < ) > update_where_sc',
245
+ 'update_where_a_in_lp_ > name|single|num > update_where_a_in_lp_a ^ single,select',
246
+ '- > select > update_where_a_in_lp_select',
247
+ 'update_where_a_in_lp_select_ > name > select_a ^ id',
248
+ 'update_where_a_in_lp_a > , > update_where_a_in_lp_a_comma_ ^ comma,)',
249
+ 'update_where_a_in_lp_a_comma_ > name|single|num > update_where_a_in_lp_a ^ single',
250
+ 'update_where_a_not_op > name|single|num > update_where_sc ^ single',
251
+ 'update_where_a_op > name|single|num > update_where_sc ^ single',
252
+ 'update_where_sc_ > and|or > update_where ^ and,or,&',
253
+
254
+ # <delete_statement> ::= DELETE FROM <table_name> [ WHERE <search_condition> ]
255
+
256
+ # <table_name> ::= <identifier>
257
+
258
+ # <search_condition> ::= <boolean_expression>
259
+
260
+ # <boolean_expression> ::= <predicate>
261
+ # | <boolean_expression> AND <predicate>
262
+ # | <boolean_expression> OR <predicate>
263
+ # | NOT <predicate>
264
+ # | ( <boolean_expression> )
265
+
266
+ # <predicate> ::= <expression> <comparison_operator> <expression>
267
+ # | <expression> IS NULL
268
+ # | <expression> IS NOT NULL
269
+ # | <expression> LIKE <pattern> [ ESCAPE <escape_character> ]
270
+ # | <expression> IN ( <expression_list> )
271
+ # | EXISTS ( <select_statement> )
272
+ # | ... (other predicates)
273
+
274
+ # <comparison_operator> ::= = | <> | != | > | < | >= | <=
275
+
276
+ # <expression> ::= <literal>
277
+ # | <column_name>
278
+ # | <function_call>
279
+ # | ( <expression> )
280
+ # | <expression> <arithmetic_operator> <expression>
281
+ # | ... (other expressions)
282
+
283
+ # <literal> ::= <numeric_literal> | <string_literal> | <boolean_literal> | <date_literal> | ...
284
+
285
+ # <column_name> ::= <identifier>
286
+
287
+ # <identifier> ::= <letter> { <letter> | <digit> | _ }...
288
+
289
+ # <pattern> ::= <string_literal>
290
+
291
+ # <escape_character> ::= <string_literal> (single character)
292
+
293
+ # <expression_list> ::= <expression> { , <expression> }...
294
+ ' > delete > delete',
295
+ 'delete_ > from > delete_from ^ from',
296
+ 'delete_from_ > name|audit > delete_from_x ^ tables',
297
+ 'delete_from_x_ > where > update_where ^ where',
298
+
299
+ # <alter table action> ::=
300
+ # ADD <column definition>
301
+ # | DROP COLUMN <column name>
302
+ # | MODIFY COLUMN <column name> <column modification>
303
+ # | RENAME TO <new table name>
304
+ # | ADD CONSTRAINT <constraint definition>
305
+ # | DROP CONSTRAINT <constraint name>
306
+ # | ... (other actions like adding/dropping indexes, partitions, etc.)
307
+
308
+ # <column definition> ::= <column name> <data type> [ <column constraint> ... ]
309
+
310
+ # <column modification> ::=
311
+ # SET DATA TYPE <data type>
312
+ # | SET DEFAULT <expression>
313
+ # | DROP DEFAULT
314
+ # | SET NOT NULL
315
+ # | DROP NOT NULL
316
+ # | ...
317
+
318
+ # <constraint definition> ::=
319
+ # PRIMARY KEY ( <column name list> )
320
+ # | UNIQUE ( <column name list> )
321
+ # | FOREIGN KEY ( <column name list> ) REFERENCES <referenced table> ( <referenced column list> )
322
+ # | CHECK ( <search condition> )
323
+
324
+ ' > alter > alter',
325
+ 'alter_ > table > alter_table ^ table',
326
+ 'alter_table_ > name|audit|cluster > alter_table_t ^ tables',
327
+ 'alter_table_t_ > add > alter_table_add ^ add,add constraint,drop column,drop constraint,rename to',
328
+ '- > drop > alter_table_drop',
329
+
330
+ ' > preview > preview',
331
+ 'preview_ > name|audit > preview_t ^ tables',
332
+ ]
333
+
334
+ SQL_KEYWORDS = [
335
+ 'select', 'from', 'as', 'not', 'in', 'where',
336
+ 'and', 'or', 'group', 'by', 'group by', 'order', 'order by', 'limit', 'asc', 'desc',
337
+ 'inner join', 'on', 'left', 'right', 'full', 'outer', 'left outer join',
338
+ 'left join', 'right outer join', 'right join', 'full join', 'full outer join',
339
+ 'insert', 'into', 'values',
340
+ 'update', 'where', 'set',
341
+ 'delete',
342
+ 'audit', 'cluster',
343
+ 'alter', 'table', 'tables', 'add', 'drop', 'with',
344
+ 'describe', 'preview'
345
+ ]
346
+
347
+ EXPANDABLE_NAMES = {'keyspaces', 'tables', 'columns', 'partition-columns', 'table-props', 'table-props-values'}
348
+
349
+ CQL_SPEC = SQL_SPEC + [
350
+ ' > select > select ^ select,insert,update,delete,alter,describe,preview,consistency,export,import,drop,clean',
351
+
352
+ # ALTER TABLE [ <keyspace_name> . ] <table_name>
353
+ # ( ALTER <column_name> TYPE <cql_type>
354
+ # | ADD ( <column_definition_list> )
355
+ # | DROP ( <column_list> )
356
+ # | RENAME <column_name> TO <column_name> [ AND <column_name> TO <column_name> ... ]
357
+ # | WITH <table_properties> );
358
+
359
+ 'alter_ > table > alter_table ^ table,`tables`',
360
+ '- > tables > alter_tables',
361
+ 'alter_tables_ > with > alter_table_with ^ with',
362
+ 'alter_table_t_ > with > alter_table_with ^ with,add,drop',
363
+ 'alter_table_with_ > name > alter_table_with_p ^ table-props',
364
+ 'alter_table_with_p > comparison > alter_table_with_p_op ^ =',
365
+ 'alter_table_with_p_op > name|single|num > alter_table_with_p_op_v ^ table-prop-values',
366
+ 'alter_table_with_p_op_v_ > --include-reaper > alter_table_with_p_op_v_$ ^ --include-reaper',
367
+
368
+ ' > describe > describe',
369
+ 'describe_ > table > desc_table ^ table,`tables`,keyspace,`keyspaces`,schema',
370
+ '- > tables > desc_tables',
371
+ '- > keyspace > desc_keyspace',
372
+ '- > keyspaces > desc_keyspaces',
373
+ '- > schema > desc_schema',
374
+ 'desc_table_ > name > desc_table_t ^ tables',
375
+ 'desc_table_t_ > & > desc_table_t_$ ^ &',
376
+ 'desc_tables_ > & > desc_tables_$ ^ &',
377
+ 'desc_keyspace_ > name > desc_keyspace_k ^ keyspaces',
378
+ 'desc_keyspace_k_ > & > desc_keyspace_k_$ ^ &',
379
+ 'desc_schema_ > & > desc_schema_$ ^ &',
380
+
381
+ ' > export > export',
382
+ 'export_ > name > export_table ^ *,tables',
383
+ '- > * > export_all',
384
+ 'export_all_ > in > export_in ^ in,with',
385
+ '- > with > export_with',
386
+ 'export_table > ( > export_table_lp_ ^ (,comma,with,tables',
387
+ '- > , > export_table_comma_',
388
+ '- > . > export_table ^ tables',
389
+ 'export_table_ > ( > export_table_lp_ ^ as,(,comma,with consistency,to',
390
+ '- > , > export_table_comma_',
391
+ '- > as > export_as',
392
+ '- > with > export_with',
393
+ '- > to > export_table_to',
394
+ 'export_table_comma_ > name > export_table ^ tables',
395
+ 'export_table_lp_ > name > export_table_lp_a ^ columns',
396
+ 'export_table_lp_a > , > export_table_lp_a_comma_',
397
+ '- > ) > export_table_lp_a_comma_rp_',
398
+ 'export_table_lp_a_comma_ > name > export_table_lp_a ^ columns',
399
+ 'export_table_lp_a_comma_rp_ > as > export_as ^ as,with consistency',
400
+ '- > , > export ^ with consistency',
401
+ '- > with > export_with',
402
+ 'export_as_ > name > export_as_f',
403
+ 'export_as_f > , > export_table_comma_',
404
+ 'export_as_f_ > , > export_table_comma_ ^ with consistency,to',
405
+ '- > with > export_with',
406
+ '- > to > export_table_to',
407
+ 'export_in_ > name > export_in_k ^ keyspaces',
408
+ 'export_in_k_ > with > export_with ^ with consistency',
409
+ 'export_with_ > consistency > export_with_consistency ^ consistency',
410
+ 'export_with_consistency_ > quorum|all|serial|one|each_quorum|local_quorum|any|local_one|two|three|local_serial > export_with_quorum ^ quorum,all,serial,one,each_quorum,local_quorum,any,local_one,two,three,local_serial',
411
+ 'export_table_to_ > athena|sqlite|csv > export_table_to$ ^ athena,sqlite,csv',
412
+
413
+ ' > import > import',
414
+ 'import_ > session > import_session ^ session,files',
415
+ '- > files > import_files',
416
+ 'import_session_ > name > import_session_s ^ export-sessions-incomplete',
417
+ 'import_session_s_ > to > import_session_to ^ to',
418
+ 'import_files_ > name > import_files_f',
419
+ 'import_files_f > , > import_files',
420
+ 'import_files_f_ > as > import_files_f_as ^ as',
421
+ 'import_files_f_as_ > name > import_files_f_as_a',
422
+ 'import_files_f_as_a_ > to > import_session_to ^ to',
423
+ 'import_session_to_ > athena|sqlite > import_session_to$ ^ athena,sqlite',
424
+
425
+ ' > consistency > consistency',
426
+ 'consistency_ > quorum|all|serial|one|each_quorum|local_quorum|any|local_one|two|three|local_serial > consistency_quorum ^ quorum,all,serial,one,each_quorum,local_quorum,any,local_one,two,three,local_serial',
427
+ 'consistency_quorum > ; > ',
428
+
429
+ ' > drop > drop',
430
+ 'drop_ > all > drop_all ^ all export databases,export database',
431
+ '- > export > drop_export',
432
+ 'drop_all_ > export > drop_all_export ^ export databases',
433
+ 'drop_all_export_ > databases > drop_all_dbs ^ databases',
434
+ 'drop_export_ > database > drop_export_db ^ database',
435
+ 'drop_export_db_ > name > drop_export_db$ ^ export-dbs',
436
+
437
+ ' > clean > clean',
438
+ 'clean_ > up > clean_up ^ up all export sessions,up export session',
439
+ 'clean_up_ > all > clean_up_all ^ all export sessions,export sessions',
440
+ '- > export > clean_up_export',
441
+ 'clean_up_all_ > export > clean_up_all_export ^ export sessions',
442
+ 'clean_up_all_export_ > sessions > clean_up_all_sessions ^ sessions',
443
+ 'clean_up_export_ > sessions > clean_up_export_sessions ^ sessions',
444
+ 'clean_up_export_sessions_ > name > clean_up_export_sessions$ ^ export-sessions',
445
+ ]
446
+
447
+ CQL_KEYWORDS = SQL_KEYWORDS + [
448
+ 'schema', 'keyspace', 'keyspaces', 'tables', 'export', 'copy', 'consistency',
449
+ 'quorum', 'all', 'serial', 'one', 'each_quorum', 'local_quorum', 'any', 'local_one', 'two', 'three', 'local_serial', 'to',
450
+ 'database', 'databases', 'session', 'sessions', 'clean', 'up', 'athena', 'sqlite', 'csv', 'import', 'files'
451
+ ]
452
+
453
+ CQL_EXPANDABLE_NAMES = EXPANDABLE_NAMES | {
454
+ 'export-dbs', 'export-sessions', 'export-sessions-incomplete'
455
+ }
456
+
457
+ ATHENA_SPEC = SQL_SPEC + [
458
+ ' > select > select ^ select,insert,update,delete,alter,describe,preview,drop',
459
+
460
+ 'alter_table_t_ > add > alter_table_add ^ add partition,drop partition',
461
+ 'alter_table_add_ > partition > alter_partition ^ partition',
462
+ 'alter_table_drop_ > partition > alter_partition ^ partition',
463
+ 'alter_partition > ( > alter_partition_lp ^ (',
464
+ 'alter_partition_lp > name > alter_partition_lp_a ^ partition-columns',
465
+ 'alter_partition_lp_a > comparison > alter_partition_lp_a_op ^ =',
466
+ 'alter_partition_lp_a_op > single > alter_partition_lp_a_op_v ^ single',
467
+ 'alter_partition_lp_a_op_v > , > alter_partition_lp_sc ^ single',
468
+ 'alter_partition_lp_sc > name|) > alter_partition_lp_a ^ partition-columns',
469
+
470
+ ' > describe > describe',
471
+ 'describe_ > name > desc_t ^ tables',
472
+ 'desc_t_ > name > desc_t_',
473
+
474
+ 'repair',
475
+
476
+ ' > drop > drop',
477
+ 'drop_ > all > drop_all ^ all export databases,export database',
478
+ '- > export > drop_export',
479
+ 'drop_all_ > export > drop_all_export ^ export databases',
480
+ 'drop_all_export_ > databases > drop_all_dbs ^ databases',
481
+ 'drop_export_ > database > drop_export_db ^ database',
482
+ 'drop_export_db_ > name > drop_export_db$ ^ export-dbs',
483
+ ]
484
+
485
+ ATHENA_KEYWORDS = SQL_KEYWORDS + [
486
+ 'partition',
487
+ 'database', 'databases', 'session', 'sessions', 'clean', 'up', 'all', 'export'
488
+ ]
489
+
490
+ ATHENA_EXPANDABLE_NAMES = EXPANDABLE_NAMES | {
491
+ 'export-dbs'
492
+ }
493
+
494
+ class SqlStateMachine(StateMachine[Token]):
495
+ def __init__(self, indent=0, push_level = 0, debug = False):
496
+ super().__init__(indent, push_level, debug)
497
+
498
+ def traverse_tokens(self, tokens: list[Token], state: State = State('')):
499
+ def handle_push():
500
+ if f'{state.state} > {it}' in self.states:
501
+ state_test = self.states[f'{state.state} > {it}']
502
+ if state_test.comeback_token:
503
+ self.comebacks[self.push_level] = state_test.comeback_state
504
+
505
+ def handle_pop():
506
+ if self.push_level in self.comebacks:
507
+ try:
508
+ return State(self.comebacks[self.push_level])
509
+ finally:
510
+ del self.comebacks[self.push_level]
511
+
512
+ return None
513
+
514
+ for token in tokens:
515
+ if self.debug:
516
+ if token.ttype == TOKEN.Whitespace:
517
+ print('_ ', end='')
518
+ elif token.ttype in [TOKEN.DML, TOKEN.Wildcard, TOKEN.Punctuation, TOKEN.CTE]:
519
+ print(f'{token.value} ', end='')
520
+ elif token.ttype:
521
+ tks = str(token.ttype).split('.')
522
+ typ = tks[len(tks) - 1]
523
+ if ' ' in token.value:
524
+ print(f'"{token.value}:{typ}" ', end='')
525
+ else:
526
+ print(f'{token.value}:{typ} ', end='')
527
+ # print(" " * self.indent + f"Token: {token.value}, Type: {token.ttype}@{token.ttype.__class__}")
528
+
529
+ last_name = None
530
+ if token.is_group:
531
+ state = self.traverse_tokens(token.tokens, state)
532
+ else:
533
+ comeback_state = None
534
+
535
+ it = ''
536
+ if (t := token.value.lower()) in self.keywords():
537
+ it = t
538
+ elif token.ttype == TOKEN.Text.Whitespace:
539
+ it = '_'
540
+ elif token.ttype == TOKEN.Name:
541
+ it = 'name'
542
+ last_name = token.value
543
+ elif token.ttype == TOKEN.Literal.String.Single:
544
+ it = 'single'
545
+ elif token.ttype in [TOKEN.Literal.Number.Integer, TOKEN.Literal.Number.Float]:
546
+ it = 'num'
547
+ elif token.ttype == TOKEN.Wildcard:
548
+ it = '*'
549
+ elif token.ttype == TOKEN.Punctuation:
550
+ it = token.value
551
+
552
+ if it == '(':
553
+ handle_push()
554
+ self.push_level += 1
555
+ elif it == ')':
556
+ self.push_level -= 1
557
+ comeback_state = handle_pop()
558
+ elif it == '.' and 'last_name' in state.context and (ln := state.context['last_name']):
559
+ state.context['last_namespace'] = ln
560
+
561
+ elif token.ttype == TOKEN.Operator.Comparison:
562
+ it = 'comparison'
563
+
564
+ with log_exc(False):
565
+ # print(f'\n{state.to_s} > {it} > ', end='')
566
+ if comeback_state:
567
+ state = comeback_state
568
+ else:
569
+ context = state.context
570
+ state = self.states[f'{state.state} > {it}']
571
+ state.context = context
572
+
573
+ if last_name:
574
+ state.context['last_name'] = last_name
575
+
576
+ return state
577
+
578
+ def spec(self):
579
+ return SQL_SPEC
580
+
581
+ def keywords(self):
582
+ return SQL_KEYWORDS
583
+
584
+ def expandable_names(self):
585
+ return EXPANDABLE_NAMES
586
+
587
+ def witespace_transition_condition(self, from_s: str, to_s: str):
588
+ return from_s.endswith('_') and not from_s.endswith('_comma_') and not from_s.endswith('_lp_') and not from_s.endswith('_rp_')
589
+
590
+ def incomplete_name_transition_condition(self, from_s: str, token: str, to_s: str, suggestions: str):
591
+ if not suggestions:
592
+ return None
593
+
594
+ tokens = [token]
595
+ if '|' in token:
596
+ tokens = token.split('|')
597
+
598
+ if 'name' not in tokens:
599
+ return None
600
+
601
+ if not self.expandable_names().intersection(set(suggestions.split(','))):
602
+ return None
603
+
604
+ return tokens
605
+
606
+ class CqlStateMachine(SqlStateMachine):
607
+ def __init__(self, indent=0, push_level = 0, debug = False):
608
+ super().__init__(indent, push_level, debug)
609
+
610
+ def spec(self):
611
+ return CQL_SPEC
612
+
613
+ def keywords(self):
614
+ return CQL_KEYWORDS
615
+
616
+ def expandable_names(self):
617
+ return CQL_EXPANDABLE_NAMES
618
+
619
+ class AthenaStateMachine(SqlStateMachine):
620
+ def __init__(self, indent=0, push_level = 0, debug = False):
621
+ super().__init__(indent, push_level, debug)
622
+
623
+ def spec(self):
624
+ return ATHENA_SPEC
625
+
626
+ def keywords(self):
627
+ return ATHENA_KEYWORDS
628
+
629
+ def expandable_names(self):
630
+ return ATHENA_EXPANDABLE_NAMES