databricks-sql-connector 3.7.2__tar.gz → 3.7.4__tar.gz

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.
Files changed (59) hide show
  1. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/CHANGELOG.md +10 -0
  2. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/PKG-INFO +1 -1
  3. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/pyproject.toml +1 -1
  4. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/__init__.py +1 -1
  5. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/auth/retry.py +16 -10
  6. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/auth/thrift_http_client.py +6 -0
  7. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/client.py +4 -0
  8. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/thrift_backend.py +8 -2
  9. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/LICENSE +0 -0
  10. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/README.md +0 -0
  11. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/__init__.py +0 -0
  12. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/auth/__init__.py +0 -0
  13. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/auth/auth.py +0 -0
  14. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/auth/authenticators.py +0 -0
  15. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/auth/endpoint.py +0 -0
  16. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/auth/oauth.py +0 -0
  17. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/auth/oauth_http_handler.py +0 -0
  18. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/cloudfetch/download_manager.py +0 -0
  19. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/cloudfetch/downloader.py +0 -0
  20. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/exc.py +0 -0
  21. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/experimental/__init__.py +0 -0
  22. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/experimental/oauth_persistence.py +0 -0
  23. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/parameters/__init__.py +0 -0
  24. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/parameters/native.py +0 -0
  25. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/parameters/py.typed +0 -0
  26. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/py.typed +0 -0
  27. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/thrift_api/TCLIService/TCLIService-remote +0 -0
  28. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/thrift_api/TCLIService/TCLIService.py +0 -0
  29. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/thrift_api/TCLIService/__init__.py +0 -0
  30. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/thrift_api/TCLIService/constants.py +0 -0
  31. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/thrift_api/TCLIService/ttypes.py +0 -0
  32. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/thrift_api/__init__.py +0 -0
  33. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/types.py +0 -0
  34. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sql/utils.py +0 -0
  35. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/README.sqlalchemy.md +0 -0
  36. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/README.tests.md +0 -0
  37. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/__init__.py +0 -0
  38. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/_ddl.py +0 -0
  39. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/_parse.py +0 -0
  40. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/_types.py +0 -0
  41. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/base.py +0 -0
  42. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/py.typed +0 -0
  43. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/requirements.py +0 -0
  44. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/setup.cfg +0 -0
  45. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test/_extra.py +0 -0
  46. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test/_future.py +0 -0
  47. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test/_regression.py +0 -0
  48. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test/_unsupported.py +0 -0
  49. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test/conftest.py +0 -0
  50. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test/overrides/_componentreflectiontest.py +0 -0
  51. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test/overrides/_ctetest.py +0 -0
  52. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test/test_suite.py +0 -0
  53. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test_local/__init__.py +0 -0
  54. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test_local/conftest.py +0 -0
  55. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test_local/e2e/MOCK_DATA.xlsx +0 -0
  56. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test_local/e2e/test_basic.py +0 -0
  57. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test_local/test_ddl.py +0 -0
  58. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test_local/test_parsing.py +0 -0
  59. {databricks_sql_connector-3.7.2 → databricks_sql_connector-3.7.4}/src/databricks/sqlalchemy/test_local/test_types.py +0 -0
@@ -1,5 +1,15 @@
1
1
  # Release History
2
2
 
