MindsDB 25.4.5.0__py3-none-any.whl → 25.5.4.0__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 (350) hide show
  1. mindsdb/__about__.py +1 -1
  2. mindsdb/__main__.py +215 -185
  3. mindsdb/api/a2a/__init__.py +0 -0
  4. mindsdb/api/a2a/__main__.py +114 -0
  5. mindsdb/api/a2a/a2a_client.py +439 -0
  6. mindsdb/api/a2a/agent.py +308 -0
  7. mindsdb/api/a2a/common/__init__.py +0 -0
  8. mindsdb/api/a2a/common/client/__init__.py +4 -0
  9. mindsdb/api/a2a/common/client/card_resolver.py +21 -0
  10. mindsdb/api/a2a/common/client/client.py +86 -0
  11. mindsdb/api/a2a/common/server/__init__.py +4 -0
  12. mindsdb/api/a2a/common/server/server.py +164 -0
  13. mindsdb/api/a2a/common/server/task_manager.py +287 -0
  14. mindsdb/api/a2a/common/server/utils.py +28 -0
  15. mindsdb/api/a2a/common/types.py +365 -0
  16. mindsdb/api/a2a/constants.py +9 -0
  17. mindsdb/api/a2a/run_a2a.py +129 -0
  18. mindsdb/api/a2a/task_manager.py +594 -0
  19. mindsdb/api/executor/command_executor.py +49 -28
  20. mindsdb/api/executor/datahub/classes/response.py +5 -2
  21. mindsdb/api/executor/datahub/datanodes/information_schema_datanode.py +8 -0
  22. mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
  23. mindsdb/api/executor/datahub/datanodes/system_tables.py +10 -13
  24. mindsdb/api/executor/planner/query_planner.py +14 -2
  25. mindsdb/api/executor/sql_query/result_set.py +185 -52
  26. mindsdb/api/executor/sql_query/sql_query.py +1 -1
  27. mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +11 -13
  28. mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
  29. mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
  30. mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
  31. mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
  32. mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
  33. mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
  34. mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
  35. mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
  36. mindsdb/api/http/initialize.py +118 -85
  37. mindsdb/api/http/namespaces/analysis.py +17 -4
  38. mindsdb/api/http/namespaces/file.py +8 -2
  39. mindsdb/api/http/namespaces/sql.py +13 -27
  40. mindsdb/api/http/namespaces/tree.py +1 -1
  41. mindsdb/api/http/start.py +7 -2
  42. mindsdb/api/mcp/start.py +42 -5
  43. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
  44. mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
  45. mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
  46. mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
  47. mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +86 -123
  48. mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
  49. mindsdb/api/mysql/mysql_proxy/utilities/exceptions.py +0 -4
  50. mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
  51. mindsdb/api/postgres/postgres_proxy/postgres_packets/postgres_message_formats.py +2 -2
  52. mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
  53. mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
  54. mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
  55. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
  56. mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
  57. mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
  58. mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
  59. mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
  60. mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
  61. mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
  62. mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
  63. mindsdb/integrations/handlers/bigquery_handler/requirements.txt +1 -0
  64. mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
  65. mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
  66. mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
  67. mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
  68. mindsdb/integrations/handlers/chromadb_handler/requirements.txt +1 -0
  69. mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
  70. mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
  71. mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
  72. mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
  73. mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
  74. mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
  75. mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
  76. mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
  77. mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
  78. mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
  79. mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
  80. mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
  81. mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
  82. mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
  83. mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
  84. mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
  85. mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
  86. mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
  87. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
  88. mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
  89. mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
  90. mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
  91. mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
  92. mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
  93. mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
  94. mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
  95. mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
  96. mindsdb/integrations/handlers/email_handler/settings.py +0 -1
  97. mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
  98. mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
  99. mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
  100. mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
  101. mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
  102. mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
  103. mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
  104. mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
  105. mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
  106. mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
  107. mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
  108. mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
  109. mindsdb/integrations/handlers/gmail_handler/requirements.txt +1 -0
  110. mindsdb/integrations/handlers/google_analytics_handler/requirements.txt +2 -1
  111. mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
  112. mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
  113. mindsdb/integrations/handlers/google_books_handler/requirements.txt +1 -1
  114. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
  115. mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
  116. mindsdb/integrations/handlers/google_calendar_handler/requirements.txt +1 -0
  117. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
  118. mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
  119. mindsdb/integrations/handlers/google_content_shopping_handler/requirements.txt +1 -1
  120. mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
  121. mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
  122. mindsdb/integrations/handlers/google_fit_handler/requirements.txt +2 -0
  123. mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
  124. mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
  125. mindsdb/integrations/handlers/google_search_handler/requirements.txt +1 -1
  126. mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
  127. mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
  128. mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
  129. mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
  130. mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
  131. mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
  132. mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
  133. mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
  134. mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
  135. mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
  136. mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
  137. mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
  138. mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
  139. mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
  140. mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
  141. mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
  142. mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
  143. mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
  144. mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
  145. mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
  146. mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
  147. mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
  148. mindsdb/integrations/handlers/jira_handler/jira_handler.archived.py +75 -0
  149. mindsdb/integrations/handlers/jira_handler/jira_handler.py +113 -38
  150. mindsdb/integrations/handlers/jira_handler/jira_tables.py +229 -0
  151. mindsdb/integrations/handlers/jira_handler/requirements.txt +1 -0
  152. mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
  153. mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
  154. mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
  155. mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
  156. mindsdb/integrations/handlers/lightfm_handler/requirements.txt +1 -0
  157. mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
  158. mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -3
  159. mindsdb/integrations/handlers/lightwood_handler/requirements.txt +4 -4
  160. mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
  161. mindsdb/integrations/handlers/lindorm_handler/requirements.txt +1 -0
  162. mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
  163. mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
  164. mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
  165. mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
  166. mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
  167. mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
  168. mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
  169. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
  170. mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
  171. mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
  172. mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
  173. mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
  174. mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
  175. mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
  176. mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
  177. mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
  178. mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
  179. mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
  180. mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
  181. mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
  182. mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
  183. mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
  184. mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
  185. mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
  186. mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
  187. mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
  188. mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
  189. mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
  190. mindsdb/integrations/handlers/ms_one_drive_handler/requirements.txt +2 -0
  191. mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
  192. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
  193. mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
  194. mindsdb/integrations/handlers/ms_teams_handler/requirements.txt +3 -1
  195. mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
  196. mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
  197. mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
  198. mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
  199. mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
  200. mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
  201. mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
  202. mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
  203. mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
  204. mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
  205. mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
  206. mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
  207. mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
  208. mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
  209. mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
  210. mindsdb/integrations/handlers/openai_handler/openai_handler.py +5 -4
  211. mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
  212. mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
  213. mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
  214. mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
  215. mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
  216. mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
  217. mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
  218. mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
  219. mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
  220. mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
  221. mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
  222. mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
  223. mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
  224. mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
  225. mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
  226. mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
  227. mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
  228. mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
  229. mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
  230. mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
  231. mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
  232. mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
  233. mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
  234. mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
  235. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
  236. mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
  237. mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
  238. mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
  239. mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
  240. mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
  241. mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
  242. mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
  243. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
  244. mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
  245. mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
  246. mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
  247. mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
  248. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
  249. mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
  250. mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
  251. mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
  252. mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
  253. mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
  254. mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
  255. mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
  256. mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
  257. mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
  258. mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
  259. mindsdb/integrations/handlers/snowflake_handler/requirements.txt +1 -1
  260. mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
  261. mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
  262. mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
  263. mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
  264. mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
  265. mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
  266. mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
  267. mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
  268. mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
  269. mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
  270. mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
  271. mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
  272. mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
  273. mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
  274. mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
  275. mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
  276. mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
  277. mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
  278. mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
  279. mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
  280. mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
  281. mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
  282. mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
  283. mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
  284. mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
  285. mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
  286. mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
  287. mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
  288. mindsdb/integrations/handlers/vertex_handler/requirements.txt +1 -0
  289. mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
  290. mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
  291. mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
  292. mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
  293. mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
  294. mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
  295. mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
  296. mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
  297. mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
  298. mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
  299. mindsdb/integrations/handlers/youtube_handler/requirements.txt +1 -0
  300. mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
  301. mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
  302. mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
  303. mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
  304. mindsdb/integrations/libs/response.py +67 -52
  305. mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
  306. mindsdb/integrations/utilities/files/file_reader.py +5 -2
  307. mindsdb/integrations/utilities/handler_utils.py +15 -3
  308. mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
  309. mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
  310. mindsdb/integrations/utilities/utils.py +3 -3
  311. mindsdb/interfaces/agents/agents_controller.py +164 -1
  312. mindsdb/interfaces/agents/constants.py +29 -2
  313. mindsdb/interfaces/agents/langchain_agent.py +18 -8
  314. mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
  315. mindsdb/interfaces/database/projects.py +1 -7
  316. mindsdb/interfaces/functions/controller.py +11 -14
  317. mindsdb/interfaces/functions/to_markdown.py +9 -124
  318. mindsdb/interfaces/knowledge_base/controller.py +47 -19
  319. mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +41 -15
  320. mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
  321. mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
  322. mindsdb/interfaces/knowledge_base/utils.py +10 -15
  323. mindsdb/interfaces/model/model_controller.py +0 -2
  324. mindsdb/interfaces/query_context/context_controller.py +66 -10
  325. mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
  326. mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
  327. mindsdb/interfaces/skills/skill_tool.py +202 -57
  328. mindsdb/interfaces/skills/sql_agent.py +238 -28
  329. mindsdb/interfaces/storage/fs.py +1 -0
  330. mindsdb/interfaces/variables/__init__.py +0 -0
  331. mindsdb/interfaces/variables/variables_controller.py +97 -0
  332. mindsdb/migrations/env.py +5 -7
  333. mindsdb/migrations/migrate.py +47 -9
  334. mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
  335. mindsdb/utilities/config.py +333 -220
  336. mindsdb/utilities/context.py +1 -1
  337. mindsdb/utilities/functions.py +0 -36
  338. mindsdb/utilities/langfuse.py +19 -10
  339. mindsdb/utilities/otel/__init__.py +9 -193
  340. mindsdb/utilities/otel/metric_handlers/__init__.py +5 -1
  341. mindsdb/utilities/otel/prepare.py +198 -0
  342. mindsdb/utilities/sql.py +83 -0
  343. mindsdb/utilities/starters.py +13 -0
  344. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/METADATA +351 -338
  345. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/RECORD +348 -322
  346. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/WHEEL +1 -1
  347. mindsdb/api/mysql/mysql_proxy/classes/sql_statement_parser.py +0 -151
  348. mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
  349. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/licenses/LICENSE +0 -0
  350. {mindsdb-25.4.5.0.dist-info → mindsdb-25.5.4.0.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,6 @@ from typing import Optional
5
5
  from functools import reduce
6
6
 
7
7
  import pandas as pd
8
- from mindsdb_evaluator.accuracy.general import evaluate_accuracy
9
8
  from mindsdb_sql_parser import parse_sql
10
9
  from mindsdb_sql_parser.ast import (
11
10
  Alter,
@@ -35,6 +34,7 @@ from mindsdb_sql_parser.ast import (
35
34
  Use,
36
35
  Tuple,
37
36
  Function,
37
+ Variable,
38
38
  )
39
39
 
40
40
  # typed models
@@ -50,6 +50,7 @@ from mindsdb_sql_parser.ast.mindsdb import (
50
50
  CreateSkill,
51
51
  CreateTrigger,
52
52
  CreateView,
53
+ CreateKnowledgeBaseIndex,
53
54
  DropAgent,
54
55
  DropChatBot,
55
56
  DropDatasource,
@@ -102,6 +103,7 @@ from mindsdb.interfaces.model.functions import (
102
103
  )
103
104
  from mindsdb.interfaces.query_context.context_controller import query_context_controller
104
105
  from mindsdb.interfaces.triggers.triggers_controller import TriggersController
106
+ from mindsdb.interfaces.variables.variables_controller import variables_controller
105
107
  from mindsdb.utilities.context import context as ctx
106
108
  from mindsdb.utilities.functions import mark_process, resolve_model_identifier, get_handler_install_message
107
109
  from mindsdb.utilities.exception import EntityExistsError, EntityNotExistsError
@@ -337,7 +339,7 @@ class ExecuteCommands:
337
339
  df2 = query_df(df, new_statement)
338
340
 
339
341
  return ExecuteAnswer(
340
- data=ResultSet().from_df(df2, table_name="session_variables")
342
+ data=ResultSet.from_df(df2, table_name="session_variables")
341
343
  )
342
344
  elif sql_category == "search_path":
343
345
  return ExecuteAnswer(
@@ -512,28 +514,30 @@ class ExecuteCommands:
512
514
  return ExecuteAnswer()
513
515
  elif statement_type is Set:
514
516
  category = (statement.category or "").lower()
515
- if category == "" and isinstance(statement.name, Identifier):
516
- param = statement.name.parts[0].lower()
517
-
518
- value = None
519
- if isinstance(statement.value, Constant):
520
- value = statement.value.value
521
-
522
- if param == "profiling":
523
- self.session.profiling = value in (1, True)
524
- if self.session.profiling is True:
525
- profiler.enable()
526
- else:
527
- profiler.disable()
528
- elif param == "predictor_cache":
529
- self.session.predictor_cache = value in (1, True)
530
- elif param == "context":
531
- if value in (0, False, None):
532
- # drop context
533
- query_context_controller.drop_query_context(None)
534
- elif param == "show_secrets":
535
- self.session.show_secrets = value in (1, True)
536
-
517
+ if category == "":
518
+ if isinstance(statement.name, Identifier):
519
+ param = statement.name.parts[0].lower()
520
+
521
+ value = None
522
+ if isinstance(statement.value, Constant):
523
+ value = statement.value.value
524
+
525
+ if param == "profiling":
526
+ self.session.profiling = value in (1, True)
527
+ if self.session.profiling is True:
528
+ profiler.enable()
529
+ else:
530
+ profiler.disable()
531
+ elif param == "predictor_cache":
532
+ self.session.predictor_cache = value in (1, True)
533
+ elif param == "context":
534
+ if value in (0, False, None):
535
+ # drop context
536
+ query_context_controller.drop_query_context(None)
537
+ elif param == "show_secrets":
538
+ self.session.show_secrets = value in (1, True)
539
+ elif isinstance(statement.name, Variable):
540
+ variables_controller.set_variable(statement.name.value, statement.value)
537
541
  return ExecuteAnswer()
538
542
  elif category == "autocommit":
539
543
  return ExecuteAnswer()
@@ -650,6 +654,8 @@ class ExecuteCommands:
650
654
  elif statement_type is Evaluate:
651
655
  statement.data = parse_sql(statement.query_str)
652
656
  return self.answer_evaluate_metric(statement, database_name)
657
+ elif statement_type is CreateKnowledgeBaseIndex:
658
+ return self.answer_create_kb_index(statement, database_name)
653
659
  else:
654
660
  logger.warning(f"Unknown SQL statement: {sql}")
655
661
  raise NotSupportedYet(f"Unknown SQL statement: {sql}")
@@ -814,6 +820,8 @@ class ExecuteCommands:
814
820
  return ExecuteAnswer()
815
821
 
816
822
  def answer_evaluate_metric(self, statement, database_name):
823
+ # heavy import, so we do it here on-demand
824
+ from mindsdb_evaluator.accuracy.general import evaluate_accuracy
817
825
  try:
818
826
  sqlquery = SQLQuery(statement.data, session=self.session, database=database_name)
819
827
  except Exception as e:
@@ -935,8 +943,18 @@ class ExecuteCommands:
935
943
  )
936
944
 
937
945
  return ExecuteAnswer(
938
- data=ResultSet().from_df(df, table_name="")
946
+ data=ResultSet.from_df(df, table_name="")
947
+ )
948
+
949
+ def answer_create_kb_index(self, statement, database_name):
950
+ table_name = statement.name.parts[-1]
951
+ project_name = (
952
+ statement.name.parts[0]
953
+ if len(statement.name.parts) > 1
954
+ else database_name
939
955
  )
956
+ self.session.kb_controller.create_index(table_name=table_name, project_name=project_name)
957
+ return ExecuteAnswer()
940
958
 
941
959
  def _get_model_info(self, identifier, except_absent=True, database_name=None):
942
960
  if len(identifier.parts) == 1:
@@ -967,6 +985,9 @@ class ExecuteCommands:
967
985
  """Checks if there is already a predictor retraining or fine-tuning
968
986
  Do not allow to run retrain if there is another model in training process in less that 1h
969
987
  """
988
+ if ctx.company_id is None:
989
+ # bypass for tests
990
+ return
970
991
  is_cloud = self.session.config.get("cloud", False)
971
992
  if is_cloud and ctx.user_class == 0:
972
993
  models = get_model_records(active=None)
@@ -1031,7 +1052,7 @@ class ExecuteCommands:
1031
1052
  df = self.session.model_controller.retrain_model(statement, ml_handler)
1032
1053
 
1033
1054
  return ExecuteAnswer(
1034
- data=ResultSet().from_df(df)
1055
+ data=ResultSet.from_df(df)
1035
1056
  )
1036
1057
 
1037
1058
  @profiler.profile()
@@ -1061,7 +1082,7 @@ class ExecuteCommands:
1061
1082
  df = self.session.model_controller.finetune_model(statement, ml_handler)
1062
1083
 
1063
1084
  return ExecuteAnswer(
1064
- data=ResultSet().from_df(df)
1085
+ data=ResultSet.from_df(df)
1065
1086
  )
1066
1087
 
1067
1088
  def _create_integration(self, name: str, engine: str, connection_args: dict):
@@ -1571,7 +1592,7 @@ class ExecuteCommands:
1571
1592
  try:
1572
1593
  df = self.session.model_controller.create_model(statement, ml_handler)
1573
1594
 
1574
- return ExecuteAnswer(data=ResultSet().from_df(df))
1595
+ return ExecuteAnswer(data=ResultSet.from_df(df))
1575
1596
  except EntityExistsError:
1576
1597
  if getattr(statement, "if_not_exists", False) is True:
1577
1598
  return ExecuteAnswer()
@@ -1,11 +1,14 @@
1
1
  from dataclasses import dataclass, field
2
- from typing import Optional, List, Dict
2
+ from typing import List, Dict
3
3
 
4
4
  import pandas as pd
5
5
 
6
+ from mindsdb.api.mysql.mysql_proxy.libs.constants.mysql import MYSQL_DATA_TYPE
7
+
6
8
 
7
9
  @dataclass
8
10
  class DataHubResponse:
9
11
  data_frame: pd.DataFrame = field(default_factory=pd.DataFrame)
10
12
  columns: List[Dict] = field(default_factory=list)
11
- affected_rows: Optional[int] = None
13
+ affected_rows: int | None = None
14
+ mysql_types: list[MYSQL_DATA_TYPE] | None = None
@@ -22,6 +22,8 @@ from .mindsdb_tables import (
22
22
  ModelsTable, DatabasesTable, MLEnginesTable, HandlersTable, JobsTable, QueriesTable,
23
23
  ChatbotsTable, KBTable, SkillsTable, AgentsTable, ViewsTable, TriggersTable)
24
24
 
25
+ from mindsdb.api.executor.datahub.classes.tables_row import TablesRow
26
+
25
27
 
26
28
  logger = log.getLogger(__name__)
27
29
 
@@ -166,6 +168,12 @@ class InformationSchemaDataNode(DataNode):
166
168
  return [x.lower() for x in projects]
167
169
 
168
170
  def get_tables(self):
171
+ return [
172
+ TablesRow(TABLE_NAME=name)
173
+ for name in self.tables.keys()
174
+ ]
175
+
176
+ def get_tree_tables(self):
169
177
  return {
170
178
  name: table
171
179
  for name, table in self.tables.items()
@@ -1,13 +1,12 @@
1
1
  import time
2
2
  import inspect
3
3
  from dataclasses import astuple
4
+ from typing import Iterable
4
5
 
5
6
  import numpy as np
6
- from numpy import dtype as np_dtype
7
7
  import pandas as pd
8
- from pandas.api import types as pd_types
9
8
  from sqlalchemy.types import (
10
- Integer, Float, Text
9
+ Integer, Float
11
10
  )
12
11
 
13
12
  from mindsdb_sql_parser.ast.base import ASTNode
@@ -121,9 +120,7 @@ class IntegrationDataNode(DataNode):
121
120
  tables=[name],
122
121
  if_exists=if_exists
123
122
  )
124
- result = self._query(drop_ast)
125
- if result.type == RESPONSE_TYPE.ERROR:
126
- raise Exception(result.error_message)
123
+ self.query(drop_ast)
127
124
 
128
125
  def create_table(self, table_name: Identifier, result_set: ResultSet = None, columns=None,
129
126
  is_replace=False, is_create=False, **kwargs) -> DataHubResponse:
@@ -138,27 +135,11 @@ class IntegrationDataNode(DataNode):
138
135
 
139
136
  df = result_set.get_raw_df()
140
137
 
141
- for idx, col in enumerate(result_set.columns):
142
- dtype = col.type
143
- # assume this is pandas type
144
- column_type = Text
145
- if isinstance(dtype, np_dtype):
146
- if pd_types.is_object_dtype(dtype):
147
- # try to infer
148
- dtype = df[idx].infer_objects().dtype
149
-
150
- if pd_types.is_integer_dtype(dtype):
151
- column_type = Integer
152
- elif pd_types.is_numeric_dtype(dtype):
153
- column_type = Float
154
-
155
- columns.append(
156
- TableColumn(
157
- name=col.alias,
158
- type=column_type
159
- )
160
- )
161
- table_columns_meta[col.alias] = column_type
138
+ columns: list[TableColumn] = result_set.get_ast_columns()
139
+ table_columns_meta = {
140
+ column.name: column.type
141
+ for column in columns
142
+ }
162
143
 
163
144
  if is_replace:
164
145
  # drop
@@ -166,9 +147,7 @@ class IntegrationDataNode(DataNode):
166
147
  tables=[table_name],
167
148
  if_exists=True
168
149
  )
169
- result = self._query(drop_ast)
170
- if result.type == RESPONSE_TYPE.ERROR:
171
- raise Exception(result.error_message)
150
+ self.query(drop_ast)
172
151
  is_create = True
173
152
 
174
153
  if is_create:
@@ -177,9 +156,7 @@ class IntegrationDataNode(DataNode):
177
156
  columns=columns,
178
157
  is_replace=is_replace
179
158
  )
180
- result = self._query(create_table_ast)
181
- if result.type == RESPONSE_TYPE.ERROR:
182
- raise Exception(result.error_message)
159
+ self.query(create_table_ast)
183
160
 
184
161
  if result_set is None:
185
162
  # it is just a 'create table'
@@ -224,56 +201,44 @@ class IntegrationDataNode(DataNode):
224
201
  )
