MindsDB 25.5.3.0__py3-none-any.whl → 25.5.4.1__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 MindsDB might be problematic. Click here for more details.

Files changed (313) hide show
  1. mindsdb/__about__.py +8 -8
  2. mindsdb/__main__.py +127 -79
  3. mindsdb/api/a2a/__init__.py +0 -0
  4. mindsdb/api/a2a/__main__.py +144 -0
  5. mindsdb/api/a2a/agent.py +308 -0
  6. mindsdb/api/a2a/common/__init__.py +0 -0
  7. mindsdb/api/a2a/common/server/__init__.py +4 -0
  8. mindsdb/api/a2a/common/server/server.py +164 -0
  9. mindsdb/api/a2a/common/server/task_manager.py +287 -0
  10. mindsdb/api/a2a/common/server/utils.py +28 -0
  11. mindsdb/api/a2a/common/types.py +365 -0
  12. mindsdb/api/a2a/constants.py +9 -0
  13. mindsdb/api/a2a/run_a2a.py +86 -0
  14. mindsdb/api/a2a/task_manager.py +560 -0
  15. mindsdb/api/executor/command_executor.py +185 -309
  16. mindsdb/api/executor/datahub/classes/response.py +5 -2
  17. mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
  18. mindsdb/api/executor/planner/query_planner.py +10 -1
  19. mindsdb/api/executor/sql_query/result_set.py +185 -52
  20. mindsdb/api/executor/sql_query/sql_query.py +1 -1
  21. mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
  22. mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
  23. mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
  24. mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
  25. mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
  26. mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
  27. mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
  28. mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
  29. mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
  30. mindsdb/api/http/initialize.py +99 -83
  31. mindsdb/api/http/namespaces/analysis.py +3 -3
  32. mindsdb/api/http/namespaces/config.py +61 -86
  33. mindsdb/api/http/namespaces/file.py +8 -2
  34. mindsdb/api/http/namespaces/sql.py +13 -27
  35. mindsdb/api/mcp/start.py +42 -5
  36. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
  37. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
  38. mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
  39. mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
  40. mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
  41. mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
  42. mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
  43. mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
  44. mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
  45. mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
  46. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
  47. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
  48. mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
  49. mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
  50. mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
  51. mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
  52. mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
  53. mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
  54. mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
  55. mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
  56. mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
  57. mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
  58. mindsdb/integrations/handlers/byom_handler/requirements.txt +1 -2
  59. mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
  60. mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
  61. mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
  62. mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
  63. mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
  64. mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
  65. mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
  66. mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
  67. mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
  68. mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
  69. mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
  70. mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
  71. mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
  72. mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
  73. mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
  74. mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
  75. mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
  76. mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
  77. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
  78. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
  79. mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
  80. mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
  81. mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
  82. mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
  83. mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
  84. mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
  85. mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
  86. mindsdb/integrations/handlers/email_handler/settings.py +0 -1
  87. mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
  88. mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
  89. mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
  90. mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
  91. mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
  92. mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
  93. mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
  94. mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
  95. mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
  96. mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
  97. mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
  98. mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
  99. mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
  100. mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
  101. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
  102. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
  103. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
  104. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
  105. mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
  106. mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
  107. mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
  108. mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
  109. mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
  110. mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
  111. mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
  112. mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
  113. mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
  114. mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
  115. mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
  116. mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
  117. mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
  118. mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
  119. mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
  120. mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
  121. mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
  122. mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
  123. mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
  124. mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
  125. mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
  126. mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
  127. mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
  128. mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
  129. mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
  130. mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
  131. mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
  132. mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
  133. mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
  134. mindsdb/integrations/handlers/lancedb_handler/requirements.txt +0 -1
  135. mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
  136. mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
  137. mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
  138. mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
  139. mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
  140. mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
  141. mindsdb/integrations/handlers/litellm_handler/litellm_handler.py +37 -20
  142. mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
  143. mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
  144. mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
  145. mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
  146. mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
  147. mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
  148. mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
  149. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
  150. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
  151. mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
  152. mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
  153. mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
  154. mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
  155. mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
  156. mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
  157. mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
  158. mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
  159. mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
  160. mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
  161. mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
  162. mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
  163. mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
  164. mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
  165. mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
  166. mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
  167. mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
  168. mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
  169. mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
  170. mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
  171. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
  172. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
  173. mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
  174. mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
  175. mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
  176. mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
  177. mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
  178. mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
  179. mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
  180. mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
  181. mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
  182. mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
  183. mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
  184. mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
  185. mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
  186. mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
  187. mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
  188. mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
  189. mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
  190. mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
  191. mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
  192. mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
  193. mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
  194. mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
  195. mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
  196. mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
  197. mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
  198. mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
  199. mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
  200. mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
  201. mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
  202. mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
  203. mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
  204. mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
  205. mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
  206. mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
  207. mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
  208. mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
  209. mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
  210. mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
  211. mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
  212. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
  213. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
  214. mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
  215. mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
  216. mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
  217. mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
  218. mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
  219. mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
  220. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
  221. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
  222. mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
  223. mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
  224. mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
  225. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
  226. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
  227. mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
  228. mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
  229. mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
  230. mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
  231. mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
  232. mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
  233. mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
  234. mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
  235. mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
  236. mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
  237. mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
  238. mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
  239. mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
  240. mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
  241. mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
  242. mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
  243. mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
  244. mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
  245. mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
  246. mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
  247. mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
  248. mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
  249. mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
  250. mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
  251. mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
  252. mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
  253. mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
  254. mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
  255. mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
  256. mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
  257. mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
  258. mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
  259. mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
  260. mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
  261. mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
  262. mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
  263. mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
  264. mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
  265. mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
  266. mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
  267. mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
  268. mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
  269. mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
  270. mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
  271. mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
  272. mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
  273. mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
  274. mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
  275. mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
  276. mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
  277. mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
  278. mindsdb/integrations/libs/llm/config.py +13 -0
  279. mindsdb/integrations/libs/llm/utils.py +37 -65
  280. mindsdb/integrations/libs/response.py +67 -52
  281. mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
  282. mindsdb/integrations/utilities/handler_utils.py +15 -3
  283. mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
  284. mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
  285. mindsdb/integrations/utilities/rag/rerankers/base_reranker.py +230 -227
  286. mindsdb/integrations/utilities/utils.py +3 -3
  287. mindsdb/interfaces/agents/agents_controller.py +164 -1
  288. mindsdb/interfaces/agents/constants.py +32 -13
  289. mindsdb/interfaces/agents/langchain_agent.py +106 -95
  290. mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
  291. mindsdb/interfaces/knowledge_base/controller.py +250 -216
  292. mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
  293. mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
  294. mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
  295. mindsdb/interfaces/query_context/context_controller.py +66 -10
  296. mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
  297. mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
  298. mindsdb/interfaces/skills/skill_tool.py +202 -57
  299. mindsdb/interfaces/skills/sql_agent.py +205 -17
  300. mindsdb/interfaces/storage/fs.py +1 -0
  301. mindsdb/interfaces/variables/__init__.py +0 -0
  302. mindsdb/interfaces/variables/variables_controller.py +97 -0
  303. mindsdb/migrations/env.py +5 -7
  304. mindsdb/migrations/migrate.py +47 -7
  305. mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
  306. mindsdb/utilities/config.py +287 -216
  307. mindsdb/utilities/starters.py +13 -0
  308. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/METADATA +646 -698
  309. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/RECORD +312 -295
  310. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/WHEEL +1 -1
  311. mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
  312. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/licenses/LICENSE +0 -0
  313. {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/top_level.txt +0 -0
@@ -9,6 +9,7 @@
9
9
  *******************************************************
10
10
  """
11
11
  import enum
12
+ from dataclasses import dataclass, field
12
13
 
13
14
  # CAPABILITIES
14
15
  # As defined in : https://dev.mysql.com/doc/dev/mysql-server/8.0.0/group__group__cs__capabilities__flags.html
@@ -128,10 +129,10 @@ class TYPES(object):
128
129
  MYSQL_TYPE_DATETIME2 = 18
129
130
  MYSQL_TYPE_TIME2 = 19
130
131
  MYSQL_TYPE_TYPED_ARRAY = 20
131
- MYSQL_TYPE_VECTOR = 242,
132
- MYSQL_TYPE_INVALID = 243,
133
- MYSQL_TYPE_BOOL = 244,
134
- MYSQL_TYPE_JSON = 245,
132
+ MYSQL_TYPE_VECTOR = 242
133
+ MYSQL_TYPE_INVALID = 243
134
+ MYSQL_TYPE_BOOL = 244
135
+ MYSQL_TYPE_JSON = 245
135
136
  MYSQL_TYPE_NEWDECIMAL = 246
136
137
  MYSQL_TYPE_ENUM = 247
137
138
  MYSQL_TYPE_SET = 248
@@ -312,40 +313,6 @@ MYSQL_DATA_TYPE_COLUMNS_DEFAULT = {
312
313
  }
313
314
 
314
315
 
315
- # Map between data types and C types
316
- # https://dev.mysql.com/doc/c-api/8.0/en/c-api-prepared-statement-type-codes.html
317
- DATA_C_TYPE_MAP = {
318
- MYSQL_DATA_TYPE.TINYINT: C_TYPES.MYSQL_TYPE_TINY,
319
- MYSQL_DATA_TYPE.SMALLINT: C_TYPES.MYSQL_TYPE_SHORT,
320
- MYSQL_DATA_TYPE.MEDIUMINT: C_TYPES.MYSQL_TYPE_INT24,
321
- MYSQL_DATA_TYPE.INT: C_TYPES.MYSQL_TYPE_LONG,
322
- MYSQL_DATA_TYPE.BIGINT: C_TYPES.MYSQL_TYPE_LONGLONG,
323
- MYSQL_DATA_TYPE.FLOAT: C_TYPES.MYSQL_TYPE_FLOAT,
324
- MYSQL_DATA_TYPE.DOUBLE: C_TYPES.MYSQL_TYPE_DOUBLE,
325
- MYSQL_DATA_TYPE.DECIMAL: C_TYPES.MYSQL_TYPE_NEWDECIMAL,
326
- MYSQL_DATA_TYPE.YEAR: C_TYPES.MYSQL_TYPE_SHORT,
327
- MYSQL_DATA_TYPE.TIME: C_TYPES.MYSQL_TYPE_TIME,
328
- MYSQL_DATA_TYPE.DATE: C_TYPES.MYSQL_TYPE_DATE,
329
- MYSQL_DATA_TYPE.DATETIME: C_TYPES.MYSQL_TYPE_DATETIME,
330
- MYSQL_DATA_TYPE.TIMESTAMP: C_TYPES.MYSQL_TYPE_TIMESTAMP,
331
- MYSQL_DATA_TYPE.CHAR: C_TYPES.MYSQL_TYPE_STRING,
332
- MYSQL_DATA_TYPE.BINARY: C_TYPES.MYSQL_TYPE_STRING,
333
- MYSQL_DATA_TYPE.VARCHAR: C_TYPES.MYSQL_TYPE_VAR_STRING,
334
- MYSQL_DATA_TYPE.VARBINARY: C_TYPES.MYSQL_TYPE_VAR_STRING,
335
- MYSQL_DATA_TYPE.TINYBLOB: C_TYPES.MYSQL_TYPE_TINY_BLOB,
336
- MYSQL_DATA_TYPE.TINYTEXT: C_TYPES.MYSQL_TYPE_TINY_BLOB,
337
- MYSQL_DATA_TYPE.BLOB: C_TYPES.MYSQL_TYPE_BLOB,
338
- MYSQL_DATA_TYPE.TEXT: C_TYPES.MYSQL_TYPE_BLOB,
339
- MYSQL_DATA_TYPE.MEDIUMBLOB: C_TYPES.MYSQL_TYPE_MEDIUM_BLOB,
340
- MYSQL_DATA_TYPE.MEDIUMTEXT: C_TYPES.MYSQL_TYPE_MEDIUM_BLOB,
341
- MYSQL_DATA_TYPE.LONGBLOB: C_TYPES.MYSQL_TYPE_LONG_BLOB,
342
- MYSQL_DATA_TYPE.LONGTEXT: C_TYPES.MYSQL_TYPE_LONG_BLOB,
343
- MYSQL_DATA_TYPE.BIT: C_TYPES.MYSQL_TYPE_BIT,
344
- MYSQL_DATA_TYPE.BOOL: C_TYPES.MYSQL_TYPE_TINY,
345
- MYSQL_DATA_TYPE.BOOLEAN: C_TYPES.MYSQL_TYPE_TINY
346
- }
347
-
348
-
349
316
  class FIELD_FLAG(object):
350
317
  __slots__ = ()
351
318
  NOT_NULL = 1 # field cannot be null
@@ -368,6 +335,55 @@ class FIELD_FLAG(object):
368
335
  FIELD_FLAG = FIELD_FLAG()
369
336
 
370
337
 
338
+ @dataclass(frozen=True)
339
+ class CTypeProperties:
340
+ """Properties that describe int-representation of mysql column.
341
+
342
+ Attributes:
343
+ code (int): Code of the mysql type.
344
+ size (int | None): Size of the column. If not specified, then size is variable (text/blob types).
345
+ flags (list[int]): Flags of the mysql type.
346
+ """
347
+ code: int
348
+ size: int | None = None
349
+ flags: list[int] = field(default_factory=list)
350
+
351
+
352
+ # Map between data types and C types
353
+ # Fields size and flags been taken from tcp dump of mysql-server response
354
+ # https://dev.mysql.com/doc/c-api/8.0/en/c-api-prepared-statement-type-codes.html
355
+ DATA_C_TYPE_MAP = {
356
+ MYSQL_DATA_TYPE.TINYINT: CTypeProperties(C_TYPES.MYSQL_TYPE_TINY, 4),
357
+ MYSQL_DATA_TYPE.SMALLINT: CTypeProperties(C_TYPES.MYSQL_TYPE_SHORT, 6),
358
+ MYSQL_DATA_TYPE.MEDIUMINT: CTypeProperties(C_TYPES.MYSQL_TYPE_INT24, 9),
359
+ MYSQL_DATA_TYPE.INT: CTypeProperties(C_TYPES.MYSQL_TYPE_LONG, 11),
360
+ MYSQL_DATA_TYPE.BIGINT: CTypeProperties(C_TYPES.MYSQL_TYPE_LONGLONG, 20),
361
+ MYSQL_DATA_TYPE.FLOAT: CTypeProperties(C_TYPES.MYSQL_TYPE_FLOAT, 12),
362
+ MYSQL_DATA_TYPE.DOUBLE: CTypeProperties(C_TYPES.MYSQL_TYPE_DOUBLE, 22),
363
+ MYSQL_DATA_TYPE.DECIMAL: CTypeProperties(C_TYPES.MYSQL_TYPE_NEWDECIMAL),
364
+ MYSQL_DATA_TYPE.YEAR: CTypeProperties(C_TYPES.MYSQL_TYPE_YEAR, 4, [FIELD_FLAG.UNSIGNED, FIELD_FLAG.ZEROFILL_FLAG]),
365
+ MYSQL_DATA_TYPE.TIME: CTypeProperties(C_TYPES.MYSQL_TYPE_TIME, 10, [FIELD_FLAG.BINARY_COLLATION]),
366
+ MYSQL_DATA_TYPE.DATE: CTypeProperties(C_TYPES.MYSQL_TYPE_DATE, 10, [FIELD_FLAG.BINARY_COLLATION]),
367
+ MYSQL_DATA_TYPE.DATETIME: CTypeProperties(C_TYPES.MYSQL_TYPE_DATETIME, 19, [FIELD_FLAG.BINARY_COLLATION]),
368
+ MYSQL_DATA_TYPE.TIMESTAMP: CTypeProperties(C_TYPES.MYSQL_TYPE_TIMESTAMP, 19, [FIELD_FLAG.BINARY_COLLATION, FIELD_FLAG.TIMESTAMP]),
369
+ MYSQL_DATA_TYPE.CHAR: CTypeProperties(C_TYPES.MYSQL_TYPE_STRING),
370
+ MYSQL_DATA_TYPE.BINARY: CTypeProperties(C_TYPES.MYSQL_TYPE_STRING, flags=[FIELD_FLAG.BINARY_COLLATION]),
371
+ MYSQL_DATA_TYPE.VARCHAR: CTypeProperties(C_TYPES.MYSQL_TYPE_VAR_STRING),
372
+ MYSQL_DATA_TYPE.VARBINARY: CTypeProperties(C_TYPES.MYSQL_TYPE_VAR_STRING, flags=[FIELD_FLAG.BINARY_COLLATION]),
373
+ MYSQL_DATA_TYPE.TINYBLOB: CTypeProperties(C_TYPES.MYSQL_TYPE_BLOB, flags=[FIELD_FLAG.BLOB, FIELD_FLAG.BINARY_COLLATION]),
374
+ MYSQL_DATA_TYPE.TINYTEXT: CTypeProperties(C_TYPES.MYSQL_TYPE_BLOB, flags=[FIELD_FLAG.BLOB]),
375
+ MYSQL_DATA_TYPE.BLOB: CTypeProperties(C_TYPES.MYSQL_TYPE_BLOB, flags=[FIELD_FLAG.BLOB, FIELD_FLAG.BINARY_COLLATION]),
376
+ MYSQL_DATA_TYPE.TEXT: CTypeProperties(C_TYPES.MYSQL_TYPE_BLOB, flags=[FIELD_FLAG.BLOB]),
377
+ MYSQL_DATA_TYPE.MEDIUMBLOB: CTypeProperties(C_TYPES.MYSQL_TYPE_BLOB, flags=[FIELD_FLAG.BLOB, FIELD_FLAG.BINARY_COLLATION]),
378
+ MYSQL_DATA_TYPE.MEDIUMTEXT: CTypeProperties(C_TYPES.MYSQL_TYPE_BLOB, flags=[FIELD_FLAG.BLOB]),
379
+ MYSQL_DATA_TYPE.LONGBLOB: CTypeProperties(C_TYPES.MYSQL_TYPE_BLOB, flags=[FIELD_FLAG.BLOB, FIELD_FLAG.BINARY_COLLATION]),
380
+ MYSQL_DATA_TYPE.LONGTEXT: CTypeProperties(C_TYPES.MYSQL_TYPE_BLOB, flags=[FIELD_FLAG.BLOB]),
381
+ MYSQL_DATA_TYPE.BIT: CTypeProperties(C_TYPES.MYSQL_TYPE_BIT, 8, [FIELD_FLAG.UNSIGNED]),
382
+ MYSQL_DATA_TYPE.BOOL: CTypeProperties(C_TYPES.MYSQL_TYPE_TINY, 1),
383
+ MYSQL_DATA_TYPE.BOOLEAN: CTypeProperties(C_TYPES.MYSQL_TYPE_TINY, 1)
384
+ }
385
+
386
+
371
387
  # HANDSHAKE
372
388
 
373
389
  DEFAULT_COALLITION_ID = 83
@@ -21,15 +21,10 @@ import sys
21
21
  import tempfile
22
22
  import traceback
23
23
  from functools import partial
24
- from typing import Dict, List, Optional
24
+ from typing import List
25
25
  from dataclasses import dataclass
26
26
 
27
- from numpy import dtype as np_dtype
28
- from pandas.api import types as pd_types
29
-
30
- from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import NULL_VALUE
31
27
  from mindsdb.api.mysql.mysql_proxy.data_types.mysql_datum import Datum
32
-
33
28
  import mindsdb.utilities.hooks as hooks
34
29
  import mindsdb.utilities.profiler as profiler
35
30
  from mindsdb.utilities.sql import clear_sql
@@ -61,14 +56,14 @@ from mindsdb.api.mysql.mysql_proxy.external_libs.mysql_scramble import (
61
56
  scramble as scramble_func,
62
57
  )
63
58
  from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import (
64
- CAPABILITIES,
59
+ DEFAULT_AUTH_METHOD,
65
60
  CHARSET_NUMBERS,
61
+ SERVER_STATUS,
62
+ CAPABILITIES,
63
+ NULL_VALUE,
66
64
  COMMANDS,
67
- DEFAULT_AUTH_METHOD,
68
65
  ERR,
69
- SERVER_STATUS,
70
- TYPES,
71
- getConstName,
66
+ getConstName
72
67
  )
73
68
  from mindsdb.api.executor.data_types.answer import ExecuteAnswer
74
69
  from mindsdb.api.executor.data_types.response_type import RESPONSE_TYPE
@@ -79,12 +74,14 @@ from mindsdb.api.mysql.mysql_proxy.utilities import (
79
74
  from mindsdb.api.executor import exceptions as exec_exc
80
75
 
81
76
  from mindsdb.api.common.check_auth import check_auth
82
- from mindsdb.api.mysql.mysql_proxy.utilities.lightwood_dtype import dtype
77
+ from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
78
+ from mindsdb.api.executor.sql_query.result_set import Column, ResultSet
83
79
  from mindsdb.utilities import log
84
80
  from mindsdb.utilities.config import config
85
81
  from mindsdb.utilities.context import context as ctx
86
82
  from mindsdb.utilities.otel import increment_otel_query_request_counter
87
83
  from mindsdb.utilities.wizards import make_ssl_cert
84
+ from mindsdb.api.mysql.mysql_proxy.utilities.dump import dump_result_set_to_mysql, column_to_mysql_column_dict
88
85
 
89
86
  logger = log.getLogger(__name__)
90
87
 
@@ -96,18 +93,43 @@ def empty_fn():
96
93
  @dataclass
97
94
  class SQLAnswer:
98
95
  resp_type: RESPONSE_TYPE = RESPONSE_TYPE.OK
99
- columns: Optional[List[Dict]] = None
100
- data: Optional[List[Dict]] = None # resultSet ?
101
- status: Optional[int] = None
102
- state_track: Optional[List[List]] = None
103
- error_code: Optional[int] = None
104
- error_message: Optional[str] = None
105
- affected_rows: Optional[int] = None
96
+ result_set: ResultSet | None = None
97
+ status: int | None = None
98
+ state_track: List[List] | None = None
99
+ error_code: int | None = None
100
+ error_message: str | None = None
101
+ affected_rows: int | None = None
102
+ mysql_types: list[MYSQL_DATA_TYPE] | None = None
106
103
 
107
104
  @property
108
105
  def type(self):
109
106
  return self.resp_type
110
107
 
108
+ def dump_http_response(self) -> dict:
109
+ if self.resp_type == RESPONSE_TYPE.OK:
110
+ return {
111
+ "type": self.resp_type,
112
+ "affected_rows": self.affected_rows,
113
+ }
114
+ elif self.resp_type in (RESPONSE_TYPE.TABLE, RESPONSE_TYPE.COLUMNS_TABLE):
115
+ data = self.result_set.to_lists(json_types=True)
116
+ return {
117
+ "type": RESPONSE_TYPE.TABLE,
118
+ "data": data,
119
+ "column_names": [
120
+ column.alias or column.name
121
+ for column in self.result_set.columns
122
+ ],
123
+ }
124
+ elif self.resp_type == RESPONSE_TYPE.ERROR:
125
+ return {
126
+ "type": RESPONSE_TYPE.ERROR,
127
+ "error_code": self.error_code or 0,
128
+ "error_message": self.error_message,
129
+ }
130
+ else:
131
+ raise ValueError(f"Unsupported response type for dump HTTP response: {self.resp_type}")
132
+
111
133
 
112
134
  class MysqlProxy(SocketServer.BaseRequestHandler):
113
135
  """
@@ -310,14 +332,14 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
310
332
  self.session.unregister_stmt(stmt_id)
311
333
 
312
334
  def send_query_answer(self, answer: SQLAnswer):
313
- if answer.type == RESPONSE_TYPE.TABLE:
335
+ if answer.type in (RESPONSE_TYPE.TABLE, RESPONSE_TYPE.COLUMNS_TABLE):
314
336
  packages = []
315
337
 
316
- if len(answer.data) > 1000:
338
+ if len(answer.result_set) > 1000:
317
339
  # for big responses leverage pandas map function to convert data to packages
318
- self.send_table_packets(columns=answer.columns, data=answer.data)
340
+ self.send_table_packets(result_set=answer.result_set)
319
341
  else:
320
- packages += self.get_table_packets(columns=answer.columns, data=answer.data.to_lists())
342
+ packages += self.get_table_packets(result_set=answer.result_set)
321
343
 
322
344
  if answer.status is not None:
323
345
  packages.append(self.last_packet(status=answer.status))
@@ -331,7 +353,7 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
331
353
  ErrPacket, err_code=answer.error_code, msg=answer.error_message
332
354
  ).send()