3
+ # 3.7.4 (2025-04-21)
4
+
5
+ - Fix: compatibility with urllib3 versions less than 2.x (databricks/databricks-sql-python#545 by @jprakash-db)
6
+
7
+ # 3.7.3 (2025-03-28)
8
+
9
+ - Fix: Unable to poll small results in execute_async function (databricks/databricks-sql-python#515 by @jprakash-db)
10
+ - Updated log messages to show the status code and error messages of requests (databricks/databricks-sql-python#511 by @jprakash-db)
11
+ - Fix: Incorrect metadata was fetched in case of queries with the same alias (databricks/databricks-sql-python#505 by @jprakash-db)
12
+
3
13
  # 3.7.2 (2025-01-31)
4
14
 
5
15
  - Updated the retry_dela_max and retry_timeout (databricks/databricks-sql-python#497 by @jprakash-db)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: databricks-sql-connector
3
- Version: 3.7.2
3
+ Version: 3.7.4
4
4
  Summary: Databricks SQL Connector for Python
5
5
  License: Apache-2.0
6
6
  Author: Databricks
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "databricks-sql-connector"
3
- version = "3.7.2"
3
+ version = "3.7.4"
4
4
  description = "Databricks SQL Connector for Python"
5
5
  authors = ["Databricks <databricks-sql-connector-maintainers@databricks.com>"]
6
6
  license = "Apache-2.0"
@@ -68,7 +68,7 @@ DATETIME = DBAPITypeObject("timestamp")
68
68
  DATE = DBAPITypeObject("date")
69
69
  ROWID = DBAPITypeObject()
70
70
 
71
- __version__ = "3.7.2"
71
+ __version__ = "3.7.4"
72
72
  USER_AGENT_NAME = "PyDatabricksSqlConnector"
73
73
 
74
74
  # These two functions are pyhive legacy
@@ -2,6 +2,7 @@ import logging
2
2
  import random
3
3
  import time
4
4
  import typing
5
+ from importlib.metadata import version
5
6
  from enum import Enum
6
7
  from typing import List, Optional, Tuple, Union
7
8
 
@@ -308,8 +309,11 @@ class DatabricksRetryPolicy(Retry):
308
309
 
309
310
  current_attempt = self.stop_after_attempts_count - int(self.total or 0)
310
311
  proposed_backoff = (2**current_attempt) * self.delay_min
311
- if self.backoff_jitter != 0.0:
312
- proposed_backoff += random.random() * self.backoff_jitter
312
+
313
+ library_version = version("urllib3")
314
+ if int(library_version.split(".")[0]) >= 2:
315
+ if self.backoff_jitter != 0.0:
316
+ proposed_backoff += random.random() * self.backoff_jitter
313
317
 
314
318
  proposed_backoff = min(proposed_backoff, self.delay_max)
315
319
  self.check_proposed_wait(proposed_backoff)
@@ -345,23 +349,24 @@ class DatabricksRetryPolicy(Retry):
345
349
  if a retry would violate the configured policy.
346
350
  """
347
351
 
352
+ logger.info(f"Received status code {status_code} for {method} request")
353
+
348
354
  # Request succeeded. Don't retry.
349
355
  if status_code == 200:
350
356
  return False, "200 codes are not retried"
351
357
 
352
358
  if status_code == 401:
353
- raise NonRecoverableNetworkError(
354
- "Received 401 - UNAUTHORIZED. Confirm your authentication credentials."
359
+ return (
360
+ False,
361
+ "Received 401 - UNAUTHORIZED. Confirm your authentication credentials.",
355
362
  )
356
363
 
357
364
  if status_code == 403:
358
- raise NonRecoverableNetworkError(
359
- "Received 403 - FORBIDDEN. Confirm your authentication credentials."
360
- )
365
+ return False, "403 codes are not retried"
361
366
 
362
367
  # Request failed and server said NotImplemented. This isn't recoverable. Don't retry.
363
368
  if status_code == 501:
364
- raise NonRecoverableNetworkError("Received code 501 from server.")
369
+ return False, "Received code 501 from server."
365
370
 
366
371
  # Request failed and this method is not retryable. We only retry POST requests.
367
372
  if not self._is_method_retryable(method):
@@ -400,8 +405,9 @@ class DatabricksRetryPolicy(Retry):
400
405
  and status_code not in self.status_forcelist
401
406
  and status_code not in self.force_dangerous_codes
402
407
  ):
403
- raise UnsafeToRetryError(
404
- "ExecuteStatement command can only be retried for codes 429 and 503"
408
+ return (
409
+ False,
410
+ "ExecuteStatement command can only be retried for codes 429 and 503",
405
411
  )
406
412
 
407
413
  # Request failed with a dangerous code, was an ExecuteStatement, but user forced retries for this
@@ -198,6 +198,12 @@ class THttpClient(thrift.transport.THttpClient.THttpClient):
198
198
  self.message = self.__resp.reason
199
199
  self.headers = self.__resp.headers
200
200
 
201
+ logger.info(
202
+ "HTTP Response with status code {}, message: {}".format(
203
+ self.code, self.message
204
+ )
205
+ )
206
+
201
207
  @staticmethod
202
208
  def basic_proxy_auth_headers(proxy):
203
209
  if proxy is None or not proxy.username:
@@ -737,6 +737,7 @@ class Cursor:
737
737
  self,
738
738
  operation: str,
739
739
  parameters: Optional[TParameterCollection] = None,
740
+ enforce_embedded_schema_correctness=False,
740
741
  ) -> "Cursor":
741
742
  """
742
743
  Execute a query and wait for execution to complete.
@@ -801,6 +802,7 @@ class Cursor:
801
802
  use_cloud_fetch=self.connection.use_cloud_fetch,
802
803
  parameters=prepared_params,
803
804
  async_op=False,
805
+ enforce_embedded_schema_correctness=enforce_embedded_schema_correctness,
804
806
  )
805
807
  self.active_result_set = ResultSet(
806
808
  self.connection,
@@ -822,6 +824,7 @@ class Cursor:
822
824
  self,
823
825
  operation: str,
824
826
  parameters: Optional[TParameterCollection] = None,
827
+ enforce_embedded_schema_correctness=False,
825
828
  ) -> "Cursor":
826
829
  """
827
830
 
@@ -862,6 +865,7 @@ class Cursor:
862
865
  use_cloud_fetch=self.connection.use_cloud_fetch,
863
866
  parameters=prepared_params,
864
867
  async_op=True,
868
+ enforce_embedded_schema_correctness=enforce_embedded_schema_correctness,
865
869
  )
866
870
 
867
871
  return self
@@ -883,6 +883,7 @@ class ThriftBackend:
883
883
  use_cloud_fetch=True,
884
884
  parameters=[],
885
885
  async_op=False,
886
+ enforce_embedded_schema_correctness=False,
886
887
  ):
887
888
  assert session_handle is not None
888
889
 
@@ -898,8 +899,12 @@ class ThriftBackend:
898
899
  sessionHandle=session_handle,
899
900
  statement=operation,
900
901
  runAsync=True,
901
- getDirectResults=ttypes.TSparkGetDirectResults(
902
- maxRows=max_rows, maxBytes=max_bytes
902
+ # For async operation we don't want the direct results
903
+ getDirectResults=None
904
+ if async_op
905
+ else ttypes.TSparkGetDirectResults(
906
+ maxRows=max_rows,
907
+ maxBytes=max_bytes,
903
908
  ),
904
909
  canReadArrowResult=True if pyarrow else False,
905
910
  canDecompressLZ4Result=lz4_compression,
@@ -910,6 +915,7 @@ class ThriftBackend:
910
915
  },
911
916
  useArrowNativeTypes=spark_arrow_types,
912
917
  parameters=parameters,
918
+ enforceEmbeddedSchemaCorrectness=enforce_embedded_schema_correctness,
913
919
  )
914
920
  resp = self.make_request(self._client.ExecuteStatement, req)
915
921