@@ -117,7 +117,7 @@ def test_bad_protocol_versions_are_rejected(self, tcli_service_client_cass):
117117
118118 with self .assertRaises (OperationalError ) as cm :
119119 thrift_backend = self ._make_fake_thrift_backend ()
120- thrift_backend .open_session ({})
120+ thrift_backend .open_session ({}, None , None )
121121
122122 self .assertIn ("expected server to use a protocol version" , str (cm .exception ))
123123
@@ -134,7 +134,7 @@ def test_okay_protocol_versions_succeed(self, tcli_service_client_cass):
134134 status = self .okay_status , serverProtocolVersion = protocol_version )
135135
136136 thrift_backend = self ._make_fake_thrift_backend ()
137- thrift_backend .open_session ({})
137+ thrift_backend .open_session ({}, None , None )
138138
139139 @patch ("thrift.transport.THttpClient.THttpClient" )
140140 def test_headers_are_set (self , t_http_client_class ):
@@ -673,7 +673,7 @@ def test_open_session_user_provided_session_id_optional(self, tcli_service_class
673673 tcli_service_instance .OpenSession .return_value = self .open_session_resp
674674
675675 thrift_backend = ThriftBackend ("foobar" , 443 , "path" , [])
676- thrift_backend .open_session ({})
676+ thrift_backend .open_session ({}, None , None )
677677 self .assertEqual (len (tcli_service_instance .OpenSession .call_args_list ), 1 )
678678
679679 @patch ("databricks.sql.thrift_backend.TCLIService.Client" )
@@ -1057,7 +1057,7 @@ def test_configuration_passthrough(self, tcli_client_class):
10571057 }
10581058
10591059 backend = ThriftBackend ("foobar" , 443 , "path" , [])
1060- backend .open_session (mock_config )
1060+ backend .open_session (mock_config , None , None )
10611061
10621062 open_session_req = tcli_client_class .return_value .OpenSession .call_args [0 ][0 ]
10631063 self .assertEqual (open_session_req .configuration , expected_config )
@@ -1070,10 +1070,92 @@ def test_cant_set_timestamp_as_string_to_true(self, tcli_client_class):
10701070 backend = ThriftBackend ("foobar" , 443 , "path" , [])
10711071
10721072 with self .assertRaises (databricks .sql .Error ) as cm :
1073- backend .open_session (mock_config )
1073+ backend .open_session (mock_config , None , None )
10741074
10751075 self .assertIn ("timestampAsString cannot be changed" , str (cm .exception ))
10761076
1077+ def _construct_open_session_with_namespace (self , can_use_multiple_cats , cat , schem ):
1078+ return ttypes .TOpenSessionResp (
1079+ status = self .okay_status ,
1080+ serverProtocolVersion = ttypes .TProtocolVersion .SPARK_CLI_SERVICE_PROTOCOL_V4 ,
1081+ canUseMultipleCatalogs = can_use_multiple_cats ,
1082+ initialNamespace = ttypes .TNamespace (catalogName = cat , schemaName = schem ))
1083+
1084+ @patch ("databricks.sql.thrift_backend.TCLIService.Client" )
1085+ def test_initial_namespace_passthrough_to_open_session (self , tcli_client_class ):
1086+ tcli_service_instance = tcli_client_class .return_value
1087+
1088+ backend = ThriftBackend ("foobar" , 443 , "path" , [])
1089+ initial_cat_schem_args = [("cat" , None ), (None , "schem" ), ("cat" , "schem" )]
1090+
1091+ for cat , schem in initial_cat_schem_args :
1092+ with self .subTest (cat = cat , schem = schem ):
1093+ tcli_service_instance .OpenSession .return_value = \
1094+ self ._construct_open_session_with_namespace (True , cat , schem )
1095+
1096+ backend .open_session ({}, cat , schem )
1097+
1098+ open_session_req = tcli_client_class .return_value .OpenSession .call_args [0 ][0 ]
1099+ self .assertEqual (open_session_req .initialNamespace .catalogName , cat )
1100+ self .assertEqual (open_session_req .initialNamespace .schemaName , schem )
1101+
1102+ @patch ("databricks.sql.thrift_backend.TCLIService.Client" )
1103+ def test_can_use_multiple_catalogs_is_set_in_open_session_req (self , tcli_client_class ):
1104+ tcli_service_instance = tcli_client_class .return_value
1105+ tcli_service_instance .OpenSession .return_value = self .open_session_resp
1106+
1107+ backend = ThriftBackend ("foobar" , 443 , "path" , [])
1108+ backend .open_session ({}, None , None )
1109+
1110+ open_session_req = tcli_client_class .return_value .OpenSession .call_args [0 ][0 ]
1111+ self .assertTrue (open_session_req .canUseMultipleCatalogs )
1112+
1113+ @patch ("databricks.sql.thrift_backend.TCLIService.Client" )
1114+ def test_can_use_multiple_catalogs_is_false_fails_with_initial_catalog (self , tcli_client_class ):
1115+ tcli_service_instance = tcli_client_class .return_value
1116+
1117+ backend = ThriftBackend ("foobar" , 443 , "path" , [])
1118+ # If the initial catalog is set, but server returns canUseMultipleCatalogs=False, we
1119+ # expect failure. If the initial catalog isn't set, then canUseMultipleCatalogs=False
1120+ # is fine
1121+ failing_ns_args = [("cat" , None ), ("cat" , "schem" )]
1122+ passing_ns_args = [(None , None ), (None , "schem" )]
1123+
1124+ for cat , schem in failing_ns_args :
1125+ tcli_service_instance .OpenSession .return_value = \
1126+ self ._construct_open_session_with_namespace (False , cat , schem )
1127+
1128+ with self .assertRaises (InvalidServerResponseError ) as cm :
1129+ backend .open_session ({}, cat , schem )
1130+
1131+ self .assertIn ("server does not support multiple catalogs" , str (cm .exception ),
1132+ "incorrect error thrown for initial namespace {}" .format ((cat , schem )))
1133+
1134+ for cat , schem in passing_ns_args :
1135+ tcli_service_instance .OpenSession .return_value = \
1136+ self ._construct_open_session_with_namespace (False , cat , schem )
1137+ backend .open_session ({}, cat , schem )
1138+
1139+ @patch ("databricks.sql.thrift_backend.TCLIService.Client" )
1140+ def test_protocol_v3_fails_if_initial_namespace_set (self , tcli_client_class ):
1141+ tcli_service_instance = tcli_client_class .return_value
1142+
1143+ tcli_service_instance .OpenSession .return_value = \
1144+ ttypes .TOpenSessionResp (
1145+ status = self .okay_status ,
1146+ serverProtocolVersion = ttypes .TProtocolVersion .SPARK_CLI_SERVICE_PROTOCOL_V3 ,
1147+ canUseMultipleCatalogs = True ,
1148+ initialNamespace = ttypes .TNamespace (catalogName = "cat" , schemaName = "schem" )
1149+ )
1150+
1151+ backend = ThriftBackend ("foobar" , 443 , "path" , [])
1152+
1153+ with self .assertRaises (InvalidServerResponseError ) as cm :
1154+ backend .open_session ({}, "cat" , "schem" )
1155+
1156+ self .assertIn ("Setting initial namespace not supported by the DBR version" ,
1157+ str (cm .exception ))
1158+
10771159
10781160if __name__ == '__main__' :
10791161 unittest .main ()
0 commit comments