333
355
 
334
- def _get_column_defenition_packets(self, columns, data=None, columns_len=None):
356
+ def _get_column_defenition_packets(self, columns: dict, data=None):
335
357
  if data is None:
336
358
  data = []
337
359
  packets = []
@@ -346,18 +368,16 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
346
368
  column_name = column.get("name", "column_name")
347
369
  column_alias = column.get("alias", column_name)
348
370
  flags = column.get("flags", 0)
349
- if columns_len is not None:
350
- length = columns_len[i]
351
- else:
352
- if len(data) == 0:
353
- length = 0xFFFF
354
- else:
355
- length = 1
356
- for row in data:
357
- if isinstance(row, dict):
358
- length = max(len(str(row[column_alias])), length)
359
- else:
360
- length = max(len(str(row[i])), length)
371
+ if isinstance(flags, list):
372
+ flags = sum(flags)
373
+ if column.get('size') is None:
374
+ length = 1
375
+ for row in data:
376
+ if isinstance(row, dict):
377
+ length = max(len(str(row[column_alias])), length)
378
+ else:
379
+ length = max(len(str(row[i])), length)
380
+ column['size'] = 1
361
381
 
362
382
  packets.append(
363
383
  self.packet(
@@ -369,16 +389,19 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
369
389
  column_name=column_name,
370
390
  column_type=column["type"],
371
391
  charset=column.get("charset", CHARSET_NUMBERS["utf8_unicode_ci"]),
372
- max_length=length,
392
+ max_length=column["size"],
373
393
  flags=flags,
374
394
  )
375
395
  )