225
202
 
226
203
  try:
227
- result = self._query(insert_ast)
204
+ result: DataHubResponse = self.query(insert_ast)
228
205
  except Exception as e:
229
206
  msg = f'[{self.ds_type}/{self.integration_name}]: {str(e)}'
230
207
  raise DBHandlerException(msg) from e
231
208
 
232
- if result.type == RESPONSE_TYPE.ERROR:
233
- raise Exception(result.error_message)
234
-
235
209
  return DataHubResponse(affected_rows=result.affected_rows)
236
210
 
237
- def _query(self, query) -> HandlerResponse:
238
- time_before_query = time.perf_counter()
239
- result = self.integration_handler.query(query)
240
- elapsed_seconds = time.perf_counter() - time_before_query
241
- query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
242
- get_class_name(self.integration_handler), result.type)
243
- query_time_with_labels.observe(elapsed_seconds)
244
-
245
- num_rows = 0
246
- if result.data_frame is not None:
247
- num_rows = len(result.data_frame.index)
248
- response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
249
- get_class_name(self.integration_handler), result.type)
250
- response_size_with_labels.observe(num_rows)
251
- return result
252
-
253
- def _native_query(self, native_query) -> HandlerResponse:
254
- time_before_query = time.perf_counter()
255
- result = self.integration_handler.native_query(native_query)
256
- elapsed_seconds = time.perf_counter() - time_before_query
257
- query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
258
- get_class_name(self.integration_handler), result.type)
259
- query_time_with_labels.observe(elapsed_seconds)
260
-
261
- num_rows = 0
262
- if result.data_frame is not None:
263
- num_rows = len(result.data_frame.index)
264
- response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
265
- get_class_name(self.integration_handler), result.type)
266
- response_size_with_labels.observe(num_rows)
267
- return result
211
+ def has_support_stream(self) -> bool:
212
+ # checks if data handler has query_stream method
213
+ return hasattr(self.integration_handler, 'query_stream') and callable(self.integration_handler.query_stream)
214
+
215
+ @profiler.profile()
216
+ def query_stream(self, query: ASTNode, fetch_size: int = None) -> Iterable:
217
+ # returns generator of results from handler (split by chunks)
218
+ return self.integration_handler.query_stream(query, fetch_size=fetch_size)
268
219
 
