databricks-sql-connector 3.1.0__tar.gz → 3.1.1__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 (57) hide show
  1. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/CHANGELOG.md +8 -0
  2. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/PKG-INFO +1 -1
  3. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/pyproject.toml +1 -1
  4. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/__init__.py +1 -1
  5. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/auth/retry.py +6 -0
  6. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/client.py +14 -0
  7. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/thrift_backend.py +2 -2
  8. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/base.py +1 -0
  9. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/LICENSE +0 -0
  10. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/README.md +0 -0
  11. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/__init__.py +0 -0
  12. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/auth/__init__.py +0 -0
  13. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/auth/auth.py +0 -0
  14. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/auth/authenticators.py +0 -0
  15. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/auth/endpoint.py +0 -0
  16. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/auth/oauth.py +0 -0
  17. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/auth/oauth_http_handler.py +0 -0
  18. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/auth/thrift_http_client.py +0 -0
  19. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/cloudfetch/download_manager.py +0 -0
  20. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/cloudfetch/downloader.py +0 -0
  21. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/exc.py +0 -0
  22. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/experimental/__init__.py +0 -0
  23. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/experimental/oauth_persistence.py +0 -0
  24. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/parameters/__init__.py +0 -0
  25. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/parameters/native.py +0 -0
  26. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/parameters/py.typed +0 -0
  27. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/thrift_api/TCLIService/TCLIService-remote +0 -0
  28. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/thrift_api/TCLIService/TCLIService.py +0 -0
  29. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/thrift_api/TCLIService/__init__.py +0 -0
  30. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/thrift_api/TCLIService/constants.py +0 -0
  31. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/thrift_api/TCLIService/ttypes.py +0 -0
  32. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/thrift_api/__init__.py +0 -0
  33. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/types.py +0 -0
  34. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sql/utils.py +0 -0
  35. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/README.sqlalchemy.md +0 -0
  36. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/README.tests.md +0 -0
  37. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/__init__.py +0 -0
  38. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/_ddl.py +0 -0
  39. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/_parse.py +0 -0
  40. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/_types.py +0 -0
  41. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/requirements.py +0 -0
  42. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/setup.cfg +0 -0
  43. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test/_extra.py +0 -0
  44. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test/_future.py +0 -0
  45. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test/_regression.py +0 -0
  46. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test/_unsupported.py +0 -0
  47. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test/conftest.py +0 -0
  48. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test/overrides/_componentreflectiontest.py +0 -0
  49. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test/overrides/_ctetest.py +0 -0
  50. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test/test_suite.py +0 -0
  51. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test_local/__init__.py +0 -0
  52. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test_local/conftest.py +0 -0
  53. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test_local/e2e/MOCK_DATA.xlsx +0 -0
  54. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test_local/e2e/test_basic.py +0 -0
  55. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test_local/test_ddl.py +0 -0
  56. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test_local/test_parsing.py +0 -0
  57. {databricks_sql_connector-3.1.0 → databricks_sql_connector-3.1.1}/src/databricks/sqlalchemy/test_local/test_types.py +0 -0
@@ -1,5 +1,13 @@
1
1
  # Release History
2
2
 
3
+ # x.x.x (TBD)
4
+
5
+ # 3.1.1 (2024-03-19)
6
+
7
+ - Don't retry requests that fail with code 403 (#373)
8
+ - Assume a default retry-after for 429/503 (#371)
9
+ - Fix boolean literals (#357)
10
+
3
11
  # 3.1.0 (2024-02-16)
4
12
 
5
13
  - Revert retry-after behavior to be exponential backoff (#349)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: databricks-sql-connector
3
- Version: 3.1.0
3
+ Version: 3.1.1
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.1.0"
3
+ version = "3.1.1"
4
4
  description = "Databricks SQL Connector for Python"
5
5
  authors = ["Databricks <databricks-sql-connector-maintainers@databricks.com>"]
6
6
  license = "Apache-2.0"
@@ -62,7 +62,7 @@ DATETIME = DBAPITypeObject("timestamp")
62
62
  DATE = DBAPITypeObject("date")
63
63
  ROWID = DBAPITypeObject()
64
64
 
65
- __version__ = "3.1.0"
65
+ __version__ = "3.1.1"
66
66
  USER_AGENT_NAME = "PyDatabricksSqlConnector"
67
67
 
68
68
  # These two functions are pyhive legacy
@@ -325,6 +325,7 @@ class DatabricksRetryPolicy(Retry):
325
325
  default, this means ExecuteStatement is only retried for codes 429 and 503.
326
326
  This limit prevents automatically retrying non-idempotent commands that could
327
327
  be destructive.
328
+ 5. The request received a 403 response, because this can never succeed.
328
329
 
329
330
 
330
331
  Q: What about OSErrors and Redirects?
@@ -338,6 +339,11 @@ class DatabricksRetryPolicy(Retry):
338
339
  if status_code == 200:
339
340
  return False, "200 codes are not retried"
340
341
 
342
+ if status_code == 403:
343
+ raise NonRecoverableNetworkError(
344
+ "Received 403 - FORBIDDEN. Confirm your authentication credentials."
345
+ )
346
+
341
347
  # Request failed and server said NotImplemented. This isn't recoverable. Don't retry.
342
348
  if status_code == 501:
343
349
  raise NonRecoverableNetworkError("Received code 501 from server.")
@@ -6,6 +6,7 @@ import requests
6
6
  import json
7
7
  import os
8
8
  import decimal
9
+ from uuid import UUID
9
10
 
10
11
  from databricks.sql import __version__
11
12
  from databricks.sql import *
@@ -1004,9 +1005,22 @@ class Cursor:
1004
1005
  def close(self) -> None:
1005
1006
  """Close cursor"""
1006
1007
  self.open = False
1008
+ self.active_op_handle = None
1007
1009
  if self.active_result_set:
1008
1010
  self._close_and_clear_active_result_set()
1009
1011
 
1012
+ @property
1013
+ def query_id(self) -> Optional[str]:
1014
+ """
1015
+ This attribute is an identifier of last executed query.
1016
+
1017
+ This attribute will be ``None`` if the cursor has not had an operation
1018
+ invoked via the execute method yet, or if cursor was closed.
1019
+ """
1020
+ if self.active_op_handle is not None:
1021
+ return str(UUID(bytes=self.active_op_handle.operationId.guid))
1022
+ return None
1023
+
1010
1024
  @property
1011
1025
  def description(self) -> Optional[List[Tuple]]:
1012
1026
  """
@@ -376,8 +376,8 @@ class ThriftBackend:
376
376
  # encapsulate retry checks, returns None || delay-in-secs
377
377
  # Retry IFF 429/503 code + Retry-After header set
378
378
  http_code = getattr(self._transport, "code", None)
379
- retry_after = getattr(self._transport, "headers", {}).get("Retry-After")
380
- if http_code in [429, 503] and retry_after:
379
+ retry_after = getattr(self._transport, "headers", {}).get("Retry-After", 1)
380
+ if http_code in [429, 503]:
381
381
  # bound delay (seconds) by [min_delay*1.5^(attempt-1), max_delay]
382
382
  return bound_retry_delay(attempt, int(retry_after))
383
383
  return None
@@ -64,6 +64,7 @@ class DatabricksDialect(default.DefaultDialect):
64
64
  supports_default_values: bool = False
65
65
  supports_server_side_cursors: bool = False
66
66
  supports_sequences: bool = False
67
+ supports_native_boolean: bool = True
67
68
 
68
69
  colspecs = {
69
70
  sqlalchemy.types.DateTime: dialect_type_impl.TIMESTAMP_NTZ,