376
396
  return packets
377
397
 
378
- def get_table_packets(self, columns, data, status=0):
398
+ def get_table_packets(self, result_set: ResultSet, status=0):
399
+ data_frame, columns_dict = dump_result_set_to_mysql(result_set)
400
+ data = data_frame.to_dict('split')['data']
401
+
379
402
  # TODO remove columns order
380
- packets = [self.packet(ColumnCountPacket, count=len(columns))]
381
- packets.extend(self._get_column_defenition_packets(columns, data))
403
+ packets = [self.packet(ColumnCountPacket, count=len(columns_dict))]
404
+ packets.extend(self._get_column_defenition_packets(columns_dict, data))
382
405
 
383
406
  if self.client_capabilities.DEPRECATE_EOF is False:
384
407
  packets.append(self.packet(EofPacket, status=status))
@@ -386,9 +409,9 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
386
409
  packets += [self.packet(ResultsetRowPacket, data=x) for x in data]
387
410
  return packets
388
411
 
389
- def send_table_packets(self, columns, data, status=0):
412
+ def send_table_packets(self, result_set: ResultSet, status: int = 0):
413
+ df, columns_dicts = dump_result_set_to_mysql(result_set, infer_column_size=True)
390
414
  # text protocol, convert all to string and serialize as packages