269
220
  @profiler.profile()
270
221
  def query(self, query: ASTNode | None = None, native_query: str | None = None, session=None) -> DataHubResponse:
271
222
  try:
223
+ time_before_query = time.perf_counter()
272
224
  if query is not None:
273
- result: HandlerResponse = self._query(query)
225
+ result: HandlerResponse = self.integration_handler.query(query)
274
226
  else:
275
227
  # try to fetch native query
276
- result: HandlerResponse = self._native_query(native_query)
228
+ result: HandlerResponse = self.integration_handler.native_query(native_query)
229
+
230
+ # metrics
231
+ elapsed_seconds = time.perf_counter() - time_before_query
232
+ query_time_with_labels = metrics.INTEGRATION_HANDLER_QUERY_TIME.labels(
233
+ get_class_name(self.integration_handler), result.type)
234
+ query_time_with_labels.observe(elapsed_seconds)
235
+
236
+ num_rows = 0
237
+ if result.data_frame is not None:
238
+ num_rows = len(result.data_frame.index)
239
+ response_size_with_labels = metrics.INTEGRATION_HANDLER_RESPONSE_SIZE.labels(
240
+ get_class_name(self.integration_handler), result.type)
241
+ response_size_with_labels.observe(num_rows)
277
242
  except Exception as e:
278
243
  msg = str(e).strip()
279
244
  if msg == '':
@@ -294,7 +259,8 @@ class IntegrationDataNode(DataNode):
294
259
 
295
260
  try:
296
261
  # replace python's Nan, np.NaN, np.nan and pd.NA to None
297
- df.replace([np.NaN, pd.NA], None, inplace=True)
262
+ # TODO keep all NAN to the end of processing, bacause replacing also changes dtypes
263
+ df.replace([np.NaN, pd.NA, pd.NaT], None, inplace=True)
298
264
  except Exception as e:
299
265
  logger.error(f"Issue with clearing DF from NaN values: {e}")
300
266
  # endregion
@@ -310,5 +276,6 @@ class IntegrationDataNode(DataNode):
310
276
  return DataHubResponse(
311
277
  data_frame=df,
312
278
  columns=columns_info,
313
- affected_rows=result.affected_rows
279
+ affected_rows=result.affected_rows,
280
+ mysql_types=result.mysql_types
314
281
  )
@@ -311,20 +311,17 @@ class ColumnsTable(Table):
311
311
  result = []
312
312
  for db_name in databases:
313
313
  tables = {}
314
- if db_name == 'information_schema':
315
- for table_name, table in inf_schema.tables.items():
316
- tables[table_name] = [
317
- {'name': name} for name in table.columns
318
- ]
314
+
315
+ dn = inf_schema.get(db_name)
316
+ if dn is None:
317
+ continue
318
+
319
+ if tables_names is None:
320
+ list_tables = [t.TABLE_NAME for t in dn.get_tables()]
319
321
  else:
320
- dn = inf_schema.get(db_name)
321
- if dn is None:
322
- continue
323
-
324
- if tables_names is None:
325
- tables_names = [t.TABLE_NAME for t in dn.get_tables()]
326
- for table_name in tables_names:
327
- tables[table_name] = dn.get_table_columns_df(table_name)
322
+ list_tables = tables_names
323
+ for table_name in list_tables:
324
+ tables[table_name] = dn.get_table_columns_df(table_name)
328
325
 
329
326
  for table_name, table_columns_df in tables.items():
330
327
  for _, row in table_columns_df.iterrows():
@@ -29,6 +29,9 @@ from mindsdb.utilities.config import config
29
29
 
30
30
  default_project = config.get('default_project')
31
31
 
32
+ # This includes built-in MindsDB SQL functions and functions to be executed via DuckDB consistently.
33
+ MINDSDB_SQL_FUNCTIONS = {'llm', 'to_markdown', 'hash'}
34
+
32
35
 
33
36
  class QueryPlanner:
34
37
 
@@ -237,7 +240,7 @@ class QueryPlanner:
237
240
 
238
241
  def find_objects(node, is_table, **kwargs):
239
242
  if isinstance(node, Function):
240
- if node.namespace is not None or node.op.lower() in ('llm',):
243
+ if node.namespace is not None or node.op.lower() in MINDSDB_SQL_FUNCTIONS:
241
244
  user_functions.append(node)
242
245
 
243
246
  if is_table:
@@ -845,11 +848,12 @@ class QueryPlanner:
845
848
  """
846
849
 
847
850
  # handle fetchdataframe partitioning
851
+ steps_in = plan.steps
848
852
  steps_out = []
849
853
 
850
854
  step = None
851
855
  partition_step = None
852
- for step in plan.steps:
856
+ for step in steps_in:
853
857
  if isinstance(step, FetchDataframeStep) and step.params is not None:
854
858
  batch_size = step.params.get('batch_size')
855
859
  if batch_size is not None:
@@ -902,6 +906,14 @@ class QueryPlanner:
902
906
 
903
907
  if plan.is_resumable and isinstance(step, InsertToTable):
904
908
  plan.is_async = True
909
+ else:
910
+ # special case: register insert from select (it is the same as mark resumable)
911
+ if (
912
+ len(steps_in) == 2
913
+ and isinstance(steps_in[0], FetchDataframeStep)
914
+ and isinstance(steps_in[1], InsertToTable)
915
+ ):
916
+ plan.is_resumable = True
905
917
 
906
918
  plan.steps = steps_out
907
919
  return plan