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.
- mindsdb/__about__.py +8 -8
- mindsdb/__main__.py +127 -79
- mindsdb/api/a2a/__init__.py +0 -0
- mindsdb/api/a2a/__main__.py +144 -0
- mindsdb/api/a2a/agent.py +308 -0
- mindsdb/api/a2a/common/__init__.py +0 -0
- mindsdb/api/a2a/common/server/__init__.py +4 -0
- mindsdb/api/a2a/common/server/server.py +164 -0
- mindsdb/api/a2a/common/server/task_manager.py +287 -0
- mindsdb/api/a2a/common/server/utils.py +28 -0
- mindsdb/api/a2a/common/types.py +365 -0
- mindsdb/api/a2a/constants.py +9 -0
- mindsdb/api/a2a/run_a2a.py +86 -0
- mindsdb/api/a2a/task_manager.py +560 -0
- mindsdb/api/executor/command_executor.py +185 -309
- mindsdb/api/executor/datahub/classes/response.py +5 -2
- mindsdb/api/executor/datahub/datanodes/integration_datanode.py +39 -72
- mindsdb/api/executor/planner/query_planner.py +10 -1
- mindsdb/api/executor/sql_query/result_set.py +185 -52
- mindsdb/api/executor/sql_query/sql_query.py +1 -1
- mindsdb/api/executor/sql_query/steps/apply_predictor_step.py +9 -12
- mindsdb/api/executor/sql_query/steps/fetch_dataframe.py +8 -10
- mindsdb/api/executor/sql_query/steps/fetch_dataframe_partition.py +5 -44
- mindsdb/api/executor/sql_query/steps/insert_step.py +24 -15
- mindsdb/api/executor/sql_query/steps/join_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/project_step.py +1 -1
- mindsdb/api/executor/sql_query/steps/sql_steps.py +1 -1
- mindsdb/api/executor/sql_query/steps/subselect_step.py +4 -8
- mindsdb/api/executor/sql_query/steps/union_step.py +1 -3
- mindsdb/api/http/initialize.py +99 -83
- mindsdb/api/http/namespaces/analysis.py +3 -3
- mindsdb/api/http/namespaces/config.py +61 -86
- mindsdb/api/http/namespaces/file.py +8 -2
- mindsdb/api/http/namespaces/sql.py +13 -27
- mindsdb/api/mcp/start.py +42 -5
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packet.py +0 -1
- mindsdb/api/mysql/mysql_proxy/data_types/mysql_packets/binary_resultset_row_package.py +52 -19
- mindsdb/api/mysql/mysql_proxy/executor/mysql_executor.py +8 -10
- mindsdb/api/mysql/mysql_proxy/libs/constants/mysql.py +54 -38
- mindsdb/api/mysql/mysql_proxy/mysql_proxy.py +82 -115
- mindsdb/api/mysql/mysql_proxy/utilities/dump.py +351 -0
- mindsdb/api/postgres/postgres_proxy/executor/executor.py +1 -1
- mindsdb/api/postgres/postgres_proxy/postgres_proxy.py +5 -6
- mindsdb/integrations/handlers/altibase_handler/altibase_handler.py +26 -27
- mindsdb/integrations/handlers/altibase_handler/connection_args.py +13 -13
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler.py +8 -8
- mindsdb/integrations/handlers/altibase_handler/tests/test_altibase_handler_dsn.py +13 -13
- mindsdb/integrations/handlers/anthropic_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/anthropic_handler/anthropic_handler.py +1 -3
- mindsdb/integrations/handlers/aurora_handler/aurora_handler.py +1 -0
- mindsdb/integrations/handlers/autosklearn_handler/autosklearn_handler.py +1 -1
- mindsdb/integrations/handlers/autosklearn_handler/config.py +0 -1
- mindsdb/integrations/handlers/bigquery_handler/bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/bigquery_handler/tests/test_bigquery_handler.py +1 -1
- mindsdb/integrations/handlers/binance_handler/binance_handler.py +1 -0
- mindsdb/integrations/handlers/binance_handler/binance_tables.py +3 -4
- mindsdb/integrations/handlers/byom_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/byom_handler/requirements.txt +1 -2
- mindsdb/integrations/handlers/ckan_handler/ckan_handler.py +3 -0
- mindsdb/integrations/handlers/clickhouse_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cloud_spanner_handler/tests/test_cloud_spanner_handler.py +0 -2
- mindsdb/integrations/handlers/cloud_sql_handler/cloud_sql_handler.py +0 -1
- mindsdb/integrations/handlers/cohere_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/cohere_handler/cohere_handler.py +11 -13
- mindsdb/integrations/handlers/confluence_handler/confluence_tables.py +6 -0
- mindsdb/integrations/handlers/databend_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/databend_handler/databend_handler.py +4 -4
- mindsdb/integrations/handlers/databend_handler/tests/__init__.py +0 -1
- mindsdb/integrations/handlers/databend_handler/tests/test_databend_handler.py +1 -1
- mindsdb/integrations/handlers/derby_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/derby_handler/derby_handler.py +14 -22
- mindsdb/integrations/handlers/derby_handler/tests/test_derby_handler.py +6 -6
- mindsdb/integrations/handlers/discord_handler/discord_handler.py +5 -5
- mindsdb/integrations/handlers/discord_handler/discord_tables.py +3 -3
- mindsdb/integrations/handlers/discord_handler/tests/test_discord.py +5 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub.py +3 -3
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_handler.py +2 -2
- mindsdb/integrations/handlers/dockerhub_handler/dockerhub_tables.py +57 -54
- mindsdb/integrations/handlers/dremio_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/druid_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/druid_handler/druid_handler.py +2 -2
- mindsdb/integrations/handlers/edgelessdb_handler/tests/test_edgelessdb_handler.py +9 -9
- mindsdb/integrations/handlers/email_handler/email_client.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_ingestor.py +1 -1
- mindsdb/integrations/handlers/email_handler/email_tables.py +0 -1
- mindsdb/integrations/handlers/email_handler/settings.py +0 -1
- mindsdb/integrations/handlers/eventstoredb_handler/eventstoredb_handler.py +2 -1
- mindsdb/integrations/handlers/firebird_handler/firebird_handler.py +1 -1
- mindsdb/integrations/handlers/flaml_handler/flaml_handler.py +9 -9
- mindsdb/integrations/handlers/frappe_handler/frappe_client.py +5 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_handler.py +6 -5
- mindsdb/integrations/handlers/frappe_handler/frappe_tables.py +2 -2
- mindsdb/integrations/handlers/github_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/github_handler/github_handler.py +1 -8
- mindsdb/integrations/handlers/github_handler/github_tables.py +13 -24
- mindsdb/integrations/handlers/gitlab_handler/gitlab_handler.py +2 -1
- mindsdb/integrations/handlers/gitlab_handler/gitlab_tables.py +1 -4
- mindsdb/integrations/handlers/gmail_handler/gmail_handler.py +6 -13
- mindsdb/integrations/handlers/google_books_handler/google_books_handler.py +2 -1
- mindsdb/integrations/handlers/google_books_handler/google_books_tables.py +0 -3
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_handler.py +4 -4
- mindsdb/integrations/handlers/google_calendar_handler/google_calendar_tables.py +2 -6
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_handler.py +3 -2
- mindsdb/integrations/handlers/google_content_shopping_handler/google_content_shopping_tables.py +0 -3
- mindsdb/integrations/handlers/google_fit_handler/google_fit_handler.py +10 -12
- mindsdb/integrations/handlers/google_fit_handler/google_fit_tables.py +11 -13
- mindsdb/integrations/handlers/google_search_handler/google_search_handler.py +2 -1
- mindsdb/integrations/handlers/google_search_handler/google_search_tables.py +0 -3
- mindsdb/integrations/handlers/groq_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/hackernews_handler/hn_handler.py +5 -7
- mindsdb/integrations/handlers/hackernews_handler/hn_table.py +6 -7
- mindsdb/integrations/handlers/hive_handler/tests/test_hive_handler.py +1 -1
- mindsdb/integrations/handlers/hsqldb_handler/connection_args.py +6 -6
- mindsdb/integrations/handlers/hsqldb_handler/hsqldb_handler.py +4 -3
- mindsdb/integrations/handlers/huggingface_api_handler/exceptions.py +1 -1
- mindsdb/integrations/handlers/huggingface_api_handler/huggingface_api_handler.py +1 -8
- mindsdb/integrations/handlers/huggingface_handler/huggingface_handler.py +6 -6
- mindsdb/integrations/handlers/huggingface_handler/requirements.txt +1 -1
- mindsdb/integrations/handlers/huggingface_handler/requirements_cpu.txt +1 -1
- mindsdb/integrations/handlers/ignite_handler/ignite_handler.py +2 -1
- mindsdb/integrations/handlers/impala_handler/impala_handler.py +9 -12
- mindsdb/integrations/handlers/impala_handler/tests/test_impala_handler.py +11 -11
- mindsdb/integrations/handlers/influxdb_handler/influxdb_handler.py +10 -13
- mindsdb/integrations/handlers/influxdb_handler/influxdb_tables.py +20 -20
- mindsdb/integrations/handlers/informix_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/informix_handler/__init__.py +12 -5
- mindsdb/integrations/handlers/informix_handler/informix_handler.py +99 -133
- mindsdb/integrations/handlers/informix_handler/tests/test_informix_handler.py +13 -11
- mindsdb/integrations/handlers/ingres_handler/__about__.py +0 -1
- mindsdb/integrations/handlers/ingres_handler/ingres_handler.py +1 -0
- mindsdb/integrations/handlers/jira_handler/jira_handler.py +4 -4
- mindsdb/integrations/handlers/jira_handler/jira_tables.py +9 -9
- mindsdb/integrations/handlers/kinetica_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/lancedb_handler/requirements.txt +0 -1
- mindsdb/integrations/handlers/langchain_handler/langchain_handler.py +4 -4
- mindsdb/integrations/handlers/langchain_handler/tools.py +9 -10
- mindsdb/integrations/handlers/leonardoai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/lightwood_handler/functions.py +2 -2
- mindsdb/integrations/handlers/lightwood_handler/lightwood_handler.py +0 -1
- mindsdb/integrations/handlers/lightwood_handler/tests/test_lightwood_handler.py +11 -11
- mindsdb/integrations/handlers/litellm_handler/litellm_handler.py +37 -20
- mindsdb/integrations/handlers/llama_index_handler/llama_index_handler.py +4 -4
- mindsdb/integrations/handlers/llama_index_handler/settings.py +10 -9
- mindsdb/integrations/handlers/materialize_handler/tests/test_materialize_handler.py +8 -10
- mindsdb/integrations/handlers/matrixone_handler/matrixone_handler.py +4 -4
- mindsdb/integrations/handlers/matrixone_handler/tests/test_matrixone_handler.py +8 -9
- mindsdb/integrations/handlers/maxdb_handler/connection_args.py +25 -25
- mindsdb/integrations/handlers/maxdb_handler/maxdb_handler.py +1 -0
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_handler.py +3 -2
- mindsdb/integrations/handlers/mediawiki_handler/mediawiki_tables.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/mendeley_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/mendeley_handler/mendeley_handler.py +48 -56
- mindsdb/integrations/handlers/mendeley_handler/mendeley_tables.py +24 -29
- mindsdb/integrations/handlers/mendeley_handler/tests/test_mendeley_handler.py +19 -17
- mindsdb/integrations/handlers/merlion_handler/merlion_handler.py +5 -4
- mindsdb/integrations/handlers/minds_endpoint_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/mlflow_handler/mlflow_handler.py +58 -36
- mindsdb/integrations/handlers/monetdb_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/monetdb_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/monetdb_handler/connection_args.py +17 -18
- mindsdb/integrations/handlers/monetdb_handler/monetdb_handler.py +40 -57
- mindsdb/integrations/handlers/monetdb_handler/tests/test_monetdb_handler.py +7 -8
- mindsdb/integrations/handlers/monetdb_handler/utils/monet_get_id.py +13 -14
- mindsdb/integrations/handlers/monkeylearn_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/monkeylearn_handler.py +2 -5
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_graph_api_one_drive_client.py +1 -0
- mindsdb/integrations/handlers/ms_one_drive_handler/ms_one_drive_handler.py +1 -1
- mindsdb/integrations/handlers/ms_teams_handler/ms_graph_api_teams_client.py +23 -23
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_handler.py +3 -3
- mindsdb/integrations/handlers/ms_teams_handler/ms_teams_tables.py +10 -5
- mindsdb/integrations/handlers/mssql_handler/mssql_handler.py +73 -8
- mindsdb/integrations/handlers/mysql_handler/__about__.py +8 -8
- mindsdb/integrations/handlers/mysql_handler/__init__.py +15 -5
- mindsdb/integrations/handlers/mysql_handler/connection_args.py +43 -47
- mindsdb/integrations/handlers/mysql_handler/mysql_handler.py +101 -34
- mindsdb/integrations/handlers/mysql_handler/settings.py +15 -13
- mindsdb/integrations/handlers/neuralforecast_handler/neuralforecast_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/newsapi_handler.py +1 -1
- mindsdb/integrations/handlers/newsapi_handler/tests/test_newsapi_handler.py +4 -4
- mindsdb/integrations/handlers/nuo_jdbc_handler/connection_args.py +2 -2
- mindsdb/integrations/handlers/nuo_jdbc_handler/nuo_jdbc_handler.py +28 -36
- mindsdb/integrations/handlers/nuo_jdbc_handler/tests/test_nuo_handler.py +5 -5
- mindsdb/integrations/handlers/oceanbase_handler/oceanbase_handler.py +0 -1
- mindsdb/integrations/handlers/oceanbase_handler/tests/test_oceanbase_handler.py +8 -10
- mindsdb/integrations/handlers/ollama_handler/ollama_handler.py +3 -3
- mindsdb/integrations/handlers/opengauss_handler/tests/test_opengauss_handler.py +1 -2
- mindsdb/integrations/handlers/openstreetmap_handler/__init__.py +7 -7
- mindsdb/integrations/handlers/oracle_handler/connection_args.py +6 -0
- mindsdb/integrations/handlers/oracle_handler/oracle_handler.py +77 -11
- mindsdb/integrations/handlers/orioledb_handler/tests/test_orioledb_handler.py +8 -10
- mindsdb/integrations/handlers/palm_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/palm_handler/palm_handler.py +1 -3
- mindsdb/integrations/handlers/paypal_handler/paypal_handler.py +2 -2
- mindsdb/integrations/handlers/paypal_handler/paypal_tables.py +15 -14
- mindsdb/integrations/handlers/pgvector_handler/pgvector_handler.py +53 -10
- mindsdb/integrations/handlers/phoenix_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/phoenix_handler/phoenix_handler.py +1 -0
- mindsdb/integrations/handlers/pinot_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/pinot_handler/pinot_handler.py +3 -2
- mindsdb/integrations/handlers/plaid_handler/plaid_handler.py +13 -13
- mindsdb/integrations/handlers/plaid_handler/plaid_tables.py +10 -12
- mindsdb/integrations/handlers/plaid_handler/utils.py +4 -6
- mindsdb/integrations/handlers/planetscale_handler/planetscale_handler.py +1 -4
- mindsdb/integrations/handlers/portkey_handler/__init__.py +2 -2
- mindsdb/integrations/handlers/postgres_handler/postgres_handler.py +105 -24
- mindsdb/integrations/handlers/postgres_handler/tests/test_postgres_handler.py +11 -6
- mindsdb/integrations/handlers/questdb_handler/questdb_handler.py +1 -2
- mindsdb/integrations/handlers/questdb_handler/tests/test_questdb_handler.py +2 -3
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_handler.py +6 -8
- mindsdb/integrations/handlers/quickbooks_handler/quickbooks_table.py +10 -10
- mindsdb/integrations/handlers/rag_handler/ingest.py +2 -2
- mindsdb/integrations/handlers/rag_handler/rag_handler.py +1 -1
- mindsdb/integrations/handlers/rag_handler/settings.py +1 -1
- mindsdb/integrations/handlers/reddit_handler/reddit_handler.py +2 -7
- mindsdb/integrations/handlers/reddit_handler/reddit_tables.py +2 -3
- mindsdb/integrations/handlers/replicate_handler/replicate_handler.py +6 -6
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_handler.py +1 -2
- mindsdb/integrations/handlers/rocket_chat_handler/rocket_chat_tables.py +0 -3
- mindsdb/integrations/handlers/rockset_handler/connection_args.py +14 -14
- mindsdb/integrations/handlers/rockset_handler/tests/test_rockset_handler.py +1 -0
- mindsdb/integrations/handlers/scylla_handler/scylla_handler.py +6 -5
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_handler.py +2 -1
- mindsdb/integrations/handlers/sendinblue_handler/sendinblue_tables.py +16 -16
- mindsdb/integrations/handlers/sentence_transformers_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/sheets_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/shopify_handler/shopify_handler.py +7 -6
- mindsdb/integrations/handlers/shopify_handler/shopify_tables.py +38 -41
- mindsdb/integrations/handlers/singlestore_handler/__about__.py +1 -1
- mindsdb/integrations/handlers/singlestore_handler/__init__.py +0 -1
- mindsdb/integrations/handlers/singlestore_handler/singlestore_handler.py +1 -0
- mindsdb/integrations/handlers/singlestore_handler/tests/test_singlestore_handler.py +3 -3
- mindsdb/integrations/handlers/slack_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/snowflake_handler/snowflake_handler.py +100 -6
- mindsdb/integrations/handlers/solr_handler/connection_args.py +7 -7
- mindsdb/integrations/handlers/solr_handler/solr_handler.py +2 -1
- mindsdb/integrations/handlers/solr_handler/tests/test_solr_handler.py +2 -1
- mindsdb/integrations/handlers/sqlany_handler/sqlany_handler.py +3 -2
- mindsdb/integrations/handlers/sqlite_handler/sqlite_handler.py +1 -0
- mindsdb/integrations/handlers/sqreamdb_handler/connection_args.py +1 -1
- mindsdb/integrations/handlers/sqreamdb_handler/sqreamdb_handler.py +15 -20
- mindsdb/integrations/handlers/sqreamdb_handler/tests/test_sqreamdb_handler.py +4 -4
- mindsdb/integrations/handlers/stabilityai_handler/__init__.py +1 -1
- mindsdb/integrations/handlers/starrocks_handler/starrocks_handler.py +0 -1
- mindsdb/integrations/handlers/starrocks_handler/tests/test_starrocks_handler.py +8 -10
- mindsdb/integrations/handlers/statsforecast_handler/statsforecast_handler.py +2 -2
- mindsdb/integrations/handlers/strava_handler/strava_handler.py +4 -8
- mindsdb/integrations/handlers/strava_handler/strava_tables.py +22 -30
- mindsdb/integrations/handlers/stripe_handler/stripe_handler.py +3 -2
- mindsdb/integrations/handlers/stripe_handler/stripe_tables.py +11 -27
- mindsdb/integrations/handlers/supabase_handler/tests/test_supabase_handler.py +1 -1
- mindsdb/integrations/handlers/surrealdb_handler/surrealdb_handler.py +4 -4
- mindsdb/integrations/handlers/tdengine_handler/tdengine_handler.py +25 -27
- mindsdb/integrations/handlers/tdengine_handler/tests/test_tdengine_handler.py +8 -8
- mindsdb/integrations/handlers/tidb_handler/tests/test_tidb_handler.py +1 -2
- mindsdb/integrations/handlers/timegpt_handler/timegpt_handler.py +5 -5
- mindsdb/integrations/handlers/tpot_handler/tpot_handler.py +21 -26
- mindsdb/integrations/handlers/trino_handler/trino_handler.py +14 -14
- mindsdb/integrations/handlers/twitter_handler/twitter_handler.py +2 -4
- mindsdb/integrations/handlers/unify_handler/tests/test_unify_handler.py +7 -8
- mindsdb/integrations/handlers/unify_handler/unify_handler.py +9 -9
- mindsdb/integrations/handlers/vertex_handler/vertex_client.py +1 -1
- mindsdb/integrations/handlers/vertica_handler/tests/test_vertica_handler.py +11 -11
- mindsdb/integrations/handlers/vertica_handler/vertica_handler.py +11 -14
- mindsdb/integrations/handlers/vitess_handler/tests/test_vitess_handler.py +9 -11
- mindsdb/integrations/handlers/vitess_handler/vitess_handler.py +0 -1
- mindsdb/integrations/handlers/web_handler/web_handler.py +1 -0
- mindsdb/integrations/handlers/whatsapp_handler/__init__.py +3 -3
- mindsdb/integrations/handlers/writer_handler/evaluate.py +1 -1
- mindsdb/integrations/handlers/writer_handler/settings.py +0 -1
- mindsdb/integrations/handlers/writer_handler/writer_handler.py +1 -0
- mindsdb/integrations/handlers/youtube_handler/youtube_handler.py +5 -5
- mindsdb/integrations/handlers/youtube_handler/youtube_tables.py +26 -27
- mindsdb/integrations/handlers/yugabyte_handler/tests/test_yugabyte_handler.py +3 -3
- mindsdb/integrations/handlers/yugabyte_handler/yugabyte_handler.py +0 -6
- mindsdb/integrations/libs/llm/config.py +13 -0
- mindsdb/integrations/libs/llm/utils.py +37 -65
- mindsdb/integrations/libs/response.py +67 -52
- mindsdb/integrations/libs/vectordatabase_handler.py +6 -0
- mindsdb/integrations/utilities/handler_utils.py +15 -3
- mindsdb/integrations/utilities/handlers/api_utilities/__init__.py +0 -1
- mindsdb/integrations/utilities/handlers/auth_utilities/__init__.py +0 -2
- mindsdb/integrations/utilities/rag/rerankers/base_reranker.py +230 -227
- mindsdb/integrations/utilities/utils.py +3 -3
- mindsdb/interfaces/agents/agents_controller.py +164 -1
- mindsdb/interfaces/agents/constants.py +32 -13
- mindsdb/interfaces/agents/langchain_agent.py +106 -95
- mindsdb/interfaces/agents/mindsdb_database_agent.py +101 -2
- mindsdb/interfaces/knowledge_base/controller.py +250 -216
- mindsdb/interfaces/knowledge_base/preprocessing/document_preprocessor.py +13 -10
- mindsdb/interfaces/knowledge_base/preprocessing/json_chunker.py +434 -0
- mindsdb/interfaces/knowledge_base/preprocessing/models.py +54 -0
- mindsdb/interfaces/query_context/context_controller.py +66 -10
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_kb_tools.py +190 -0
- mindsdb/interfaces/skills/custom/text2sql/mindsdb_sql_toolkit.py +92 -0
- mindsdb/interfaces/skills/skill_tool.py +202 -57
- mindsdb/interfaces/skills/sql_agent.py +205 -17
- mindsdb/interfaces/storage/fs.py +1 -0
- mindsdb/interfaces/variables/__init__.py +0 -0
- mindsdb/interfaces/variables/variables_controller.py +97 -0
- mindsdb/migrations/env.py +5 -7
- mindsdb/migrations/migrate.py +47 -7
- mindsdb/migrations/versions/2025-05-21_9f150e4f9a05_checkpoint_1.py +360 -0
- mindsdb/utilities/config.py +287 -216
- mindsdb/utilities/starters.py +13 -0
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/METADATA +646 -698
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/RECORD +312 -295
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/WHEEL +1 -1
- mindsdb/integrations/handlers/monkeylearn_handler/requirements.txt +0 -1
- {mindsdb-25.5.3.0.dist-info → mindsdb-25.5.4.1.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
335
|
+
if answer.type in (RESPONSE_TYPE.TABLE, RESPONSE_TYPE.COLUMNS_TABLE):
|
|
314
336
|
packages = []
|
|
315
337
|
|
|
316
|
-
if len(answer.
|
|
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(
|
|
340
|
+
self.send_table_packets(result_set=answer.result_set)
|
|
319
341
|
else:
|
|
320
|
-
packages += self.get_table_packets(
|
|
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
|
|
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
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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=
|
|
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,
|
|
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(
|
|
381
|
-
packets.extend(self._get_column_defenition_packets(
|
|
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,
|
|
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(
|
|
424
|
+
packets = [self.packet(ColumnCountPacket, count=len(columns_dicts))]
|
|
415
425
|
|
|
416
|
-
packets.extend(self._get_column_defenition_packets(
|
|
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
|
-
|
|
491
|
-
|
|
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
|
-
|
|
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
|
-
|
|
613
|
-
|
|
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
|
|
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
|
|
588
|
+
for row in data:
|
|
622
589
|
packages.append(
|
|
623
|
-
self.packet(BinaryResultsetRowPacket, data=row, columns=
|
|
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(
|
|
595
|
+
prepared_stmt["fetched"] += len(data)
|
|
629
596
|
|
|
630
597
|
return self.send_package_group(packages)
|
|
631
598
|
|