391
- df = data.get_raw_df()
392
415
 
393
416
  def apply_f(v):
394
417
  if v is None:
@@ -397,23 +420,10 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
397
420
  v = str(v)
398
421
  return Datum.serialize_str(v)
399
422
 
400
- # get column max size
401
- # column_len is used by mysql client to determine width of columns, so it is not mandatory
402
- # to get exactly max value. We can approximate them by sample.
403
- columns_len = None
404
- if len(df) > 0:
405
- sample = df.head(100)
406
- columns_len = []
407
- for column in sample.columns:
408
- try:
409
- columns_len.append(sample[column].astype(str).str.len().max())
410
- except Exception:
411
- columns_len.append(1)
412
-
413
423
  # columns packages
414
- packets = [self.packet(ColumnCountPacket, count=len(columns))]
424
+ packets = [self.packet(ColumnCountPacket, count=len(columns_dicts))]
415
425
 
416
- packets.extend(self._get_column_defenition_packets(columns, columns_len=columns_len))
426
+ packets.extend(self._get_column_defenition_packets(columns_dicts))
417
427
 
418
428
  if self.client_capabilities.DEPRECATE_EOF is False:
419
429
  packets.append(self.packet(EofPacket, status=status))
@@ -486,57 +496,12 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
486
496
 
