33import logging
44import math
55import time
6+ import uuid
67import threading
78from typing import List , Union , Any , TYPE_CHECKING
89
910if TYPE_CHECKING :
1011 from databricks .sql .client import Cursor
1112
13+ from databricks .sql .thrift_api .TCLIService .ttypes import TOperationState
1214from databricks .sql .backend .types import (
1315 CommandState ,
1416 SessionId ,
1517 CommandId ,
18+ BackendType ,
19+ guid_to_hex_id ,
1620 ExecuteResponse ,
1721)
1822from databricks .sql .backend .utils import guid_to_hex_id
1923
20-
2124try :
2225 import pyarrow
2326except ImportError :
@@ -757,13 +760,11 @@ def _results_message_to_execute_response(self, resp, operation_state):
757760 )
758761 direct_results = resp .directResults
759762 has_been_closed_server_side = direct_results and direct_results .closeOperation
760-
761- is_direct_results = (
763+ has_more_rows = (
762764 (not direct_results )
763765 or (not direct_results .resultSet )
764766 or direct_results .resultSet .hasMoreRows
765767 )
766-
767768 description = self ._hive_schema_to_description (
768769 t_result_set_metadata_resp .schema
769770 )
@@ -779,25 +780,43 @@ def _results_message_to_execute_response(self, resp, operation_state):
779780 schema_bytes = None
780781
781782 lz4_compressed = t_result_set_metadata_resp .lz4Compressed
783+ is_staging_operation = t_result_set_metadata_resp .isStagingOperation
784+ if direct_results and direct_results .resultSet :
785+ assert direct_results .resultSet .results .startRowOffset == 0
786+ assert direct_results .resultSetMetadata
787+
788+ arrow_queue_opt = ResultSetQueueFactory .build_queue (
789+ row_set_type = t_result_set_metadata_resp .resultFormat ,
790+ t_row_set = direct_results .resultSet .results ,
791+ arrow_schema_bytes = schema_bytes ,
792+ max_download_threads = self .max_download_threads ,
793+ lz4_compressed = lz4_compressed ,
794+ description = description ,
795+ ssl_options = self ._ssl_options ,
796+ )
797+ else :
798+ arrow_queue_opt = None
799+
782800 command_id = CommandId .from_thrift_handle (resp .operationHandle )
783801
784802 status = CommandState .from_thrift_state (operation_state )
785803 if status is None :
786804 raise ValueError (f"Unknown command state: { operation_state } " )
787805
788- execute_response = ExecuteResponse (
789- command_id = command_id ,
790- status = status ,
791- description = description ,
792- has_been_closed_server_side = has_been_closed_server_side ,
793- lz4_compressed = lz4_compressed ,
794- is_staging_operation = t_result_set_metadata_resp .isStagingOperation ,
795- arrow_schema_bytes = schema_bytes ,
796- result_format = t_result_set_metadata_resp .resultFormat ,
806+ return (
807+ ExecuteResponse (
808+ command_id = command_id ,
809+ status = status ,
810+ description = description ,
811+ has_more_rows = has_more_rows ,
812+ results_queue = arrow_queue_opt ,
813+ has_been_closed_server_side = has_been_closed_server_side ,
814+ lz4_compressed = lz4_compressed ,
815+ is_staging_operation = is_staging_operation ,
816+ ),
817+ schema_bytes ,
797818 )
798819
799- return execute_response , is_direct_results
800-
801820 def get_execution_result (
802821 self , command_id : CommandId , cursor : "Cursor"
803822 ) -> "ResultSet" :
@@ -822,6 +841,9 @@ def get_execution_result(
822841
823842 t_result_set_metadata_resp = resp .resultSetMetadata
824843
844+ lz4_compressed = t_result_set_metadata_resp .lz4Compressed
845+ is_staging_operation = t_result_set_metadata_resp .isStagingOperation
846+ has_more_rows = resp .hasMoreRows
825847 description = self ._hive_schema_to_description (
826848 t_result_set_metadata_resp .schema
827849 )
@@ -836,21 +858,25 @@ def get_execution_result(
836858 else :
837859 schema_bytes = None
838860
839- lz4_compressed = t_result_set_metadata_resp .lz4Compressed
840- is_staging_operation = t_result_set_metadata_resp .isStagingOperation
841- is_direct_results = resp .hasMoreRows
842-
843- status = self .get_query_state (command_id )
861+ queue = ResultSetQueueFactory .build_queue (
862+ row_set_type = resp .resultSetMetadata .resultFormat ,
863+ t_row_set = resp .results ,
864+ arrow_schema_bytes = schema_bytes ,
865+ max_download_threads = self .max_download_threads ,
866+ lz4_compressed = lz4_compressed ,
867+ description = description ,
868+ ssl_options = self ._ssl_options ,
869+ )
844870
845871 execute_response = ExecuteResponse (
846872 command_id = command_id ,
847873 status = status ,
848874 description = description ,
875+ has_more_rows = has_more_rows ,
876+ results_queue = queue ,
849877 has_been_closed_server_side = False ,
850878 lz4_compressed = lz4_compressed ,
851879 is_staging_operation = is_staging_operation ,
852- arrow_schema_bytes = schema_bytes ,
853- result_format = t_result_set_metadata_resp .resultFormat ,
854880 )
855881
856882 return ThriftResultSet (
@@ -860,10 +886,7 @@ def get_execution_result(
860886 buffer_size_bytes = cursor .buffer_size_bytes ,
861887 arraysize = cursor .arraysize ,
862888 use_cloud_fetch = cursor .connection .use_cloud_fetch ,
863- t_row_set = resp .results ,
864- max_download_threads = self .max_download_threads ,
865- ssl_options = self ._ssl_options ,
866- is_direct_results = is_direct_results ,
889+ arrow_schema_bytes = schema_bytes ,
867890 )
868891
869892 def _wait_until_command_done (self , op_handle , initial_operation_status_resp ):
@@ -976,25 +999,18 @@ def execute_command(
976999 self ._handle_execute_response_async (resp , cursor )
9771000 return None
9781001 else :
979- execute_response , is_direct_results = self ._handle_execute_response (
1002+ execute_response , arrow_schema_bytes = self ._handle_execute_response (
9801003 resp , cursor
9811004 )
9821005
983- t_row_set = None
984- if resp .directResults and resp .directResults .resultSet :
985- t_row_set = resp .directResults .resultSet .results
986-
9871006 return ThriftResultSet (
9881007 connection = cursor .connection ,
9891008 execute_response = execute_response ,
9901009 thrift_client = self ,
9911010 buffer_size_bytes = max_bytes ,
9921011 arraysize = max_rows ,
9931012 use_cloud_fetch = use_cloud_fetch ,
994- t_row_set = t_row_set ,
995- max_download_threads = self .max_download_threads ,
996- ssl_options = self ._ssl_options ,
997- is_direct_results = is_direct_results ,
1013+ arrow_schema_bytes = arrow_schema_bytes ,
9981014 )
9991015
10001016 def get_catalogs (
@@ -1016,25 +1032,18 @@ def get_catalogs(
10161032 )
10171033 resp = self .make_request (self ._client .GetCatalogs , req )
10181034
1019- execute_response , is_direct_results = self ._handle_execute_response (
1035+ execute_response , arrow_schema_bytes = self ._handle_execute_response (
10201036 resp , cursor
10211037 )
10221038
1023- t_row_set = None
1024- if resp .directResults and resp .directResults .resultSet :
1025- t_row_set = resp .directResults .resultSet .results
1026-
10271039 return ThriftResultSet (
10281040 connection = cursor .connection ,
10291041 execute_response = execute_response ,
10301042 thrift_client = self ,
10311043 buffer_size_bytes = max_bytes ,
10321044 arraysize = max_rows ,
10331045 use_cloud_fetch = cursor .connection .use_cloud_fetch ,
1034- t_row_set = t_row_set ,
1035- max_download_threads = self .max_download_threads ,
1036- ssl_options = self ._ssl_options ,
1037- is_direct_results = is_direct_results ,
1046+ arrow_schema_bytes = arrow_schema_bytes ,
10381047 )
10391048
10401049 def get_schemas (
@@ -1060,25 +1069,18 @@ def get_schemas(
10601069 )
10611070 resp = self .make_request (self ._client .GetSchemas , req )
10621071
1063- execute_response , is_direct_results = self ._handle_execute_response (
1072+ execute_response , arrow_schema_bytes = self ._handle_execute_response (
10641073 resp , cursor
10651074 )
10661075
1067- t_row_set = None
1068- if resp .directResults and resp .directResults .resultSet :
1069- t_row_set = resp .directResults .resultSet .results
1070-
10711076 return ThriftResultSet (
10721077 connection = cursor .connection ,
10731078 execute_response = execute_response ,
10741079 thrift_client = self ,
10751080 buffer_size_bytes = max_bytes ,
10761081 arraysize = max_rows ,
10771082 use_cloud_fetch = cursor .connection .use_cloud_fetch ,
1078- t_row_set = t_row_set ,
1079- max_download_threads = self .max_download_threads ,
1080- ssl_options = self ._ssl_options ,
1081- is_direct_results = is_direct_results ,
1083+ arrow_schema_bytes = arrow_schema_bytes ,
10821084 )
10831085
10841086 def get_tables (
@@ -1108,25 +1110,18 @@ def get_tables(
11081110 )
11091111 resp = self .make_request (self ._client .GetTables , req )
11101112
1111- execute_response , is_direct_results = self ._handle_execute_response (
1113+ execute_response , arrow_schema_bytes = self ._handle_execute_response (
11121114 resp , cursor
11131115 )
11141116
1115- t_row_set = None
1116- if resp .directResults and resp .directResults .resultSet :
1117- t_row_set = resp .directResults .resultSet .results
1118-
11191117 return ThriftResultSet (
11201118 connection = cursor .connection ,
11211119 execute_response = execute_response ,
11221120 thrift_client = self ,
11231121 buffer_size_bytes = max_bytes ,
11241122 arraysize = max_rows ,
11251123 use_cloud_fetch = cursor .connection .use_cloud_fetch ,
1126- t_row_set = t_row_set ,
1127- max_download_threads = self .max_download_threads ,
1128- ssl_options = self ._ssl_options ,
1129- is_direct_results = is_direct_results ,
1124+ arrow_schema_bytes = arrow_schema_bytes ,
11301125 )
11311126
11321127 def get_columns (
@@ -1156,25 +1151,18 @@ def get_columns(
11561151 )
11571152 resp = self .make_request (self ._client .GetColumns , req )
11581153
1159- execute_response , is_direct_results = self ._handle_execute_response (
1154+ execute_response , arrow_schema_bytes = self ._handle_execute_response (
11601155 resp , cursor
11611156 )
11621157
1163- t_row_set = None
1164- if resp .directResults and resp .directResults .resultSet :
1165- t_row_set = resp .directResults .resultSet .results
1166-
11671158 return ThriftResultSet (
11681159 connection = cursor .connection ,
11691160 execute_response = execute_response ,
11701161 thrift_client = self ,
11711162 buffer_size_bytes = max_bytes ,
11721163 arraysize = max_rows ,
11731164 use_cloud_fetch = cursor .connection .use_cloud_fetch ,
1174- t_row_set = t_row_set ,
1175- max_download_threads = self .max_download_threads ,
1176- ssl_options = self ._ssl_options ,
1177- is_direct_results = is_direct_results ,
1165+ arrow_schema_bytes = arrow_schema_bytes ,
11781166 )
11791167
11801168 def _handle_execute_response (self , resp , cursor ):
0 commit comments