487
497
  return {"is_cloud": False}
488
498
 
489
- def to_mysql_columns(self, columns_list):
490
- """Converts raw columns data into convinient format(list of lists) for the futher usage.
491
- Plus, it is also converts column types into internal ones."""
492
-
493
- result = []
494
-
495
- database = (
496
- None if self.session.database == "" else self.session.database.lower()
497
- )
498
- for column_record in columns_list:
499
-
500
- field_type = column_record.type
501
-
502
- column_type = TYPES.MYSQL_TYPE_VAR_STRING
503
- # is already in mysql protocol type?
504
- if isinstance(field_type, int):
505
- column_type = field_type
506
- # pandas checks
507
- elif isinstance(field_type, np_dtype):
508
- if pd_types.is_integer_dtype(field_type):
509
- column_type = TYPES.MYSQL_TYPE_LONG
510
- elif pd_types.is_numeric_dtype(field_type):
511
- column_type = TYPES.MYSQL_TYPE_DOUBLE
512
- elif pd_types.is_datetime64_any_dtype(field_type):
513
- column_type = TYPES.MYSQL_TYPE_DATETIME
514
- # lightwood checks
515
- elif field_type == dtype.date:
516
- column_type = TYPES.MYSQL_TYPE_DATE
517
- elif field_type == dtype.datetime:
518
- column_type = TYPES.MYSQL_TYPE_DATETIME
519
- elif field_type == dtype.float:
520
- column_type = TYPES.MYSQL_TYPE_DOUBLE
521
- elif field_type == dtype.integer:
522
- column_type = TYPES.MYSQL_TYPE_LONG
523
-
524
- result.append(
525
- {
526
- "database": column_record.database or database,
527
- # TODO add 'original_table'
528
- "table_name": column_record.table_name,
529
- "name": column_record.name,
530
- "alias": column_record.alias or column_record.name,
531
- # NOTE all work with text-type, but if/when wanted change types to real,
532
- # it will need to check all types casts in BinaryResultsetRowPacket
533
- "type": column_type,
534
- }
535
- )
536
- return result
499
+ def to_mysql_columns(self, columns_list: list[Column]) -> list[dict[str, str | int]]:
500
+ database_name = None if self.session.database == "" else self.session.database.lower()
501
+ return [column_to_mysql_column_dict(column, database_name=database_name) for column in columns_list]
537
502
 
538
503
  @profiler.profile()
539
- def process_query(self, sql):
504
+ def process_query(self, sql) -> SQLAnswer:
540
505
  executor = Executor(session=self.session, sqlserver=self)
541
506
  executor.query_execute(sql)
542
507
  executor_answer = executor.executor_answer
@@ -551,10 +516,10 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
551
516
  resp = SQLAnswer(
552
517
  resp_type=RESPONSE_TYPE.TABLE,
553
518
  state_track=executor_answer.state_track,
554
- columns=self.to_mysql_columns(executor_answer.data.columns),
555
- data=executor_answer.data,
519
+ result_set=executor_answer.data,
556
520
  status=executor.server_status,
557
- affected_rows=executor_answer.affected_rows
521
+ affected_rows=executor_answer.affected_rows,
522
+ mysql_types=executor_answer.data.mysql_types
558
523
  )
559
524
 
560
525
  # Increment the counter and include metadata in attributes
@@ -609,23 +574,25 @@ class MysqlProxy(SocketServer.BaseRequestHandler):
609
574
  return self.send_query_answer(resp)
610
575
 
611
576
  # TODO prepared_stmt['type'] == 'lock' is not used but it works
612
- columns_def = self.to_mysql_columns(executor_answer.data.columns)
613
- packages = [self.packet(ColumnCountPacket, count=len(columns_def))]
577
+ result_set = executor_answer.data
578
+ data_frame, columns_dict = dump_result_set_to_mysql(result_set)
579
+ data = data_frame.to_dict('split')['data']
614
580
 
615
- packages.extend(self._get_column_defenition_packets(columns_def))
581
+ packages = [self.packet(ColumnCountPacket, count=len(columns_dict))]
582
+ packages.extend(self._get_column_defenition_packets(columns_dict))
616
583
 
617
584
  if self.client_capabilities.DEPRECATE_EOF is False:
618
585
  packages.append(self.packet(EofPacket, status=0x0062))
619
586
 
620
587
  # send all
621
- for row in executor_answer.data.to_lists():
588
+ for row in data:
622
589
  packages.append(
623
- self.packet(BinaryResultsetRowPacket, data=row, columns=columns_def)
590
+ self.packet(BinaryResultsetRowPacket, data=row, columns=columns_dict)
624
591
  )
625
592
 
626
593
  server_status = executor.server_status or 0x0002
627
594
  packages.append(self.last_packet(status=server_status))
628
- prepared_stmt["fetched"] += len(executor_answer.data)
595
+ prepared_stmt["fetched"] += len(data)
629
596
 
630
597
  return self.send_package_group(packages)
631
598