diff --git a/CHANGELOG.md b/CHANGELOG.md index 2138b5c2..90096d8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,42 +1,6 @@ # Release History -# 3.0.2 (2024-01-25) - -- SQLAlchemy dialect now supports table and column comments (thanks @cbornet!) -- Fix: SQLAlchemy dialect now correctly reflects TINYINT types (thanks @TimTheinAtTabs!) -- Fix: `server_hostname` URIs that included `https://` would raise an exception -- Other: pinned to `pandas<=2.1` and `urllib3>=1.26` to avoid runtime errors in dbt-databricks (#330) - -## 3.0.1 (2023-12-01) - -- Other: updated docstring comment about default parameterization approach (#287) -- Other: added tests for reading complex types and revised docstrings and type hints (#293) -- Fix: SQLAlchemy dialect raised DeprecationWarning due to `dbapi` classmethod (#294) -- Fix: SQLAlchemy dialect could not reflect TIMESTAMP_NTZ columns (#296) - -## 3.0.0 (2023-11-17) - -- Remove support for Python 3.7 -- Add support for native parameterized SQL queries. Requires DBR 14.2 and above. See docs/parameters.md for more info. -- Completely rewritten SQLAlchemy dialect - - Adds support for SQLAlchemy >= 2.0 and drops support for SQLAlchemy 1.x - - Full e2e test coverage of all supported features - - Detailed usage notes in `README.sqlalchemy.md` - - Adds support for: - - New types: `TIME`, `TIMESTAMP`, `TIMESTAMP_NTZ`, `TINYINT` - - `Numeric` type scale and precision, like `Numeric(10,2)` - - Reading and writing `PrimaryKeyConstraint` and `ForeignKeyConstraint` - - Reading and writing composite keys - - Reading and writing from views - - Writing `Identity` to tables (i.e. autoincrementing primary keys) - - `LIMIT` and `OFFSET` for paging through results - - Caching metadata calls -- Enable cloud fetch by default. To disable, set `use_cloud_fetch=False` when building `databricks.sql.client`. -- Add integration tests for Databricks UC Volumes ingestion queries -- Retries: - - Add `_retry_max_redirects` config - - Set `_enable_v3_retries=True` and warn if users override it -- Security: bump minimum pyarrow version to 14.0.1 (CVE-2023-47248) +## 2.9.4 (Unreleased) ## 2.9.3 (2023-08-24) @@ -44,21 +8,17 @@ ## 2.9.2 (2023-08-17) -__Note: this release was yanked from Pypi on 13 September 2023 due to compatibility issues with environments where `urllib3<=2.0.0` were installed. The log changes are incorporated into version 2.9.3 and greater.__ - - Other: Add `examples/v3_retries_query_execute.py` (#199) - Other: suppress log message when `_enable_v3_retries` is not `True` (#199) - Other: make this connector backwards compatible with `urllib3>=1.0.0` (#197) ## 2.9.1 (2023-08-11) -__Note: this release was yanked from Pypi on 13 September 2023 due to compatibility issues with environments where `urllib3<=2.0.0` were installed.__ - - Other: Explicitly pin urllib3 to ^2.0.0 (#191) ## 2.9.0 (2023-08-10) -- Replace retry handling with DatabricksRetryPolicy. This is disabled by default. To enable, set `_enable_v3_retries=True` when creating `databricks.sql.client` (#182) +- Replace retry handling with DatabricksRetryPolicy. This is disabled by default. To enable, set `enable_v3_retries=True` when creating `databricks.sql.client` (#182) - Other: Fix typo in README quick start example (#186) - Other: Add autospec to Client mocks and tidy up `make_request` (#188) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1d5c2e97..6ab8b45f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -107,8 +107,6 @@ End-to-end tests require a Databricks account. Before you can run them, you must export host="" export http_path="" export access_token="" -export catalog="" -export schema="" ``` Or you can write these into a file called `test.env` in the root of the repository: @@ -143,11 +141,6 @@ The `PySQLLargeQueriesSuite` namespace contains long-running query tests and is The `PySQLStagingIngestionTestSuite` namespace requires a cluster running DBR version > 12.x which supports staging ingestion commands. The suites marked `[not documented]` require additional configuration which will be documented at a later time. - -#### SQLAlchemy dialect tests - -See README.tests.md for details. - ### Code formatting This project uses [Black](https://pypi.org/project/black/). diff --git a/README.md b/README.md index 835831b2..9913e3d6 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![PyPI](https://img.shields.io/pypi/v/databricks-sql-connector?style=flat-square)](https://pypi.org/project/databricks-sql-connector/) [![Downloads](https://pepy.tech/badge/databricks-sql-connector)](https://pepy.tech/project/databricks-sql-connector) -The Databricks SQL Connector for Python allows you to develop Python applications that connect to Databricks clusters and SQL warehouses. It is a Thrift-based client with no dependencies on ODBC or JDBC. It conforms to the [Python DB API 2.0 specification](https://www.python.org/dev/peps/pep-0249/) and exposes a [SQLAlchemy](https://www.sqlalchemy.org/) dialect for use with tools like `pandas` and `alembic` which use SQLAlchemy to execute DDL. Use `pip install databricks-sql-connector[sqlalchemy]` to install with SQLAlchemy's dependencies. `pip install databricks-sql-connector[alembic]` will install alembic's dependencies. +The Databricks SQL Connector for Python allows you to develop Python applications that connect to Databricks clusters and SQL warehouses. It is a Thrift-based client with no dependencies on ODBC or JDBC. It conforms to the [Python DB API 2.0 specification](https://www.python.org/dev/peps/pep-0249/) and exposes a [SQLAlchemy](https://www.sqlalchemy.org/) dialect for use with tools like `pandas` and `alembic` which use SQLAlchemy to execute DDL. This connector uses Arrow as the data-exchange format, and supports APIs to directly fetch Arrow tables. Arrow tables are wrapped in the `ArrowQueue` class to provide a natural API to get several rows at a time. @@ -11,7 +11,7 @@ You are welcome to file an issue here for general use cases. You can also contac ## Requirements -Python 3.8 or above is required. +Python 3.7 or above is required. ## Documentation @@ -47,7 +47,8 @@ connection = sql.connect( access_token=access_token) cursor = connection.cursor() -cursor.execute('SELECT :param `p`, * FROM RANGE(10)', {"param": "foo"}) + +cursor.execute('SELECT * FROM RANGE(10)') result = cursor.fetchall() for row in result: print(row) diff --git a/docs/parameters.md b/docs/parameters.md deleted file mode 100644 index 05529d42..00000000 --- a/docs/parameters.md +++ /dev/null @@ -1,255 +0,0 @@ -# Using Native Parameters - -This connector supports native parameterized query execution. When you execute a query that includes variable markers, then you can pass a collection of parameters which are sent separately to Databricks Runtime for safe execution. This prevents SQL injection and can improve query performance. - -This behaviour is distinct from legacy "inline" parameterized execution in versions below 3.0.0. The legacy behavior is preserved behind a flag called `use_inline_params`, which will be removed in a future release. See [Using Inline Parameters](#using-inline-parameters) for more information. - -See **[below](#migrating-to-native-parameters)** for details about updating your client code to use native parameters. - -See `examples/parameters.py` in this repository for a runnable demo. - -## Requirements - -- `databricks-sql-connector>=3.0.0` -- A SQL warehouse or all-purpose cluster running Databricks Runtime >=14.2 - -## Limitations - -- A query executed with native parameters can contain at most 255 parameter markers -- The maximum size of all parameterized values cannot exceed 1MB - -## SQL Syntax - -Variables in your SQL query can use one of three PEP-249 [paramstyles](https://peps.python.org/pep-0249/#paramstyle). A parameterized query can use exactly one paramstyle. - -|paramstyle|example|comment| -|-|-|-| -|`named`|`:param`|Parameters must be named| -|`qmark`|`?`|Parameter names are ignored| -|`pyformat`|`%(param)s`|Legacy syntax. Will be deprecated. Parameters must be named.| - -#### Example - -```sql --- named paramstyle -SELECT * FROM table WHERE field = :value - --- qmark paramstyle -SELECT * FROM table WHERE field = ? - --- pyformat paramstyle (legacy) -SELECT * FROM table WHERE field = %(value)s -``` - -## Python Syntax - -This connector follows the [PEP-249 interface](https://peps.python.org/pep-0249/#id20). The expected structure of the parameter collection follows the paramstyle of the variables in your query. - -### `named` paramstyle Usage Example - -When your SQL query uses `named` paramstyle variable markers, you need specify a name for each value that corresponds to a variable marker in your query. - -Generally, you do this by passing `parameters` as a dictionary whose keys match the variables in your query. The length of the dictionary must exactly match the count of variable markers or an exception will be raised. - -```python -from databricks import sql - -with sql.connect(...) as conn: - with conn.cursor() as cursor(): - query = "SELECT field FROM table WHERE field = :value1 AND another_field = :value2" - parameters = {"value1": "foo", "value2": 20} - result = cursor.execute(query, parameters=parameters).fetchone() -``` - -This paramstyle is a drop-in replacement for the `pyformat` paramstyle which was used in connector versions below 3.0.0. It should be used going forward. - -### `qmark` paramstyle Usage Example - -When your SQL query uses `qmark` paramstyle variable markers, you only need to specify a value for each variable marker in your query. - -You do this by passing `parameters` as a list. The order of values in the list corresponds to the order of `qmark` variables in your query. The length of the list must exactly match the count of variable markers in your query or an exception will be raised. - -```python -from databricks import sql - -with sql.connect(...) as conn: - with conn.cursor() as cursor(): - query = "SELECT field FROM table WHERE field = ? AND another_field = ?" - parameters = ["foo", 20] - result = cursor.execute(query, parameters=parameters).fetchone() -``` - -The result of the above two examples is identical. - -### Legacy `pyformat` paramstyle Usage Example - -Databricks Runtime expects variable markers to use either `named` or `qmark` paramstyles. Historically, this connector used `pyformat` which Databricks Runtime does not support. So to assist assist customers transitioning their codebases from `pyformat` → `named`, we can dynamically rewrite the variable markers before sending the query to Databricks. This happens only when `use_inline_params=False`. - - This dynamic rewrite will be deprecated in a future release. New queries should be written using the `named` paramstyle instead. And users should update their client code to replace `pyformat` markers with `named` markers. - -For example: - -```sql --- a query written for databricks-sql-connector==2.9.3 and below - -SELECT field1, field2, %(param1)s FROM table WHERE field4 = %(param2)s - --- rewritten for databricks-sql-connector==3.0.0 and above - -SELECT field1, field2, :param1 FROM table WHERE field4 = :param2 -``` - - -**Note:** While named `pyformat` markers are transparently replaced when `use_inline_params=False`, un-named inline `%s`-style markers are ignored. If your client code makes extensive use of `%s` markers, these queries will need to be updated to use `?` markers before you can execute them when `use_inline_params=False`. See [When to use inline parameters](#when-to-use-inline-parameters) for more information. - -### Type inference - -Under the covers, parameter values are annotated with a valid Databricks SQL type. As shown in the examples above, this connector accepts primitive Python types like `int`, `str`, and `Decimal`. When this happens, the connector infers the corresponding Databricks SQL type (e.g. `INT`, `STRING`, `DECIMAL`) automatically. This means that the parameters passed to `cursor.execute()` are always wrapped in a `TDbsqlParameter` subtype prior to execution. - -Automatic inferrence is sufficient for most usages. But you can bypass the inference by explicitly setting the Databricks SQL type in your client code. All supported Databricks SQL types have `TDbsqlParameter` implementations which you can import from `databricks.sql.parameters`. - -`TDbsqlParameter` objects must always be passed within a list. Either paramstyle (`:named` or `?`) may be used. However, if your query uses the `named` paramstyle, all `TDbsqlParameter` objects must be provided a `name` when they are constructed. - -```python -from databricks import sql -from databricks.sql.parameters import StringParameter, IntegerParameter - -# with `named` markers -with sql.connect(...) as conn: - with conn.cursor() as cursor(): - query = "SELECT field FROM table WHERE field = :value1 AND another_field = :value2" - parameters = [ - StringParameter(name="value1", value="foo"), - IntegerParameter(name="value2", value=20) - ] - result = cursor.execute(query, parameters=parameters).fetchone() - -# with `?` markers -with sql.connect(...) as conn: - with conn.cursor() as cursor(): - query = "SELECT field FROM table WHERE field = ? AND another_field = ?" - parameters = [ - StringParameter(value="foo"), - IntegerParameter(value=20) - ] - result = cursor.execute(query, parameters=parameters).fetchone() -``` - -In general, we recommend using `?` markers when passing `TDbsqlParameter`'s directly. - -**Note**: When using `?` markers, you can bypass inference for _some_ parameters by passing a list containing both primitive Python types and `TDbsqlParameter` objects. `TDbsqlParameter` objects can never be passed in a dictionary. - -# Using Inline Parameters - -Since its initial release, this connector's `cursor.execute()` method has supported passing a sequence or mapping of parameter values. Prior to Databricks Runtime introducing native parameter support, however, "parameterized" queries could not be executed in a guaranteed safe manner. Instead, the connector made a best effort to escape parameter values and and render those strings inline with the query. - -This approach has several drawbacks: - -- It's not guaranteed to be safe from SQL injection -- The server could not boost performance by caching prepared statements -- The parameter marker syntax conflicted with SQL syntax in some cases - -Nevertheless, this behaviour is preserved in version 3.0.0 and above for legacy purposes. It will be removed in a subsequent major release. To enable this legacy code path, you must now construct your connection with `use_inline_params=True`. - -## Requirements - -Rendering parameters inline is supported on all versions of DBR since these queries are indistinguishable from ad-hoc query text. - - -## SQL Syntax - -Variables in your SQL query can look like `%(param)s` or like `%s`. - -#### Example - -```sql --- pyformat paramstyle is used for named parameters -SELECT * FROM table WHERE field = %(value)s - --- %s is used for positional parameters -SELECT * FROM table WHERE field = %s -``` - -## Python Syntax - -This connector follows the [PEP-249 interface](https://peps.python.org/pep-0249/#id20). The expected structure of the parameter collection follows the paramstyle of the variables in your query. - -### `pyformat` paramstyle Usage Example - -Parameters must be passed as a dictionary. - -```python -from databricks import sql - -with sql.connect(..., use_inline_params=True) as conn: - with conn.cursor() as cursor(): - query = "SELECT field FROM table WHERE field = %(value1)s AND another_field = %(value2)s" - parameters = {"value1": "foo", "value2": 20} - result = cursor.execute(query, parameters=parameters).fetchone() -``` - -The above query would be rendered into the following SQL: - -```sql -SELECT field FROM table WHERE field = 'foo' AND another_field = 20 -``` - -### `%s` paramstyle Usage Example - -Parameters must be passed as a list. - -```python -from databricks import sql - -with sql.connect(..., use_inline_params=True) as conn: - with conn.cursor() as cursor(): - query = "SELECT field FROM table WHERE field = %s AND another_field = %s" - parameters = ["foo", 20] - result = cursor.execute(query, parameters=parameters).fetchone() -``` - -The result of the above two examples is identical. - -**Note**: `%s` is not compliant with PEP-249 and only works due to the specific implementation of our inline renderer. - -**Note:** This `%s` syntax overlaps with valid SQL syntax around the usage of `LIKE` DML. For example if your query includes a clause like `WHERE field LIKE '%sequence'`, the parameter inlining function will raise an exception because this string appears to include an inline marker but none is provided. This means that connector versions below 3.0.0 it has been impossible to execute a query that included both parameters and LIKE wildcards. When `use_inline_params=False`, we will pass `%s` occurrences along to the database, allowing it to be used as expected in `LIKE` statements. - -### Passing sequences as parameter values - -Parameter values can also be passed as a sequence. This is typically used when writing `WHERE ... IN` clauses: - -```python -from databricks import sql - -with sql.connect(..., use_inline_params=True) as conn: - with conn.cursor() as cursor(): - query = "SELECT field FROM table WHERE field IN %(value_list)s" - parameters = {"value_list": [1,2,3,4,5]} - result = cursor.execute(query, parameters=parameters).fetchone() -``` - -Output: - -```sql -SELECT field FROM table WHERE field IN (1,2,3,4,5) -``` - -**Note**: this behavior is not specified by PEP-249 and only works due to the specific implementation of our inline renderer. - -### Migrating to native parameters - -Native parameters are meant to be a drop-in replacement for inline parameters. In most use-cases, upgrading to `databricks-sql-connector>=3.0.0` will grant an immediate improvement to safety. Plus, native parameters allow you to use SQL LIKE wildcards (`%`) in your queries which is impossible with inline parameters. Future improvements to parameterization (such as support for binding complex types like `STRUCT`, `MAP`, and `ARRAY`) will only be available when `use_inline_params=False`. - -To completely migrate, you need to [revise your SQL queries](#legacy-pyformat-paramstyle-usage-example) to use the new paramstyles. - - -### When to use inline parameters - -You should only set `use_inline_params=True` in the following cases: - -1. Your client code passes more than 255 parameters in a single query execution -2. Your client code passes parameter values greater than 1MB in a single query execution -3. Your client code makes extensive use of [`%s` positional parameter markers](#s-paramstyle-usage-example) -4. Your client code uses [sequences as parameter values](#passing-sequences-as-parameter-values) - -We expect limitations (1) and (2) to be addressed in a future Databricks Runtime release. diff --git a/examples/README.md b/examples/README.md index ad0fb07e..bcf031fa 100644 --- a/examples/README.md +++ b/examples/README.md @@ -33,12 +33,10 @@ To run all of these examples you can clone the entire repository to your disk. O - **`insert_data.py`** adds a tables called `squares` to your default catalog and inserts one hundred rows of example data. Then it fetches this data and prints it to the screen. - **`query_cancel.py`** shows how to cancel a query assuming that you can access the `Cursor` executing that query from a different thread. This is necessary because `databricks-sql-connector` does not yet implement an asynchronous API; calling `.execute()` blocks the current thread until execution completes. Therefore, the connector can't cancel queries from the same thread where they began. - **`interactive_oauth.py`** shows the simplest example of authenticating by OAuth (no need for a PAT generated in the DBSQL UI) while Bring Your Own IDP is in public preview. When you run the script it will open a browser window so you can authenticate. Afterward, the script fetches some sample data from Databricks and prints it to the screen. For this script, the OAuth token is not persisted which means you need to authenticate every time you run the script. -- **`m2m_oauth.py`** shows the simplest example of authenticating by using OAuth M2M (machine-to-machine) for service principal. - **`persistent_oauth.py`** shows a more advanced example of authenticating by OAuth while Bring Your Own IDP is in public preview. In this case, it shows how to use a sublcass of `OAuthPersistence` to reuse an OAuth token across script executions. - **`set_user_agent.py`** shows how to customize the user agent header used for Thrift commands. In this example the string `ExamplePartnerTag` will be added to the the user agent on every request. - **`staging_ingestion.py`** shows how the connector handles Databricks' experimental staging ingestion commands `GET`, `PUT`, and `REMOVE`. -- **`sqlalchemy.py`** shows a basic example of connecting to Databricks with [SQLAlchemy 2.0](https://www.sqlalchemy.org/). +- **`sqlalchemy.py`** shows a basic example of connecting to Databricks with [SQLAlchemy](https://www.sqlalchemy.org/). - **`custom_cred_provider.py`** shows how to pass a custom credential provider to bypass connector authentication. Please install databricks-sdk prior to running this example. -- **`v3_retries_query_execute.py`** shows how to enable v3 retries in connector version 2.9.x including how to enable retries for non-default retry cases. -- **`parameters.py`** shows how to use parameters in native and inline modes. \ No newline at end of file +- **`v3_retries_query_execute.py`** shows how to enable v3 retries in connector version 2.9.x including how to enable retries for non-default retry cases. \ No newline at end of file diff --git a/examples/m2m_oauth.py b/examples/m2m_oauth.py deleted file mode 100644 index eba2095c..00000000 --- a/examples/m2m_oauth.py +++ /dev/null @@ -1,41 +0,0 @@ -import os - -from databricks.sdk.core import oauth_service_principal, Config -from databricks import sql - -""" -This example shows how to use OAuth M2M (machine-to-machine) for service principal - -Pre-requisites: -- Create service principal and OAuth secret in Account Console -- Assign the service principal to the workspace - -See more https://docs.databricks.com/en/dev-tools/authentication-oauth.html) -""" - -server_hostname = os.getenv("DATABRICKS_SERVER_HOSTNAME") - - -def credential_provider(): - config = Config( - host=f"https://{server_hostname}", - # Service Principal UUID - client_id=os.getenv("DATABRICKS_CLIENT_ID"), - # Service Principal Secret - client_secret=os.getenv("DATABRICKS_CLIENT_SECRET")) - return oauth_service_principal(config) - - -with sql.connect( - server_hostname=server_hostname, - http_path=os.getenv("DATABRICKS_HTTP_PATH"), - credentials_provider=credential_provider) as connection: - for x in range(1, 100): - cursor = connection.cursor() - cursor.execute('SELECT 1+1') - result = cursor.fetchall() - for row in result: - print(row) - cursor.close() - - connection.close() diff --git a/examples/parameters.py b/examples/parameters.py deleted file mode 100644 index 93136ec7..00000000 --- a/examples/parameters.py +++ /dev/null @@ -1,121 +0,0 @@ -""" -This example demonstrates how to use parameters in both native (default) and inline (legacy) mode. -""" - -from decimal import Decimal -from databricks import sql -from databricks.sql.parameters import * - -import os -from databricks import sql -from datetime import datetime -import pytz - -host = os.getenv("DATABRICKS_SERVER_HOSTNAME") -http_path = os.getenv("DATABRICKS_HTTP_PATH") -access_token = os.getenv("DATABRICKS_TOKEN") - - -native_connection = sql.connect( - server_hostname=host, http_path=http_path, access_token=access_token -) - -inline_connection = sql.connect( - server_hostname=host, - http_path=http_path, - access_token=access_token, - use_inline_params="silent", -) - -# Example 1 demonstrates how in most cases, queries written for databricks-sql-connector<3.0.0 will work -# with databricks-sql-connector>=3.0.0. This is because the default mode is native mode, which is backwards -# compatible with the legacy inline mode. - -LEGACY_NAMED_QUERY = "SELECT %(name)s `name`, %(age)s `age`, %(active)s `active`" -EX1_PARAMS = {"name": "Jane", "age": 30, "active": True} - -with native_connection.cursor() as cursor: - ex1_native_result = cursor.execute(LEGACY_NAMED_QUERY, EX1_PARAMS).fetchone() - -with inline_connection.cursor() as cursor: - ex1_inline_result = cursor.execute(LEGACY_NAMED_QUERY, EX1_PARAMS).fetchone() - -print("\nEXAMPLE 1") -print("Example 1 result in native mode\t→\t", ex1_native_result) -print("Example 1 result in inline mode\t→\t", ex1_inline_result) - - -# Example 2 shows how to update example 1 to use the new `named` parameter markers. -# This query would fail in inline mode. - -# This is an example of the automatic transformation from pyformat → named. -# The output looks like this: -# SELECT :name `name`, :age `age`, :active `active` -NATIVE_NAMED_QUERY = LEGACY_NAMED_QUERY % { - "name": ":name", - "age": ":age", - "active": ":active", -} -EX2_PARAMS = EX1_PARAMS - -with native_connection.cursor() as cursor: - ex2_named_result = cursor.execute(NATIVE_NAMED_QUERY, EX1_PARAMS).fetchone() - -with native_connection.cursor() as cursor: - ex2_pyformat_result = cursor.execute(LEGACY_NAMED_QUERY, EX1_PARAMS).fetchone() - -print("\nEXAMPLE 2") -print("Example 2 result with pyformat \t→\t", ex2_named_result) -print("Example 2 result with named \t→\t", ex2_pyformat_result) - - -# Example 3 shows how to use positional parameters. Notice the syntax is different between native and inline modes. -# No automatic transformation is done here. So the LEGACY_POSITIONAL_QUERY will not work in native mode. - -NATIVE_POSITIONAL_QUERY = "SELECT ? `name`, ? `age`, ? `active`" -LEGACY_POSITIONAL_QUERY = "SELECT %s `name`, %s `age`, %s `active`" - -EX3_PARAMS = ["Jane", 30, True] - -with native_connection.cursor() as cursor: - ex3_native_result = cursor.execute(NATIVE_POSITIONAL_QUERY, EX3_PARAMS).fetchone() - -with inline_connection.cursor() as cursor: - ex3_inline_result = cursor.execute(LEGACY_POSITIONAL_QUERY, EX3_PARAMS).fetchone() - -print("\nEXAMPLE 3") -print("Example 3 result in native mode\t→\t", ex3_native_result) -print("Example 3 result in inline mode\t→\t", ex3_inline_result) - -# Example 4 shows how to bypass type inference and set an exact Databricks SQL type for a parameter. -# This is only possible when use_inline_params=False - - -moment = datetime(2012, 10, 15, 12, 57, 18) -chicago_timezone = pytz.timezone("America/Chicago") - -# For this parameter value, we don't bypass inference. So we know that the connector -# will infer the datetime object to be a TIMESTAMP, which preserves the timezone info. -ex4_p1 = chicago_timezone.localize(moment) - -# For this parameter value, we bypass inference and set the type to TIMESTAMP_NTZ, -# which does not preserve the timezone info. Therefore we expect the timezone -# will be dropped in the roundtrip. -ex4_p2 = TimestampNTZParameter(value=ex4_p1) - -# For this parameter, we don't bypass inference. So we know that the connector -# will infer the Decimal to be a DECIMAL and will preserve its current precision and scale. -ex4_p3 = Decimal("12.3456") - -# For this parameter value, we bind a decimal with custom scale and precision -# that will result in the decimal being truncated. -ex4_p4 = DecimalParameter(value=ex4_p3, scale=4, precision=2) - -EX4_QUERY = "SELECT ? `p1`, ? `p2`, ? `p3`, ? `p4`" -EX4_PARAMS = [ex4_p1, ex4_p2, ex4_p3, ex4_p4] -with native_connection.cursor() as cursor: - result = cursor.execute(EX4_QUERY, EX4_PARAMS).fetchone() - -print("\nEXAMPLE 4") -print("Example 4 inferred result\t→\t {}\t{}".format(result.p1, result.p3)) -print("Example 4 explicit result\t→\t {}\t\t{}".format(result.p2, result.p4)) diff --git a/examples/sqlalchemy.py b/examples/sqlalchemy.py index 15608d03..efb8f0bf 100644 --- a/examples/sqlalchemy.py +++ b/examples/sqlalchemy.py @@ -1,45 +1,55 @@ """ -databricks-sql-connector includes a SQLAlchemy 2.0 dialect compatible with Databricks SQL. To install -its dependencies you can run `pip install databricks-sql-connector[sqlalchemy]`. - -The expected connection string format which you can pass to create_engine() is: - -databricks://token:dapi***@***.cloud.databricks.com?http_path=/sql/***&catalog=**&schema=** - -Our dialect implements the majority of SQLAlchemy 2.0's API. Because of the extent of SQLAlchemy's -capabilities it isn't feasible to provide examples of every usage in a single script, so we only -provide a basic one here. Learn more about usage in README.sqlalchemy.md in this repo. +databricks-sql-connector includes a SQLAlchemy dialect compatible with Databricks SQL. +It aims to be a drop-in replacement for the crflynn/sqlalchemy-databricks project, that implements +more of the Databricks API, particularly around table reflection, Alembic usage, and data +ingestion with pandas. + +Expected URI format is: databricks+thrift://token:dapi***@***.cloud.databricks.com?http_path=/sql/*** + +Because of the extent of SQLAlchemy's capabilities it isn't feasible to provide examples of every +usage in a single script, so we only provide a basic one here. More examples are found in our test +suite at tests/e2e/sqlalchemy/test_basic.py and in the PR that implements this change: + +https://github.com/databricks/databricks-sql-python/pull/57 + +# What's already supported + +Most of the functionality is demonstrated in the e2e tests mentioned above. The below list we +derived from those test method names: + + - Create and drop tables with SQLAlchemy Core + - Create and drop tables with SQLAlchemy ORM + - Read created tables via reflection + - Modify column nullability + - Insert records manually + - Insert records with pandas.to_sql (note that this does not work for DataFrames with indexes) + +This connector also aims to support Alembic for programmatic delta table schema maintenance. This +behaviour is not yet backed by integration tests, which will follow in a subsequent PR as we learn +more about customer use cases there. That said, the following behaviours have been tested manually: + + - Autogenerate revisions with alembic revision --autogenerate + - Upgrade and downgrade between revisions with `alembic upgrade ` and + `alembic downgrade ` + +# Known Gaps + - MAP, ARRAY, and STRUCT types: this dialect can read these types out as strings. But you cannot + define a SQLAlchemy model with databricks.sqlalchemy.dialect.types.DatabricksMap (e.g.) because + we haven't implemented them yet. + - Constraints: with the addition of information_schema to Unity Catalog, Databricks SQL supports + foreign key and primary key constraints. This dialect can write these constraints but the ability + for alembic to reflect and modify them programmatically has not been tested. """ -# fmt: off - import os -from datetime import date, datetime, time, timedelta, timezone -from decimal import Decimal -from uuid import UUID - -# By convention, backend-specific SQLA types are defined in uppercase -# This dialect exposes Databricks SQL's TIMESTAMP and TINYINT types -# as these are not covered by the generic, camelcase types shown below -from databricks.sqlalchemy import TIMESTAMP, TINYINT - -# Beside the CamelCase types shown below, line comments reflect -# the underlying Databricks SQL / Delta table type -from sqlalchemy import ( - BigInteger, # BIGINT - Boolean, # BOOLEAN - Column, - Date, # DATE - DateTime, # TIMESTAMP_NTZ - Integer, # INTEGER - Numeric, # DECIMAL - String, # STRING - Time, # STRING - Uuid, # STRING - create_engine, - select, -) -from sqlalchemy.orm import DeclarativeBase, Session +import sqlalchemy +from sqlalchemy.orm import Session +from sqlalchemy import Column, String, Integer, BOOLEAN, create_engine, select + +try: + from sqlalchemy.orm import declarative_base +except ImportError: + from sqlalchemy.ext.declarative import declarative_base host = os.getenv("DATABRICKS_SERVER_HOSTNAME") http_path = os.getenv("DATABRICKS_HTTP_PATH") @@ -48,127 +58,58 @@ schema = os.getenv("DATABRICKS_SCHEMA") -# Extra arguments are passed untouched to databricks-sql-connector -# See src/databricks/sql/thrift_backend.py for complete list +# Extra arguments are passed untouched to the driver +# See thrift_backend.py for complete list extra_connect_args = { "_tls_verify_hostname": True, "_user_agent_entry": "PySQL Example Script", } +if sqlalchemy.__version__.startswith("1.3"): + # SQLAlchemy 1.3.x fails to parse the http_path, catalog, and schema from our connection string + # Pass these in as connect_args instead -engine = create_engine( - f"databricks://token:{access_token}@{host}?http_path={http_path}&catalog={catalog}&schema={schema}", - connect_args=extra_connect_args, echo=True, -) - - -class Base(DeclarativeBase): - pass - - -# This object gives a usage example for each supported type -# for more details on these, see README.sqlalchemy.md -class SampleObject(Base): - __tablename__ = "pysql_sqlalchemy_example_table" - - bigint_col = Column(BigInteger, primary_key=True) - string_col = Column(String) - tinyint_col = Column(TINYINT) - int_col = Column(Integer) - numeric_col = Column(Numeric(10, 2)) - boolean_col = Column(Boolean) - date_col = Column(Date) - datetime_col = Column(TIMESTAMP) - datetime_col_ntz = Column(DateTime) - time_col = Column(Time) - uuid_col = Column(Uuid) - -# This generates a CREATE TABLE statement against the catalog and schema -# specified in the connection string -Base.metadata.create_all(engine) - -# Output SQL is: -# CREATE TABLE pysql_sqlalchemy_example_table ( -# bigint_col BIGINT NOT NULL, -# string_col STRING, -# tinyint_col SMALLINT, -# int_col INT, -# numeric_col DECIMAL(10, 2), -# boolean_col BOOLEAN, -# date_col DATE, -# datetime_col TIMESTAMP, -# datetime_col_ntz TIMESTAMP_NTZ, -# time_col STRING, -# uuid_col STRING, -# PRIMARY KEY (bigint_col) -# ) USING DELTA - -# The code that follows will INSERT a record using SQLAlchemy ORM containing these values -# and then SELECT it back out. The output is compared to the input to demonstrate that -# all type information is preserved. -sample_object = { - "bigint_col": 1234567890123456789, - "string_col": "foo", - "tinyint_col": -100, - "int_col": 5280, - "numeric_col": Decimal("525600.01"), - "boolean_col": True, - "date_col": date(2020, 12, 25), - "datetime_col": datetime( - 1991, 8, 3, 21, 30, 5, tzinfo=timezone(timedelta(hours=-8)) - ), - "datetime_col_ntz": datetime(1990, 12, 4, 6, 33, 41), - "time_col": time(23, 59, 59), - "uuid_col": UUID(int=255), -} -sa_obj = SampleObject(**sample_object) + conn_string = f"databricks://token:{access_token}@{host}" + connect_args = dict(catalog=catalog, schema=schema, http_path=http_path) + all_connect_args = {**extra_connect_args, **connect_args} + engine = create_engine(conn_string, connect_args=all_connect_args) +else: + engine = create_engine( + f"databricks://token:{access_token}@{host}?http_path={http_path}&catalog={catalog}&schema={schema}", + connect_args=extra_connect_args, + ) + +session = Session(bind=engine) +base = declarative_base(bind=engine) + + +class SampleObject(base): + + __tablename__ = "mySampleTable" + + name = Column(String(255), primary_key=True) + episodes = Column(Integer) + some_bool = Column(BOOLEAN) + + +base.metadata.create_all() + +sample_object_1 = SampleObject(name="Bim Adewunmi", episodes=6, some_bool=True) +sample_object_2 = SampleObject(name="Miki Meek", episodes=12, some_bool=False) + +session.add(sample_object_1) +session.add(sample_object_2) -session = Session(engine) -session.add(sa_obj) session.commit() -# Output SQL is: -# INSERT INTO -# pysql_sqlalchemy_example_table ( -# bigint_col, -# string_col, -# tinyint_col, -# int_col, -# numeric_col, -# boolean_col, -# date_col, -# datetime_col, -# datetime_col_ntz, -# time_col, -# uuid_col -# ) -# VALUES -# ( -# :bigint_col, -# :string_col, -# :tinyint_col, -# :int_col, -# :numeric_col, -# :boolean_col, -# :date_col, -# :datetime_col, -# :datetime_col_ntz, -# :time_col, -# :uuid_col -# ) - -# Here we build a SELECT query using ORM -stmt = select(SampleObject).where(SampleObject.int_col == 5280) - -# Then fetch one result with session.scalar() -result = session.scalar(stmt) - -# Finally, we read out the input data and compare it to the output -compare = {key: getattr(result, key) for key in sample_object.keys()} -assert compare == sample_object - -# Then we drop the demonstration table -Base.metadata.drop_all(engine) - -# Output SQL is: -# DROP TABLE pysql_sqlalchemy_example_table +# SQLAlchemy 1.3 has slightly different methods +if sqlalchemy.__version__.startswith("1.3"): + stmt = select([SampleObject]).where(SampleObject.name.in_(["Bim Adewunmi", "Miki Meek"])) + output = [i for i in session.execute(stmt)] +else: + stmt = select(SampleObject).where(SampleObject.name.in_(["Bim Adewunmi", "Miki Meek"])) + output = [i for i in session.scalars(stmt)] + +assert len(output) == 2 + +base.metadata.drop_all() diff --git a/examples/v3_retries_query_execute.py b/examples/v3_retries_query_execute.py index bf8fce69..377cebfb 100644 --- a/examples/v3_retries_query_execute.py +++ b/examples/v3_retries_query_execute.py @@ -20,20 +20,12 @@ # for 502 (Bad Gateway) codes etc. In these cases, there is a possibility that the initial command _did_ reach # Databricks compute and retrying it could result in additional executions. Retrying under these conditions uses # an exponential back-off since a Retry-After header is not present. -# -# This new retry behaviour allows you to configure the maximum number of redirects that the connector will follow. -# Just set `_retry_max_redirects` to the integer number of redirects you want to allow. The default is None, -# which means all redirects will be followed. In this case, a redirect will count toward the -# _retry_stop_after_attempts_count which means that by default the connector will not enter an endless retry loop. -# -# For complete information about configuring retries, see the docstring for databricks.sql.thrift_backend.ThriftBackend with sql.connect(server_hostname = os.getenv("DATABRICKS_SERVER_HOSTNAME"), http_path = os.getenv("DATABRICKS_HTTP_PATH"), access_token = os.getenv("DATABRICKS_TOKEN"), _enable_v3_retries = True, - _retry_dangerous_codes=[502,400], - _retry_max_redirects=2) as connection: + _retry_dangerous_codes=[502,400]) as connection: with connection.cursor() as cursor: cursor.execute("SELECT * FROM default.diamonds LIMIT 2") diff --git a/poetry.lock b/poetry.lock index e3039c8d..432907c5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "alembic" -version = "1.13.1" +version = "1.11.2" description = "A database migration tool for SQLAlchemy." -optional = true -python-versions = ">=3.8" +optional = false +python-versions = ">=3.7" files = [ - {file = "alembic-1.13.1-py3-none-any.whl", hash = "sha256:2edcc97bed0bd3272611ce3a98d98279e9c209e7186e43e75bbb1b2bdfdbcc43"}, - {file = "alembic-1.13.1.tar.gz", hash = "sha256:4932c8558bf68f2ee92b9bbcb8218671c627064d5b08939437af6d77dc05e595"}, + {file = "alembic-1.11.2-py3-none-any.whl", hash = "sha256:7981ab0c4fad4fe1be0cf183aae17689fe394ff874fd2464adb774396faf0796"}, + {file = "alembic-1.11.2.tar.gz", hash = "sha256:678f662130dc540dac12de0ea73de9f89caea9dbea138f60ef6263149bf84657"}, ] [package.dependencies] @@ -19,21 +19,25 @@ SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["backports.zoneinfo"] +tz = ["python-dateutil"] [[package]] name = "astroid" -version = "3.0.2" +version = "2.11.7" description = "An abstract syntax tree for Python with inference support." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.6.2" files = [ - {file = "astroid-3.0.2-py3-none-any.whl", hash = "sha256:d6e62862355f60e716164082d6b4b041d38e2a8cf1c7cd953ded5108bac8ff5c"}, - {file = "astroid-3.0.2.tar.gz", hash = "sha256:4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91"}, + {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, + {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, ] [package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +lazy-object-proxy = ">=1.4.0" +setuptools = ">=20.0" +typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} +typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} +wrapt = ">=1.11,<2" [[package]] name = "black" @@ -62,6 +66,7 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] @@ -72,127 +77,113 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2023.11.17" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.6" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, + {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -232,13 +223,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.1.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, ] [package.extras] @@ -246,122 +237,125 @@ test = ["pytest (>=6)"] [[package]] name = "greenlet" -version = "3.0.3" +version = "2.0.2" description = "Lightweight in-process concurrent programming" -optional = true -python-versions = ">=3.7" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, ] [package.extras] -docs = ["Sphinx", "furo"] +docs = ["Sphinx", "docutils (<0.18)"] test = ["objgraph", "psutil"] [[package]] name = "idna" -version = "3.6" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "6.7.0" description = "Read metadata from Python packages" -optional = true -python-versions = ">=3.8" +optional = false +python-versions = ">=3.7" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, ] [package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" -version = "6.1.1" +version = "5.12.0" description = "Read resources from Python packages" -optional = true -python-versions = ">=3.8" +optional = false +python-versions = ">=3.7" files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "iniconfig" @@ -376,61 +370,108 @@ files = [ [[package]] name = "isort" -version = "5.13.2" +version = "5.11.5" description = "A Python utility / library to sort Python imports." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.7.0" files = [ - {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, - {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, + {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, + {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, ] [package.extras] -colors = ["colorama (>=0.4.6)"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] [[package]] name = "lz4" -version = "4.3.3" +version = "4.3.2" description = "LZ4 Bindings for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "lz4-4.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b891880c187e96339474af2a3b2bfb11a8e4732ff5034be919aa9029484cd201"}, - {file = "lz4-4.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:222a7e35137d7539c9c33bb53fcbb26510c5748779364014235afc62b0ec797f"}, - {file = "lz4-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f76176492ff082657ada0d0f10c794b6da5800249ef1692b35cf49b1e93e8ef7"}, - {file = "lz4-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1d18718f9d78182c6b60f568c9a9cec8a7204d7cb6fad4e511a2ef279e4cb05"}, - {file = "lz4-4.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cdc60e21ec70266947a48839b437d46025076eb4b12c76bd47f8e5eb8a75dcc"}, - {file = "lz4-4.3.3-cp310-cp310-win32.whl", hash = "sha256:c81703b12475da73a5d66618856d04b1307e43428a7e59d98cfe5a5d608a74c6"}, - {file = "lz4-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:43cf03059c0f941b772c8aeb42a0813d68d7081c009542301637e5782f8a33e2"}, - {file = "lz4-4.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:30e8c20b8857adef7be045c65f47ab1e2c4fabba86a9fa9a997d7674a31ea6b6"}, - {file = "lz4-4.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7b1839f795315e480fb87d9bc60b186a98e3e5d17203c6e757611ef7dcef61"}, - {file = "lz4-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edfd858985c23523f4e5a7526ca6ee65ff930207a7ec8a8f57a01eae506aaee7"}, - {file = "lz4-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e9c410b11a31dbdc94c05ac3c480cb4b222460faf9231f12538d0074e56c563"}, - {file = "lz4-4.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2507ee9c99dbddd191c86f0e0c8b724c76d26b0602db9ea23232304382e1f21"}, - {file = "lz4-4.3.3-cp311-cp311-win32.whl", hash = "sha256:f180904f33bdd1e92967923a43c22899e303906d19b2cf8bb547db6653ea6e7d"}, - {file = "lz4-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:b14d948e6dce389f9a7afc666d60dd1e35fa2138a8ec5306d30cd2e30d36b40c"}, - {file = "lz4-4.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e36cd7b9d4d920d3bfc2369840da506fa68258f7bb176b8743189793c055e43d"}, - {file = "lz4-4.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31ea4be9d0059c00b2572d700bf2c1bc82f241f2c3282034a759c9a4d6ca4dc2"}, - {file = "lz4-4.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c9a6fd20767ccaf70649982f8f3eeb0884035c150c0b818ea660152cf3c809"}, - {file = "lz4-4.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca8fccc15e3add173da91be8f34121578dc777711ffd98d399be35487c934bf"}, - {file = "lz4-4.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d84b479ddf39fe3ea05387f10b779155fc0990125f4fb35d636114e1c63a2e"}, - {file = "lz4-4.3.3-cp312-cp312-win32.whl", hash = "sha256:337cb94488a1b060ef1685187d6ad4ba8bc61d26d631d7ba909ee984ea736be1"}, - {file = "lz4-4.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:5d35533bf2cee56f38ced91f766cd0038b6abf46f438a80d50c52750088be93f"}, - {file = "lz4-4.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:363ab65bf31338eb364062a15f302fc0fab0a49426051429866d71c793c23394"}, - {file = "lz4-4.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a136e44a16fc98b1abc404fbabf7f1fada2bdab6a7e970974fb81cf55b636d0"}, - {file = "lz4-4.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abc197e4aca8b63f5ae200af03eb95fb4b5055a8f990079b5bdf042f568469dd"}, - {file = "lz4-4.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56f4fe9c6327adb97406f27a66420b22ce02d71a5c365c48d6b656b4aaeb7775"}, - {file = "lz4-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0e822cd7644995d9ba248cb4b67859701748a93e2ab7fc9bc18c599a52e4604"}, - {file = "lz4-4.3.3-cp38-cp38-win32.whl", hash = "sha256:24b3206de56b7a537eda3a8123c644a2b7bf111f0af53bc14bed90ce5562d1aa"}, - {file = "lz4-4.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:b47839b53956e2737229d70714f1d75f33e8ac26e52c267f0197b3189ca6de24"}, - {file = "lz4-4.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6756212507405f270b66b3ff7f564618de0606395c0fe10a7ae2ffcbbe0b1fba"}, - {file = "lz4-4.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee9ff50557a942d187ec85462bb0960207e7ec5b19b3b48949263993771c6205"}, - {file = "lz4-4.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b901c7784caac9a1ded4555258207d9e9697e746cc8532129f150ffe1f6ba0d"}, - {file = "lz4-4.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d9ec061b9eca86e4dcc003d93334b95d53909afd5a32c6e4f222157b50c071"}, - {file = "lz4-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4c7bf687303ca47d69f9f0133274958fd672efaa33fb5bcde467862d6c621f0"}, - {file = "lz4-4.3.3-cp39-cp39-win32.whl", hash = "sha256:054b4631a355606e99a42396f5db4d22046a3397ffc3269a348ec41eaebd69d2"}, - {file = "lz4-4.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:eac9af361e0d98335a02ff12fb56caeb7ea1196cf1a49dbf6f17828a131da807"}, - {file = "lz4-4.3.3.tar.gz", hash = "sha256:01fe674ef2889dbb9899d8a67361e0c4a2c833af5aeb37dd505727cf5d2a131e"}, + {file = "lz4-4.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c4c100d99eed7c08d4e8852dd11e7d1ec47a3340f49e3a96f8dfbba17ffb300"}, + {file = "lz4-4.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:edd8987d8415b5dad25e797043936d91535017237f72fa456601be1479386c92"}, + {file = "lz4-4.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7c50542b4ddceb74ab4f8b3435327a0861f06257ca501d59067a6a482535a77"}, + {file = "lz4-4.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5614d8229b33d4a97cb527db2a1ac81308c6e796e7bdb5d1309127289f69d5"}, + {file = "lz4-4.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f00a9ba98f6364cadda366ae6469b7b3568c0cced27e16a47ddf6b774169270"}, + {file = "lz4-4.3.2-cp310-cp310-win32.whl", hash = "sha256:b10b77dc2e6b1daa2f11e241141ab8285c42b4ed13a8642495620416279cc5b2"}, + {file = "lz4-4.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:86480f14a188c37cb1416cdabacfb4e42f7a5eab20a737dac9c4b1c227f3b822"}, + {file = "lz4-4.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c2df117def1589fba1327dceee51c5c2176a2b5a7040b45e84185ce0c08b6a3"}, + {file = "lz4-4.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1f25eb322eeb24068bb7647cae2b0732b71e5c639e4e4026db57618dcd8279f0"}, + {file = "lz4-4.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8df16c9a2377bdc01e01e6de5a6e4bbc66ddf007a6b045688e285d7d9d61d1c9"}, + {file = "lz4-4.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f571eab7fec554d3b1db0d666bdc2ad85c81f4b8cb08906c4c59a8cad75e6e22"}, + {file = "lz4-4.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7211dc8f636ca625abc3d4fb9ab74e5444b92df4f8d58ec83c8868a2b0ff643d"}, + {file = "lz4-4.3.2-cp311-cp311-win32.whl", hash = "sha256:867664d9ca9bdfce840ac96d46cd8838c9ae891e859eb98ce82fcdf0e103a947"}, + {file = "lz4-4.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:a6a46889325fd60b8a6b62ffc61588ec500a1883db32cddee9903edfba0b7584"}, + {file = "lz4-4.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a85b430138882f82f354135b98c320dafb96fc8fe4656573d95ab05de9eb092"}, + {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65d5c93f8badacfa0456b660285e394e65023ef8071142e0dcbd4762166e1be0"}, + {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50f096a6a25f3b2edca05aa626ce39979d63c3b160687c8c6d50ac3943d0ba"}, + {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:200d05777d61ba1ff8d29cb51c534a162ea0b4fe6d3c28be3571a0a48ff36080"}, + {file = "lz4-4.3.2-cp37-cp37m-win32.whl", hash = "sha256:edc2fb3463d5d9338ccf13eb512aab61937be50aa70734bcf873f2f493801d3b"}, + {file = "lz4-4.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:83acfacab3a1a7ab9694333bcb7950fbeb0be21660d236fd09c8337a50817897"}, + {file = "lz4-4.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a9eec24ec7d8c99aab54de91b4a5a149559ed5b3097cf30249b665689b3d402"}, + {file = "lz4-4.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:31d72731c4ac6ebdce57cd9a5cabe0aecba229c4f31ba3e2c64ae52eee3fdb1c"}, + {file = "lz4-4.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83903fe6db92db0be101acedc677aa41a490b561567fe1b3fe68695b2110326c"}, + {file = "lz4-4.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926b26db87ec8822cf1870efc3d04d06062730ec3279bbbd33ba47a6c0a5c673"}, + {file = "lz4-4.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e05afefc4529e97c08e65ef92432e5f5225c0bb21ad89dee1e06a882f91d7f5e"}, + {file = "lz4-4.3.2-cp38-cp38-win32.whl", hash = "sha256:ad38dc6a7eea6f6b8b642aaa0683253288b0460b70cab3216838747163fb774d"}, + {file = "lz4-4.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:7e2dc1bd88b60fa09b9b37f08553f45dc2b770c52a5996ea52b2b40f25445676"}, + {file = "lz4-4.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edda4fb109439b7f3f58ed6bede59694bc631c4b69c041112b1b7dc727fffb23"}, + {file = "lz4-4.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ca83a623c449295bafad745dcd399cea4c55b16b13ed8cfea30963b004016c9"}, + {file = "lz4-4.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5ea0e788dc7e2311989b78cae7accf75a580827b4d96bbaf06c7e5a03989bd5"}, + {file = "lz4-4.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a98b61e504fb69f99117b188e60b71e3c94469295571492a6468c1acd63c37ba"}, + {file = "lz4-4.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4931ab28a0d1c133104613e74eec1b8bb1f52403faabe4f47f93008785c0b929"}, + {file = "lz4-4.3.2-cp39-cp39-win32.whl", hash = "sha256:ec6755cacf83f0c5588d28abb40a1ac1643f2ff2115481089264c7630236618a"}, + {file = "lz4-4.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:4caedeb19e3ede6c7a178968b800f910db6503cb4cb1e9cc9221157572139b49"}, + {file = "lz4-4.3.2.tar.gz", hash = "sha256:e1431d84a9cfb23e6773e72078ce8e65cad6745816d4cbf9ae67da5ea419acda"}, ] [package.extras] @@ -440,16 +481,17 @@ tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] [[package]] name = "mako" -version = "1.3.0" +version = "1.2.4" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -optional = true -python-versions = ">=3.8" +optional = false +python-versions = ">=3.7" files = [ - {file = "Mako-1.3.0-py3-none-any.whl", hash = "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9"}, - {file = "Mako-1.3.0.tar.gz", hash = "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"}, + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, ] [package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} MarkupSafe = ">=0.9.2" [package.extras] @@ -459,71 +501,61 @@ testing = ["pytest"] [[package]] name = "markupsafe" -version = "2.1.4" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -optional = true +optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, - {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] @@ -539,40 +571,40 @@ files = [ [[package]] name = "mypy" -version = "0.981" +version = "0.950" description = "Optional static typing for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "mypy-0.981-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4bc460e43b7785f78862dab78674e62ec3cd523485baecfdf81a555ed29ecfa0"}, - {file = "mypy-0.981-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:756fad8b263b3ba39e4e204ee53042671b660c36c9017412b43af210ddee7b08"}, - {file = "mypy-0.981-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16a0145d6d7d00fbede2da3a3096dcc9ecea091adfa8da48fa6a7b75d35562d"}, - {file = "mypy-0.981-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce65f70b14a21fdac84c294cde75e6dbdabbcff22975335e20827b3b94bdbf49"}, - {file = "mypy-0.981-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e35d764784b42c3e256848fb8ed1d4292c9fc0098413adb28d84974c095b279"}, - {file = "mypy-0.981-cp310-cp310-win_amd64.whl", hash = "sha256:e53773073c864d5f5cec7f3fc72fbbcef65410cde8cc18d4f7242dea60dac52e"}, - {file = "mypy-0.981-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ee196b1d10b8b215e835f438e06965d7a480f6fe016eddbc285f13955cca659"}, - {file = "mypy-0.981-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ad21d4c9d3673726cf986ea1d0c9fb66905258709550ddf7944c8f885f208be"}, - {file = "mypy-0.981-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d1debb09043e1f5ee845fa1e96d180e89115b30e47c5d3ce53bc967bab53f62d"}, - {file = "mypy-0.981-cp37-cp37m-win_amd64.whl", hash = "sha256:9f362470a3480165c4c6151786b5379351b790d56952005be18bdbdd4c7ce0ae"}, - {file = "mypy-0.981-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c9e0efb95ed6ca1654951bd5ec2f3fa91b295d78bf6527e026529d4aaa1e0c30"}, - {file = "mypy-0.981-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e178eaffc3c5cd211a87965c8c0df6da91ed7d258b5fc72b8e047c3771317ddb"}, - {file = "mypy-0.981-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06e1eac8d99bd404ed8dd34ca29673c4346e76dd8e612ea507763dccd7e13c7a"}, - {file = "mypy-0.981-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa38f82f53e1e7beb45557ff167c177802ba7b387ad017eab1663d567017c8ee"}, - {file = "mypy-0.981-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:64e1f6af81c003f85f0dfed52db632817dabb51b65c0318ffbf5ff51995bbb08"}, - {file = "mypy-0.981-cp38-cp38-win_amd64.whl", hash = "sha256:e1acf62a8c4f7c092462c738aa2c2489e275ed386320c10b2e9bff31f6f7e8d6"}, - {file = "mypy-0.981-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6ede64e52257931315826fdbfc6ea878d89a965580d1a65638ef77cb551f56d"}, - {file = "mypy-0.981-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eb3978b191b9fa0488524bb4ffedf2c573340e8c2b4206fc191d44c7093abfb7"}, - {file = "mypy-0.981-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f8fcf7b4b3cc0c74fb33ae54a4cd00bb854d65645c48beccf65fa10b17882c"}, - {file = "mypy-0.981-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64d2ce043a209a297df322eb4054dfbaa9de9e8738291706eaafda81ab2b362"}, - {file = "mypy-0.981-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ee3dbc53d4df7e6e3b1c68ac6a971d3a4fb2852bf10a05fda228721dd44fae1"}, - {file = "mypy-0.981-cp39-cp39-win_amd64.whl", hash = "sha256:8e8e49aa9cc23aa4c926dc200ce32959d3501c4905147a66ce032f05cb5ecb92"}, - {file = "mypy-0.981-py3-none-any.whl", hash = "sha256:794f385653e2b749387a42afb1e14c2135e18daeb027e0d97162e4b7031210f8"}, - {file = "mypy-0.981.tar.gz", hash = "sha256:ad77c13037d3402fbeffda07d51e3f228ba078d1c7096a73759c9419ea031bf4"}, + {file = "mypy-0.950-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b"}, + {file = "mypy-0.950-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0"}, + {file = "mypy-0.950-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e7647df0f8fc947388e6251d728189cfadb3b1e558407f93254e35abc026e22"}, + {file = "mypy-0.950-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eaff8156016487c1af5ffa5304c3e3fd183edcb412f3e9c72db349faf3f6e0eb"}, + {file = "mypy-0.950-cp310-cp310-win_amd64.whl", hash = "sha256:563514c7dc504698fb66bb1cf897657a173a496406f1866afae73ab5b3cdb334"}, + {file = "mypy-0.950-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dd4d670eee9610bf61c25c940e9ade2d0ed05eb44227275cce88701fee014b1f"}, + {file = "mypy-0.950-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca75ecf2783395ca3016a5e455cb322ba26b6d33b4b413fcdedfc632e67941dc"}, + {file = "mypy-0.950-cp36-cp36m-win_amd64.whl", hash = "sha256:6003de687c13196e8a1243a5e4bcce617d79b88f83ee6625437e335d89dfebe2"}, + {file = "mypy-0.950-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c653e4846f287051599ed8f4b3c044b80e540e88feec76b11044ddc5612ffed"}, + {file = "mypy-0.950-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e19736af56947addedce4674c0971e5dceef1b5ec7d667fe86bcd2b07f8f9075"}, + {file = "mypy-0.950-cp37-cp37m-win_amd64.whl", hash = "sha256:ef7beb2a3582eb7a9f37beaf38a28acfd801988cde688760aea9e6cc4832b10b"}, + {file = "mypy-0.950-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0112752a6ff07230f9ec2f71b0d3d4e088a910fdce454fdb6553e83ed0eced7d"}, + {file = "mypy-0.950-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ee0a36edd332ed2c5208565ae6e3a7afc0eabb53f5327e281f2ef03a6bc7687a"}, + {file = "mypy-0.950-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77423570c04aca807508a492037abbd72b12a1fb25a385847d191cd50b2c9605"}, + {file = "mypy-0.950-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ce6a09042b6da16d773d2110e44f169683d8cc8687e79ec6d1181a72cb028d2"}, + {file = "mypy-0.950-cp38-cp38-win_amd64.whl", hash = "sha256:5b231afd6a6e951381b9ef09a1223b1feabe13625388db48a8690f8daa9b71ff"}, + {file = "mypy-0.950-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0384d9f3af49837baa92f559d3fa673e6d2652a16550a9ee07fc08c736f5e6f8"}, + {file = "mypy-0.950-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1fdeb0a0f64f2a874a4c1f5271f06e40e1e9779bf55f9567f149466fc7a55038"}, + {file = "mypy-0.950-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:61504b9a5ae166ba5ecfed9e93357fd51aa693d3d434b582a925338a2ff57fd2"}, + {file = "mypy-0.950-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a952b8bc0ae278fc6316e6384f67bb9a396eb30aced6ad034d3a76120ebcc519"}, + {file = "mypy-0.950-cp39-cp39-win_amd64.whl", hash = "sha256:eaea21d150fb26d7b4856766e7addcf929119dd19fc832b22e71d942835201ef"}, + {file = "mypy-0.950-py3-none-any.whl", hash = "sha256:a4d9898f46446bfb6405383b57b96737dcfd0a7f25b748e78ef3e8c576bba3cb"}, + {file = "mypy-0.950.tar.gz", hash = "sha256:1b333cfbca1762ff15808a0ef4f71b5d3eed8528b23ea1c3fb50543c867d68de"}, ] [package.dependencies] mypy-extensions = ">=0.4.3" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} typing-extensions = ">=3.10" [package.extras] @@ -593,84 +625,76 @@ files = [ [[package]] name = "numpy" -version = "1.24.4" -description = "Fundamental package for array computing in Python" +version = "1.21.6" +description = "NumPy is the fundamental package for array computing with Python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7,<3.11" files = [ - {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, - {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, - {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, - {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, - {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, - {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, - {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, - {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, - {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, - {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, - {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, + {file = "numpy-1.21.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8737609c3bbdd48e380d463134a35ffad3b22dc56295eff6f79fd85bd0eeeb25"}, + {file = "numpy-1.21.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fdffbfb6832cd0b300995a2b08b8f6fa9f6e856d562800fea9182316d99c4e8e"}, + {file = "numpy-1.21.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3820724272f9913b597ccd13a467cc492a0da6b05df26ea09e78b171a0bb9da6"}, + {file = "numpy-1.21.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f17e562de9edf691a42ddb1eb4a5541c20dd3f9e65b09ded2beb0799c0cf29bb"}, + {file = "numpy-1.21.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f30427731561ce75d7048ac254dbe47a2ba576229250fb60f0fb74db96501a1"}, + {file = "numpy-1.21.6-cp310-cp310-win32.whl", hash = "sha256:d4bf4d43077db55589ffc9009c0ba0a94fa4908b9586d6ccce2e0b164c86303c"}, + {file = "numpy-1.21.6-cp310-cp310-win_amd64.whl", hash = "sha256:d136337ae3cc69aa5e447e78d8e1514be8c3ec9b54264e680cf0b4bd9011574f"}, + {file = "numpy-1.21.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6aaf96c7f8cebc220cdfc03f1d5a31952f027dda050e5a703a0d1c396075e3e7"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:67c261d6c0a9981820c3a149d255a76918278a6b03b6a036800359aba1256d46"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a6be4cb0ef3b8c9250c19cc122267263093eee7edd4e3fa75395dfda8c17a8e2"}, + {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4068a8c44014b2d55f3c3f574c376b2494ca9cc73d2f1bd692382b6dffe3db"}, + {file = "numpy-1.21.6-cp37-cp37m-win32.whl", hash = "sha256:7c7e5fa88d9ff656e067876e4736379cc962d185d5cd808014a8a928d529ef4e"}, + {file = "numpy-1.21.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bcb238c9c96c00d3085b264e5c1a1207672577b93fa666c3b14a45240b14123a"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:82691fda7c3f77c90e62da69ae60b5ac08e87e775b09813559f8901a88266552"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:643843bcc1c50526b3a71cd2ee561cf0d8773f062c8cbaf9ffac9fdf573f83ab"}, + {file = "numpy-1.21.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:357768c2e4451ac241465157a3e929b265dfac85d9214074985b1786244f2ef3"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f411b2c3f3d76bba0865b35a425157c5dcf54937f82bbeb3d3c180789dd66a6"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4aa48afdce4660b0076a00d80afa54e8a97cd49f457d68a4342d188a09451c1a"}, + {file = "numpy-1.21.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a96eef20f639e6a97d23e57dd0c1b1069a7b4fd7027482a4c5c451cd7732f4"}, + {file = "numpy-1.21.6-cp38-cp38-win32.whl", hash = "sha256:5c3c8def4230e1b959671eb959083661b4a0d2e9af93ee339c7dada6759a9470"}, + {file = "numpy-1.21.6-cp38-cp38-win_amd64.whl", hash = "sha256:bf2ec4b75d0e9356edea834d1de42b31fe11f726a81dfb2c2112bc1eaa508fcf"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4391bd07606be175aafd267ef9bea87cf1b8210c787666ce82073b05f202add1"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67f21981ba2f9d7ba9ade60c9e8cbaa8cf8e9ae51673934480e45cf55e953673"}, + {file = "numpy-1.21.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee5ec40fdd06d62fe5d4084bef4fd50fd4bb6bfd2bf519365f569dc470163ab0"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dbe1c91269f880e364526649a52eff93ac30035507ae980d2fed33aaee633ac"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9caa9d5e682102453d96a0ee10c7241b72859b01a941a397fd965f23b3e016b"}, + {file = "numpy-1.21.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58459d3bad03343ac4b1b42ed14d571b8743dc80ccbf27444f266729df1d6f5b"}, + {file = "numpy-1.21.6-cp39-cp39-win32.whl", hash = "sha256:7f5ae4f304257569ef3b948810816bc87c9146e8c446053539947eedeaa32786"}, + {file = "numpy-1.21.6-cp39-cp39-win_amd64.whl", hash = "sha256:e31f0bb5928b793169b87e3d1e070f2342b22d5245c755e2b81caa29756246c3"}, + {file = "numpy-1.21.6-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd1c8f6bd65d07d3810b90d02eba7997e32abbdf1277a481d698969e921a3be0"}, + {file = "numpy-1.21.6.zip", hash = "sha256:ecb55251139706669fdec2ff073c98ef8e9a84473e51e716211b41aa0f18e656"}, ] [[package]] name = "numpy" -version = "1.26.3" +version = "1.25.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, + {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, + {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, + {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, + {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, + {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, + {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, + {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, + {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, + {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, + {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, + {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, + {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, + {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, + {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, + {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, + {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, + {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, ] [[package]] @@ -705,15 +729,61 @@ et-xmlfile = "*" [[package]] name = "packaging" -version = "23.2" +version = "23.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] +[[package]] +name = "pandas" +version = "1.3.5" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "pandas-1.3.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:62d5b5ce965bae78f12c1c0df0d387899dd4211ec0bdc52822373f13a3a022b9"}, + {file = "pandas-1.3.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:adfeb11be2d54f275142c8ba9bf67acee771b7186a5745249c7d5a06c670136b"}, + {file = "pandas-1.3.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:60a8c055d58873ad81cae290d974d13dd479b82cbb975c3e1fa2cf1920715296"}, + {file = "pandas-1.3.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd541ab09e1f80a2a1760032d665f6e032d8e44055d602d65eeea6e6e85498cb"}, + {file = "pandas-1.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2651d75b9a167cc8cc572cf787ab512d16e316ae00ba81874b560586fa1325e0"}, + {file = "pandas-1.3.5-cp310-cp310-win_amd64.whl", hash = "sha256:aaf183a615ad790801fa3cf2fa450e5b6d23a54684fe386f7e3208f8b9bfbef6"}, + {file = "pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:344295811e67f8200de2390093aeb3c8309f5648951b684d8db7eee7d1c81fb7"}, + {file = "pandas-1.3.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:552020bf83b7f9033b57cbae65589c01e7ef1544416122da0c79140c93288f56"}, + {file = "pandas-1.3.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cce0c6bbeb266b0e39e35176ee615ce3585233092f685b6a82362523e59e5b4"}, + {file = "pandas-1.3.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d28a3c65463fd0d0ba8bbb7696b23073efee0510783340a44b08f5e96ffce0c"}, + {file = "pandas-1.3.5-cp37-cp37m-win32.whl", hash = "sha256:a62949c626dd0ef7de11de34b44c6475db76995c2064e2d99c6498c3dba7fe58"}, + {file = "pandas-1.3.5-cp37-cp37m-win_amd64.whl", hash = "sha256:8025750767e138320b15ca16d70d5cdc1886e8f9cc56652d89735c016cd8aea6"}, + {file = "pandas-1.3.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fe95bae4e2d579812865db2212bb733144e34d0c6785c0685329e5b60fcb85dd"}, + {file = "pandas-1.3.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f261553a1e9c65b7a310302b9dbac31cf0049a51695c14ebe04e4bfd4a96f02"}, + {file = "pandas-1.3.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b6dbec5f3e6d5dc80dcfee250e0a2a652b3f28663492f7dab9a24416a48ac39"}, + {file = "pandas-1.3.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3bc49af96cd6285030a64779de5b3688633a07eb75c124b0747134a63f4c05f"}, + {file = "pandas-1.3.5-cp38-cp38-win32.whl", hash = "sha256:b6b87b2fb39e6383ca28e2829cddef1d9fc9e27e55ad91ca9c435572cdba51bf"}, + {file = "pandas-1.3.5-cp38-cp38-win_amd64.whl", hash = "sha256:a395692046fd8ce1edb4c6295c35184ae0c2bbe787ecbe384251da609e27edcb"}, + {file = "pandas-1.3.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd971a3f08b745a75a86c00b97f3007c2ea175951286cdda6abe543e687e5f2f"}, + {file = "pandas-1.3.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37f06b59e5bc05711a518aa10beaec10942188dccb48918bb5ae602ccbc9f1a0"}, + {file = "pandas-1.3.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c21778a688d3712d35710501f8001cdbf96eb70a7c587a3d5613573299fdca6"}, + {file = "pandas-1.3.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3345343206546545bc26a05b4602b6a24385b5ec7c75cb6059599e3d56831da2"}, + {file = "pandas-1.3.5-cp39-cp39-win32.whl", hash = "sha256:c69406a2808ba6cf580c2255bcf260b3f214d2664a3a4197d0e640f573b46fd3"}, + {file = "pandas-1.3.5-cp39-cp39-win_amd64.whl", hash = "sha256:32e1a26d5ade11b547721a72f9bfc4bd113396947606e00d5b4a5b79b3dcb006"}, + {file = "pandas-1.3.5.tar.gz", hash = "sha256:1e4285f5de1012de20ca46b188ccf33521bff61ba5c5ebd78b4fb28e5416a9f1"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.17.3", markers = "(platform_machine != \"aarch64\" and platform_machine != \"arm64\") and python_version < \"3.10\""}, + {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, + {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, +] +python-dateutil = ">=2.7.3" +pytz = ">=2017.3" + +[package.extras] +test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] + [[package]] name = "pandas" version = "2.0.3" @@ -783,88 +853,83 @@ xml = ["lxml (>=4.6.3)"] [[package]] name = "pathspec" -version = "0.12.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] name = "platformdirs" -version = "4.1.0" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} + [package.extras] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.4.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, - {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pyarrow" -version = "14.0.2" +version = "12.0.1" description = "Python library for Apache Arrow" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "pyarrow-14.0.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:ba9fe808596c5dbd08b3aeffe901e5f81095baaa28e7d5118e01354c64f22807"}, - {file = "pyarrow-14.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:22a768987a16bb46220cef490c56c671993fbee8fd0475febac0b3e16b00a10e"}, - {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dbba05e98f247f17e64303eb876f4a80fcd32f73c7e9ad975a83834d81f3fda"}, - {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a898d134d00b1eca04998e9d286e19653f9d0fcb99587310cd10270907452a6b"}, - {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:87e879323f256cb04267bb365add7208f302df942eb943c93a9dfeb8f44840b1"}, - {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:76fc257559404ea5f1306ea9a3ff0541bf996ff3f7b9209fc517b5e83811fa8e"}, - {file = "pyarrow-14.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0c4a18e00f3a32398a7f31da47fefcd7a927545b396e1f15d0c85c2f2c778cd"}, - {file = "pyarrow-14.0.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:87482af32e5a0c0cce2d12eb3c039dd1d853bd905b04f3f953f147c7a196915b"}, - {file = "pyarrow-14.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:059bd8f12a70519e46cd64e1ba40e97eae55e0cbe1695edd95384653d7626b23"}, - {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f16111f9ab27e60b391c5f6d197510e3ad6654e73857b4e394861fc79c37200"}, - {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06ff1264fe4448e8d02073f5ce45a9f934c0f3db0a04460d0b01ff28befc3696"}, - {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6dd4f4b472ccf4042f1eab77e6c8bce574543f54d2135c7e396f413046397d5a"}, - {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:32356bfb58b36059773f49e4e214996888eeea3a08893e7dbde44753799b2a02"}, - {file = "pyarrow-14.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:52809ee69d4dbf2241c0e4366d949ba035cbcf48409bf404f071f624ed313a2b"}, - {file = "pyarrow-14.0.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:c87824a5ac52be210d32906c715f4ed7053d0180c1060ae3ff9b7e560f53f944"}, - {file = "pyarrow-14.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a25eb2421a58e861f6ca91f43339d215476f4fe159eca603c55950c14f378cc5"}, - {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c1da70d668af5620b8ba0a23f229030a4cd6c5f24a616a146f30d2386fec422"}, - {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cc61593c8e66194c7cdfae594503e91b926a228fba40b5cf25cc593563bcd07"}, - {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:78ea56f62fb7c0ae8ecb9afdd7893e3a7dbeb0b04106f5c08dbb23f9c0157591"}, - {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:37c233ddbce0c67a76c0985612fef27c0c92aef9413cf5aa56952f359fcb7379"}, - {file = "pyarrow-14.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:e4b123ad0f6add92de898214d404e488167b87b5dd86e9a434126bc2b7a5578d"}, - {file = "pyarrow-14.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e354fba8490de258be7687f341bc04aba181fc8aa1f71e4584f9890d9cb2dec2"}, - {file = "pyarrow-14.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:20e003a23a13da963f43e2b432483fdd8c38dc8882cd145f09f21792e1cf22a1"}, - {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc0de7575e841f1595ac07e5bc631084fd06ca8b03c0f2ecece733d23cd5102a"}, - {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e986dc859712acb0bd45601229021f3ffcdfc49044b64c6d071aaf4fa49e98"}, - {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f7d029f20ef56673a9730766023459ece397a05001f4e4d13805111d7c2108c0"}, - {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:209bac546942b0d8edc8debda248364f7f668e4aad4741bae58e67d40e5fcf75"}, - {file = "pyarrow-14.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:1e6987c5274fb87d66bb36816afb6f65707546b3c45c44c28e3c4133c010a881"}, - {file = "pyarrow-14.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a01d0052d2a294a5f56cc1862933014e696aa08cc7b620e8c0cce5a5d362e976"}, - {file = "pyarrow-14.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a51fee3a7db4d37f8cda3ea96f32530620d43b0489d169b285d774da48ca9785"}, - {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64df2bf1ef2ef14cee531e2dfe03dd924017650ffaa6f9513d7a1bb291e59c15"}, - {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c0fa3bfdb0305ffe09810f9d3e2e50a2787e3a07063001dcd7adae0cee3601a"}, - {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c65bf4fd06584f058420238bc47a316e80dda01ec0dfb3044594128a6c2db794"}, - {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:63ac901baec9369d6aae1cbe6cca11178fb018a8d45068aaf5bb54f94804a866"}, - {file = "pyarrow-14.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:75ee0efe7a87a687ae303d63037d08a48ef9ea0127064df18267252cfe2e9541"}, - {file = "pyarrow-14.0.2.tar.gz", hash = "sha256:36cef6ba12b499d864d1def3e990f97949e0b79400d08b7cf74504ffbd3eb025"}, + {file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"}, + {file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"}, + {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"}, + {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"}, + {file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"}, + {file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"}, + {file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"}, + {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"}, + {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"}, + {file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"}, + {file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"}, + {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"}, + {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"}, + {file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"}, + {file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"}, + {file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"}, + {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"}, + {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"}, + {file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"}, + {file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"}, + {file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"}, + {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"}, + {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"}, + {file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"}, + {file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"}, ] [package.dependencies] @@ -872,48 +937,43 @@ numpy = ">=1.16.6" [[package]] name = "pylint" -version = "3.0.3" +version = "2.13.9" description = "python code static checker" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.6.2" files = [ - {file = "pylint-3.0.3-py3-none-any.whl", hash = "sha256:7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810"}, - {file = "pylint-3.0.3.tar.gz", hash = "sha256:58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b"}, + {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, + {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, ] [package.dependencies] -astroid = ">=3.0.1,<=3.1.0-dev0" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, - {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, -] -isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +astroid = ">=2.11.5,<=2.12.0-dev0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +dill = ">=0.2" +isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -tomlkit = ">=0.10.1" typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -spelling = ["pyenchant (>=3.2,<4.0)"] -testutils = ["gitpython (>3)"] +testutil = ["gitpython (>3)"] [[package]] name = "pytest" -version = "7.4.4" +version = "7.4.0" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -953,13 +1013,13 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.0.1" +version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, + {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, + {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, ] [package.extras] @@ -967,13 +1027,13 @@ cli = ["click (>=5.0)"] [[package]] name = "pytz" -version = "2023.3.post1" +version = "2023.3" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] [[package]] @@ -997,6 +1057,22 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "six" version = "1.16.0" @@ -1010,90 +1086,75 @@ files = [ [[package]] name = "sqlalchemy" -version = "2.0.25" +version = "1.4.49" description = "Database Abstraction Library" -optional = true -python-versions = ">=3.7" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"}, - {file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"}, - {file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, + {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} -typing-extensions = ">=4.6.0" +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0)"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=8)"] -oracle-oracledb = ["oracledb (>=1.0.1)"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.29.1)"] -postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] -pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3_binary"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] [[package]] name = "thrift" @@ -1125,74 +1186,194 @@ files = [ ] [[package]] -name = "tomlkit" -version = "0.12.3" -description = "Style preserving TOML library" +name = "typed-ast" +version = "1.5.5" +description = "a fork of Python 2 and 3 ast modules with type comment support" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, - {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, + {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, + {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, + {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, + {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, + {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, + {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, + {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, + {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, + {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, ] [[package]] name = "typing-extensions" -version = "4.9.0" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "tzdata" -version = "2023.4" +version = "2023.3" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] [[package]] name = "urllib3" -version = "2.1.0" +version = "2.0.4" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, + {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + [[package]] name = "zipp" -version = "3.17.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -optional = true -python-versions = ">=3.8" +optional = false +python-versions = ">=3.7" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] - -[extras] -alembic = ["alembic", "sqlalchemy"] -sqlalchemy = ["sqlalchemy"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "2.0" -python-versions = "^3.8.0" -content-hash = "ad523101f78432ed47f65c09eb5e652c518e717428798f2fe7ff194dcbe07434" +python-versions = "^3.7.1" +content-hash = "8e61ec31838813ee794b06670a32118e6089b13c99b86a8da6850066cedbac2c" diff --git a/pyproject.toml b/pyproject.toml index eb779c43..1565e0dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "databricks-sql-connector" -version = "3.0.2" +version = "2.9.3" description = "Databricks SQL Connector for Python" authors = ["Databricks "] license = "Apache-2.0" @@ -9,32 +9,31 @@ packages = [{ include = "databricks", from = "src" }] include = ["CHANGELOG.md"] [tool.poetry.dependencies] -python = "^3.8.0" +python = "^3.7.1" thrift = "^0.16.0" pandas = [ - { version = ">=1.2.5,<2.2.0", python = ">=3.8" } + { version = ">=1.2.5,<1.4.0", python = ">=3.7,<3.8" }, + { version = ">=1.2.5,<3.0.0", python = ">=3.8" }, +] +pyarrow = [ + { version = ">=6.0.0", python = ">=3.7,<3.11" }, + { version = ">=10.0.1", python = ">=3.11" }, ] -pyarrow = "^14.0.1" - lz4 = "^4.0.2" requests = "^2.18.1" oauthlib = "^3.1.0" numpy = [ - { version = ">=1.16.6", python = ">=3.8,<3.11" }, + { version = ">=1.16.6", python = ">=3.7,<3.11" }, { version = ">=1.23.4", python = ">=3.11" }, ] -sqlalchemy = { version = ">=2.0.21", optional = true } +sqlalchemy = "^1.3.24" openpyxl = "^3.0.10" -alembic = { version = "^1.0.11", optional = true } -urllib3 = ">=1.26" - -[tool.poetry.extras] -sqlalchemy = ["sqlalchemy"] -alembic = ["sqlalchemy", "alembic"] +alembic = "^1.0.11" +urllib3 = ">=1.0" [tool.poetry.dev-dependencies] pytest = "^7.1.2" -mypy = "^0.981" +mypy = "^0.950" pylint = ">=2.12.0" black = "^22.3.0" pytest-dotenv = "^0.5.2" @@ -61,5 +60,5 @@ exclude = '/(\.eggs|\.git|\.hg|\.mypy_cache|\.nox|\.tox|\.venv|\.svn|_build|buck minversion = "6.0" log_cli = "false" log_cli_level = "INFO" -testpaths = ["tests", "src/databricks/sqlalchemy/test_local"] +testpaths = ["tests"] env_files = ["test.env"] diff --git a/src/databricks/__init__.py b/src/databricks/__init__.py index 40d3f2e8..2c691f3a 100644 --- a/src/databricks/__init__.py +++ b/src/databricks/__init__.py @@ -1,7 +1,4 @@ -# See: https://packaging.python.org/guides/packaging-namespace-packages/#pkgutil-style-namespace-packages -# -# This file must only contain the following line, or other packages in the databricks.* namespace -# may not be importable. The contents of this file must be byte-for-byte equivalent across all packages. -# If they are not, parallel package installation may lead to clobbered and invalid files. -# Also see https://github.com/databricks/databricks-sdk-py/issues/343. +# https://packaging.python.org/guides/packaging-namespace-packages/#pkgutil-style-namespace-packages +# This file should only contain the following line. Otherwise other sub-packages databricks.* namespace +# may not be importable. __path__ = __import__("pkgutil").extend_path(__path__, __name__) diff --git a/src/databricks/sql/__init__.py b/src/databricks/sql/__init__.py index 40bdacf7..918bd47a 100644 --- a/src/databricks/sql/__init__.py +++ b/src/databricks/sql/__init__.py @@ -5,8 +5,7 @@ # PEP 249 module globals apilevel = "2.0" threadsafety = 1 # Threads may share the module, but not connections. - -paramstyle = "named" +paramstyle = "pyformat" # Python extended format codes, e.g. ...WHERE name=%(name)s class DBAPITypeObject(object): @@ -29,7 +28,7 @@ def __repr__(self): DATE = DBAPITypeObject("date") ROWID = DBAPITypeObject() -__version__ = "3.0.2" +__version__ = "2.9.3" USER_AGENT_NAME = "PyDatabricksSqlConnector" # These two functions are pyhive legacy diff --git a/src/databricks/sql/auth/endpoint.py b/src/databricks/sql/auth/endpoint.py index c0ce0f9d..e24f9d75 100644 --- a/src/databricks/sql/auth/endpoint.py +++ b/src/databricks/sql/auth/endpoint.py @@ -23,12 +23,7 @@ class CloudType(Enum): AZURE = "azure" -DATABRICKS_AWS_DOMAINS = [ - ".cloud.databricks.com", - ".cloud.databricks.us", - ".dev.databricks.com", -] - +DATABRICKS_AWS_DOMAINS = [".cloud.databricks.com", ".dev.databricks.com"] DATABRICKS_AZURE_DOMAINS = [ ".azuredatabricks.net", ".databricks.azure.cn", diff --git a/src/databricks/sql/auth/retry.py b/src/databricks/sql/auth/retry.py index 3295fd21..0b3ad175 100644 --- a/src/databricks/sql/auth/retry.py +++ b/src/databricks/sql/auth/retry.py @@ -30,7 +30,6 @@ class CommandType(Enum): EXECUTE_STATEMENT = "ExecuteStatement" CLOSE_SESSION = "CloseSession" CLOSE_OPERATION = "CloseOperation" - GET_OPERATION_STATUS = "GetOperationStatus" OTHER = "Other" @classmethod @@ -315,9 +314,9 @@ def should_retry(self, method: str, status_code: int) -> Tuple[bool, str]: 2. The request received a 501 (Not Implemented) status code Because this request can never succeed. 3. The request received a 404 (Not Found) code and the request CommandType - was GetOperationStatus, CloseSession or CloseOperation. This code indicates - that the command, session or cursor was already closed. Further retries will - always return the same code. + was CloseSession or CloseOperation. This code indicates that the session + or cursor was already closed. Further retries will always return the same + code. 4. The request CommandType was ExecuteStatement and the HTTP code does not appear in the default status_forcelist or force_dangerous_codes list. By default, this means ExecuteStatement is only retried for codes 429 and 503. @@ -344,13 +343,6 @@ def should_retry(self, method: str, status_code: int) -> Tuple[bool, str]: if not self._is_method_retryable(method): # type: ignore return False, "Only POST requests are retried" - # Request failed with 404 and was a GetOperationStatus. This is not recoverable. Don't retry. - if status_code == 404 and self.command_type == CommandType.GET_OPERATION_STATUS: - return ( - False, - "GetOperationStatus received 404 code from Databricks. Operation was canceled.", - ) - # Request failed with 404 because CloseSession returns 404 if you repeat the request. if ( status_code == 404 diff --git a/src/databricks/sql/client.py b/src/databricks/sql/client.py index 7417161f..eed13f1c 100644 --- a/src/databricks/sql/client.py +++ b/src/databricks/sql/client.py @@ -1,11 +1,10 @@ -from typing import Dict, Tuple, List, Optional, Any, Union, Sequence +from typing import Dict, Tuple, List, Optional, Any, Union import pandas import pyarrow import requests import json import os -import decimal from databricks.sql import __version__ from databricks.sql import * @@ -14,42 +13,17 @@ SessionAlreadyClosedError, CursorAlreadyClosedError, ) -from databricks.sql.thrift_api.TCLIService import ttypes from databricks.sql.thrift_backend import ThriftBackend -from databricks.sql.utils import ( - ExecuteResponse, - ParamEscaper, - inject_parameters, - transform_paramstyle, -) -from databricks.sql.parameters.native import ( - DbsqlParameterBase, - TDbsqlParameter, - TParameterDict, - TParameterSequence, - TParameterCollection, - ParameterStructure, - dbsql_parameter_from_primitive, - ParameterApproach, -) - - +from databricks.sql.utils import ExecuteResponse, ParamEscaper, inject_parameters from databricks.sql.types import Row from databricks.sql.auth.auth import get_python_sql_connector_auth_provider from databricks.sql.experimental.oauth_persistence import OAuthPersistence -from databricks.sql.thrift_api.TCLIService.ttypes import ( - TSparkParameter, -) - - logger = logging.getLogger(__name__) DEFAULT_RESULT_BUFFER_SIZE_BYTES = 104857600 DEFAULT_ARRAY_SIZE = 100000 -NO_NATIVE_PARAMS: List = [] - class Connection: def __init__( @@ -61,7 +35,6 @@ def __init__( session_configuration: Dict[str, Any] = None, catalog: Optional[str] = None, schema: Optional[str] = None, - _use_arrow_native_complex_types: Optional[bool] = True, **kwargs, ) -> None: """ @@ -75,13 +48,11 @@ def __init__( Http Bearer access token, e.g. Databricks Personal Access Token. Unless if you use auth_type=`databricks-oauth` you need to pass `access_token. Examples: - ``` connection = sql.connect( server_hostname='dbc-12345.staging.cloud.databricks.com', http_path='sql/protocolv1/o/6789/12abc567', access_token='dabpi12345678' ) - ``` :param http_headers: An optional list of (k, v) pairs that will be set as Http headers on every request :param session_configuration: An optional dictionary of Spark session parameters. Defaults to None. Execute the SQL command `SET -v` to get a full list of available commands. @@ -89,12 +60,6 @@ def __init__( :param schema: An optional initial schema to use. Requires DBR version 9.0+ Other Parameters: - use_inline_params: `boolean` | str, optional (default is False) - When True, parameterized calls to cursor.execute() will try to render parameter values inline with the - query text instead of using native bound parameters supported in DBR 14.1 and above. This connector will attempt to - sanitise parameterized inputs to prevent SQL injection. The inline parameter approach is maintained for - legacy purposes and will be deprecated in a future release. When this parameter is `True` you will see - a warning log message. To suppress this log message, set `use_inline_params="silent"`. auth_type: `str`, optional `databricks-oauth` : to use oauth with fine-grained permission scopes, set to `databricks-oauth`. This is currently in private preview for Databricks accounts on AWS. @@ -142,7 +107,6 @@ def read(self) -> Optional[OAuthToken]: own implementation of OAuthPersistence. Examples: - ``` # for development only from databricks.sql.experimental.oauth_persistence import DevOnlyFilePersistence @@ -152,14 +116,8 @@ def read(self) -> Optional[OAuthToken]: auth_type="databricks-oauth", experimental_oauth_persistence=DevOnlyFilePersistence("~/dev-oauth.json") ) - ``` - :param _use_arrow_native_complex_types: `bool`, optional - Controls whether a complex type field value is returned as a string or as a native Arrow type. Defaults to True. - When True: - MAP is returned as List[Tuple[str, Any]] - STRUCT is returned as Dict[str, Any] - ARRAY is returned as numpy.ndarray - When False, complex types are returned as a strings. These are generally deserializable as JSON. + + """ # Internal arguments in **kwargs: @@ -190,6 +148,9 @@ def read(self) -> Optional[OAuthToken]: # _disable_pandas # In case the deserialisation through pandas causes any issues, it can be disabled with # this flag. + # _use_arrow_native_complex_types + # DBR will return native Arrow types for structs, arrays and maps instead of Arrow strings + # (True by default) # _use_arrow_native_decimals # Databricks runtime will return native Arrow types for decimals instead of Arrow strings # (True by default) @@ -228,51 +189,17 @@ def read(self) -> Optional[OAuthToken]: http_path, (http_headers or []) + base_headers, auth_provider, - _use_arrow_native_complex_types=_use_arrow_native_complex_types, **kwargs, ) - self._open_session_resp = self.thrift_backend.open_session( + self._session_handle = self.thrift_backend.open_session( session_configuration, catalog, schema ) - self._session_handle = self._open_session_resp.sessionHandle - self.protocol_version = self.get_protocol_version(self._open_session_resp) - self.use_cloud_fetch = kwargs.get("use_cloud_fetch", True) + self.use_cloud_fetch = kwargs.get("use_cloud_fetch", False) self.open = True logger.info("Successfully opened session " + str(self.get_session_id_hex())) self._cursors = [] # type: List[Cursor] - self.use_inline_params = self._set_use_inline_params_with_warning( - kwargs.get("use_inline_params", False) - ) - - def _set_use_inline_params_with_warning(self, value: Union[bool, str]): - """Valid values are True, False, and "silent" - - False: Use native parameters - True: Use inline parameters and log a warning - "silent": Use inline parameters and don't log a warning - """ - - if value is False: - return False - - if value not in [True, "silent"]: - raise ValueError( - f"Invalid value for use_inline_params: {value}. " - + 'Valid values are True, False, and "silent"' - ) - - if value is True: - logger.warning( - "Parameterised queries executed with this client will use the inline parameter approach." - "This approach will be deprecated in a future release. Consider using native parameters." - "Learn more: https://github.com/databricks/databricks-sql-python/tree/main/docs/parameters.md" - 'To suppress this warning, set use_inline_params="silent"' - ) - - return value - def __enter__(self): return self @@ -294,30 +221,6 @@ def __del__(self): def get_session_id(self): return self.thrift_backend.handle_to_id(self._session_handle) - @staticmethod - def get_protocol_version(openSessionResp): - """ - Since the sessionHandle will sometimes have a serverProtocolVersion, it takes - precedence over the serverProtocolVersion defined in the OpenSessionResponse. - """ - if ( - openSessionResp.sessionHandle - and hasattr(openSessionResp.sessionHandle, "serverProtocolVersion") - and openSessionResp.sessionHandle.serverProtocolVersion - ): - return openSessionResp.sessionHandle.serverProtocolVersion - return openSessionResp.serverProtocolVersion - - @staticmethod - def server_parameterized_queries_enabled(protocolVersion): - if ( - protocolVersion - and protocolVersion >= ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8 - ): - return True - else: - return False - def get_session_id_hex(self): return self.thrift_backend.handle_to_hex_id(self._session_handle) @@ -424,132 +327,6 @@ def __iter__(self): else: raise Error("There is no active result set") - def _determine_parameter_approach( - self, params: Optional[TParameterCollection] - ) -> ParameterApproach: - """Encapsulates the logic for choosing whether to send parameters in native vs inline mode - - If params is None then ParameterApproach.NONE is returned. - If self.use_inline_params is True then inline mode is used. - If self.use_inline_params is False, then check if the server supports them and proceed. - Else raise an exception. - - Returns a ParameterApproach enumeration or raises an exception - - If inline approach is used when the server supports native approach, a warning is logged - """ - - if params is None: - return ParameterApproach.NONE - - if self.connection.use_inline_params: - return ParameterApproach.INLINE - - else: - return ParameterApproach.NATIVE - - def _all_dbsql_parameters_are_named(self, params: List[TDbsqlParameter]) -> bool: - """Return True if all members of the list have a non-null .name attribute""" - return all([i.name is not None for i in params]) - - def _normalize_tparametersequence( - self, params: TParameterSequence - ) -> List[TDbsqlParameter]: - """Retains the same order as the input list.""" - - output: List[TDbsqlParameter] = [] - for p in params: - if isinstance(p, DbsqlParameterBase): - output.append(p) # type: ignore - else: - output.append(dbsql_parameter_from_primitive(value=p)) # type: ignore - - return output - - def _normalize_tparameterdict( - self, params: TParameterDict - ) -> List[TDbsqlParameter]: - return [ - dbsql_parameter_from_primitive(value=value, name=name) - for name, value in params.items() - ] - - def _normalize_tparametercollection( - self, params: Optional[TParameterCollection] - ) -> List[TDbsqlParameter]: - if params is None: - return [] - if isinstance(params, dict): - return self._normalize_tparameterdict(params) - if isinstance(params, Sequence): - return self._normalize_tparametersequence(list(params)) - - def _determine_parameter_structure( - self, - parameters: List[TDbsqlParameter], - ) -> ParameterStructure: - all_named = self._all_dbsql_parameters_are_named(parameters) - if all_named: - return ParameterStructure.NAMED - else: - return ParameterStructure.POSITIONAL - - def _prepare_inline_parameters( - self, stmt: str, params: Optional[Union[Sequence, Dict[str, Any]]] - ) -> Tuple[str, List]: - """Return a statement and list of native parameters to be passed to thrift_backend for execution - - :stmt: - A string SQL query containing parameter markers of PEP-249 paramstyle `pyformat`. - For example `%(param)s`. - - :params: - An iterable of parameter values to be rendered inline. If passed as a Dict, the keys - must match the names of the markers included in :stmt:. If passed as a List, its length - must equal the count of parameter markers in :stmt:. - - Returns a tuple of: - stmt: the passed statement with the param markers replaced by literal rendered values - params: an empty list representing the native parameters to be passed with this query. - The list is always empty because native parameters are never used under the inline approach - """ - - escaped_values = self.escaper.escape_args(params) - rendered_statement = inject_parameters(stmt, escaped_values) - - return rendered_statement, NO_NATIVE_PARAMS - - def _prepare_native_parameters( - self, - stmt: str, - params: List[TDbsqlParameter], - param_structure: ParameterStructure, - ) -> Tuple[str, List[TSparkParameter]]: - """Return a statement and a list of native parameters to be passed to thrift_backend for execution - - :stmt: - A string SQL query containing parameter markers of PEP-249 paramstyle `named`. - For example `:param`. - - :params: - An iterable of parameter values to be sent natively. If passed as a Dict, the keys - must match the names of the markers included in :stmt:. If passed as a List, its length - must equal the count of parameter markers in :stmt:. In list form, any member of the list - can be wrapped in a DbsqlParameter class. - - Returns a tuple of: - stmt: the passed statement` with the param markers replaced by literal rendered values - params: a list of TSparkParameters that will be passed in native mode - """ - - stmt = stmt - output = [ - p.as_tspark_param(named=param_structure == ParameterStructure.NAMED) - for p in params - ] - - return stmt, output - def _close_and_clear_active_result_set(self): try: if self.active_result_set: @@ -705,72 +482,32 @@ def _handle_staging_remove(self, presigned_url: str, headers: dict = None): ) def execute( - self, - operation: str, - parameters: Optional[TParameterCollection] = None, + self, operation: str, parameters: Optional[Dict[str, str]] = None ) -> "Cursor": """ Execute a query and wait for execution to complete. - - The parameterisation behaviour of this method depends on which parameter approach is used: - - With INLINE mode, parameters are rendered inline with the query text - - With NATIVE mode (default), parameters are sent to the server separately for binding - - This behaviour is controlled by the `use_inline_params` argument passed when building a connection. - - The paramstyle for these approaches is different: - - If the connection was instantiated with use_inline_params=False (default), then parameters - should be given in PEP-249 `named` paramstyle like :param_name. Parameters passed by positionally - are indicated using a `?` in the query text. - - If the connection was instantiated with use_inline_params=True, then parameters - should be given in PEP-249 `pyformat` paramstyle like %(param_name)s. Parameters passed by positionally - are indicated using a `%s` marker in the query. Note: this approach is not recommended as it can break - your SQL query syntax and will be removed in a future release. - - ```python - inline_operation = "SELECT * FROM table WHERE field = %(some_value)s" - native_operation = "SELECT * FROM table WHERE field = :some_value" - parameters = {"some_value": "foo"} - ``` - - Both will result in the query equivalent to "SELECT * FROM table WHERE field = 'foo' - being sent to the server - + Parameters should be given in extended param format style: %(...). + For example: + operation = "SELECT * FROM table WHERE field = %(some_value)s" + parameters = {"some_value": "foo"} + Will result in the query "SELECT * FROM table WHERE field = 'foo' being sent to the server :returns self """ - - param_approach = self._determine_parameter_approach(parameters) - if param_approach == ParameterApproach.NONE: - prepared_params = NO_NATIVE_PARAMS - prepared_operation = operation - - elif param_approach == ParameterApproach.INLINE: - prepared_operation, prepared_params = self._prepare_inline_parameters( - operation, parameters - ) - elif param_approach == ParameterApproach.NATIVE: - normalized_parameters = self._normalize_tparametercollection(parameters) - param_structure = self._determine_parameter_structure(normalized_parameters) - transformed_operation = transform_paramstyle( - operation, normalized_parameters, param_structure # type: ignore - ) - prepared_operation, prepared_params = self._prepare_native_parameters( - transformed_operation, normalized_parameters, param_structure + if parameters is not None: + operation = inject_parameters( + operation, self.escaper.escape_args(parameters) ) self._check_not_closed() self._close_and_clear_active_result_set() execute_response = self.thrift_backend.execute_command( - operation=prepared_operation, + operation=operation, session_handle=self.connection._session_handle, max_rows=self.arraysize, max_bytes=self.buffer_size_bytes, lz4_compression=self.connection.lz4_compression, cursor=self, use_cloud_fetch=self.connection.use_cloud_fetch, - parameters=prepared_params, ) self.active_result_set = ResultSet( self.connection, @@ -789,10 +526,8 @@ def execute( def executemany(self, operation, seq_of_parameters): """ - Execute the operation once for every set of passed in parameters. - - This will issue N sequential request to the database where N is the length of the provided sequence. - No optimizations of the query (like batching) will be performed. + Prepare a database operation (query or command) and then execute it against all parameter + sequences or mappings found in the sequence ``seq_of_parameters``. Only the final result set is retained. diff --git a/src/databricks/sql/parameters/__init__.py b/src/databricks/sql/parameters/__init__.py deleted file mode 100644 index 3c39cf2b..00000000 --- a/src/databricks/sql/parameters/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from databricks.sql.parameters.native import ( - IntegerParameter, - StringParameter, - BigIntegerParameter, - BooleanParameter, - DateParameter, - DoubleParameter, - FloatParameter, - VoidParameter, - SmallIntParameter, - TimestampParameter, - TimestampNTZParameter, - TinyIntParameter, - DecimalParameter, -) diff --git a/src/databricks/sql/parameters/native.py b/src/databricks/sql/parameters/native.py deleted file mode 100644 index 8a436355..00000000 --- a/src/databricks/sql/parameters/native.py +++ /dev/null @@ -1,606 +0,0 @@ -import datetime -import decimal -from enum import Enum, auto -from typing import Optional, Sequence - -from databricks.sql.exc import NotSupportedError -from databricks.sql.thrift_api.TCLIService.ttypes import ( - TSparkParameter, - TSparkParameterValue, -) - -import datetime -import decimal -from enum import Enum, auto -from typing import Dict, List, Union - - -class ParameterApproach(Enum): - INLINE = 1 - NATIVE = 2 - NONE = 3 - - -class ParameterStructure(Enum): - NAMED = 1 - POSITIONAL = 2 - NONE = 3 - - -class DatabricksSupportedType(Enum): - """Enumerate every supported Databricks SQL type shown here: - - https://docs.databricks.com/en/sql/language-manual/sql-ref-datatypes.html - """ - - BIGINT = auto() - BINARY = auto() - BOOLEAN = auto() - DATE = auto() - DECIMAL = auto() - DOUBLE = auto() - FLOAT = auto() - INT = auto() - INTERVAL = auto() - VOID = auto() - SMALLINT = auto() - STRING = auto() - TIMESTAMP = auto() - TIMESTAMP_NTZ = auto() - TINYINT = auto() - ARRAY = auto() - MAP = auto() - STRUCT = auto() - - -TAllowedParameterValue = Union[ - str, int, float, datetime.datetime, datetime.date, bool, decimal.Decimal, None -] - - -class DbsqlParameterBase: - """Parent class for IntegerParameter, DecimalParameter etc.. - - Each each instance that extends this base class should be capable of generating a TSparkParameter - It should know how to generate a cast expression based off its DatabricksSupportedType. - - By default the cast expression should render the string value of it's `value` and the literal - name of its Databricks Supported Type - - Interface should be: - - from databricks.sql.parameters import DecimalParameter - param = DecimalParameter(value, scale=None, precision=None) - cursor.execute("SELECT ?",[param]) - - Or - - from databricks.sql.parameters import IntegerParameter - param = IntegerParameter(42) - cursor.execute("SELECT ?", [param]) - """ - - CAST_EXPR: str - name: Optional[str] - - def as_tspark_param(self, named: bool) -> TSparkParameter: - """Returns a TSparkParameter object that can be passed to the DBR thrift server.""" - - tsp = TSparkParameter(value=self._tspark_param_value(), type=self._cast_expr()) - - if named: - tsp.name = self.name - tsp.ordinal = False - elif not named: - tsp.ordinal = True - return tsp - - def _tspark_param_value(self): - return TSparkParameterValue(stringValue=str(self.value)) - - def _cast_expr(self): - return self.CAST_EXPR - - def __str__(self): - return f"{self.__class__}(name={self.name}, value={self.value})" - - def __repr__(self): - return self.__str__() - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - -class IntegerParameter(DbsqlParameterBase): - """Wrap a Python `int` that will be bound to a Databricks SQL INT column.""" - - def __init__(self, value: int, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to an INT. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.INT.name - - -class StringParameter(DbsqlParameterBase): - """Wrap a Python `str` that will be bound to a Databricks SQL STRING column.""" - - def __init__(self, value: str, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a STRING. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.STRING.name - - -class BigIntegerParameter(DbsqlParameterBase): - """Wrap a Python `int` that will be bound to a Databricks SQL BIGINT column.""" - - def __init__(self, value: int, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a BIGINT. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.BIGINT.name - - -class BooleanParameter(DbsqlParameterBase): - """Wrap a Python `bool` that will be bound to a Databricks SQL BOOLEAN column.""" - - def __init__(self, value: bool, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a BOOLEAN. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.BOOLEAN.name - - -class DateParameter(DbsqlParameterBase): - """Wrap a Python `date` that will be bound to a Databricks SQL DATE column.""" - - def __init__(self, value: datetime.date, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a DATE. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.DATE.name - - -class DoubleParameter(DbsqlParameterBase): - """Wrap a Python `float` that will be bound to a Databricks SQL DOUBLE column.""" - - def __init__(self, value: float, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a DOUBLE. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.DOUBLE.name - - -class FloatParameter(DbsqlParameterBase): - """Wrap a Python `float` that will be bound to a Databricks SQL FLOAT column.""" - - def __init__(self, value: float, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a FLOAT. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.FLOAT.name - - -class VoidParameter(DbsqlParameterBase): - """Wrap a Python `None` that will be bound to a Databricks SQL VOID type.""" - - def __init__(self, value: None, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a VOID. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.VOID.name - - def _tspark_param_value(self): - """For Void types, the TSparkParameter.value should be a Python NoneType""" - return None - - -class SmallIntParameter(DbsqlParameterBase): - """Wrap a Python `int` that will be bound to a Databricks SQL SMALLINT type.""" - - def __init__(self, value: int, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a SMALLINT. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.SMALLINT.name - - -class TimestampParameter(DbsqlParameterBase): - """Wrap a Python `datetime` that will be bound to a Databricks SQL TIMESTAMP type.""" - - def __init__(self, value: datetime.datetime, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a TIMESTAMP. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.TIMESTAMP.name - - -class TimestampNTZParameter(DbsqlParameterBase): - """Wrap a Python `datetime` that will be bound to a Databricks SQL TIMESTAMP_NTZ type.""" - - def __init__(self, value: datetime.datetime, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a TIMESTAMP_NTZ. - If it contains a timezone, that info will be lost. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.TIMESTAMP_NTZ.name - - -class TinyIntParameter(DbsqlParameterBase): - """Wrap a Python `int` that will be bound to a Databricks SQL TINYINT type.""" - - def __init__(self, value: int, name: Optional[str] = None): - """ - :value: - The value to bind for this parameter. This will be casted to a TINYINT. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - """ - self.value = value - self.name = name - - CAST_EXPR = DatabricksSupportedType.TINYINT.name - - -class DecimalParameter(DbsqlParameterBase): - """Wrap a Python `Decimal` that will be bound to a Databricks SQL DECIMAL type.""" - - CAST_EXPR = "DECIMAL({},{})" - - def __init__( - self, - value: decimal.Decimal, - name: Optional[str] = None, - scale: Optional[int] = None, - precision: Optional[int] = None, - ): - """ - If set, `scale` and `precision` must both be set. If neither is set, the value - will be casted to the smallest possible DECIMAL type that can contain it. - - :value: - The value to bind for this parameter. This will be casted to a DECIMAL. - :name: - If None, your query must contain a `?` marker. Like: - - ```sql - SELECT * FROM table WHERE field = ? - ``` - If not None, your query should contain a named parameter marker. Like: - ```sql - SELECT * FROM table WHERE field = :my_param - ``` - - The `name` argument to this function would be `my_param`. - :scale: - The maximum precision (total number of digits) of the number between 1 and 38. - :precision: - The number of digits to the right of the decimal point. - """ - self.value: decimal.Decimal = value - self.name = name - self.scale = scale - self.precision = precision - - if not self.valid_scale_and_precision(): - raise ValueError( - "DecimalParameter requires both or none of scale and precision to be set" - ) - - def valid_scale_and_precision(self): - if (self.scale is None and self.precision is None) or ( - isinstance(self.scale, int) and isinstance(self.precision, int) - ): - return True - else: - return False - - def _cast_expr(self): - if self.scale and self.precision: - return self.CAST_EXPR.format(self.scale, self.precision) - else: - return self.calculate_decimal_cast_string(self.value) - - def calculate_decimal_cast_string(self, input: decimal.Decimal) -> str: - """Returns the smallest SQL cast argument that can contain the passed decimal - - Example: - Input: Decimal("1234.5678") - Output: DECIMAL(8,4) - """ - - string_decimal = str(input) - - if string_decimal.startswith("0."): - # This decimal is less than 1 - overall = after = len(string_decimal) - 2 - elif "." not in string_decimal: - # This decimal has no fractional component - overall = len(string_decimal) - after = 0 - else: - # This decimal has both whole and fractional parts - parts = string_decimal.split(".") - parts_lengths = [len(i) for i in parts] - before, after = parts_lengths[:2] - overall = before + after - - return self.CAST_EXPR.format(overall, after) - - -def dbsql_parameter_from_int(value: int, name: Optional[str] = None): - """Returns IntegerParameter unless the passed int() requires a BIGINT. - - Note: TinyIntegerParameter is never inferred here because it is a rarely used type and clauses like LIMIT and OFFSET - cannot accept TINYINT bound parameter values. - """ - if -128 <= value <= 127: - # If DBR is ever updated to permit TINYINT values passed to LIMIT and OFFSET - # then we can change this line to return TinyIntParameter - return IntegerParameter(value=value, name=name) - elif -2147483648 <= value <= 2147483647: - return IntegerParameter(value=value, name=name) - else: - return BigIntegerParameter(value=value, name=name) - - -def dbsql_parameter_from_primitive( - value: TAllowedParameterValue, name: Optional[str] = None -) -> "TDbsqlParameter": - """Returns a DbsqlParameter subclass given an inferrable value - - This is a convenience function that can be used to create a DbsqlParameter subclass - without having to explicitly import a subclass of DbsqlParameter. - """ - - # This series of type checks are required for mypy not to raise - # havoc. We can't use TYPE_INFERRENCE_MAP because mypy doesn't trust - # its logic - - if type(value) is int: - return dbsql_parameter_from_int(value, name=name) - elif type(value) is str: - return StringParameter(value=value, name=name) - elif type(value) is float: - return FloatParameter(value=value, name=name) - elif type(value) is datetime.datetime: - return TimestampParameter(value=value, name=name) - elif type(value) is datetime.date: - return DateParameter(value=value, name=name) - elif type(value) is bool: - return BooleanParameter(value=value, name=name) - elif type(value) is decimal.Decimal: - return DecimalParameter(value=value, name=name) - elif value is None: - return VoidParameter(value=value, name=name) - - else: - raise NotSupportedError( - f"Could not infer parameter type from value: {value} - {type(value)} \n" - "Please specify the type explicitly." - ) - - -TDbsqlParameter = Union[ - IntegerParameter, - StringParameter, - BigIntegerParameter, - BooleanParameter, - DateParameter, - DoubleParameter, - FloatParameter, - VoidParameter, - SmallIntParameter, - TimestampParameter, - TimestampNTZParameter, - TinyIntParameter, - DecimalParameter, -] - - -TParameterSequence = Sequence[Union[TDbsqlParameter, TAllowedParameterValue]] -TParameterDict = Dict[str, TAllowedParameterValue] -TParameterCollection = Union[TParameterSequence, TParameterDict] - - -_all__ = [ - "IntegerParameter", - "StringParameter", - "BigIntegerParameter", - "BooleanParameter", - "DateParameter", - "DoubleParameter", - "FloatParameter", - "VoidParameter", - "SmallIntParameter", - "TimestampParameter", - "TimestampNTZParameter", - "TinyIntParameter", - "DecimalParameter", -] diff --git a/src/databricks/sql/parameters/py.typed b/src/databricks/sql/parameters/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/src/databricks/sql/thrift_api/TCLIService/TCLIService-remote b/src/databricks/sql/thrift_api/TCLIService/TCLIService-remote index 552b21e5..5271f955 100755 --- a/src/databricks/sql/thrift_api/TCLIService/TCLIService-remote +++ b/src/databricks/sql/thrift_api/TCLIService/TCLIService-remote @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Autogenerated by Thrift Compiler (0.19.0) +# Autogenerated by Thrift Compiler (0.17.0) # # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING # @@ -45,6 +45,7 @@ if len(sys.argv) <= 1 or sys.argv[1] == '--help': print(' TGetDelegationTokenResp GetDelegationToken(TGetDelegationTokenReq req)') print(' TCancelDelegationTokenResp CancelDelegationToken(TCancelDelegationTokenReq req)') print(' TRenewDelegationTokenResp RenewDelegationToken(TRenewDelegationTokenReq req)') + print(' TDBSqlGetLoadInformationResp GetLoadInformation(TDBSqlGetLoadInformationReq req)') print('') sys.exit(0) @@ -250,6 +251,12 @@ elif cmd == 'RenewDelegationToken': sys.exit(1) pp.pprint(client.RenewDelegationToken(eval(args[0]),)) +elif cmd == 'GetLoadInformation': + if len(args) != 1: + print('GetLoadInformation requires 1 args') + sys.exit(1) + pp.pprint(client.GetLoadInformation(eval(args[0]),)) + else: print('Unrecognized method %s' % cmd) sys.exit(1) diff --git a/src/databricks/sql/thrift_api/TCLIService/TCLIService.py b/src/databricks/sql/thrift_api/TCLIService/TCLIService.py index 071e78a9..6dde6702 100644 --- a/src/databricks/sql/thrift_api/TCLIService/TCLIService.py +++ b/src/databricks/sql/thrift_api/TCLIService/TCLIService.py @@ -1,5 +1,5 @@ # -# Autogenerated by Thrift Compiler (0.19.0) +# Autogenerated by Thrift Compiler (0.17.0) # # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING # @@ -187,6 +187,14 @@ def RenewDelegationToken(self, req): """ pass + def GetLoadInformation(self, req): + """ + Parameters: + - req + + """ + pass + class Client(Iface): def __init__(self, iprot, oprot=None): @@ -867,6 +875,38 @@ def recv_RenewDelegationToken(self): return result.success raise TApplicationException(TApplicationException.MISSING_RESULT, "RenewDelegationToken failed: unknown result") + def GetLoadInformation(self, req): + """ + Parameters: + - req + + """ + self.send_GetLoadInformation(req) + return self.recv_GetLoadInformation() + + def send_GetLoadInformation(self, req): + self._oprot.writeMessageBegin('GetLoadInformation', TMessageType.CALL, self._seqid) + args = GetLoadInformation_args() + args.req = req + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_GetLoadInformation(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = GetLoadInformation_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "GetLoadInformation failed: unknown result") + class Processor(Iface, TProcessor): def __init__(self, handler): @@ -893,6 +933,7 @@ def __init__(self, handler): self._processMap["GetDelegationToken"] = Processor.process_GetDelegationToken self._processMap["CancelDelegationToken"] = Processor.process_CancelDelegationToken self._processMap["RenewDelegationToken"] = Processor.process_RenewDelegationToken + self._processMap["GetLoadInformation"] = Processor.process_GetLoadInformation self._on_message_begin = None def on_message_begin(self, func): @@ -1398,6 +1439,29 @@ def process_RenewDelegationToken(self, seqid, iprot, oprot): oprot.writeMessageEnd() oprot.trans.flush() + def process_GetLoadInformation(self, seqid, iprot, oprot): + args = GetLoadInformation_args() + args.read(iprot) + iprot.readMessageEnd() + result = GetLoadInformation_result() + try: + result.success = self._handler.GetLoadInformation(args.req) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("GetLoadInformation", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + # HELPER FUNCTIONS AND STRUCTURES @@ -4024,5 +4088,130 @@ def __ne__(self, other): RenewDelegationToken_result.thrift_spec = ( (0, TType.STRUCT, 'success', [TRenewDelegationTokenResp, None], None, ), # 0 ) + + +class GetLoadInformation_args(object): + """ + Attributes: + - req + + """ + + + def __init__(self, req=None,): + self.req = req + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.STRUCT: + self.req = TDBSqlGetLoadInformationReq() + self.req.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('GetLoadInformation_args') + if self.req is not None: + oprot.writeFieldBegin('req', TType.STRUCT, 1) + self.req.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(GetLoadInformation_args) +GetLoadInformation_args.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'req', [TDBSqlGetLoadInformationReq, None], None, ), # 1 +) + + +class GetLoadInformation_result(object): + """ + Attributes: + - success + + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.STRUCT: + self.success = TDBSqlGetLoadInformationResp() + self.success.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('GetLoadInformation_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.STRUCT, 0) + self.success.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(GetLoadInformation_result) +GetLoadInformation_result.thrift_spec = ( + (0, TType.STRUCT, 'success', [TDBSqlGetLoadInformationResp, None], None, ), # 0 +) fix_spec(all_structs) del all_structs diff --git a/src/databricks/sql/thrift_api/TCLIService/constants.py b/src/databricks/sql/thrift_api/TCLIService/constants.py index 2cdf2f41..66dfc322 100644 --- a/src/databricks/sql/thrift_api/TCLIService/constants.py +++ b/src/databricks/sql/thrift_api/TCLIService/constants.py @@ -1,5 +1,5 @@ # -# Autogenerated by Thrift Compiler (0.19.0) +# Autogenerated by Thrift Compiler (0.17.0) # # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING # diff --git a/src/databricks/sql/thrift_api/TCLIService/ttypes.py b/src/databricks/sql/thrift_api/TCLIService/ttypes.py index 16abbc2e..07ecfe48 100644 --- a/src/databricks/sql/thrift_api/TCLIService/ttypes.py +++ b/src/databricks/sql/thrift_api/TCLIService/ttypes.py @@ -1,5 +1,5 @@ # -# Autogenerated by Thrift Compiler (0.19.0) +# Autogenerated by Thrift Compiler (0.17.0) # # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING # @@ -36,7 +36,6 @@ class TProtocolVersion(object): SPARK_CLI_SERVICE_PROTOCOL_V5 = 42245 SPARK_CLI_SERVICE_PROTOCOL_V6 = 42246 SPARK_CLI_SERVICE_PROTOCOL_V7 = 42247 - SPARK_CLI_SERVICE_PROTOCOL_V8 = 42248 _VALUES_TO_NAMES = { -7: "__HIVE_JDBC_WORKAROUND", @@ -58,7 +57,6 @@ class TProtocolVersion(object): 42245: "SPARK_CLI_SERVICE_PROTOCOL_V5", 42246: "SPARK_CLI_SERVICE_PROTOCOL_V6", 42247: "SPARK_CLI_SERVICE_PROTOCOL_V7", - 42248: "SPARK_CLI_SERVICE_PROTOCOL_V8", } _NAMES_TO_VALUES = { @@ -81,7 +79,6 @@ class TProtocolVersion(object): "SPARK_CLI_SERVICE_PROTOCOL_V5": 42245, "SPARK_CLI_SERVICE_PROTOCOL_V6": 42246, "SPARK_CLI_SERVICE_PROTOCOL_V7": 42247, - "SPARK_CLI_SERVICE_PROTOCOL_V8": 42248, } @@ -181,39 +178,6 @@ class TSparkRowSetType(object): } -class TDBSqlCompressionCodec(object): - NONE = 0 - LZ4_FRAME = 1 - LZ4_BLOCK = 2 - - _VALUES_TO_NAMES = { - 0: "NONE", - 1: "LZ4_FRAME", - 2: "LZ4_BLOCK", - } - - _NAMES_TO_VALUES = { - "NONE": 0, - "LZ4_FRAME": 1, - "LZ4_BLOCK": 2, - } - - -class TDBSqlArrowLayout(object): - ARROW_BATCH = 0 - ARROW_STREAMING = 1 - - _VALUES_TO_NAMES = { - 0: "ARROW_BATCH", - 1: "ARROW_STREAMING", - } - - _NAMES_TO_VALUES = { - "ARROW_BATCH": 0, - "ARROW_STREAMING": 1, - } - - class TOperationIdempotencyType(object): UNKNOWN = 0 NON_IDEMPOTENT = 1 @@ -511,21 +475,6 @@ class TResultPersistenceMode(object): } -class TDBSqlCloseOperationReason(object): - NONE = 0 - COMMAND_INACTIVITY_TIMEOUT = 1 - - _VALUES_TO_NAMES = { - 0: "NONE", - 1: "COMMAND_INACTIVITY_TIMEOUT", - } - - _NAMES_TO_VALUES = { - "NONE": 0, - "COMMAND_INACTIVITY_TIMEOUT": 1, - } - - class TCacheLookupResult(object): CACHE_INELIGIBLE = 0 LOCAL_CACHE_HIT = 1 @@ -580,18 +529,6 @@ class TCloudFetchDisabledReason(object): } -class TDBSqlManifestFileFormat(object): - THRIFT_GET_RESULT_SET_METADATA_RESP = 0 - - _VALUES_TO_NAMES = { - 0: "THRIFT_GET_RESULT_SET_METADATA_RESP", - } - - _NAMES_TO_VALUES = { - "THRIFT_GET_RESULT_SET_METADATA_RESP": 0, - } - - class TFetchOrientation(object): FETCH_NEXT = 0 FETCH_PRIOR = 1 @@ -619,27 +556,6 @@ class TFetchOrientation(object): } -class TDBSqlFetchDisposition(object): - DISPOSITION_UNSPECIFIED = 0 - DISPOSITION_INLINE = 1 - DISPOSITION_EXTERNAL_LINKS = 2 - DISPOSITION_INTERNAL_DBFS = 3 - - _VALUES_TO_NAMES = { - 0: "DISPOSITION_UNSPECIFIED", - 1: "DISPOSITION_INLINE", - 2: "DISPOSITION_EXTERNAL_LINKS", - 3: "DISPOSITION_INTERNAL_DBFS", - } - - _NAMES_TO_VALUES = { - "DISPOSITION_UNSPECIFIED": 0, - "DISPOSITION_INLINE": 1, - "DISPOSITION_EXTERNAL_LINKS": 2, - "DISPOSITION_INTERNAL_DBFS": 3, - } - - class TJobExecutionStatus(object): IN_PROGRESS = 0 COMPLETE = 1 @@ -796,7 +712,7 @@ def __ne__(self, other): return not (self == other) -class TTAllowedParameterValueEntry(object): +class TPrimitiveTypeEntry(object): """ Attributes: - type @@ -838,7 +754,7 @@ def write(self, oprot): if oprot._fast_encode is not None and self.thrift_spec is not None: oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) return - oprot.writeStructBegin('TTAllowedParameterValueEntry') + oprot.writeStructBegin('TPrimitiveTypeEntry') if self.type is not None: oprot.writeFieldBegin('type', TType.I32, 1) oprot.writeI32(self.type) @@ -1227,7 +1143,7 @@ def read(self, iprot): break if fid == 1: if ftype == TType.STRUCT: - self.primitiveEntry = TTAllowedParameterValueEntry() + self.primitiveEntry = TPrimitiveTypeEntry() self.primitiveEntry.read(iprot) else: iprot.skip(ftype) @@ -2925,270 +2841,6 @@ def __ne__(self, other): return not (self == other) -class TDBSqlJsonArrayFormat(object): - """ - Attributes: - - compressionCodec - - """ - - - def __init__(self, compressionCodec=None,): - self.compressionCodec = compressionCodec - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.I32: - self.compressionCodec = iprot.readI32() - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('TDBSqlJsonArrayFormat') - if self.compressionCodec is not None: - oprot.writeFieldBegin('compressionCodec', TType.I32, 1) - oprot.writeI32(self.compressionCodec) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) - - -class TDBSqlCsvFormat(object): - """ - Attributes: - - compressionCodec - - """ - - - def __init__(self, compressionCodec=None,): - self.compressionCodec = compressionCodec - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.I32: - self.compressionCodec = iprot.readI32() - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('TDBSqlCsvFormat') - if self.compressionCodec is not None: - oprot.writeFieldBegin('compressionCodec', TType.I32, 1) - oprot.writeI32(self.compressionCodec) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) - - -class TDBSqlArrowFormat(object): - """ - Attributes: - - arrowLayout - - compressionCodec - - """ - - - def __init__(self, arrowLayout=None, compressionCodec=None,): - self.arrowLayout = arrowLayout - self.compressionCodec = compressionCodec - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.I32: - self.arrowLayout = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.I32: - self.compressionCodec = iprot.readI32() - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('TDBSqlArrowFormat') - if self.arrowLayout is not None: - oprot.writeFieldBegin('arrowLayout', TType.I32, 1) - oprot.writeI32(self.arrowLayout) - oprot.writeFieldEnd() - if self.compressionCodec is not None: - oprot.writeFieldBegin('compressionCodec', TType.I32, 2) - oprot.writeI32(self.compressionCodec) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) - - -class TDBSqlResultFormat(object): - """ - Attributes: - - arrowFormat - - csvFormat - - jsonArrayFormat - - """ - - - def __init__(self, arrowFormat=None, csvFormat=None, jsonArrayFormat=None,): - self.arrowFormat = arrowFormat - self.csvFormat = csvFormat - self.jsonArrayFormat = jsonArrayFormat - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.STRUCT: - self.arrowFormat = TDBSqlArrowFormat() - self.arrowFormat.read(iprot) - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.STRUCT: - self.csvFormat = TDBSqlCsvFormat() - self.csvFormat.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3: - if ftype == TType.STRUCT: - self.jsonArrayFormat = TDBSqlJsonArrayFormat() - self.jsonArrayFormat.read(iprot) - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('TDBSqlResultFormat') - if self.arrowFormat is not None: - oprot.writeFieldBegin('arrowFormat', TType.STRUCT, 1) - self.arrowFormat.write(oprot) - oprot.writeFieldEnd() - if self.csvFormat is not None: - oprot.writeFieldBegin('csvFormat', TType.STRUCT, 2) - self.csvFormat.write(oprot) - oprot.writeFieldEnd() - if self.jsonArrayFormat is not None: - oprot.writeFieldBegin('jsonArrayFormat', TType.STRUCT, 3) - self.jsonArrayFormat.write(oprot) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) - - class TSparkArrowBatch(object): """ Attributes: @@ -3269,18 +2921,16 @@ class TSparkArrowResultLink(object): - startRowOffset - rowCount - bytesNum - - httpHeaders """ - def __init__(self, fileLink=None, expiryTime=None, startRowOffset=None, rowCount=None, bytesNum=None, httpHeaders=None,): + def __init__(self, fileLink=None, expiryTime=None, startRowOffset=None, rowCount=None, bytesNum=None,): self.fileLink = fileLink self.expiryTime = expiryTime self.startRowOffset = startRowOffset self.rowCount = rowCount self.bytesNum = bytesNum - self.httpHeaders = httpHeaders def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3316,17 +2966,6 @@ def read(self, iprot): self.bytesNum = iprot.readI64() else: iprot.skip(ftype) - elif fid == 6: - if ftype == TType.MAP: - self.httpHeaders = {} - (_ktype105, _vtype106, _size104) = iprot.readMapBegin() - for _i108 in range(_size104): - _key109 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val110 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.httpHeaders[_key109] = _val110 - iprot.readMapEnd() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -3357,14 +2996,6 @@ def write(self, oprot): oprot.writeFieldBegin('bytesNum', TType.I64, 5) oprot.writeI64(self.bytesNum) oprot.writeFieldEnd() - if self.httpHeaders is not None: - oprot.writeFieldBegin('httpHeaders', TType.MAP, 6) - oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.httpHeaders)) - for kiter111, viter112 in self.httpHeaders.items(): - oprot.writeString(kiter111.encode('utf-8') if sys.version_info[0] == 2 else kiter111) - oprot.writeString(viter112.encode('utf-8') if sys.version_info[0] == 2 else viter112) - oprot.writeMapEnd() - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -3401,22 +3032,16 @@ class TDBSqlCloudResultFile(object): - rowCount - uncompressedBytes - compressedBytes - - fileLink - - linkExpiryTime - - httpHeaders """ - def __init__(self, filePath=None, startRowOffset=None, rowCount=None, uncompressedBytes=None, compressedBytes=None, fileLink=None, linkExpiryTime=None, httpHeaders=None,): + def __init__(self, filePath=None, startRowOffset=None, rowCount=None, uncompressedBytes=None, compressedBytes=None,): self.filePath = filePath self.startRowOffset = startRowOffset self.rowCount = rowCount self.uncompressedBytes = uncompressedBytes self.compressedBytes = compressedBytes - self.fileLink = fileLink - self.linkExpiryTime = linkExpiryTime - self.httpHeaders = httpHeaders def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3452,27 +3077,6 @@ def read(self, iprot): self.compressedBytes = iprot.readI64() else: iprot.skip(ftype) - elif fid == 6: - if ftype == TType.STRING: - self.fileLink = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 7: - if ftype == TType.I64: - self.linkExpiryTime = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 8: - if ftype == TType.MAP: - self.httpHeaders = {} - (_ktype114, _vtype115, _size113) = iprot.readMapBegin() - for _i117 in range(_size113): - _key118 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val119 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.httpHeaders[_key118] = _val119 - iprot.readMapEnd() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -3503,26 +3107,20 @@ def write(self, oprot): oprot.writeFieldBegin('compressedBytes', TType.I64, 5) oprot.writeI64(self.compressedBytes) oprot.writeFieldEnd() - if self.fileLink is not None: - oprot.writeFieldBegin('fileLink', TType.STRING, 6) - oprot.writeString(self.fileLink.encode('utf-8') if sys.version_info[0] == 2 else self.fileLink) - oprot.writeFieldEnd() - if self.linkExpiryTime is not None: - oprot.writeFieldBegin('linkExpiryTime', TType.I64, 7) - oprot.writeI64(self.linkExpiryTime) - oprot.writeFieldEnd() - if self.httpHeaders is not None: - oprot.writeFieldBegin('httpHeaders', TType.MAP, 8) - oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.httpHeaders)) - for kiter120, viter121 in self.httpHeaders.items(): - oprot.writeString(kiter120.encode('utf-8') if sys.version_info[0] == 2 else kiter120) - oprot.writeString(viter121.encode('utf-8') if sys.version_info[0] == 2 else viter121) - oprot.writeMapEnd() - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() def validate(self): + if self.filePath is None: + raise TProtocolException(message='Required field filePath is unset!') + if self.startRowOffset is None: + raise TProtocolException(message='Required field startRowOffset is unset!') + if self.rowCount is None: + raise TProtocolException(message='Required field rowCount is unset!') + if self.uncompressedBytes is None: + raise TProtocolException(message='Required field uncompressedBytes is unset!') + if self.compressedBytes is None: + raise TProtocolException(message='Required field compressedBytes is unset!') return def __repr__(self): @@ -3547,12 +3145,11 @@ class TRowSet(object): - columnCount - arrowBatches - resultLinks - - cloudFetchResults """ - def __init__(self, startRowOffset=None, rows=None, columns=None, binaryColumns=None, columnCount=None, arrowBatches=None, resultLinks=None, cloudFetchResults=None,): + def __init__(self, startRowOffset=None, rows=None, columns=None, binaryColumns=None, columnCount=None, arrowBatches=None, resultLinks=None,): self.startRowOffset = startRowOffset self.rows = rows self.columns = columns @@ -3560,7 +3157,6 @@ def __init__(self, startRowOffset=None, rows=None, columns=None, binaryColumns=N self.columnCount = columnCount self.arrowBatches = arrowBatches self.resultLinks = resultLinks - self.cloudFetchResults = cloudFetchResults def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3579,22 +3175,22 @@ def read(self, iprot): elif fid == 2: if ftype == TType.LIST: self.rows = [] - (_etype125, _size122) = iprot.readListBegin() - for _i126 in range(_size122): - _elem127 = TRow() - _elem127.read(iprot) - self.rows.append(_elem127) + (_etype107, _size104) = iprot.readListBegin() + for _i108 in range(_size104): + _elem109 = TRow() + _elem109.read(iprot) + self.rows.append(_elem109) iprot.readListEnd() else: iprot.skip(ftype) elif fid == 3: if ftype == TType.LIST: self.columns = [] - (_etype131, _size128) = iprot.readListBegin() - for _i132 in range(_size128): - _elem133 = TColumn() - _elem133.read(iprot) - self.columns.append(_elem133) + (_etype113, _size110) = iprot.readListBegin() + for _i114 in range(_size110): + _elem115 = TColumn() + _elem115.read(iprot) + self.columns.append(_elem115) iprot.readListEnd() else: iprot.skip(ftype) @@ -3611,33 +3207,22 @@ def read(self, iprot): elif fid == 1281: if ftype == TType.LIST: self.arrowBatches = [] - (_etype137, _size134) = iprot.readListBegin() - for _i138 in range(_size134): - _elem139 = TSparkArrowBatch() - _elem139.read(iprot) - self.arrowBatches.append(_elem139) + (_etype119, _size116) = iprot.readListBegin() + for _i120 in range(_size116): + _elem121 = TSparkArrowBatch() + _elem121.read(iprot) + self.arrowBatches.append(_elem121) iprot.readListEnd() else: iprot.skip(ftype) elif fid == 1282: if ftype == TType.LIST: self.resultLinks = [] - (_etype143, _size140) = iprot.readListBegin() - for _i144 in range(_size140): - _elem145 = TSparkArrowResultLink() - _elem145.read(iprot) - self.resultLinks.append(_elem145) - iprot.readListEnd() - else: - iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.LIST: - self.cloudFetchResults = [] - (_etype149, _size146) = iprot.readListBegin() - for _i150 in range(_size146): - _elem151 = TDBSqlCloudResultFile() - _elem151.read(iprot) - self.cloudFetchResults.append(_elem151) + (_etype125, _size122) = iprot.readListBegin() + for _i126 in range(_size122): + _elem127 = TSparkArrowResultLink() + _elem127.read(iprot) + self.resultLinks.append(_elem127) iprot.readListEnd() else: iprot.skip(ftype) @@ -3658,15 +3243,15 @@ def write(self, oprot): if self.rows is not None: oprot.writeFieldBegin('rows', TType.LIST, 2) oprot.writeListBegin(TType.STRUCT, len(self.rows)) - for iter152 in self.rows: - iter152.write(oprot) + for iter128 in self.rows: + iter128.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.columns is not None: oprot.writeFieldBegin('columns', TType.LIST, 3) oprot.writeListBegin(TType.STRUCT, len(self.columns)) - for iter153 in self.columns: - iter153.write(oprot) + for iter129 in self.columns: + iter129.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.binaryColumns is not None: @@ -3680,22 +3265,15 @@ def write(self, oprot): if self.arrowBatches is not None: oprot.writeFieldBegin('arrowBatches', TType.LIST, 1281) oprot.writeListBegin(TType.STRUCT, len(self.arrowBatches)) - for iter154 in self.arrowBatches: - iter154.write(oprot) + for iter130 in self.arrowBatches: + iter130.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.resultLinks is not None: oprot.writeFieldBegin('resultLinks', TType.LIST, 1282) oprot.writeListBegin(TType.STRUCT, len(self.resultLinks)) - for iter155 in self.resultLinks: - iter155.write(oprot) - oprot.writeListEnd() - oprot.writeFieldEnd() - if self.cloudFetchResults is not None: - oprot.writeFieldBegin('cloudFetchResults', TType.LIST, 3329) - oprot.writeListBegin(TType.STRUCT, len(self.cloudFetchResults)) - for iter156 in self.cloudFetchResults: - iter156.write(oprot) + for iter131 in self.resultLinks: + iter131.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() oprot.writeFieldStop() @@ -3759,11 +3337,11 @@ def read(self, iprot): elif fid == 3: if ftype == TType.MAP: self.properties = {} - (_ktype158, _vtype159, _size157) = iprot.readMapBegin() - for _i161 in range(_size157): - _key162 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val163 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.properties[_key162] = _val163 + (_ktype133, _vtype134, _size132) = iprot.readMapBegin() + for _i136 in range(_size132): + _key137 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val138 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.properties[_key137] = _val138 iprot.readMapEnd() else: iprot.skip(ftype) @@ -3793,9 +3371,9 @@ def write(self, oprot): if self.properties is not None: oprot.writeFieldBegin('properties', TType.MAP, 3) oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.properties)) - for kiter164, viter165 in self.properties.items(): - oprot.writeString(kiter164.encode('utf-8') if sys.version_info[0] == 2 else kiter164) - oprot.writeString(viter165.encode('utf-8') if sys.version_info[0] == 2 else viter165) + for kiter139, viter140 in self.properties.items(): + oprot.writeString(kiter139.encode('utf-8') if sys.version_info[0] == 2 else kiter139) + oprot.writeString(viter140.encode('utf-8') if sys.version_info[0] == 2 else viter140) oprot.writeMapEnd() oprot.writeFieldEnd() if self.viewSchema is not None: @@ -4147,22 +3725,22 @@ def read(self, iprot): if fid == 1: if ftype == TType.MAP: self.confs = {} - (_ktype167, _vtype168, _size166) = iprot.readMapBegin() - for _i170 in range(_size166): - _key171 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val172 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.confs[_key171] = _val172 + (_ktype142, _vtype143, _size141) = iprot.readMapBegin() + for _i145 in range(_size141): + _key146 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val147 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.confs[_key146] = _val147 iprot.readMapEnd() else: iprot.skip(ftype) elif fid == 2: if ftype == TType.LIST: self.tempViews = [] - (_etype176, _size173) = iprot.readListBegin() - for _i177 in range(_size173): - _elem178 = TDBSqlTempView() - _elem178.read(iprot) - self.tempViews.append(_elem178) + (_etype151, _size148) = iprot.readListBegin() + for _i152 in range(_size148): + _elem153 = TDBSqlTempView() + _elem153.read(iprot) + self.tempViews.append(_elem153) iprot.readListEnd() else: iprot.skip(ftype) @@ -4185,23 +3763,23 @@ def read(self, iprot): elif fid == 6: if ftype == TType.LIST: self.expressionsInfos = [] - (_etype182, _size179) = iprot.readListBegin() - for _i183 in range(_size179): - _elem184 = TExpressionInfo() - _elem184.read(iprot) - self.expressionsInfos.append(_elem184) + (_etype157, _size154) = iprot.readListBegin() + for _i158 in range(_size154): + _elem159 = TExpressionInfo() + _elem159.read(iprot) + self.expressionsInfos.append(_elem159) iprot.readListEnd() else: iprot.skip(ftype) elif fid == 7: if ftype == TType.MAP: self.internalConfs = {} - (_ktype186, _vtype187, _size185) = iprot.readMapBegin() - for _i189 in range(_size185): - _key190 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val191 = TDBSqlConfValue() - _val191.read(iprot) - self.internalConfs[_key190] = _val191 + (_ktype161, _vtype162, _size160) = iprot.readMapBegin() + for _i164 in range(_size160): + _key165 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val166 = TDBSqlConfValue() + _val166.read(iprot) + self.internalConfs[_key165] = _val166 iprot.readMapEnd() else: iprot.skip(ftype) @@ -4218,16 +3796,16 @@ def write(self, oprot): if self.confs is not None: oprot.writeFieldBegin('confs', TType.MAP, 1) oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.confs)) - for kiter192, viter193 in self.confs.items(): - oprot.writeString(kiter192.encode('utf-8') if sys.version_info[0] == 2 else kiter192) - oprot.writeString(viter193.encode('utf-8') if sys.version_info[0] == 2 else viter193) + for kiter167, viter168 in self.confs.items(): + oprot.writeString(kiter167.encode('utf-8') if sys.version_info[0] == 2 else kiter167) + oprot.writeString(viter168.encode('utf-8') if sys.version_info[0] == 2 else viter168) oprot.writeMapEnd() oprot.writeFieldEnd() if self.tempViews is not None: oprot.writeFieldBegin('tempViews', TType.LIST, 2) oprot.writeListBegin(TType.STRUCT, len(self.tempViews)) - for iter194 in self.tempViews: - iter194.write(oprot) + for iter169 in self.tempViews: + iter169.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.currentDatabase is not None: @@ -4245,16 +3823,16 @@ def write(self, oprot): if self.expressionsInfos is not None: oprot.writeFieldBegin('expressionsInfos', TType.LIST, 6) oprot.writeListBegin(TType.STRUCT, len(self.expressionsInfos)) - for iter195 in self.expressionsInfos: - iter195.write(oprot) + for iter170 in self.expressionsInfos: + iter170.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.internalConfs is not None: oprot.writeFieldBegin('internalConfs', TType.MAP, 7) oprot.writeMapBegin(TType.STRING, TType.STRUCT, len(self.internalConfs)) - for kiter196, viter197 in self.internalConfs.items(): - oprot.writeString(kiter196.encode('utf-8') if sys.version_info[0] == 2 else kiter196) - viter197.write(oprot) + for kiter171, viter172 in self.internalConfs.items(): + oprot.writeString(kiter171.encode('utf-8') if sys.version_info[0] == 2 else kiter171) + viter172.write(oprot) oprot.writeMapEnd() oprot.writeFieldEnd() oprot.writeFieldStop() @@ -4284,20 +3862,18 @@ class TStatus(object): - errorCode - errorMessage - displayMessage - - errorDetailsJson - responseValidation """ - def __init__(self, statusCode=None, infoMessages=None, sqlState=None, errorCode=None, errorMessage=None, displayMessage=None, errorDetailsJson=None, responseValidation=None,): + def __init__(self, statusCode=None, infoMessages=None, sqlState=None, errorCode=None, errorMessage=None, displayMessage=None, responseValidation=None,): self.statusCode = statusCode self.infoMessages = infoMessages self.sqlState = sqlState self.errorCode = errorCode self.errorMessage = errorMessage self.displayMessage = displayMessage - self.errorDetailsJson = errorDetailsJson self.responseValidation = responseValidation def read(self, iprot): @@ -4317,10 +3893,10 @@ def read(self, iprot): elif fid == 2: if ftype == TType.LIST: self.infoMessages = [] - (_etype201, _size198) = iprot.readListBegin() - for _i202 in range(_size198): - _elem203 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.infoMessages.append(_elem203) + (_etype176, _size173) = iprot.readListBegin() + for _i177 in range(_size173): + _elem178 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.infoMessages.append(_elem178) iprot.readListEnd() else: iprot.skip(ftype) @@ -4344,11 +3920,6 @@ def read(self, iprot): self.displayMessage = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) - elif fid == 1281: - if ftype == TType.STRING: - self.errorDetailsJson = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) elif fid == 3329: if ftype == TType.STRING: self.responseValidation = iprot.readBinary() @@ -4371,8 +3942,8 @@ def write(self, oprot): if self.infoMessages is not None: oprot.writeFieldBegin('infoMessages', TType.LIST, 2) oprot.writeListBegin(TType.STRING, len(self.infoMessages)) - for iter204 in self.infoMessages: - oprot.writeString(iter204.encode('utf-8') if sys.version_info[0] == 2 else iter204) + for iter179 in self.infoMessages: + oprot.writeString(iter179.encode('utf-8') if sys.version_info[0] == 2 else iter179) oprot.writeListEnd() oprot.writeFieldEnd() if self.sqlState is not None: @@ -4391,10 +3962,6 @@ def write(self, oprot): oprot.writeFieldBegin('displayMessage', TType.STRING, 6) oprot.writeString(self.displayMessage.encode('utf-8') if sys.version_info[0] == 2 else self.displayMessage) oprot.writeFieldEnd() - if self.errorDetailsJson is not None: - oprot.writeFieldBegin('errorDetailsJson', TType.STRING, 1281) - oprot.writeString(self.errorDetailsJson.encode('utf-8') if sys.version_info[0] == 2 else self.errorDetailsJson) - oprot.writeFieldEnd() if self.responseValidation is not None: oprot.writeFieldBegin('responseValidation', TType.STRING, 3329) oprot.writeBinary(self.responseValidation) @@ -4794,21 +4361,21 @@ def read(self, iprot): elif fid == 4: if ftype == TType.MAP: self.configuration = {} - (_ktype206, _vtype207, _size205) = iprot.readMapBegin() - for _i209 in range(_size205): - _key210 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val211 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.configuration[_key210] = _val211 + (_ktype181, _vtype182, _size180) = iprot.readMapBegin() + for _i184 in range(_size180): + _key185 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val186 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.configuration[_key185] = _val186 iprot.readMapEnd() else: iprot.skip(ftype) elif fid == 1281: if ftype == TType.LIST: self.getInfos = [] - (_etype215, _size212) = iprot.readListBegin() - for _i216 in range(_size212): - _elem217 = iprot.readI32() - self.getInfos.append(_elem217) + (_etype190, _size187) = iprot.readListBegin() + for _i191 in range(_size187): + _elem192 = iprot.readI32() + self.getInfos.append(_elem192) iprot.readListEnd() else: iprot.skip(ftype) @@ -4820,11 +4387,11 @@ def read(self, iprot): elif fid == 1283: if ftype == TType.MAP: self.connectionProperties = {} - (_ktype219, _vtype220, _size218) = iprot.readMapBegin() - for _i222 in range(_size218): - _key223 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val224 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.connectionProperties[_key223] = _val224 + (_ktype194, _vtype195, _size193) = iprot.readMapBegin() + for _i197 in range(_size193): + _key198 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val199 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.connectionProperties[_key198] = _val199 iprot.readMapEnd() else: iprot.skip(ftype) @@ -4870,16 +4437,16 @@ def write(self, oprot): if self.configuration is not None: oprot.writeFieldBegin('configuration', TType.MAP, 4) oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.configuration)) - for kiter225, viter226 in self.configuration.items(): - oprot.writeString(kiter225.encode('utf-8') if sys.version_info[0] == 2 else kiter225) - oprot.writeString(viter226.encode('utf-8') if sys.version_info[0] == 2 else viter226) + for kiter200, viter201 in self.configuration.items(): + oprot.writeString(kiter200.encode('utf-8') if sys.version_info[0] == 2 else kiter200) + oprot.writeString(viter201.encode('utf-8') if sys.version_info[0] == 2 else viter201) oprot.writeMapEnd() oprot.writeFieldEnd() if self.getInfos is not None: oprot.writeFieldBegin('getInfos', TType.LIST, 1281) oprot.writeListBegin(TType.I32, len(self.getInfos)) - for iter227 in self.getInfos: - oprot.writeI32(iter227) + for iter202 in self.getInfos: + oprot.writeI32(iter202) oprot.writeListEnd() oprot.writeFieldEnd() if self.client_protocol_i64 is not None: @@ -4889,9 +4456,9 @@ def write(self, oprot): if self.connectionProperties is not None: oprot.writeFieldBegin('connectionProperties', TType.MAP, 1283) oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.connectionProperties)) - for kiter228, viter229 in self.connectionProperties.items(): - oprot.writeString(kiter228.encode('utf-8') if sys.version_info[0] == 2 else kiter228) - oprot.writeString(viter229.encode('utf-8') if sys.version_info[0] == 2 else viter229) + for kiter203, viter204 in self.connectionProperties.items(): + oprot.writeString(kiter203.encode('utf-8') if sys.version_info[0] == 2 else kiter203) + oprot.writeString(viter204.encode('utf-8') if sys.version_info[0] == 2 else viter204) oprot.writeMapEnd() oprot.writeFieldEnd() if self.initialNamespace is not None: @@ -4976,11 +4543,11 @@ def read(self, iprot): elif fid == 4: if ftype == TType.MAP: self.configuration = {} - (_ktype231, _vtype232, _size230) = iprot.readMapBegin() - for _i234 in range(_size230): - _key235 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val236 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.configuration[_key235] = _val236 + (_ktype206, _vtype207, _size205) = iprot.readMapBegin() + for _i209 in range(_size205): + _key210 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val211 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.configuration[_key210] = _val211 iprot.readMapEnd() else: iprot.skip(ftype) @@ -4998,11 +4565,11 @@ def read(self, iprot): elif fid == 1281: if ftype == TType.LIST: self.getInfos = [] - (_etype240, _size237) = iprot.readListBegin() - for _i241 in range(_size237): - _elem242 = TGetInfoValue() - _elem242.read(iprot) - self.getInfos.append(_elem242) + (_etype215, _size212) = iprot.readListBegin() + for _i216 in range(_size212): + _elem217 = TGetInfoValue() + _elem217.read(iprot) + self.getInfos.append(_elem217) iprot.readListEnd() else: iprot.skip(ftype) @@ -5031,16 +4598,16 @@ def write(self, oprot): if self.configuration is not None: oprot.writeFieldBegin('configuration', TType.MAP, 4) oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.configuration)) - for kiter243, viter244 in self.configuration.items(): - oprot.writeString(kiter243.encode('utf-8') if sys.version_info[0] == 2 else kiter243) - oprot.writeString(viter244.encode('utf-8') if sys.version_info[0] == 2 else viter244) + for kiter218, viter219 in self.configuration.items(): + oprot.writeString(kiter218.encode('utf-8') if sys.version_info[0] == 2 else kiter218) + oprot.writeString(viter219.encode('utf-8') if sys.version_info[0] == 2 else viter219) oprot.writeMapEnd() oprot.writeFieldEnd() if self.getInfos is not None: oprot.writeFieldBegin('getInfos', TType.LIST, 1281) oprot.writeListBegin(TType.STRUCT, len(self.getInfos)) - for iter245 in self.getInfos: - iter245.write(oprot) + for iter220 in self.getInfos: + iter220.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.initialNamespace is not None: @@ -5635,17 +5202,15 @@ class TSparkArrowTypes(object): - decimalAsArrow - complexTypesAsArrow - intervalTypesAsArrow - - nullTypeAsArrow """ - def __init__(self, timestampAsArrow=None, decimalAsArrow=None, complexTypesAsArrow=None, intervalTypesAsArrow=None, nullTypeAsArrow=None,): + def __init__(self, timestampAsArrow=None, decimalAsArrow=None, complexTypesAsArrow=None, intervalTypesAsArrow=None,): self.timestampAsArrow = timestampAsArrow self.decimalAsArrow = decimalAsArrow self.complexTypesAsArrow = complexTypesAsArrow self.intervalTypesAsArrow = intervalTypesAsArrow - self.nullTypeAsArrow = nullTypeAsArrow def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -5676,11 +5241,6 @@ def read(self, iprot): self.intervalTypesAsArrow = iprot.readBool() else: iprot.skip(ftype) - elif fid == 5: - if ftype == TType.BOOL: - self.nullTypeAsArrow = iprot.readBool() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -5707,10 +5267,6 @@ def write(self, oprot): oprot.writeFieldBegin('intervalTypesAsArrow', TType.BOOL, 4) oprot.writeBool(self.intervalTypesAsArrow) oprot.writeFieldEnd() - if self.nullTypeAsArrow is not None: - oprot.writeFieldBegin('nullTypeAsArrow', TType.BOOL, 5) - oprot.writeBool(self.nullTypeAsArrow) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -5744,9 +5300,6 @@ class TExecuteStatementReq(object): - maxBytesPerFile - useArrowNativeTypes - resultRowLimit - - parameters - - maxBytesPerBatch - - statementConf - operationId - sessionConf - rejectHighCostQueries @@ -5755,24 +5308,11 @@ class TExecuteStatementReq(object): - requestValidation - resultPersistenceMode - trimArrowBatchesToLimit - - fetchDisposition - - enforceResultPersistenceMode - - statementList - - persistResultManifest - - resultRetentionSeconds - - resultByteLimit - - resultDataFormat - - originatingClientIdentity - - preferSingleFileResult - - preferDriverOnlyUpload - - enforceEmbeddedSchemaCorrectness - - idempotencyToken - - throwErrorOnByteLimitTruncation """ - def __init__(self, sessionHandle=None, statement=None, confOverlay=None, runAsync=False, getDirectResults=None, queryTimeout=0, canReadArrowResult=None, canDownloadResult=None, canDecompressLZ4Result=None, maxBytesPerFile=None, useArrowNativeTypes=None, resultRowLimit=None, parameters=None, maxBytesPerBatch=None, statementConf=None, operationId=None, sessionConf=None, rejectHighCostQueries=None, estimatedCost=None, executionVersion=None, requestValidation=None, resultPersistenceMode=None, trimArrowBatchesToLimit=None, fetchDisposition=None, enforceResultPersistenceMode=None, statementList=None, persistResultManifest=None, resultRetentionSeconds=None, resultByteLimit=None, resultDataFormat=None, originatingClientIdentity=None, preferSingleFileResult=None, preferDriverOnlyUpload=None, enforceEmbeddedSchemaCorrectness=False, idempotencyToken=None, throwErrorOnByteLimitTruncation=None,): + def __init__(self, sessionHandle=None, statement=None, confOverlay=None, runAsync=False, getDirectResults=None, queryTimeout=0, canReadArrowResult=None, canDownloadResult=None, canDecompressLZ4Result=None, maxBytesPerFile=None, useArrowNativeTypes=None, resultRowLimit=None, operationId=None, sessionConf=None, rejectHighCostQueries=None, estimatedCost=None, executionVersion=None, requestValidation=None, resultPersistenceMode=None, trimArrowBatchesToLimit=None,): self.sessionHandle = sessionHandle self.statement = statement self.confOverlay = confOverlay @@ -5785,9 +5325,6 @@ def __init__(self, sessionHandle=None, statement=None, confOverlay=None, runAsyn self.maxBytesPerFile = maxBytesPerFile self.useArrowNativeTypes = useArrowNativeTypes self.resultRowLimit = resultRowLimit - self.parameters = parameters - self.maxBytesPerBatch = maxBytesPerBatch - self.statementConf = statementConf self.operationId = operationId self.sessionConf = sessionConf self.rejectHighCostQueries = rejectHighCostQueries @@ -5796,19 +5333,6 @@ def __init__(self, sessionHandle=None, statement=None, confOverlay=None, runAsyn self.requestValidation = requestValidation self.resultPersistenceMode = resultPersistenceMode self.trimArrowBatchesToLimit = trimArrowBatchesToLimit - self.fetchDisposition = fetchDisposition - self.enforceResultPersistenceMode = enforceResultPersistenceMode - self.statementList = statementList - self.persistResultManifest = persistResultManifest - self.resultRetentionSeconds = resultRetentionSeconds - self.resultByteLimit = resultByteLimit - self.resultDataFormat = resultDataFormat - self.originatingClientIdentity = originatingClientIdentity - self.preferSingleFileResult = preferSingleFileResult - self.preferDriverOnlyUpload = preferDriverOnlyUpload - self.enforceEmbeddedSchemaCorrectness = enforceEmbeddedSchemaCorrectness - self.idempotencyToken = idempotencyToken - self.throwErrorOnByteLimitTruncation = throwErrorOnByteLimitTruncation def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -5833,11 +5357,11 @@ def read(self, iprot): elif fid == 3: if ftype == TType.MAP: self.confOverlay = {} - (_ktype247, _vtype248, _size246) = iprot.readMapBegin() - for _i250 in range(_size246): - _key251 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _val252 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.confOverlay[_key251] = _val252 + (_ktype222, _vtype223, _size221) = iprot.readMapBegin() + for _i225 in range(_size221): + _key226 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val227 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.confOverlay[_key226] = _val227 iprot.readMapEnd() else: iprot.skip(ftype) @@ -5888,28 +5412,6 @@ def read(self, iprot): self.resultRowLimit = iprot.readI64() else: iprot.skip(ftype) - elif fid == 1288: - if ftype == TType.LIST: - self.parameters = [] - (_etype256, _size253) = iprot.readListBegin() - for _i257 in range(_size253): - _elem258 = TSparkParameter() - _elem258.read(iprot) - self.parameters.append(_elem258) - iprot.readListEnd() - else: - iprot.skip(ftype) - elif fid == 1289: - if ftype == TType.I64: - self.maxBytesPerBatch = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 1296: - if ftype == TType.STRUCT: - self.statementConf = TStatementConf() - self.statementConf.read(iprot) - else: - iprot.skip(ftype) elif fid == 3329: if ftype == TType.STRUCT: self.operationId = THandleIdentifier() @@ -5952,78 +5454,6 @@ def read(self, iprot): self.trimArrowBatchesToLimit = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3337: - if ftype == TType.I32: - self.fetchDisposition = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 3344: - if ftype == TType.BOOL: - self.enforceResultPersistenceMode = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3345: - if ftype == TType.LIST: - self.statementList = [] - (_etype262, _size259) = iprot.readListBegin() - for _i263 in range(_size259): - _elem264 = TDBSqlStatement() - _elem264.read(iprot) - self.statementList.append(_elem264) - iprot.readListEnd() - else: - iprot.skip(ftype) - elif fid == 3346: - if ftype == TType.BOOL: - self.persistResultManifest = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3347: - if ftype == TType.I64: - self.resultRetentionSeconds = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 3348: - if ftype == TType.I64: - self.resultByteLimit = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 3349: - if ftype == TType.STRUCT: - self.resultDataFormat = TDBSqlResultFormat() - self.resultDataFormat.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3350: - if ftype == TType.STRING: - self.originatingClientIdentity = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 3351: - if ftype == TType.BOOL: - self.preferSingleFileResult = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3352: - if ftype == TType.BOOL: - self.preferDriverOnlyUpload = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3353: - if ftype == TType.BOOL: - self.enforceEmbeddedSchemaCorrectness = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3360: - if ftype == TType.STRING: - self.idempotencyToken = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 3361: - if ftype == TType.BOOL: - self.throwErrorOnByteLimitTruncation = iprot.readBool() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -6045,9 +5475,9 @@ def write(self, oprot): if self.confOverlay is not None: oprot.writeFieldBegin('confOverlay', TType.MAP, 3) oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.confOverlay)) - for kiter265, viter266 in self.confOverlay.items(): - oprot.writeString(kiter265.encode('utf-8') if sys.version_info[0] == 2 else kiter265) - oprot.writeString(viter266.encode('utf-8') if sys.version_info[0] == 2 else viter266) + for kiter228, viter229 in self.confOverlay.items(): + oprot.writeString(kiter228.encode('utf-8') if sys.version_info[0] == 2 else kiter228) + oprot.writeString(viter229.encode('utf-8') if sys.version_info[0] == 2 else viter229) oprot.writeMapEnd() oprot.writeFieldEnd() if self.runAsync is not None: @@ -6086,21 +5516,6 @@ def write(self, oprot): oprot.writeFieldBegin('resultRowLimit', TType.I64, 1287) oprot.writeI64(self.resultRowLimit) oprot.writeFieldEnd() - if self.parameters is not None: - oprot.writeFieldBegin('parameters', TType.LIST, 1288) - oprot.writeListBegin(TType.STRUCT, len(self.parameters)) - for iter267 in self.parameters: - iter267.write(oprot) - oprot.writeListEnd() - oprot.writeFieldEnd() - if self.maxBytesPerBatch is not None: - oprot.writeFieldBegin('maxBytesPerBatch', TType.I64, 1289) - oprot.writeI64(self.maxBytesPerBatch) - oprot.writeFieldEnd() - if self.statementConf is not None: - oprot.writeFieldBegin('statementConf', TType.STRUCT, 1296) - self.statementConf.write(oprot) - oprot.writeFieldEnd() if self.operationId is not None: oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) self.operationId.write(oprot) @@ -6133,61 +5548,6 @@ def write(self, oprot): oprot.writeFieldBegin('trimArrowBatchesToLimit', TType.BOOL, 3336) oprot.writeBool(self.trimArrowBatchesToLimit) oprot.writeFieldEnd() - if self.fetchDisposition is not None: - oprot.writeFieldBegin('fetchDisposition', TType.I32, 3337) - oprot.writeI32(self.fetchDisposition) - oprot.writeFieldEnd() - if self.enforceResultPersistenceMode is not None: - oprot.writeFieldBegin('enforceResultPersistenceMode', TType.BOOL, 3344) - oprot.writeBool(self.enforceResultPersistenceMode) - oprot.writeFieldEnd() - if self.statementList is not None: - oprot.writeFieldBegin('statementList', TType.LIST, 3345) - oprot.writeListBegin(TType.STRUCT, len(self.statementList)) - for iter268 in self.statementList: - iter268.write(oprot) - oprot.writeListEnd() - oprot.writeFieldEnd() - if self.persistResultManifest is not None: - oprot.writeFieldBegin('persistResultManifest', TType.BOOL, 3346) - oprot.writeBool(self.persistResultManifest) - oprot.writeFieldEnd() - if self.resultRetentionSeconds is not None: - oprot.writeFieldBegin('resultRetentionSeconds', TType.I64, 3347) - oprot.writeI64(self.resultRetentionSeconds) - oprot.writeFieldEnd() - if self.resultByteLimit is not None: - oprot.writeFieldBegin('resultByteLimit', TType.I64, 3348) - oprot.writeI64(self.resultByteLimit) - oprot.writeFieldEnd() - if self.resultDataFormat is not None: - oprot.writeFieldBegin('resultDataFormat', TType.STRUCT, 3349) - self.resultDataFormat.write(oprot) - oprot.writeFieldEnd() - if self.originatingClientIdentity is not None: - oprot.writeFieldBegin('originatingClientIdentity', TType.STRING, 3350) - oprot.writeString(self.originatingClientIdentity.encode('utf-8') if sys.version_info[0] == 2 else self.originatingClientIdentity) - oprot.writeFieldEnd() - if self.preferSingleFileResult is not None: - oprot.writeFieldBegin('preferSingleFileResult', TType.BOOL, 3351) - oprot.writeBool(self.preferSingleFileResult) - oprot.writeFieldEnd() - if self.preferDriverOnlyUpload is not None: - oprot.writeFieldBegin('preferDriverOnlyUpload', TType.BOOL, 3352) - oprot.writeBool(self.preferDriverOnlyUpload) - oprot.writeFieldEnd() - if self.enforceEmbeddedSchemaCorrectness is not None: - oprot.writeFieldBegin('enforceEmbeddedSchemaCorrectness', TType.BOOL, 3353) - oprot.writeBool(self.enforceEmbeddedSchemaCorrectness) - oprot.writeFieldEnd() - if self.idempotencyToken is not None: - oprot.writeFieldBegin('idempotencyToken', TType.STRING, 3360) - oprot.writeString(self.idempotencyToken.encode('utf-8') if sys.version_info[0] == 2 else self.idempotencyToken) - oprot.writeFieldEnd() - if self.throwErrorOnByteLimitTruncation is not None: - oprot.writeFieldBegin('throwErrorOnByteLimitTruncation', TType.BOOL, 3361) - oprot.writeBool(self.throwErrorOnByteLimitTruncation) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -6210,324 +5570,6 @@ def __ne__(self, other): return not (self == other) -class TDBSqlStatement(object): - """ - Attributes: - - statement - - """ - - - def __init__(self, statement=None,): - self.statement = statement - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.STRING: - self.statement = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('TDBSqlStatement') - if self.statement is not None: - oprot.writeFieldBegin('statement', TType.STRING, 1) - oprot.writeString(self.statement.encode('utf-8') if sys.version_info[0] == 2 else self.statement) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) - - -class TSparkParameterValue(object): - """ - Attributes: - - stringValue - - doubleValue - - booleanValue - - """ - - - def __init__(self, stringValue=None, doubleValue=None, booleanValue=None,): - self.stringValue = stringValue - self.doubleValue = doubleValue - self.booleanValue = booleanValue - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.STRING: - self.stringValue = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.DOUBLE: - self.doubleValue = iprot.readDouble() - else: - iprot.skip(ftype) - elif fid == 3: - if ftype == TType.BOOL: - self.booleanValue = iprot.readBool() - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('TSparkParameterValue') - if self.stringValue is not None: - oprot.writeFieldBegin('stringValue', TType.STRING, 1) - oprot.writeString(self.stringValue.encode('utf-8') if sys.version_info[0] == 2 else self.stringValue) - oprot.writeFieldEnd() - if self.doubleValue is not None: - oprot.writeFieldBegin('doubleValue', TType.DOUBLE, 2) - oprot.writeDouble(self.doubleValue) - oprot.writeFieldEnd() - if self.booleanValue is not None: - oprot.writeFieldBegin('booleanValue', TType.BOOL, 3) - oprot.writeBool(self.booleanValue) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) - - -class TSparkParameter(object): - """ - Attributes: - - ordinal - - name - - type - - value - - """ - - - def __init__(self, ordinal=None, name=None, type=None, value=None,): - self.ordinal = ordinal - self.name = name - self.type = type - self.value = value - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.I32: - self.ordinal = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.STRING: - self.name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 3: - if ftype == TType.STRING: - self.type = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 4: - if ftype == TType.STRUCT: - self.value = TSparkParameterValue() - self.value.read(iprot) - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('TSparkParameter') - if self.ordinal is not None: - oprot.writeFieldBegin('ordinal', TType.I32, 1) - oprot.writeI32(self.ordinal) - oprot.writeFieldEnd() - if self.name is not None: - oprot.writeFieldBegin('name', TType.STRING, 2) - oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name) - oprot.writeFieldEnd() - if self.type is not None: - oprot.writeFieldBegin('type', TType.STRING, 3) - oprot.writeString(self.type.encode('utf-8') if sys.version_info[0] == 2 else self.type) - oprot.writeFieldEnd() - if self.value is not None: - oprot.writeFieldBegin('value', TType.STRUCT, 4) - self.value.write(oprot) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) - - -class TStatementConf(object): - """ - Attributes: - - sessionless - - initialNamespace - - client_protocol - - client_protocol_i64 - - """ - - - def __init__(self, sessionless=None, initialNamespace=None, client_protocol=None, client_protocol_i64=None,): - self.sessionless = sessionless - self.initialNamespace = initialNamespace - self.client_protocol = client_protocol - self.client_protocol_i64 = client_protocol_i64 - - def read(self, iprot): - if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: - iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) - return - iprot.readStructBegin() - while True: - (fname, ftype, fid) = iprot.readFieldBegin() - if ftype == TType.STOP: - break - if fid == 1: - if ftype == TType.BOOL: - self.sessionless = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.STRUCT: - self.initialNamespace = TNamespace() - self.initialNamespace.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3: - if ftype == TType.I32: - self.client_protocol = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 4: - if ftype == TType.I64: - self.client_protocol_i64 = iprot.readI64() - else: - iprot.skip(ftype) - else: - iprot.skip(ftype) - iprot.readFieldEnd() - iprot.readStructEnd() - - def write(self, oprot): - if oprot._fast_encode is not None and self.thrift_spec is not None: - oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) - return - oprot.writeStructBegin('TStatementConf') - if self.sessionless is not None: - oprot.writeFieldBegin('sessionless', TType.BOOL, 1) - oprot.writeBool(self.sessionless) - oprot.writeFieldEnd() - if self.initialNamespace is not None: - oprot.writeFieldBegin('initialNamespace', TType.STRUCT, 2) - self.initialNamespace.write(oprot) - oprot.writeFieldEnd() - if self.client_protocol is not None: - oprot.writeFieldBegin('client_protocol', TType.I32, 3) - oprot.writeI32(self.client_protocol) - oprot.writeFieldEnd() - if self.client_protocol_i64 is not None: - oprot.writeFieldBegin('client_protocol_i64', TType.I64, 4) - oprot.writeI64(self.client_protocol_i64) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - return - - def __repr__(self): - L = ['%s=%r' % (key, value) - for key, value in self.__dict__.items()] - return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) - - def __eq__(self, other): - return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not (self == other) - - class TExecuteStatementResp(object): """ Attributes: @@ -6540,14 +5582,11 @@ class TExecuteStatementResp(object): - sessionConf - currentClusterLoad - idempotencyType - - remoteResultCacheEnabled - - isServerless - - operationHandles """ - def __init__(self, status=None, operationHandle=None, directResults=None, executionRejected=None, maxClusterCapacity=None, queryCost=None, sessionConf=None, currentClusterLoad=None, idempotencyType=None, remoteResultCacheEnabled=None, isServerless=None, operationHandles=None,): + def __init__(self, status=None, operationHandle=None, directResults=None, executionRejected=None, maxClusterCapacity=None, queryCost=None, sessionConf=None, currentClusterLoad=None, idempotencyType=None,): self.status = status self.operationHandle = operationHandle self.directResults = directResults @@ -6557,9 +5596,6 @@ def __init__(self, status=None, operationHandle=None, directResults=None, execut self.sessionConf = sessionConf self.currentClusterLoad = currentClusterLoad self.idempotencyType = idempotencyType - self.remoteResultCacheEnabled = remoteResultCacheEnabled - self.isServerless = isServerless - self.operationHandles = operationHandles def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -6619,27 +5655,6 @@ def read(self, iprot): self.idempotencyType = iprot.readI32() else: iprot.skip(ftype) - elif fid == 3335: - if ftype == TType.BOOL: - self.remoteResultCacheEnabled = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3336: - if ftype == TType.BOOL: - self.isServerless = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3337: - if ftype == TType.LIST: - self.operationHandles = [] - (_etype272, _size269) = iprot.readListBegin() - for _i273 in range(_size269): - _elem274 = TOperationHandle() - _elem274.read(iprot) - self.operationHandles.append(_elem274) - iprot.readListEnd() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -6686,21 +5701,6 @@ def write(self, oprot): oprot.writeFieldBegin('idempotencyType', TType.I32, 3334) oprot.writeI32(self.idempotencyType) oprot.writeFieldEnd() - if self.remoteResultCacheEnabled is not None: - oprot.writeFieldBegin('remoteResultCacheEnabled', TType.BOOL, 3335) - oprot.writeBool(self.remoteResultCacheEnabled) - oprot.writeFieldEnd() - if self.isServerless is not None: - oprot.writeFieldBegin('isServerless', TType.BOOL, 3336) - oprot.writeBool(self.isServerless) - oprot.writeFieldEnd() - if self.operationHandles is not None: - oprot.writeFieldBegin('operationHandles', TType.LIST, 3337) - oprot.writeListBegin(TType.STRUCT, len(self.operationHandles)) - for iter275 in self.operationHandles: - iter275.write(oprot) - oprot.writeListEnd() - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -7376,10 +6376,10 @@ def read(self, iprot): elif fid == 5: if ftype == TType.LIST: self.tableTypes = [] - (_etype279, _size276) = iprot.readListBegin() - for _i280 in range(_size276): - _elem281 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.tableTypes.append(_elem281) + (_etype233, _size230) = iprot.readListBegin() + for _i234 in range(_size230): + _elem235 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.tableTypes.append(_elem235) iprot.readListEnd() else: iprot.skip(ftype) @@ -7435,8 +6435,8 @@ def write(self, oprot): if self.tableTypes is not None: oprot.writeFieldBegin('tableTypes', TType.LIST, 5) oprot.writeListBegin(TType.STRING, len(self.tableTypes)) - for iter282 in self.tableTypes: - oprot.writeString(iter282.encode('utf-8') if sys.version_info[0] == 2 else iter282) + for iter236 in self.tableTypes: + oprot.writeString(iter236.encode('utf-8') if sys.version_info[0] == 2 else iter236) oprot.writeListEnd() oprot.writeFieldEnd() if self.getDirectResults is not None: @@ -8783,7 +7783,6 @@ class TGetOperationStatusResp(object): - numModifiedRows - displayMessage - diagnosticInfo - - errorDetailsJson - responseValidation - idempotencyType - statementTimeout @@ -8792,7 +7791,7 @@ class TGetOperationStatusResp(object): """ - def __init__(self, status=None, operationState=None, sqlState=None, errorCode=None, errorMessage=None, taskStatus=None, operationStarted=None, operationCompleted=None, hasResultSet=None, progressUpdateResponse=None, numModifiedRows=None, displayMessage=None, diagnosticInfo=None, errorDetailsJson=None, responseValidation=None, idempotencyType=None, statementTimeout=None, statementTimeoutLevel=None,): + def __init__(self, status=None, operationState=None, sqlState=None, errorCode=None, errorMessage=None, taskStatus=None, operationStarted=None, operationCompleted=None, hasResultSet=None, progressUpdateResponse=None, numModifiedRows=None, displayMessage=None, diagnosticInfo=None, responseValidation=None, idempotencyType=None, statementTimeout=None, statementTimeoutLevel=None,): self.status = status self.operationState = operationState self.sqlState = sqlState @@ -8806,7 +7805,6 @@ def __init__(self, status=None, operationState=None, sqlState=None, errorCode=No self.numModifiedRows = numModifiedRows self.displayMessage = displayMessage self.diagnosticInfo = diagnosticInfo - self.errorDetailsJson = errorDetailsJson self.responseValidation = responseValidation self.idempotencyType = idempotencyType self.statementTimeout = statementTimeout @@ -8888,11 +7886,6 @@ def read(self, iprot): self.diagnosticInfo = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) - elif fid == 1283: - if ftype == TType.STRING: - self.errorDetailsJson = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) elif fid == 3329: if ftype == TType.STRING: self.responseValidation = iprot.readBinary() @@ -8975,10 +7968,6 @@ def write(self, oprot): oprot.writeFieldBegin('diagnosticInfo', TType.STRING, 1282) oprot.writeString(self.diagnosticInfo.encode('utf-8') if sys.version_info[0] == 2 else self.diagnosticInfo) oprot.writeFieldEnd() - if self.errorDetailsJson is not None: - oprot.writeFieldBegin('errorDetailsJson', TType.STRING, 1283) - oprot.writeString(self.errorDetailsJson.encode('utf-8') if sys.version_info[0] == 2 else self.errorDetailsJson) - oprot.writeFieldEnd() if self.responseValidation is not None: oprot.writeFieldBegin('responseValidation', TType.STRING, 3329) oprot.writeBinary(self.responseValidation) @@ -9161,14 +8150,12 @@ class TCloseOperationReq(object): """ Attributes: - operationHandle - - closeReason """ - def __init__(self, operationHandle=None, closeReason= 0,): + def __init__(self, operationHandle=None,): self.operationHandle = operationHandle - self.closeReason = closeReason def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -9185,11 +8172,6 @@ def read(self, iprot): self.operationHandle.read(iprot) else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.I32: - self.closeReason = iprot.readI32() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -9204,10 +8186,6 @@ def write(self, oprot): oprot.writeFieldBegin('operationHandle', TType.STRUCT, 1) self.operationHandle.write(oprot) oprot.writeFieldEnd() - if self.closeReason is not None: - oprot.writeFieldBegin('closeReason', TType.I32, 3329) - oprot.writeI32(self.closeReason) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -9375,19 +8353,11 @@ class TGetResultSetMetadataResp(object): - resultFiles - manifestFile - manifestFileFormat - - cacheLookupLatency - - remoteCacheMissReason - - fetchDisposition - - remoteResultCacheEnabled - - isServerless - - resultDataFormat - - truncatedByThriftLimit - - resultByteLimit """ - def __init__(self, status=None, schema=None, resultFormat=None, lz4Compressed=None, arrowSchema=None, cacheLookupResult=None, uncompressedBytes=None, compressedBytes=None, isStagingOperation=None, reasonForNoCloudFetch=None, resultFiles=None, manifestFile=None, manifestFileFormat=None, cacheLookupLatency=None, remoteCacheMissReason=None, fetchDisposition=None, remoteResultCacheEnabled=None, isServerless=None, resultDataFormat=None, truncatedByThriftLimit=None, resultByteLimit=None,): + def __init__(self, status=None, schema=None, resultFormat=None, lz4Compressed=None, arrowSchema=None, cacheLookupResult=None, uncompressedBytes=None, compressedBytes=None, isStagingOperation=None, reasonForNoCloudFetch=None, resultFiles=None, manifestFile=None, manifestFileFormat=None,): self.status = status self.schema = schema self.resultFormat = resultFormat @@ -9401,14 +8371,6 @@ def __init__(self, status=None, schema=None, resultFormat=None, lz4Compressed=No self.resultFiles = resultFiles self.manifestFile = manifestFile self.manifestFileFormat = manifestFileFormat - self.cacheLookupLatency = cacheLookupLatency - self.remoteCacheMissReason = remoteCacheMissReason - self.fetchDisposition = fetchDisposition - self.remoteResultCacheEnabled = remoteResultCacheEnabled - self.isServerless = isServerless - self.resultDataFormat = resultDataFormat - self.truncatedByThriftLimit = truncatedByThriftLimit - self.resultByteLimit = resultByteLimit def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -9474,11 +8436,11 @@ def read(self, iprot): elif fid == 3330: if ftype == TType.LIST: self.resultFiles = [] - (_etype286, _size283) = iprot.readListBegin() - for _i287 in range(_size283): - _elem288 = TDBSqlCloudResultFile() - _elem288.read(iprot) - self.resultFiles.append(_elem288) + (_etype240, _size237) = iprot.readListBegin() + for _i241 in range(_size237): + _elem242 = TDBSqlCloudResultFile() + _elem242.read(iprot) + self.resultFiles.append(_elem242) iprot.readListEnd() else: iprot.skip(ftype) @@ -9488,49 +8450,8 @@ def read(self, iprot): else: iprot.skip(ftype) elif fid == 3332: - if ftype == TType.I32: - self.manifestFileFormat = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 3333: - if ftype == TType.I64: - self.cacheLookupLatency = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 3334: if ftype == TType.STRING: - self.remoteCacheMissReason = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 3335: - if ftype == TType.I32: - self.fetchDisposition = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 3336: - if ftype == TType.BOOL: - self.remoteResultCacheEnabled = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3337: - if ftype == TType.BOOL: - self.isServerless = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3344: - if ftype == TType.STRUCT: - self.resultDataFormat = TDBSqlResultFormat() - self.resultDataFormat.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3345: - if ftype == TType.BOOL: - self.truncatedByThriftLimit = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3346: - if ftype == TType.I64: - self.resultByteLimit = iprot.readI64() + self.manifestFileFormat = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) else: @@ -9586,8 +8507,8 @@ def write(self, oprot): if self.resultFiles is not None: oprot.writeFieldBegin('resultFiles', TType.LIST, 3330) oprot.writeListBegin(TType.STRUCT, len(self.resultFiles)) - for iter289 in self.resultFiles: - iter289.write(oprot) + for iter243 in self.resultFiles: + iter243.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.manifestFile is not None: @@ -9595,40 +8516,8 @@ def write(self, oprot): oprot.writeString(self.manifestFile.encode('utf-8') if sys.version_info[0] == 2 else self.manifestFile) oprot.writeFieldEnd() if self.manifestFileFormat is not None: - oprot.writeFieldBegin('manifestFileFormat', TType.I32, 3332) - oprot.writeI32(self.manifestFileFormat) - oprot.writeFieldEnd() - if self.cacheLookupLatency is not None: - oprot.writeFieldBegin('cacheLookupLatency', TType.I64, 3333) - oprot.writeI64(self.cacheLookupLatency) - oprot.writeFieldEnd() - if self.remoteCacheMissReason is not None: - oprot.writeFieldBegin('remoteCacheMissReason', TType.STRING, 3334) - oprot.writeString(self.remoteCacheMissReason.encode('utf-8') if sys.version_info[0] == 2 else self.remoteCacheMissReason) - oprot.writeFieldEnd() - if self.fetchDisposition is not None: - oprot.writeFieldBegin('fetchDisposition', TType.I32, 3335) - oprot.writeI32(self.fetchDisposition) - oprot.writeFieldEnd() - if self.remoteResultCacheEnabled is not None: - oprot.writeFieldBegin('remoteResultCacheEnabled', TType.BOOL, 3336) - oprot.writeBool(self.remoteResultCacheEnabled) - oprot.writeFieldEnd() - if self.isServerless is not None: - oprot.writeFieldBegin('isServerless', TType.BOOL, 3337) - oprot.writeBool(self.isServerless) - oprot.writeFieldEnd() - if self.resultDataFormat is not None: - oprot.writeFieldBegin('resultDataFormat', TType.STRUCT, 3344) - self.resultDataFormat.write(oprot) - oprot.writeFieldEnd() - if self.truncatedByThriftLimit is not None: - oprot.writeFieldBegin('truncatedByThriftLimit', TType.BOOL, 3345) - oprot.writeBool(self.truncatedByThriftLimit) - oprot.writeFieldEnd() - if self.resultByteLimit is not None: - oprot.writeFieldBegin('resultByteLimit', TType.I64, 3346) - oprot.writeI64(self.resultByteLimit) + oprot.writeFieldBegin('manifestFileFormat', TType.STRING, 3332) + oprot.writeString(self.manifestFileFormat.encode('utf-8') if sys.version_info[0] == 2 else self.manifestFileFormat) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -10378,25 +9267,25 @@ def read(self, iprot): if fid == 1: if ftype == TType.LIST: self.headerNames = [] - (_etype293, _size290) = iprot.readListBegin() - for _i294 in range(_size290): - _elem295 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - self.headerNames.append(_elem295) + (_etype247, _size244) = iprot.readListBegin() + for _i248 in range(_size244): + _elem249 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.headerNames.append(_elem249) iprot.readListEnd() else: iprot.skip(ftype) elif fid == 2: if ftype == TType.LIST: self.rows = [] - (_etype299, _size296) = iprot.readListBegin() - for _i300 in range(_size296): - _elem301 = [] - (_etype305, _size302) = iprot.readListBegin() - for _i306 in range(_size302): - _elem307 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - _elem301.append(_elem307) + (_etype253, _size250) = iprot.readListBegin() + for _i254 in range(_size250): + _elem255 = [] + (_etype259, _size256) = iprot.readListBegin() + for _i260 in range(_size256): + _elem261 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _elem255.append(_elem261) iprot.readListEnd() - self.rows.append(_elem301) + self.rows.append(_elem255) iprot.readListEnd() else: iprot.skip(ftype) @@ -10433,17 +9322,17 @@ def write(self, oprot): if self.headerNames is not None: oprot.writeFieldBegin('headerNames', TType.LIST, 1) oprot.writeListBegin(TType.STRING, len(self.headerNames)) - for iter308 in self.headerNames: - oprot.writeString(iter308.encode('utf-8') if sys.version_info[0] == 2 else iter308) + for iter262 in self.headerNames: + oprot.writeString(iter262.encode('utf-8') if sys.version_info[0] == 2 else iter262) oprot.writeListEnd() oprot.writeFieldEnd() if self.rows is not None: oprot.writeFieldBegin('rows', TType.LIST, 2) oprot.writeListBegin(TType.LIST, len(self.rows)) - for iter309 in self.rows: - oprot.writeListBegin(TType.STRING, len(iter309)) - for iter310 in iter309: - oprot.writeString(iter310.encode('utf-8') if sys.version_info[0] == 2 else iter310) + for iter263 in self.rows: + oprot.writeListBegin(TType.STRING, len(iter263)) + for iter264 in iter263: + oprot.writeString(iter264.encode('utf-8') if sys.version_info[0] == 2 else iter264) oprot.writeListEnd() oprot.writeListEnd() oprot.writeFieldEnd() @@ -10491,6 +9380,532 @@ def __eq__(self, other): def __ne__(self, other): return not (self == other) + + +class TDBSqlClusterMetrics(object): + """ + Attributes: + - clusterCapacity + - numRunningTasks + - numPendingTasks + - rejectionThreshold + - tasksCompletedPerMinute + + """ + + + def __init__(self, clusterCapacity=None, numRunningTasks=None, numPendingTasks=None, rejectionThreshold=None, tasksCompletedPerMinute=None,): + self.clusterCapacity = clusterCapacity + self.numRunningTasks = numRunningTasks + self.numPendingTasks = numPendingTasks + self.rejectionThreshold = rejectionThreshold + self.tasksCompletedPerMinute = tasksCompletedPerMinute + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I32: + self.clusterCapacity = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.I32: + self.numRunningTasks = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.I32: + self.numPendingTasks = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 4: + if ftype == TType.DOUBLE: + self.rejectionThreshold = iprot.readDouble() + else: + iprot.skip(ftype) + elif fid == 5: + if ftype == TType.DOUBLE: + self.tasksCompletedPerMinute = iprot.readDouble() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('TDBSqlClusterMetrics') + if self.clusterCapacity is not None: + oprot.writeFieldBegin('clusterCapacity', TType.I32, 1) + oprot.writeI32(self.clusterCapacity) + oprot.writeFieldEnd() + if self.numRunningTasks is not None: + oprot.writeFieldBegin('numRunningTasks', TType.I32, 2) + oprot.writeI32(self.numRunningTasks) + oprot.writeFieldEnd() + if self.numPendingTasks is not None: + oprot.writeFieldBegin('numPendingTasks', TType.I32, 3) + oprot.writeI32(self.numPendingTasks) + oprot.writeFieldEnd() + if self.rejectionThreshold is not None: + oprot.writeFieldBegin('rejectionThreshold', TType.DOUBLE, 4) + oprot.writeDouble(self.rejectionThreshold) + oprot.writeFieldEnd() + if self.tasksCompletedPerMinute is not None: + oprot.writeFieldBegin('tasksCompletedPerMinute', TType.DOUBLE, 5) + oprot.writeDouble(self.tasksCompletedPerMinute) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + + +class TDBSqlQueryLaneMetrics(object): + """ + Attributes: + - fastLaneReservation + - numFastLaneRunningTasks + - numFastLanePendingTasks + - slowLaneReservation + - numSlowLaneRunningTasks + - numSlowLanePendingTasks + + """ + + + def __init__(self, fastLaneReservation=None, numFastLaneRunningTasks=None, numFastLanePendingTasks=None, slowLaneReservation=None, numSlowLaneRunningTasks=None, numSlowLanePendingTasks=None,): + self.fastLaneReservation = fastLaneReservation + self.numFastLaneRunningTasks = numFastLaneRunningTasks + self.numFastLanePendingTasks = numFastLanePendingTasks + self.slowLaneReservation = slowLaneReservation + self.numSlowLaneRunningTasks = numSlowLaneRunningTasks + self.numSlowLanePendingTasks = numSlowLanePendingTasks + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I32: + self.fastLaneReservation = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.I32: + self.numFastLaneRunningTasks = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.I32: + self.numFastLanePendingTasks = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 4: + if ftype == TType.I32: + self.slowLaneReservation = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 5: + if ftype == TType.I32: + self.numSlowLaneRunningTasks = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 6: + if ftype == TType.I32: + self.numSlowLanePendingTasks = iprot.readI32() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('TDBSqlQueryLaneMetrics') + if self.fastLaneReservation is not None: + oprot.writeFieldBegin('fastLaneReservation', TType.I32, 1) + oprot.writeI32(self.fastLaneReservation) + oprot.writeFieldEnd() + if self.numFastLaneRunningTasks is not None: + oprot.writeFieldBegin('numFastLaneRunningTasks', TType.I32, 2) + oprot.writeI32(self.numFastLaneRunningTasks) + oprot.writeFieldEnd() + if self.numFastLanePendingTasks is not None: + oprot.writeFieldBegin('numFastLanePendingTasks', TType.I32, 3) + oprot.writeI32(self.numFastLanePendingTasks) + oprot.writeFieldEnd() + if self.slowLaneReservation is not None: + oprot.writeFieldBegin('slowLaneReservation', TType.I32, 4) + oprot.writeI32(self.slowLaneReservation) + oprot.writeFieldEnd() + if self.numSlowLaneRunningTasks is not None: + oprot.writeFieldBegin('numSlowLaneRunningTasks', TType.I32, 5) + oprot.writeI32(self.numSlowLaneRunningTasks) + oprot.writeFieldEnd() + if self.numSlowLanePendingTasks is not None: + oprot.writeFieldBegin('numSlowLanePendingTasks', TType.I32, 6) + oprot.writeI32(self.numSlowLanePendingTasks) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + + +class TDBSqlQueryMetrics(object): + """ + Attributes: + - status + - operationHandle + - idempotencyType + - sessionHandle + - operationStarted + - queryCost + - numRunningTasks + - numPendingTasks + - numCompletedTasks + + """ + + + def __init__(self, status=None, operationHandle=None, idempotencyType=None, sessionHandle=None, operationStarted=None, queryCost=None, numRunningTasks=None, numPendingTasks=None, numCompletedTasks=None,): + self.status = status + self.operationHandle = operationHandle + self.idempotencyType = idempotencyType + self.sessionHandle = sessionHandle + self.operationStarted = operationStarted + self.queryCost = queryCost + self.numRunningTasks = numRunningTasks + self.numPendingTasks = numPendingTasks + self.numCompletedTasks = numCompletedTasks + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.STRUCT: + self.status = TStatus() + self.status.read(iprot) + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.STRUCT: + self.operationHandle = TOperationHandle() + self.operationHandle.read(iprot) + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.I32: + self.idempotencyType = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 4: + if ftype == TType.STRUCT: + self.sessionHandle = TSessionHandle() + self.sessionHandle.read(iprot) + else: + iprot.skip(ftype) + elif fid == 5: + if ftype == TType.I64: + self.operationStarted = iprot.readI64() + else: + iprot.skip(ftype) + elif fid == 6: + if ftype == TType.DOUBLE: + self.queryCost = iprot.readDouble() + else: + iprot.skip(ftype) + elif fid == 7: + if ftype == TType.I32: + self.numRunningTasks = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 8: + if ftype == TType.I32: + self.numPendingTasks = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 9: + if ftype == TType.I32: + self.numCompletedTasks = iprot.readI32() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('TDBSqlQueryMetrics') + if self.status is not None: + oprot.writeFieldBegin('status', TType.STRUCT, 1) + self.status.write(oprot) + oprot.writeFieldEnd() + if self.operationHandle is not None: + oprot.writeFieldBegin('operationHandle', TType.STRUCT, 2) + self.operationHandle.write(oprot) + oprot.writeFieldEnd() + if self.idempotencyType is not None: + oprot.writeFieldBegin('idempotencyType', TType.I32, 3) + oprot.writeI32(self.idempotencyType) + oprot.writeFieldEnd() + if self.sessionHandle is not None: + oprot.writeFieldBegin('sessionHandle', TType.STRUCT, 4) + self.sessionHandle.write(oprot) + oprot.writeFieldEnd() + if self.operationStarted is not None: + oprot.writeFieldBegin('operationStarted', TType.I64, 5) + oprot.writeI64(self.operationStarted) + oprot.writeFieldEnd() + if self.queryCost is not None: + oprot.writeFieldBegin('queryCost', TType.DOUBLE, 6) + oprot.writeDouble(self.queryCost) + oprot.writeFieldEnd() + if self.numRunningTasks is not None: + oprot.writeFieldBegin('numRunningTasks', TType.I32, 7) + oprot.writeI32(self.numRunningTasks) + oprot.writeFieldEnd() + if self.numPendingTasks is not None: + oprot.writeFieldBegin('numPendingTasks', TType.I32, 8) + oprot.writeI32(self.numPendingTasks) + oprot.writeFieldEnd() + if self.numCompletedTasks is not None: + oprot.writeFieldBegin('numCompletedTasks', TType.I32, 9) + oprot.writeI32(self.numCompletedTasks) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + if self.status is None: + raise TProtocolException(message='Required field status is unset!') + if self.operationHandle is None: + raise TProtocolException(message='Required field operationHandle is unset!') + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + + +class TDBSqlGetLoadInformationReq(object): + """ + Attributes: + - includeQueryMetrics + + """ + + + def __init__(self, includeQueryMetrics=False,): + self.includeQueryMetrics = includeQueryMetrics + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.BOOL: + self.includeQueryMetrics = iprot.readBool() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('TDBSqlGetLoadInformationReq') + if self.includeQueryMetrics is not None: + oprot.writeFieldBegin('includeQueryMetrics', TType.BOOL, 1) + oprot.writeBool(self.includeQueryMetrics) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + + +class TDBSqlGetLoadInformationResp(object): + """ + Attributes: + - status + - clusterMetrics + - queryLaneMetrics + - queryMetrics + + """ + + + def __init__(self, status=None, clusterMetrics=None, queryLaneMetrics=None, queryMetrics=None,): + self.status = status + self.clusterMetrics = clusterMetrics + self.queryLaneMetrics = queryLaneMetrics + self.queryMetrics = queryMetrics + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.STRUCT: + self.status = TStatus() + self.status.read(iprot) + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.STRUCT: + self.clusterMetrics = TDBSqlClusterMetrics() + self.clusterMetrics.read(iprot) + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.STRUCT: + self.queryLaneMetrics = TDBSqlQueryLaneMetrics() + self.queryLaneMetrics.read(iprot) + else: + iprot.skip(ftype) + elif fid == 4: + if ftype == TType.LIST: + self.queryMetrics = [] + (_etype268, _size265) = iprot.readListBegin() + for _i269 in range(_size265): + _elem270 = TDBSqlQueryMetrics() + _elem270.read(iprot) + self.queryMetrics.append(_elem270) + iprot.readListEnd() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('TDBSqlGetLoadInformationResp') + if self.status is not None: + oprot.writeFieldBegin('status', TType.STRUCT, 1) + self.status.write(oprot) + oprot.writeFieldEnd() + if self.clusterMetrics is not None: + oprot.writeFieldBegin('clusterMetrics', TType.STRUCT, 2) + self.clusterMetrics.write(oprot) + oprot.writeFieldEnd() + if self.queryLaneMetrics is not None: + oprot.writeFieldBegin('queryLaneMetrics', TType.STRUCT, 3) + self.queryLaneMetrics.write(oprot) + oprot.writeFieldEnd() + if self.queryMetrics is not None: + oprot.writeFieldBegin('queryMetrics', TType.LIST, 4) + oprot.writeListBegin(TType.STRUCT, len(self.queryMetrics)) + for iter271 in self.queryMetrics: + iter271.write(oprot) + oprot.writeListEnd() + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + if self.status is None: + raise TProtocolException(message='Required field status is unset!') + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) all_structs.append(TTypeQualifierValue) TTypeQualifierValue.thrift_spec = ( None, # 0 @@ -10502,8 +9917,8 @@ def __ne__(self, other): None, # 0 (1, TType.MAP, 'qualifiers', (TType.STRING, 'UTF8', TType.STRUCT, [TTypeQualifierValue, None], False), None, ), # 1 ) -all_structs.append(TTAllowedParameterValueEntry) -TTAllowedParameterValueEntry.thrift_spec = ( +all_structs.append(TPrimitiveTypeEntry) +TPrimitiveTypeEntry.thrift_spec = ( None, # 0 (1, TType.I32, 'type', None, None, ), # 1 (2, TType.STRUCT, 'typeQualifiers', [TTypeQualifiers, None], None, ), # 2 @@ -10537,7 +9952,7 @@ def __ne__(self, other): all_structs.append(TTypeEntry) TTypeEntry.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'primitiveEntry', [TTAllowedParameterValueEntry, None], None, ), # 1 + (1, TType.STRUCT, 'primitiveEntry', [TPrimitiveTypeEntry, None], None, ), # 1 (2, TType.STRUCT, 'arrayEntry', [TArrayTypeEntry, None], None, ), # 2 (3, TType.STRUCT, 'mapEntry', [TMapTypeEntry, None], None, ), # 3 (4, TType.STRUCT, 'structEntry', [TStructTypeEntry, None], None, ), # 4 @@ -10673,29 +10088,6 @@ def __ne__(self, other): (7, TType.STRUCT, 'stringVal', [TStringColumn, None], None, ), # 7 (8, TType.STRUCT, 'binaryVal', [TBinaryColumn, None], None, ), # 8 ) -all_structs.append(TDBSqlJsonArrayFormat) -TDBSqlJsonArrayFormat.thrift_spec = ( - None, # 0 - (1, TType.I32, 'compressionCodec', None, None, ), # 1 -) -all_structs.append(TDBSqlCsvFormat) -TDBSqlCsvFormat.thrift_spec = ( - None, # 0 - (1, TType.I32, 'compressionCodec', None, None, ), # 1 -) -all_structs.append(TDBSqlArrowFormat) -TDBSqlArrowFormat.thrift_spec = ( - None, # 0 - (1, TType.I32, 'arrowLayout', None, None, ), # 1 - (2, TType.I32, 'compressionCodec', None, None, ), # 2 -) -all_structs.append(TDBSqlResultFormat) -TDBSqlResultFormat.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'arrowFormat', [TDBSqlArrowFormat, None], None, ), # 1 - (2, TType.STRUCT, 'csvFormat', [TDBSqlCsvFormat, None], None, ), # 2 - (3, TType.STRUCT, 'jsonArrayFormat', [TDBSqlJsonArrayFormat, None], None, ), # 3 -) all_structs.append(TSparkArrowBatch) TSparkArrowBatch.thrift_spec = ( None, # 0 @@ -10710,7 +10102,6 @@ def __ne__(self, other): (3, TType.I64, 'startRowOffset', None, None, ), # 3 (4, TType.I64, 'rowCount', None, None, ), # 4 (5, TType.I64, 'bytesNum', None, None, ), # 5 - (6, TType.MAP, 'httpHeaders', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 6 ) all_structs.append(TDBSqlCloudResultFile) TDBSqlCloudResultFile.thrift_spec = ( @@ -10720,9 +10111,6 @@ def __ne__(self, other): (3, TType.I64, 'rowCount', None, None, ), # 3 (4, TType.I64, 'uncompressedBytes', None, None, ), # 4 (5, TType.I64, 'compressedBytes', None, None, ), # 5 - (6, TType.STRING, 'fileLink', 'UTF8', None, ), # 6 - (7, TType.I64, 'linkExpiryTime', None, None, ), # 7 - (8, TType.MAP, 'httpHeaders', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 8 ) all_structs.append(TRowSet) TRowSet.thrift_spec = ( @@ -12009,12121 +11397,61 @@ def __ne__(self, other): None, # 1280 (1281, TType.LIST, 'arrowBatches', (TType.STRUCT, [TSparkArrowBatch, None], False), None, ), # 1281 (1282, TType.LIST, 'resultLinks', (TType.STRUCT, [TSparkArrowResultLink, None], False), None, ), # 1282 - None, # 1283 - None, # 1284 - None, # 1285 - None, # 1286 - None, # 1287 - None, # 1288 - None, # 1289 - None, # 1290 - None, # 1291 - None, # 1292 - None, # 1293 - None, # 1294 - None, # 1295 - None, # 1296 - None, # 1297 - None, # 1298 - None, # 1299 - None, # 1300 - None, # 1301 - None, # 1302 - None, # 1303 - None, # 1304 - None, # 1305 - None, # 1306 - None, # 1307 - None, # 1308 - None, # 1309 - None, # 1310 - None, # 1311 - None, # 1312 - None, # 1313 - None, # 1314 - None, # 1315 - None, # 1316 - None, # 1317 - None, # 1318 - None, # 1319 - None, # 1320 - None, # 1321 - None, # 1322 - None, # 1323 - None, # 1324 - None, # 1325 - None, # 1326 - None, # 1327 - None, # 1328 - None, # 1329 - None, # 1330 - None, # 1331 - None, # 1332 - None, # 1333 - None, # 1334 - None, # 1335 - None, # 1336 - None, # 1337 - None, # 1338 - None, # 1339 - None, # 1340 - None, # 1341 - None, # 1342 - None, # 1343 - None, # 1344 - None, # 1345 - None, # 1346 - None, # 1347 - None, # 1348 - None, # 1349 - None, # 1350 - None, # 1351 - None, # 1352 - None, # 1353 - None, # 1354 - None, # 1355 - None, # 1356 - None, # 1357 - None, # 1358 - None, # 1359 - None, # 1360 - None, # 1361 - None, # 1362 - None, # 1363 - None, # 1364 - None, # 1365 - None, # 1366 - None, # 1367 - None, # 1368 - None, # 1369 - None, # 1370 - None, # 1371 - None, # 1372 - None, # 1373 - None, # 1374 - None, # 1375 - None, # 1376 - None, # 1377 - None, # 1378 - None, # 1379 - None, # 1380 - None, # 1381 - None, # 1382 - None, # 1383 - None, # 1384 - None, # 1385 - None, # 1386 - None, # 1387 - None, # 1388 - None, # 1389 - None, # 1390 - None, # 1391 - None, # 1392 - None, # 1393 - None, # 1394 - None, # 1395 - None, # 1396 - None, # 1397 - None, # 1398 - None, # 1399 - None, # 1400 - None, # 1401 - None, # 1402 - None, # 1403 - None, # 1404 - None, # 1405 - None, # 1406 - None, # 1407 - None, # 1408 - None, # 1409 - None, # 1410 - None, # 1411 - None, # 1412 - None, # 1413 - None, # 1414 - None, # 1415 - None, # 1416 - None, # 1417 - None, # 1418 - None, # 1419 - None, # 1420 - None, # 1421 - None, # 1422 - None, # 1423 - None, # 1424 - None, # 1425 - None, # 1426 - None, # 1427 - None, # 1428 - None, # 1429 - None, # 1430 - None, # 1431 - None, # 1432 - None, # 1433 - None, # 1434 - None, # 1435 - None, # 1436 - None, # 1437 - None, # 1438 - None, # 1439 - None, # 1440 - None, # 1441 - None, # 1442 - None, # 1443 - None, # 1444 - None, # 1445 - None, # 1446 - None, # 1447 - None, # 1448 - None, # 1449 - None, # 1450 - None, # 1451 - None, # 1452 - None, # 1453 - None, # 1454 - None, # 1455 - None, # 1456 - None, # 1457 - None, # 1458 - None, # 1459 - None, # 1460 - None, # 1461 - None, # 1462 - None, # 1463 - None, # 1464 - None, # 1465 - None, # 1466 - None, # 1467 - None, # 1468 - None, # 1469 - None, # 1470 - None, # 1471 - None, # 1472 - None, # 1473 - None, # 1474 - None, # 1475 - None, # 1476 - None, # 1477 - None, # 1478 - None, # 1479 - None, # 1480 - None, # 1481 - None, # 1482 - None, # 1483 - None, # 1484 - None, # 1485 - None, # 1486 - None, # 1487 - None, # 1488 - None, # 1489 - None, # 1490 - None, # 1491 - None, # 1492 - None, # 1493 - None, # 1494 - None, # 1495 - None, # 1496 - None, # 1497 - None, # 1498 - None, # 1499 - None, # 1500 - None, # 1501 - None, # 1502 - None, # 1503 - None, # 1504 - None, # 1505 - None, # 1506 - None, # 1507 - None, # 1508 - None, # 1509 - None, # 1510 - None, # 1511 - None, # 1512 - None, # 1513 - None, # 1514 - None, # 1515 - None, # 1516 - None, # 1517 - None, # 1518 - None, # 1519 - None, # 1520 - None, # 1521 - None, # 1522 - None, # 1523 - None, # 1524 - None, # 1525 - None, # 1526 - None, # 1527 - None, # 1528 - None, # 1529 - None, # 1530 - None, # 1531 - None, # 1532 - None, # 1533 - None, # 1534 - None, # 1535 - None, # 1536 - None, # 1537 - None, # 1538 - None, # 1539 - None, # 1540 - None, # 1541 - None, # 1542 - None, # 1543 - None, # 1544 - None, # 1545 - None, # 1546 - None, # 1547 - None, # 1548 - None, # 1549 - None, # 1550 - None, # 1551 - None, # 1552 - None, # 1553 - None, # 1554 - None, # 1555 - None, # 1556 - None, # 1557 - None, # 1558 - None, # 1559 - None, # 1560 - None, # 1561 - None, # 1562 - None, # 1563 - None, # 1564 - None, # 1565 - None, # 1566 - None, # 1567 - None, # 1568 - None, # 1569 - None, # 1570 - None, # 1571 - None, # 1572 - None, # 1573 - None, # 1574 - None, # 1575 - None, # 1576 - None, # 1577 - None, # 1578 - None, # 1579 - None, # 1580 - None, # 1581 - None, # 1582 - None, # 1583 - None, # 1584 - None, # 1585 - None, # 1586 - None, # 1587 - None, # 1588 - None, # 1589 - None, # 1590 - None, # 1591 - None, # 1592 - None, # 1593 - None, # 1594 - None, # 1595 - None, # 1596 - None, # 1597 - None, # 1598 - None, # 1599 - None, # 1600 - None, # 1601 - None, # 1602 - None, # 1603 - None, # 1604 - None, # 1605 - None, # 1606 - None, # 1607 - None, # 1608 - None, # 1609 - None, # 1610 - None, # 1611 - None, # 1612 - None, # 1613 - None, # 1614 - None, # 1615 - None, # 1616 - None, # 1617 - None, # 1618 - None, # 1619 - None, # 1620 - None, # 1621 - None, # 1622 - None, # 1623 - None, # 1624 - None, # 1625 - None, # 1626 - None, # 1627 - None, # 1628 - None, # 1629 - None, # 1630 - None, # 1631 - None, # 1632 - None, # 1633 - None, # 1634 - None, # 1635 - None, # 1636 - None, # 1637 - None, # 1638 - None, # 1639 - None, # 1640 - None, # 1641 - None, # 1642 - None, # 1643 - None, # 1644 - None, # 1645 - None, # 1646 - None, # 1647 - None, # 1648 - None, # 1649 - None, # 1650 - None, # 1651 - None, # 1652 - None, # 1653 - None, # 1654 - None, # 1655 - None, # 1656 - None, # 1657 - None, # 1658 - None, # 1659 - None, # 1660 - None, # 1661 - None, # 1662 - None, # 1663 - None, # 1664 - None, # 1665 - None, # 1666 - None, # 1667 - None, # 1668 - None, # 1669 - None, # 1670 - None, # 1671 - None, # 1672 - None, # 1673 - None, # 1674 - None, # 1675 - None, # 1676 - None, # 1677 - None, # 1678 - None, # 1679 - None, # 1680 - None, # 1681 - None, # 1682 - None, # 1683 - None, # 1684 - None, # 1685 - None, # 1686 - None, # 1687 - None, # 1688 - None, # 1689 - None, # 1690 - None, # 1691 - None, # 1692 - None, # 1693 - None, # 1694 - None, # 1695 - None, # 1696 - None, # 1697 - None, # 1698 - None, # 1699 - None, # 1700 - None, # 1701 - None, # 1702 - None, # 1703 - None, # 1704 - None, # 1705 - None, # 1706 - None, # 1707 - None, # 1708 - None, # 1709 - None, # 1710 - None, # 1711 - None, # 1712 - None, # 1713 - None, # 1714 - None, # 1715 - None, # 1716 - None, # 1717 - None, # 1718 - None, # 1719 - None, # 1720 - None, # 1721 - None, # 1722 - None, # 1723 - None, # 1724 - None, # 1725 - None, # 1726 - None, # 1727 - None, # 1728 - None, # 1729 - None, # 1730 - None, # 1731 - None, # 1732 - None, # 1733 - None, # 1734 - None, # 1735 - None, # 1736 - None, # 1737 - None, # 1738 - None, # 1739 - None, # 1740 - None, # 1741 - None, # 1742 - None, # 1743 - None, # 1744 - None, # 1745 - None, # 1746 - None, # 1747 - None, # 1748 - None, # 1749 - None, # 1750 - None, # 1751 - None, # 1752 - None, # 1753 - None, # 1754 - None, # 1755 - None, # 1756 - None, # 1757 - None, # 1758 - None, # 1759 - None, # 1760 - None, # 1761 - None, # 1762 - None, # 1763 - None, # 1764 - None, # 1765 - None, # 1766 - None, # 1767 - None, # 1768 - None, # 1769 - None, # 1770 - None, # 1771 - None, # 1772 - None, # 1773 - None, # 1774 - None, # 1775 - None, # 1776 - None, # 1777 - None, # 1778 - None, # 1779 - None, # 1780 - None, # 1781 - None, # 1782 - None, # 1783 - None, # 1784 - None, # 1785 - None, # 1786 - None, # 1787 - None, # 1788 - None, # 1789 - None, # 1790 - None, # 1791 - None, # 1792 - None, # 1793 - None, # 1794 - None, # 1795 - None, # 1796 - None, # 1797 - None, # 1798 - None, # 1799 - None, # 1800 - None, # 1801 - None, # 1802 - None, # 1803 - None, # 1804 - None, # 1805 - None, # 1806 - None, # 1807 - None, # 1808 - None, # 1809 - None, # 1810 - None, # 1811 - None, # 1812 - None, # 1813 - None, # 1814 - None, # 1815 - None, # 1816 - None, # 1817 - None, # 1818 - None, # 1819 - None, # 1820 - None, # 1821 - None, # 1822 - None, # 1823 - None, # 1824 - None, # 1825 - None, # 1826 - None, # 1827 - None, # 1828 - None, # 1829 - None, # 1830 - None, # 1831 - None, # 1832 - None, # 1833 - None, # 1834 - None, # 1835 - None, # 1836 - None, # 1837 - None, # 1838 - None, # 1839 - None, # 1840 - None, # 1841 - None, # 1842 - None, # 1843 - None, # 1844 - None, # 1845 - None, # 1846 - None, # 1847 - None, # 1848 - None, # 1849 - None, # 1850 - None, # 1851 - None, # 1852 - None, # 1853 - None, # 1854 - None, # 1855 - None, # 1856 - None, # 1857 - None, # 1858 - None, # 1859 - None, # 1860 - None, # 1861 - None, # 1862 - None, # 1863 - None, # 1864 - None, # 1865 - None, # 1866 - None, # 1867 - None, # 1868 - None, # 1869 - None, # 1870 - None, # 1871 - None, # 1872 - None, # 1873 - None, # 1874 - None, # 1875 - None, # 1876 - None, # 1877 - None, # 1878 - None, # 1879 - None, # 1880 - None, # 1881 - None, # 1882 - None, # 1883 - None, # 1884 - None, # 1885 - None, # 1886 - None, # 1887 - None, # 1888 - None, # 1889 - None, # 1890 - None, # 1891 - None, # 1892 - None, # 1893 - None, # 1894 - None, # 1895 - None, # 1896 - None, # 1897 - None, # 1898 - None, # 1899 - None, # 1900 - None, # 1901 - None, # 1902 - None, # 1903 - None, # 1904 - None, # 1905 - None, # 1906 - None, # 1907 - None, # 1908 - None, # 1909 - None, # 1910 - None, # 1911 - None, # 1912 - None, # 1913 - None, # 1914 - None, # 1915 - None, # 1916 - None, # 1917 - None, # 1918 - None, # 1919 - None, # 1920 - None, # 1921 - None, # 1922 - None, # 1923 - None, # 1924 - None, # 1925 - None, # 1926 - None, # 1927 - None, # 1928 - None, # 1929 - None, # 1930 - None, # 1931 - None, # 1932 - None, # 1933 - None, # 1934 - None, # 1935 - None, # 1936 - None, # 1937 - None, # 1938 - None, # 1939 - None, # 1940 - None, # 1941 - None, # 1942 - None, # 1943 - None, # 1944 - None, # 1945 - None, # 1946 - None, # 1947 - None, # 1948 - None, # 1949 - None, # 1950 - None, # 1951 - None, # 1952 - None, # 1953 - None, # 1954 - None, # 1955 - None, # 1956 - None, # 1957 - None, # 1958 - None, # 1959 - None, # 1960 - None, # 1961 - None, # 1962 - None, # 1963 - None, # 1964 - None, # 1965 - None, # 1966 - None, # 1967 - None, # 1968 - None, # 1969 - None, # 1970 - None, # 1971 - None, # 1972 - None, # 1973 - None, # 1974 - None, # 1975 - None, # 1976 - None, # 1977 - None, # 1978 - None, # 1979 - None, # 1980 - None, # 1981 - None, # 1982 - None, # 1983 - None, # 1984 - None, # 1985 - None, # 1986 - None, # 1987 - None, # 1988 - None, # 1989 - None, # 1990 - None, # 1991 - None, # 1992 - None, # 1993 - None, # 1994 - None, # 1995 - None, # 1996 - None, # 1997 - None, # 1998 - None, # 1999 - None, # 2000 - None, # 2001 - None, # 2002 - None, # 2003 - None, # 2004 - None, # 2005 - None, # 2006 - None, # 2007 - None, # 2008 - None, # 2009 - None, # 2010 - None, # 2011 - None, # 2012 - None, # 2013 - None, # 2014 - None, # 2015 - None, # 2016 - None, # 2017 - None, # 2018 - None, # 2019 - None, # 2020 - None, # 2021 - None, # 2022 - None, # 2023 - None, # 2024 - None, # 2025 - None, # 2026 - None, # 2027 - None, # 2028 - None, # 2029 - None, # 2030 - None, # 2031 - None, # 2032 - None, # 2033 - None, # 2034 - None, # 2035 - None, # 2036 - None, # 2037 - None, # 2038 - None, # 2039 - None, # 2040 - None, # 2041 - None, # 2042 - None, # 2043 - None, # 2044 - None, # 2045 - None, # 2046 - None, # 2047 - None, # 2048 - None, # 2049 - None, # 2050 - None, # 2051 - None, # 2052 - None, # 2053 - None, # 2054 - None, # 2055 - None, # 2056 - None, # 2057 - None, # 2058 - None, # 2059 - None, # 2060 - None, # 2061 - None, # 2062 - None, # 2063 - None, # 2064 - None, # 2065 - None, # 2066 - None, # 2067 - None, # 2068 - None, # 2069 - None, # 2070 - None, # 2071 - None, # 2072 - None, # 2073 - None, # 2074 - None, # 2075 - None, # 2076 - None, # 2077 - None, # 2078 - None, # 2079 - None, # 2080 - None, # 2081 - None, # 2082 - None, # 2083 - None, # 2084 - None, # 2085 - None, # 2086 - None, # 2087 - None, # 2088 - None, # 2089 - None, # 2090 - None, # 2091 - None, # 2092 - None, # 2093 - None, # 2094 - None, # 2095 - None, # 2096 - None, # 2097 - None, # 2098 - None, # 2099 - None, # 2100 - None, # 2101 - None, # 2102 - None, # 2103 - None, # 2104 - None, # 2105 - None, # 2106 - None, # 2107 - None, # 2108 - None, # 2109 - None, # 2110 - None, # 2111 - None, # 2112 - None, # 2113 - None, # 2114 - None, # 2115 - None, # 2116 - None, # 2117 - None, # 2118 - None, # 2119 - None, # 2120 - None, # 2121 - None, # 2122 - None, # 2123 - None, # 2124 - None, # 2125 - None, # 2126 - None, # 2127 - None, # 2128 - None, # 2129 - None, # 2130 - None, # 2131 - None, # 2132 - None, # 2133 - None, # 2134 - None, # 2135 - None, # 2136 - None, # 2137 - None, # 2138 - None, # 2139 - None, # 2140 - None, # 2141 - None, # 2142 - None, # 2143 - None, # 2144 - None, # 2145 - None, # 2146 - None, # 2147 - None, # 2148 - None, # 2149 - None, # 2150 - None, # 2151 - None, # 2152 - None, # 2153 - None, # 2154 - None, # 2155 - None, # 2156 - None, # 2157 - None, # 2158 - None, # 2159 - None, # 2160 - None, # 2161 - None, # 2162 - None, # 2163 - None, # 2164 - None, # 2165 - None, # 2166 - None, # 2167 - None, # 2168 - None, # 2169 - None, # 2170 - None, # 2171 - None, # 2172 - None, # 2173 - None, # 2174 - None, # 2175 - None, # 2176 - None, # 2177 - None, # 2178 - None, # 2179 - None, # 2180 - None, # 2181 - None, # 2182 - None, # 2183 - None, # 2184 - None, # 2185 - None, # 2186 - None, # 2187 - None, # 2188 - None, # 2189 - None, # 2190 - None, # 2191 - None, # 2192 - None, # 2193 - None, # 2194 - None, # 2195 - None, # 2196 - None, # 2197 - None, # 2198 - None, # 2199 - None, # 2200 - None, # 2201 - None, # 2202 - None, # 2203 - None, # 2204 - None, # 2205 - None, # 2206 - None, # 2207 - None, # 2208 - None, # 2209 - None, # 2210 - None, # 2211 - None, # 2212 - None, # 2213 - None, # 2214 - None, # 2215 - None, # 2216 - None, # 2217 - None, # 2218 - None, # 2219 - None, # 2220 - None, # 2221 - None, # 2222 - None, # 2223 - None, # 2224 - None, # 2225 - None, # 2226 - None, # 2227 - None, # 2228 - None, # 2229 - None, # 2230 - None, # 2231 - None, # 2232 - None, # 2233 - None, # 2234 - None, # 2235 - None, # 2236 - None, # 2237 - None, # 2238 - None, # 2239 - None, # 2240 - None, # 2241 - None, # 2242 - None, # 2243 - None, # 2244 - None, # 2245 - None, # 2246 - None, # 2247 - None, # 2248 - None, # 2249 - None, # 2250 - None, # 2251 - None, # 2252 - None, # 2253 - None, # 2254 - None, # 2255 - None, # 2256 - None, # 2257 - None, # 2258 - None, # 2259 - None, # 2260 - None, # 2261 - None, # 2262 - None, # 2263 - None, # 2264 - None, # 2265 - None, # 2266 - None, # 2267 - None, # 2268 - None, # 2269 - None, # 2270 - None, # 2271 - None, # 2272 - None, # 2273 - None, # 2274 - None, # 2275 - None, # 2276 - None, # 2277 - None, # 2278 - None, # 2279 - None, # 2280 - None, # 2281 - None, # 2282 - None, # 2283 - None, # 2284 - None, # 2285 - None, # 2286 - None, # 2287 - None, # 2288 - None, # 2289 - None, # 2290 - None, # 2291 - None, # 2292 - None, # 2293 - None, # 2294 - None, # 2295 - None, # 2296 - None, # 2297 - None, # 2298 - None, # 2299 - None, # 2300 - None, # 2301 - None, # 2302 - None, # 2303 - None, # 2304 - None, # 2305 - None, # 2306 - None, # 2307 - None, # 2308 - None, # 2309 - None, # 2310 - None, # 2311 - None, # 2312 - None, # 2313 - None, # 2314 - None, # 2315 - None, # 2316 - None, # 2317 - None, # 2318 - None, # 2319 - None, # 2320 - None, # 2321 - None, # 2322 - None, # 2323 - None, # 2324 - None, # 2325 - None, # 2326 - None, # 2327 - None, # 2328 - None, # 2329 - None, # 2330 - None, # 2331 - None, # 2332 - None, # 2333 - None, # 2334 - None, # 2335 - None, # 2336 - None, # 2337 - None, # 2338 - None, # 2339 - None, # 2340 - None, # 2341 - None, # 2342 - None, # 2343 - None, # 2344 - None, # 2345 - None, # 2346 - None, # 2347 - None, # 2348 - None, # 2349 - None, # 2350 - None, # 2351 - None, # 2352 - None, # 2353 - None, # 2354 - None, # 2355 - None, # 2356 - None, # 2357 - None, # 2358 - None, # 2359 - None, # 2360 - None, # 2361 - None, # 2362 - None, # 2363 - None, # 2364 - None, # 2365 - None, # 2366 - None, # 2367 - None, # 2368 - None, # 2369 - None, # 2370 - None, # 2371 - None, # 2372 - None, # 2373 - None, # 2374 - None, # 2375 - None, # 2376 - None, # 2377 - None, # 2378 - None, # 2379 - None, # 2380 - None, # 2381 - None, # 2382 - None, # 2383 - None, # 2384 - None, # 2385 - None, # 2386 - None, # 2387 - None, # 2388 - None, # 2389 - None, # 2390 - None, # 2391 - None, # 2392 - None, # 2393 - None, # 2394 - None, # 2395 - None, # 2396 - None, # 2397 - None, # 2398 - None, # 2399 - None, # 2400 - None, # 2401 - None, # 2402 - None, # 2403 - None, # 2404 - None, # 2405 - None, # 2406 - None, # 2407 - None, # 2408 - None, # 2409 - None, # 2410 - None, # 2411 - None, # 2412 - None, # 2413 - None, # 2414 - None, # 2415 - None, # 2416 - None, # 2417 - None, # 2418 - None, # 2419 - None, # 2420 - None, # 2421 - None, # 2422 - None, # 2423 - None, # 2424 - None, # 2425 - None, # 2426 - None, # 2427 - None, # 2428 - None, # 2429 - None, # 2430 - None, # 2431 - None, # 2432 - None, # 2433 - None, # 2434 - None, # 2435 - None, # 2436 - None, # 2437 - None, # 2438 - None, # 2439 - None, # 2440 - None, # 2441 - None, # 2442 - None, # 2443 - None, # 2444 - None, # 2445 - None, # 2446 - None, # 2447 - None, # 2448 - None, # 2449 - None, # 2450 - None, # 2451 - None, # 2452 - None, # 2453 - None, # 2454 - None, # 2455 - None, # 2456 - None, # 2457 - None, # 2458 - None, # 2459 - None, # 2460 - None, # 2461 - None, # 2462 - None, # 2463 - None, # 2464 - None, # 2465 - None, # 2466 - None, # 2467 - None, # 2468 - None, # 2469 - None, # 2470 - None, # 2471 - None, # 2472 - None, # 2473 - None, # 2474 - None, # 2475 - None, # 2476 - None, # 2477 - None, # 2478 - None, # 2479 - None, # 2480 - None, # 2481 - None, # 2482 - None, # 2483 - None, # 2484 - None, # 2485 - None, # 2486 - None, # 2487 - None, # 2488 - None, # 2489 - None, # 2490 - None, # 2491 - None, # 2492 - None, # 2493 - None, # 2494 - None, # 2495 - None, # 2496 - None, # 2497 - None, # 2498 - None, # 2499 - None, # 2500 - None, # 2501 - None, # 2502 - None, # 2503 - None, # 2504 - None, # 2505 - None, # 2506 - None, # 2507 - None, # 2508 - None, # 2509 - None, # 2510 - None, # 2511 - None, # 2512 - None, # 2513 - None, # 2514 - None, # 2515 - None, # 2516 - None, # 2517 - None, # 2518 - None, # 2519 - None, # 2520 - None, # 2521 - None, # 2522 - None, # 2523 - None, # 2524 - None, # 2525 - None, # 2526 - None, # 2527 - None, # 2528 - None, # 2529 - None, # 2530 - None, # 2531 - None, # 2532 - None, # 2533 - None, # 2534 - None, # 2535 - None, # 2536 - None, # 2537 - None, # 2538 - None, # 2539 - None, # 2540 - None, # 2541 - None, # 2542 - None, # 2543 - None, # 2544 - None, # 2545 - None, # 2546 - None, # 2547 - None, # 2548 - None, # 2549 - None, # 2550 - None, # 2551 - None, # 2552 - None, # 2553 - None, # 2554 - None, # 2555 - None, # 2556 - None, # 2557 - None, # 2558 - None, # 2559 - None, # 2560 - None, # 2561 - None, # 2562 - None, # 2563 - None, # 2564 - None, # 2565 - None, # 2566 - None, # 2567 - None, # 2568 - None, # 2569 - None, # 2570 - None, # 2571 - None, # 2572 - None, # 2573 - None, # 2574 - None, # 2575 - None, # 2576 - None, # 2577 - None, # 2578 - None, # 2579 - None, # 2580 - None, # 2581 - None, # 2582 - None, # 2583 - None, # 2584 - None, # 2585 - None, # 2586 - None, # 2587 - None, # 2588 - None, # 2589 - None, # 2590 - None, # 2591 - None, # 2592 - None, # 2593 - None, # 2594 - None, # 2595 - None, # 2596 - None, # 2597 - None, # 2598 - None, # 2599 - None, # 2600 - None, # 2601 - None, # 2602 - None, # 2603 - None, # 2604 - None, # 2605 - None, # 2606 - None, # 2607 - None, # 2608 - None, # 2609 - None, # 2610 - None, # 2611 - None, # 2612 - None, # 2613 - None, # 2614 - None, # 2615 - None, # 2616 - None, # 2617 - None, # 2618 - None, # 2619 - None, # 2620 - None, # 2621 - None, # 2622 - None, # 2623 - None, # 2624 - None, # 2625 - None, # 2626 - None, # 2627 - None, # 2628 - None, # 2629 - None, # 2630 - None, # 2631 - None, # 2632 - None, # 2633 - None, # 2634 - None, # 2635 - None, # 2636 - None, # 2637 - None, # 2638 - None, # 2639 - None, # 2640 - None, # 2641 - None, # 2642 - None, # 2643 - None, # 2644 - None, # 2645 - None, # 2646 - None, # 2647 - None, # 2648 - None, # 2649 - None, # 2650 - None, # 2651 - None, # 2652 - None, # 2653 - None, # 2654 - None, # 2655 - None, # 2656 - None, # 2657 - None, # 2658 - None, # 2659 - None, # 2660 - None, # 2661 - None, # 2662 - None, # 2663 - None, # 2664 - None, # 2665 - None, # 2666 - None, # 2667 - None, # 2668 - None, # 2669 - None, # 2670 - None, # 2671 - None, # 2672 - None, # 2673 - None, # 2674 - None, # 2675 - None, # 2676 - None, # 2677 - None, # 2678 - None, # 2679 - None, # 2680 - None, # 2681 - None, # 2682 - None, # 2683 - None, # 2684 - None, # 2685 - None, # 2686 - None, # 2687 - None, # 2688 - None, # 2689 - None, # 2690 - None, # 2691 - None, # 2692 - None, # 2693 - None, # 2694 - None, # 2695 - None, # 2696 - None, # 2697 - None, # 2698 - None, # 2699 - None, # 2700 - None, # 2701 - None, # 2702 - None, # 2703 - None, # 2704 - None, # 2705 - None, # 2706 - None, # 2707 - None, # 2708 - None, # 2709 - None, # 2710 - None, # 2711 - None, # 2712 - None, # 2713 - None, # 2714 - None, # 2715 - None, # 2716 - None, # 2717 - None, # 2718 - None, # 2719 - None, # 2720 - None, # 2721 - None, # 2722 - None, # 2723 - None, # 2724 - None, # 2725 - None, # 2726 - None, # 2727 - None, # 2728 - None, # 2729 - None, # 2730 - None, # 2731 - None, # 2732 - None, # 2733 - None, # 2734 - None, # 2735 - None, # 2736 - None, # 2737 - None, # 2738 - None, # 2739 - None, # 2740 - None, # 2741 - None, # 2742 - None, # 2743 - None, # 2744 - None, # 2745 - None, # 2746 - None, # 2747 - None, # 2748 - None, # 2749 - None, # 2750 - None, # 2751 - None, # 2752 - None, # 2753 - None, # 2754 - None, # 2755 - None, # 2756 - None, # 2757 - None, # 2758 - None, # 2759 - None, # 2760 - None, # 2761 - None, # 2762 - None, # 2763 - None, # 2764 - None, # 2765 - None, # 2766 - None, # 2767 - None, # 2768 - None, # 2769 - None, # 2770 - None, # 2771 - None, # 2772 - None, # 2773 - None, # 2774 - None, # 2775 - None, # 2776 - None, # 2777 - None, # 2778 - None, # 2779 - None, # 2780 - None, # 2781 - None, # 2782 - None, # 2783 - None, # 2784 - None, # 2785 - None, # 2786 - None, # 2787 - None, # 2788 - None, # 2789 - None, # 2790 - None, # 2791 - None, # 2792 - None, # 2793 - None, # 2794 - None, # 2795 - None, # 2796 - None, # 2797 - None, # 2798 - None, # 2799 - None, # 2800 - None, # 2801 - None, # 2802 - None, # 2803 - None, # 2804 - None, # 2805 - None, # 2806 - None, # 2807 - None, # 2808 - None, # 2809 - None, # 2810 - None, # 2811 - None, # 2812 - None, # 2813 - None, # 2814 - None, # 2815 - None, # 2816 - None, # 2817 - None, # 2818 - None, # 2819 - None, # 2820 - None, # 2821 - None, # 2822 - None, # 2823 - None, # 2824 - None, # 2825 - None, # 2826 - None, # 2827 - None, # 2828 - None, # 2829 - None, # 2830 - None, # 2831 - None, # 2832 - None, # 2833 - None, # 2834 - None, # 2835 - None, # 2836 - None, # 2837 - None, # 2838 - None, # 2839 - None, # 2840 - None, # 2841 - None, # 2842 - None, # 2843 - None, # 2844 - None, # 2845 - None, # 2846 - None, # 2847 - None, # 2848 - None, # 2849 - None, # 2850 - None, # 2851 - None, # 2852 - None, # 2853 - None, # 2854 - None, # 2855 - None, # 2856 - None, # 2857 - None, # 2858 - None, # 2859 - None, # 2860 - None, # 2861 - None, # 2862 - None, # 2863 - None, # 2864 - None, # 2865 - None, # 2866 - None, # 2867 - None, # 2868 - None, # 2869 - None, # 2870 - None, # 2871 - None, # 2872 - None, # 2873 - None, # 2874 - None, # 2875 - None, # 2876 - None, # 2877 - None, # 2878 - None, # 2879 - None, # 2880 - None, # 2881 - None, # 2882 - None, # 2883 - None, # 2884 - None, # 2885 - None, # 2886 - None, # 2887 - None, # 2888 - None, # 2889 - None, # 2890 - None, # 2891 - None, # 2892 - None, # 2893 - None, # 2894 - None, # 2895 - None, # 2896 - None, # 2897 - None, # 2898 - None, # 2899 - None, # 2900 - None, # 2901 - None, # 2902 - None, # 2903 - None, # 2904 - None, # 2905 - None, # 2906 - None, # 2907 - None, # 2908 - None, # 2909 - None, # 2910 - None, # 2911 - None, # 2912 - None, # 2913 - None, # 2914 - None, # 2915 - None, # 2916 - None, # 2917 - None, # 2918 - None, # 2919 - None, # 2920 - None, # 2921 - None, # 2922 - None, # 2923 - None, # 2924 - None, # 2925 - None, # 2926 - None, # 2927 - None, # 2928 - None, # 2929 - None, # 2930 - None, # 2931 - None, # 2932 - None, # 2933 - None, # 2934 - None, # 2935 - None, # 2936 - None, # 2937 - None, # 2938 - None, # 2939 - None, # 2940 - None, # 2941 - None, # 2942 - None, # 2943 - None, # 2944 - None, # 2945 - None, # 2946 - None, # 2947 - None, # 2948 - None, # 2949 - None, # 2950 - None, # 2951 - None, # 2952 - None, # 2953 - None, # 2954 - None, # 2955 - None, # 2956 - None, # 2957 - None, # 2958 - None, # 2959 - None, # 2960 - None, # 2961 - None, # 2962 - None, # 2963 - None, # 2964 - None, # 2965 - None, # 2966 - None, # 2967 - None, # 2968 - None, # 2969 - None, # 2970 - None, # 2971 - None, # 2972 - None, # 2973 - None, # 2974 - None, # 2975 - None, # 2976 - None, # 2977 - None, # 2978 - None, # 2979 - None, # 2980 - None, # 2981 - None, # 2982 - None, # 2983 - None, # 2984 - None, # 2985 - None, # 2986 - None, # 2987 - None, # 2988 - None, # 2989 - None, # 2990 - None, # 2991 - None, # 2992 - None, # 2993 - None, # 2994 - None, # 2995 - None, # 2996 - None, # 2997 - None, # 2998 - None, # 2999 - None, # 3000 - None, # 3001 - None, # 3002 - None, # 3003 - None, # 3004 - None, # 3005 - None, # 3006 - None, # 3007 - None, # 3008 - None, # 3009 - None, # 3010 - None, # 3011 - None, # 3012 - None, # 3013 - None, # 3014 - None, # 3015 - None, # 3016 - None, # 3017 - None, # 3018 - None, # 3019 - None, # 3020 - None, # 3021 - None, # 3022 - None, # 3023 - None, # 3024 - None, # 3025 - None, # 3026 - None, # 3027 - None, # 3028 - None, # 3029 - None, # 3030 - None, # 3031 - None, # 3032 - None, # 3033 - None, # 3034 - None, # 3035 - None, # 3036 - None, # 3037 - None, # 3038 - None, # 3039 - None, # 3040 - None, # 3041 - None, # 3042 - None, # 3043 - None, # 3044 - None, # 3045 - None, # 3046 - None, # 3047 - None, # 3048 - None, # 3049 - None, # 3050 - None, # 3051 - None, # 3052 - None, # 3053 - None, # 3054 - None, # 3055 - None, # 3056 - None, # 3057 - None, # 3058 - None, # 3059 - None, # 3060 - None, # 3061 - None, # 3062 - None, # 3063 - None, # 3064 - None, # 3065 - None, # 3066 - None, # 3067 - None, # 3068 - None, # 3069 - None, # 3070 - None, # 3071 - None, # 3072 - None, # 3073 - None, # 3074 - None, # 3075 - None, # 3076 - None, # 3077 - None, # 3078 - None, # 3079 - None, # 3080 - None, # 3081 - None, # 3082 - None, # 3083 - None, # 3084 - None, # 3085 - None, # 3086 - None, # 3087 - None, # 3088 - None, # 3089 - None, # 3090 - None, # 3091 - None, # 3092 - None, # 3093 - None, # 3094 - None, # 3095 - None, # 3096 - None, # 3097 - None, # 3098 - None, # 3099 - None, # 3100 - None, # 3101 - None, # 3102 - None, # 3103 - None, # 3104 - None, # 3105 - None, # 3106 - None, # 3107 - None, # 3108 - None, # 3109 - None, # 3110 - None, # 3111 - None, # 3112 - None, # 3113 - None, # 3114 - None, # 3115 - None, # 3116 - None, # 3117 - None, # 3118 - None, # 3119 - None, # 3120 - None, # 3121 - None, # 3122 - None, # 3123 - None, # 3124 - None, # 3125 - None, # 3126 - None, # 3127 - None, # 3128 - None, # 3129 - None, # 3130 - None, # 3131 - None, # 3132 - None, # 3133 - None, # 3134 - None, # 3135 - None, # 3136 - None, # 3137 - None, # 3138 - None, # 3139 - None, # 3140 - None, # 3141 - None, # 3142 - None, # 3143 - None, # 3144 - None, # 3145 - None, # 3146 - None, # 3147 - None, # 3148 - None, # 3149 - None, # 3150 - None, # 3151 - None, # 3152 - None, # 3153 - None, # 3154 - None, # 3155 - None, # 3156 - None, # 3157 - None, # 3158 - None, # 3159 - None, # 3160 - None, # 3161 - None, # 3162 - None, # 3163 - None, # 3164 - None, # 3165 - None, # 3166 - None, # 3167 - None, # 3168 - None, # 3169 - None, # 3170 - None, # 3171 - None, # 3172 - None, # 3173 - None, # 3174 - None, # 3175 - None, # 3176 - None, # 3177 - None, # 3178 - None, # 3179 - None, # 3180 - None, # 3181 - None, # 3182 - None, # 3183 - None, # 3184 - None, # 3185 - None, # 3186 - None, # 3187 - None, # 3188 - None, # 3189 - None, # 3190 - None, # 3191 - None, # 3192 - None, # 3193 - None, # 3194 - None, # 3195 - None, # 3196 - None, # 3197 - None, # 3198 - None, # 3199 - None, # 3200 - None, # 3201 - None, # 3202 - None, # 3203 - None, # 3204 - None, # 3205 - None, # 3206 - None, # 3207 - None, # 3208 - None, # 3209 - None, # 3210 - None, # 3211 - None, # 3212 - None, # 3213 - None, # 3214 - None, # 3215 - None, # 3216 - None, # 3217 - None, # 3218 - None, # 3219 - None, # 3220 - None, # 3221 - None, # 3222 - None, # 3223 - None, # 3224 - None, # 3225 - None, # 3226 - None, # 3227 - None, # 3228 - None, # 3229 - None, # 3230 - None, # 3231 - None, # 3232 - None, # 3233 - None, # 3234 - None, # 3235 - None, # 3236 - None, # 3237 - None, # 3238 - None, # 3239 - None, # 3240 - None, # 3241 - None, # 3242 - None, # 3243 - None, # 3244 - None, # 3245 - None, # 3246 - None, # 3247 - None, # 3248 - None, # 3249 - None, # 3250 - None, # 3251 - None, # 3252 - None, # 3253 - None, # 3254 - None, # 3255 - None, # 3256 - None, # 3257 - None, # 3258 - None, # 3259 - None, # 3260 - None, # 3261 - None, # 3262 - None, # 3263 - None, # 3264 - None, # 3265 - None, # 3266 - None, # 3267 - None, # 3268 - None, # 3269 - None, # 3270 - None, # 3271 - None, # 3272 - None, # 3273 - None, # 3274 - None, # 3275 - None, # 3276 - None, # 3277 - None, # 3278 - None, # 3279 - None, # 3280 - None, # 3281 - None, # 3282 - None, # 3283 - None, # 3284 - None, # 3285 - None, # 3286 - None, # 3287 - None, # 3288 - None, # 3289 - None, # 3290 - None, # 3291 - None, # 3292 - None, # 3293 - None, # 3294 - None, # 3295 - None, # 3296 - None, # 3297 - None, # 3298 - None, # 3299 - None, # 3300 - None, # 3301 - None, # 3302 - None, # 3303 - None, # 3304 - None, # 3305 - None, # 3306 - None, # 3307 - None, # 3308 - None, # 3309 - None, # 3310 - None, # 3311 - None, # 3312 - None, # 3313 - None, # 3314 - None, # 3315 - None, # 3316 - None, # 3317 - None, # 3318 - None, # 3319 - None, # 3320 - None, # 3321 - None, # 3322 - None, # 3323 - None, # 3324 - None, # 3325 - None, # 3326 - None, # 3327 - None, # 3328 - (3329, TType.LIST, 'cloudFetchResults', (TType.STRUCT, [TDBSqlCloudResultFile, None], False), None, ), # 3329 -) -all_structs.append(TDBSqlTempView) -TDBSqlTempView.thrift_spec = ( - None, # 0 - (1, TType.STRING, 'name', 'UTF8', None, ), # 1 - (2, TType.STRING, 'sqlStatement', 'UTF8', None, ), # 2 - (3, TType.MAP, 'properties', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 3 - (4, TType.STRING, 'viewSchema', 'UTF8', None, ), # 4 -) -all_structs.append(TDBSqlSessionCapabilities) -TDBSqlSessionCapabilities.thrift_spec = ( - None, # 0 - (1, TType.BOOL, 'supportsMultipleCatalogs', None, None, ), # 1 -) -all_structs.append(TExpressionInfo) -TExpressionInfo.thrift_spec = ( - None, # 0 - (1, TType.STRING, 'className', 'UTF8', None, ), # 1 - (2, TType.STRING, 'usage', 'UTF8', None, ), # 2 - (3, TType.STRING, 'name', 'UTF8', None, ), # 3 - (4, TType.STRING, 'extended', 'UTF8', None, ), # 4 - (5, TType.STRING, 'db', 'UTF8', None, ), # 5 - (6, TType.STRING, 'arguments', 'UTF8', None, ), # 6 - (7, TType.STRING, 'examples', 'UTF8', None, ), # 7 - (8, TType.STRING, 'note', 'UTF8', None, ), # 8 - (9, TType.STRING, 'group', 'UTF8', None, ), # 9 - (10, TType.STRING, 'since', 'UTF8', None, ), # 10 - (11, TType.STRING, 'deprecated', 'UTF8', None, ), # 11 - (12, TType.STRING, 'source', 'UTF8', None, ), # 12 -) -all_structs.append(TDBSqlConfValue) -TDBSqlConfValue.thrift_spec = ( - None, # 0 - (1, TType.STRING, 'value', 'UTF8', None, ), # 1 -) -all_structs.append(TDBSqlSessionConf) -TDBSqlSessionConf.thrift_spec = ( - None, # 0 - (1, TType.MAP, 'confs', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 1 - (2, TType.LIST, 'tempViews', (TType.STRUCT, [TDBSqlTempView, None], False), None, ), # 2 - (3, TType.STRING, 'currentDatabase', 'UTF8', None, ), # 3 - (4, TType.STRING, 'currentCatalog', 'UTF8', None, ), # 4 - (5, TType.STRUCT, 'sessionCapabilities', [TDBSqlSessionCapabilities, None], None, ), # 5 - (6, TType.LIST, 'expressionsInfos', (TType.STRUCT, [TExpressionInfo, None], False), None, ), # 6 - (7, TType.MAP, 'internalConfs', (TType.STRING, 'UTF8', TType.STRUCT, [TDBSqlConfValue, None], False), None, ), # 7 -) -all_structs.append(TStatus) -TStatus.thrift_spec = ( - None, # 0 - (1, TType.I32, 'statusCode', None, None, ), # 1 - (2, TType.LIST, 'infoMessages', (TType.STRING, 'UTF8', False), None, ), # 2 - (3, TType.STRING, 'sqlState', 'UTF8', None, ), # 3 - (4, TType.I32, 'errorCode', None, None, ), # 4 - (5, TType.STRING, 'errorMessage', 'UTF8', None, ), # 5 - (6, TType.STRING, 'displayMessage', 'UTF8', None, ), # 6 - None, # 7 - None, # 8 - None, # 9 - None, # 10 - None, # 11 - None, # 12 - None, # 13 - None, # 14 - None, # 15 - None, # 16 - None, # 17 - None, # 18 - None, # 19 - None, # 20 - None, # 21 - None, # 22 - None, # 23 - None, # 24 - None, # 25 - None, # 26 - None, # 27 - None, # 28 - None, # 29 - None, # 30 - None, # 31 - None, # 32 - None, # 33 - None, # 34 - None, # 35 - None, # 36 - None, # 37 - None, # 38 - None, # 39 - None, # 40 - None, # 41 - None, # 42 - None, # 43 - None, # 44 - None, # 45 - None, # 46 - None, # 47 - None, # 48 - None, # 49 - None, # 50 - None, # 51 - None, # 52 - None, # 53 - None, # 54 - None, # 55 - None, # 56 - None, # 57 - None, # 58 - None, # 59 - None, # 60 - None, # 61 - None, # 62 - None, # 63 - None, # 64 - None, # 65 - None, # 66 - None, # 67 - None, # 68 - None, # 69 - None, # 70 - None, # 71 - None, # 72 - None, # 73 - None, # 74 - None, # 75 - None, # 76 - None, # 77 - None, # 78 - None, # 79 - None, # 80 - None, # 81 - None, # 82 - None, # 83 - None, # 84 - None, # 85 - None, # 86 - None, # 87 - None, # 88 - None, # 89 - None, # 90 - None, # 91 - None, # 92 - None, # 93 - None, # 94 - None, # 95 - None, # 96 - None, # 97 - None, # 98 - None, # 99 - None, # 100 - None, # 101 - None, # 102 - None, # 103 - None, # 104 - None, # 105 - None, # 106 - None, # 107 - None, # 108 - None, # 109 - None, # 110 - None, # 111 - None, # 112 - None, # 113 - None, # 114 - None, # 115 - None, # 116 - None, # 117 - None, # 118 - None, # 119 - None, # 120 - None, # 121 - None, # 122 - None, # 123 - None, # 124 - None, # 125 - None, # 126 - None, # 127 - None, # 128 - None, # 129 - None, # 130 - None, # 131 - None, # 132 - None, # 133 - None, # 134 - None, # 135 - None, # 136 - None, # 137 - None, # 138 - None, # 139 - None, # 140 - None, # 141 - None, # 142 - None, # 143 - None, # 144 - None, # 145 - None, # 146 - None, # 147 - None, # 148 - None, # 149 - None, # 150 - None, # 151 - None, # 152 - None, # 153 - None, # 154 - None, # 155 - None, # 156 - None, # 157 - None, # 158 - None, # 159 - None, # 160 - None, # 161 - None, # 162 - None, # 163 - None, # 164 - None, # 165 - None, # 166 - None, # 167 - None, # 168 - None, # 169 - None, # 170 - None, # 171 - None, # 172 - None, # 173 - None, # 174 - None, # 175 - None, # 176 - None, # 177 - None, # 178 - None, # 179 - None, # 180 - None, # 181 - None, # 182 - None, # 183 - None, # 184 - None, # 185 - None, # 186 - None, # 187 - None, # 188 - None, # 189 - None, # 190 - None, # 191 - None, # 192 - None, # 193 - None, # 194 - None, # 195 - None, # 196 - None, # 197 - None, # 198 - None, # 199 - None, # 200 - None, # 201 - None, # 202 - None, # 203 - None, # 204 - None, # 205 - None, # 206 - None, # 207 - None, # 208 - None, # 209 - None, # 210 - None, # 211 - None, # 212 - None, # 213 - None, # 214 - None, # 215 - None, # 216 - None, # 217 - None, # 218 - None, # 219 - None, # 220 - None, # 221 - None, # 222 - None, # 223 - None, # 224 - None, # 225 - None, # 226 - None, # 227 - None, # 228 - None, # 229 - None, # 230 - None, # 231 - None, # 232 - None, # 233 - None, # 234 - None, # 235 - None, # 236 - None, # 237 - None, # 238 - None, # 239 - None, # 240 - None, # 241 - None, # 242 - None, # 243 - None, # 244 - None, # 245 - None, # 246 - None, # 247 - None, # 248 - None, # 249 - None, # 250 - None, # 251 - None, # 252 - None, # 253 - None, # 254 - None, # 255 - None, # 256 - None, # 257 - None, # 258 - None, # 259 - None, # 260 - None, # 261 - None, # 262 - None, # 263 - None, # 264 - None, # 265 - None, # 266 - None, # 267 - None, # 268 - None, # 269 - None, # 270 - None, # 271 - None, # 272 - None, # 273 - None, # 274 - None, # 275 - None, # 276 - None, # 277 - None, # 278 - None, # 279 - None, # 280 - None, # 281 - None, # 282 - None, # 283 - None, # 284 - None, # 285 - None, # 286 - None, # 287 - None, # 288 - None, # 289 - None, # 290 - None, # 291 - None, # 292 - None, # 293 - None, # 294 - None, # 295 - None, # 296 - None, # 297 - None, # 298 - None, # 299 - None, # 300 - None, # 301 - None, # 302 - None, # 303 - None, # 304 - None, # 305 - None, # 306 - None, # 307 - None, # 308 - None, # 309 - None, # 310 - None, # 311 - None, # 312 - None, # 313 - None, # 314 - None, # 315 - None, # 316 - None, # 317 - None, # 318 - None, # 319 - None, # 320 - None, # 321 - None, # 322 - None, # 323 - None, # 324 - None, # 325 - None, # 326 - None, # 327 - None, # 328 - None, # 329 - None, # 330 - None, # 331 - None, # 332 - None, # 333 - None, # 334 - None, # 335 - None, # 336 - None, # 337 - None, # 338 - None, # 339 - None, # 340 - None, # 341 - None, # 342 - None, # 343 - None, # 344 - None, # 345 - None, # 346 - None, # 347 - None, # 348 - None, # 349 - None, # 350 - None, # 351 - None, # 352 - None, # 353 - None, # 354 - None, # 355 - None, # 356 - None, # 357 - None, # 358 - None, # 359 - None, # 360 - None, # 361 - None, # 362 - None, # 363 - None, # 364 - None, # 365 - None, # 366 - None, # 367 - None, # 368 - None, # 369 - None, # 370 - None, # 371 - None, # 372 - None, # 373 - None, # 374 - None, # 375 - None, # 376 - None, # 377 - None, # 378 - None, # 379 - None, # 380 - None, # 381 - None, # 382 - None, # 383 - None, # 384 - None, # 385 - None, # 386 - None, # 387 - None, # 388 - None, # 389 - None, # 390 - None, # 391 - None, # 392 - None, # 393 - None, # 394 - None, # 395 - None, # 396 - None, # 397 - None, # 398 - None, # 399 - None, # 400 - None, # 401 - None, # 402 - None, # 403 - None, # 404 - None, # 405 - None, # 406 - None, # 407 - None, # 408 - None, # 409 - None, # 410 - None, # 411 - None, # 412 - None, # 413 - None, # 414 - None, # 415 - None, # 416 - None, # 417 - None, # 418 - None, # 419 - None, # 420 - None, # 421 - None, # 422 - None, # 423 - None, # 424 - None, # 425 - None, # 426 - None, # 427 - None, # 428 - None, # 429 - None, # 430 - None, # 431 - None, # 432 - None, # 433 - None, # 434 - None, # 435 - None, # 436 - None, # 437 - None, # 438 - None, # 439 - None, # 440 - None, # 441 - None, # 442 - None, # 443 - None, # 444 - None, # 445 - None, # 446 - None, # 447 - None, # 448 - None, # 449 - None, # 450 - None, # 451 - None, # 452 - None, # 453 - None, # 454 - None, # 455 - None, # 456 - None, # 457 - None, # 458 - None, # 459 - None, # 460 - None, # 461 - None, # 462 - None, # 463 - None, # 464 - None, # 465 - None, # 466 - None, # 467 - None, # 468 - None, # 469 - None, # 470 - None, # 471 - None, # 472 - None, # 473 - None, # 474 - None, # 475 - None, # 476 - None, # 477 - None, # 478 - None, # 479 - None, # 480 - None, # 481 - None, # 482 - None, # 483 - None, # 484 - None, # 485 - None, # 486 - None, # 487 - None, # 488 - None, # 489 - None, # 490 - None, # 491 - None, # 492 - None, # 493 - None, # 494 - None, # 495 - None, # 496 - None, # 497 - None, # 498 - None, # 499 - None, # 500 - None, # 501 - None, # 502 - None, # 503 - None, # 504 - None, # 505 - None, # 506 - None, # 507 - None, # 508 - None, # 509 - None, # 510 - None, # 511 - None, # 512 - None, # 513 - None, # 514 - None, # 515 - None, # 516 - None, # 517 - None, # 518 - None, # 519 - None, # 520 - None, # 521 - None, # 522 - None, # 523 - None, # 524 - None, # 525 - None, # 526 - None, # 527 - None, # 528 - None, # 529 - None, # 530 - None, # 531 - None, # 532 - None, # 533 - None, # 534 - None, # 535 - None, # 536 - None, # 537 - None, # 538 - None, # 539 - None, # 540 - None, # 541 - None, # 542 - None, # 543 - None, # 544 - None, # 545 - None, # 546 - None, # 547 - None, # 548 - None, # 549 - None, # 550 - None, # 551 - None, # 552 - None, # 553 - None, # 554 - None, # 555 - None, # 556 - None, # 557 - None, # 558 - None, # 559 - None, # 560 - None, # 561 - None, # 562 - None, # 563 - None, # 564 - None, # 565 - None, # 566 - None, # 567 - None, # 568 - None, # 569 - None, # 570 - None, # 571 - None, # 572 - None, # 573 - None, # 574 - None, # 575 - None, # 576 - None, # 577 - None, # 578 - None, # 579 - None, # 580 - None, # 581 - None, # 582 - None, # 583 - None, # 584 - None, # 585 - None, # 586 - None, # 587 - None, # 588 - None, # 589 - None, # 590 - None, # 591 - None, # 592 - None, # 593 - None, # 594 - None, # 595 - None, # 596 - None, # 597 - None, # 598 - None, # 599 - None, # 600 - None, # 601 - None, # 602 - None, # 603 - None, # 604 - None, # 605 - None, # 606 - None, # 607 - None, # 608 - None, # 609 - None, # 610 - None, # 611 - None, # 612 - None, # 613 - None, # 614 - None, # 615 - None, # 616 - None, # 617 - None, # 618 - None, # 619 - None, # 620 - None, # 621 - None, # 622 - None, # 623 - None, # 624 - None, # 625 - None, # 626 - None, # 627 - None, # 628 - None, # 629 - None, # 630 - None, # 631 - None, # 632 - None, # 633 - None, # 634 - None, # 635 - None, # 636 - None, # 637 - None, # 638 - None, # 639 - None, # 640 - None, # 641 - None, # 642 - None, # 643 - None, # 644 - None, # 645 - None, # 646 - None, # 647 - None, # 648 - None, # 649 - None, # 650 - None, # 651 - None, # 652 - None, # 653 - None, # 654 - None, # 655 - None, # 656 - None, # 657 - None, # 658 - None, # 659 - None, # 660 - None, # 661 - None, # 662 - None, # 663 - None, # 664 - None, # 665 - None, # 666 - None, # 667 - None, # 668 - None, # 669 - None, # 670 - None, # 671 - None, # 672 - None, # 673 - None, # 674 - None, # 675 - None, # 676 - None, # 677 - None, # 678 - None, # 679 - None, # 680 - None, # 681 - None, # 682 - None, # 683 - None, # 684 - None, # 685 - None, # 686 - None, # 687 - None, # 688 - None, # 689 - None, # 690 - None, # 691 - None, # 692 - None, # 693 - None, # 694 - None, # 695 - None, # 696 - None, # 697 - None, # 698 - None, # 699 - None, # 700 - None, # 701 - None, # 702 - None, # 703 - None, # 704 - None, # 705 - None, # 706 - None, # 707 - None, # 708 - None, # 709 - None, # 710 - None, # 711 - None, # 712 - None, # 713 - None, # 714 - None, # 715 - None, # 716 - None, # 717 - None, # 718 - None, # 719 - None, # 720 - None, # 721 - None, # 722 - None, # 723 - None, # 724 - None, # 725 - None, # 726 - None, # 727 - None, # 728 - None, # 729 - None, # 730 - None, # 731 - None, # 732 - None, # 733 - None, # 734 - None, # 735 - None, # 736 - None, # 737 - None, # 738 - None, # 739 - None, # 740 - None, # 741 - None, # 742 - None, # 743 - None, # 744 - None, # 745 - None, # 746 - None, # 747 - None, # 748 - None, # 749 - None, # 750 - None, # 751 - None, # 752 - None, # 753 - None, # 754 - None, # 755 - None, # 756 - None, # 757 - None, # 758 - None, # 759 - None, # 760 - None, # 761 - None, # 762 - None, # 763 - None, # 764 - None, # 765 - None, # 766 - None, # 767 - None, # 768 - None, # 769 - None, # 770 - None, # 771 - None, # 772 - None, # 773 - None, # 774 - None, # 775 - None, # 776 - None, # 777 - None, # 778 - None, # 779 - None, # 780 - None, # 781 - None, # 782 - None, # 783 - None, # 784 - None, # 785 - None, # 786 - None, # 787 - None, # 788 - None, # 789 - None, # 790 - None, # 791 - None, # 792 - None, # 793 - None, # 794 - None, # 795 - None, # 796 - None, # 797 - None, # 798 - None, # 799 - None, # 800 - None, # 801 - None, # 802 - None, # 803 - None, # 804 - None, # 805 - None, # 806 - None, # 807 - None, # 808 - None, # 809 - None, # 810 - None, # 811 - None, # 812 - None, # 813 - None, # 814 - None, # 815 - None, # 816 - None, # 817 - None, # 818 - None, # 819 - None, # 820 - None, # 821 - None, # 822 - None, # 823 - None, # 824 - None, # 825 - None, # 826 - None, # 827 - None, # 828 - None, # 829 - None, # 830 - None, # 831 - None, # 832 - None, # 833 - None, # 834 - None, # 835 - None, # 836 - None, # 837 - None, # 838 - None, # 839 - None, # 840 - None, # 841 - None, # 842 - None, # 843 - None, # 844 - None, # 845 - None, # 846 - None, # 847 - None, # 848 - None, # 849 - None, # 850 - None, # 851 - None, # 852 - None, # 853 - None, # 854 - None, # 855 - None, # 856 - None, # 857 - None, # 858 - None, # 859 - None, # 860 - None, # 861 - None, # 862 - None, # 863 - None, # 864 - None, # 865 - None, # 866 - None, # 867 - None, # 868 - None, # 869 - None, # 870 - None, # 871 - None, # 872 - None, # 873 - None, # 874 - None, # 875 - None, # 876 - None, # 877 - None, # 878 - None, # 879 - None, # 880 - None, # 881 - None, # 882 - None, # 883 - None, # 884 - None, # 885 - None, # 886 - None, # 887 - None, # 888 - None, # 889 - None, # 890 - None, # 891 - None, # 892 - None, # 893 - None, # 894 - None, # 895 - None, # 896 - None, # 897 - None, # 898 - None, # 899 - None, # 900 - None, # 901 - None, # 902 - None, # 903 - None, # 904 - None, # 905 - None, # 906 - None, # 907 - None, # 908 - None, # 909 - None, # 910 - None, # 911 - None, # 912 - None, # 913 - None, # 914 - None, # 915 - None, # 916 - None, # 917 - None, # 918 - None, # 919 - None, # 920 - None, # 921 - None, # 922 - None, # 923 - None, # 924 - None, # 925 - None, # 926 - None, # 927 - None, # 928 - None, # 929 - None, # 930 - None, # 931 - None, # 932 - None, # 933 - None, # 934 - None, # 935 - None, # 936 - None, # 937 - None, # 938 - None, # 939 - None, # 940 - None, # 941 - None, # 942 - None, # 943 - None, # 944 - None, # 945 - None, # 946 - None, # 947 - None, # 948 - None, # 949 - None, # 950 - None, # 951 - None, # 952 - None, # 953 - None, # 954 - None, # 955 - None, # 956 - None, # 957 - None, # 958 - None, # 959 - None, # 960 - None, # 961 - None, # 962 - None, # 963 - None, # 964 - None, # 965 - None, # 966 - None, # 967 - None, # 968 - None, # 969 - None, # 970 - None, # 971 - None, # 972 - None, # 973 - None, # 974 - None, # 975 - None, # 976 - None, # 977 - None, # 978 - None, # 979 - None, # 980 - None, # 981 - None, # 982 - None, # 983 - None, # 984 - None, # 985 - None, # 986 - None, # 987 - None, # 988 - None, # 989 - None, # 990 - None, # 991 - None, # 992 - None, # 993 - None, # 994 - None, # 995 - None, # 996 - None, # 997 - None, # 998 - None, # 999 - None, # 1000 - None, # 1001 - None, # 1002 - None, # 1003 - None, # 1004 - None, # 1005 - None, # 1006 - None, # 1007 - None, # 1008 - None, # 1009 - None, # 1010 - None, # 1011 - None, # 1012 - None, # 1013 - None, # 1014 - None, # 1015 - None, # 1016 - None, # 1017 - None, # 1018 - None, # 1019 - None, # 1020 - None, # 1021 - None, # 1022 - None, # 1023 - None, # 1024 - None, # 1025 - None, # 1026 - None, # 1027 - None, # 1028 - None, # 1029 - None, # 1030 - None, # 1031 - None, # 1032 - None, # 1033 - None, # 1034 - None, # 1035 - None, # 1036 - None, # 1037 - None, # 1038 - None, # 1039 - None, # 1040 - None, # 1041 - None, # 1042 - None, # 1043 - None, # 1044 - None, # 1045 - None, # 1046 - None, # 1047 - None, # 1048 - None, # 1049 - None, # 1050 - None, # 1051 - None, # 1052 - None, # 1053 - None, # 1054 - None, # 1055 - None, # 1056 - None, # 1057 - None, # 1058 - None, # 1059 - None, # 1060 - None, # 1061 - None, # 1062 - None, # 1063 - None, # 1064 - None, # 1065 - None, # 1066 - None, # 1067 - None, # 1068 - None, # 1069 - None, # 1070 - None, # 1071 - None, # 1072 - None, # 1073 - None, # 1074 - None, # 1075 - None, # 1076 - None, # 1077 - None, # 1078 - None, # 1079 - None, # 1080 - None, # 1081 - None, # 1082 - None, # 1083 - None, # 1084 - None, # 1085 - None, # 1086 - None, # 1087 - None, # 1088 - None, # 1089 - None, # 1090 - None, # 1091 - None, # 1092 - None, # 1093 - None, # 1094 - None, # 1095 - None, # 1096 - None, # 1097 - None, # 1098 - None, # 1099 - None, # 1100 - None, # 1101 - None, # 1102 - None, # 1103 - None, # 1104 - None, # 1105 - None, # 1106 - None, # 1107 - None, # 1108 - None, # 1109 - None, # 1110 - None, # 1111 - None, # 1112 - None, # 1113 - None, # 1114 - None, # 1115 - None, # 1116 - None, # 1117 - None, # 1118 - None, # 1119 - None, # 1120 - None, # 1121 - None, # 1122 - None, # 1123 - None, # 1124 - None, # 1125 - None, # 1126 - None, # 1127 - None, # 1128 - None, # 1129 - None, # 1130 - None, # 1131 - None, # 1132 - None, # 1133 - None, # 1134 - None, # 1135 - None, # 1136 - None, # 1137 - None, # 1138 - None, # 1139 - None, # 1140 - None, # 1141 - None, # 1142 - None, # 1143 - None, # 1144 - None, # 1145 - None, # 1146 - None, # 1147 - None, # 1148 - None, # 1149 - None, # 1150 - None, # 1151 - None, # 1152 - None, # 1153 - None, # 1154 - None, # 1155 - None, # 1156 - None, # 1157 - None, # 1158 - None, # 1159 - None, # 1160 - None, # 1161 - None, # 1162 - None, # 1163 - None, # 1164 - None, # 1165 - None, # 1166 - None, # 1167 - None, # 1168 - None, # 1169 - None, # 1170 - None, # 1171 - None, # 1172 - None, # 1173 - None, # 1174 - None, # 1175 - None, # 1176 - None, # 1177 - None, # 1178 - None, # 1179 - None, # 1180 - None, # 1181 - None, # 1182 - None, # 1183 - None, # 1184 - None, # 1185 - None, # 1186 - None, # 1187 - None, # 1188 - None, # 1189 - None, # 1190 - None, # 1191 - None, # 1192 - None, # 1193 - None, # 1194 - None, # 1195 - None, # 1196 - None, # 1197 - None, # 1198 - None, # 1199 - None, # 1200 - None, # 1201 - None, # 1202 - None, # 1203 - None, # 1204 - None, # 1205 - None, # 1206 - None, # 1207 - None, # 1208 - None, # 1209 - None, # 1210 - None, # 1211 - None, # 1212 - None, # 1213 - None, # 1214 - None, # 1215 - None, # 1216 - None, # 1217 - None, # 1218 - None, # 1219 - None, # 1220 - None, # 1221 - None, # 1222 - None, # 1223 - None, # 1224 - None, # 1225 - None, # 1226 - None, # 1227 - None, # 1228 - None, # 1229 - None, # 1230 - None, # 1231 - None, # 1232 - None, # 1233 - None, # 1234 - None, # 1235 - None, # 1236 - None, # 1237 - None, # 1238 - None, # 1239 - None, # 1240 - None, # 1241 - None, # 1242 - None, # 1243 - None, # 1244 - None, # 1245 - None, # 1246 - None, # 1247 - None, # 1248 - None, # 1249 - None, # 1250 - None, # 1251 - None, # 1252 - None, # 1253 - None, # 1254 - None, # 1255 - None, # 1256 - None, # 1257 - None, # 1258 - None, # 1259 - None, # 1260 - None, # 1261 - None, # 1262 - None, # 1263 - None, # 1264 - None, # 1265 - None, # 1266 - None, # 1267 - None, # 1268 - None, # 1269 - None, # 1270 - None, # 1271 - None, # 1272 - None, # 1273 - None, # 1274 - None, # 1275 - None, # 1276 - None, # 1277 - None, # 1278 - None, # 1279 - None, # 1280 - (1281, TType.STRING, 'errorDetailsJson', 'UTF8', None, ), # 1281 - None, # 1282 - None, # 1283 - None, # 1284 - None, # 1285 - None, # 1286 - None, # 1287 - None, # 1288 - None, # 1289 - None, # 1290 - None, # 1291 - None, # 1292 - None, # 1293 - None, # 1294 - None, # 1295 - None, # 1296 - None, # 1297 - None, # 1298 - None, # 1299 - None, # 1300 - None, # 1301 - None, # 1302 - None, # 1303 - None, # 1304 - None, # 1305 - None, # 1306 - None, # 1307 - None, # 1308 - None, # 1309 - None, # 1310 - None, # 1311 - None, # 1312 - None, # 1313 - None, # 1314 - None, # 1315 - None, # 1316 - None, # 1317 - None, # 1318 - None, # 1319 - None, # 1320 - None, # 1321 - None, # 1322 - None, # 1323 - None, # 1324 - None, # 1325 - None, # 1326 - None, # 1327 - None, # 1328 - None, # 1329 - None, # 1330 - None, # 1331 - None, # 1332 - None, # 1333 - None, # 1334 - None, # 1335 - None, # 1336 - None, # 1337 - None, # 1338 - None, # 1339 - None, # 1340 - None, # 1341 - None, # 1342 - None, # 1343 - None, # 1344 - None, # 1345 - None, # 1346 - None, # 1347 - None, # 1348 - None, # 1349 - None, # 1350 - None, # 1351 - None, # 1352 - None, # 1353 - None, # 1354 - None, # 1355 - None, # 1356 - None, # 1357 - None, # 1358 - None, # 1359 - None, # 1360 - None, # 1361 - None, # 1362 - None, # 1363 - None, # 1364 - None, # 1365 - None, # 1366 - None, # 1367 - None, # 1368 - None, # 1369 - None, # 1370 - None, # 1371 - None, # 1372 - None, # 1373 - None, # 1374 - None, # 1375 - None, # 1376 - None, # 1377 - None, # 1378 - None, # 1379 - None, # 1380 - None, # 1381 - None, # 1382 - None, # 1383 - None, # 1384 - None, # 1385 - None, # 1386 - None, # 1387 - None, # 1388 - None, # 1389 - None, # 1390 - None, # 1391 - None, # 1392 - None, # 1393 - None, # 1394 - None, # 1395 - None, # 1396 - None, # 1397 - None, # 1398 - None, # 1399 - None, # 1400 - None, # 1401 - None, # 1402 - None, # 1403 - None, # 1404 - None, # 1405 - None, # 1406 - None, # 1407 - None, # 1408 - None, # 1409 - None, # 1410 - None, # 1411 - None, # 1412 - None, # 1413 - None, # 1414 - None, # 1415 - None, # 1416 - None, # 1417 - None, # 1418 - None, # 1419 - None, # 1420 - None, # 1421 - None, # 1422 - None, # 1423 - None, # 1424 - None, # 1425 - None, # 1426 - None, # 1427 - None, # 1428 - None, # 1429 - None, # 1430 - None, # 1431 - None, # 1432 - None, # 1433 - None, # 1434 - None, # 1435 - None, # 1436 - None, # 1437 - None, # 1438 - None, # 1439 - None, # 1440 - None, # 1441 - None, # 1442 - None, # 1443 - None, # 1444 - None, # 1445 - None, # 1446 - None, # 1447 - None, # 1448 - None, # 1449 - None, # 1450 - None, # 1451 - None, # 1452 - None, # 1453 - None, # 1454 - None, # 1455 - None, # 1456 - None, # 1457 - None, # 1458 - None, # 1459 - None, # 1460 - None, # 1461 - None, # 1462 - None, # 1463 - None, # 1464 - None, # 1465 - None, # 1466 - None, # 1467 - None, # 1468 - None, # 1469 - None, # 1470 - None, # 1471 - None, # 1472 - None, # 1473 - None, # 1474 - None, # 1475 - None, # 1476 - None, # 1477 - None, # 1478 - None, # 1479 - None, # 1480 - None, # 1481 - None, # 1482 - None, # 1483 - None, # 1484 - None, # 1485 - None, # 1486 - None, # 1487 - None, # 1488 - None, # 1489 - None, # 1490 - None, # 1491 - None, # 1492 - None, # 1493 - None, # 1494 - None, # 1495 - None, # 1496 - None, # 1497 - None, # 1498 - None, # 1499 - None, # 1500 - None, # 1501 - None, # 1502 - None, # 1503 - None, # 1504 - None, # 1505 - None, # 1506 - None, # 1507 - None, # 1508 - None, # 1509 - None, # 1510 - None, # 1511 - None, # 1512 - None, # 1513 - None, # 1514 - None, # 1515 - None, # 1516 - None, # 1517 - None, # 1518 - None, # 1519 - None, # 1520 - None, # 1521 - None, # 1522 - None, # 1523 - None, # 1524 - None, # 1525 - None, # 1526 - None, # 1527 - None, # 1528 - None, # 1529 - None, # 1530 - None, # 1531 - None, # 1532 - None, # 1533 - None, # 1534 - None, # 1535 - None, # 1536 - None, # 1537 - None, # 1538 - None, # 1539 - None, # 1540 - None, # 1541 - None, # 1542 - None, # 1543 - None, # 1544 - None, # 1545 - None, # 1546 - None, # 1547 - None, # 1548 - None, # 1549 - None, # 1550 - None, # 1551 - None, # 1552 - None, # 1553 - None, # 1554 - None, # 1555 - None, # 1556 - None, # 1557 - None, # 1558 - None, # 1559 - None, # 1560 - None, # 1561 - None, # 1562 - None, # 1563 - None, # 1564 - None, # 1565 - None, # 1566 - None, # 1567 - None, # 1568 - None, # 1569 - None, # 1570 - None, # 1571 - None, # 1572 - None, # 1573 - None, # 1574 - None, # 1575 - None, # 1576 - None, # 1577 - None, # 1578 - None, # 1579 - None, # 1580 - None, # 1581 - None, # 1582 - None, # 1583 - None, # 1584 - None, # 1585 - None, # 1586 - None, # 1587 - None, # 1588 - None, # 1589 - None, # 1590 - None, # 1591 - None, # 1592 - None, # 1593 - None, # 1594 - None, # 1595 - None, # 1596 - None, # 1597 - None, # 1598 - None, # 1599 - None, # 1600 - None, # 1601 - None, # 1602 - None, # 1603 - None, # 1604 - None, # 1605 - None, # 1606 - None, # 1607 - None, # 1608 - None, # 1609 - None, # 1610 - None, # 1611 - None, # 1612 - None, # 1613 - None, # 1614 - None, # 1615 - None, # 1616 - None, # 1617 - None, # 1618 - None, # 1619 - None, # 1620 - None, # 1621 - None, # 1622 - None, # 1623 - None, # 1624 - None, # 1625 - None, # 1626 - None, # 1627 - None, # 1628 - None, # 1629 - None, # 1630 - None, # 1631 - None, # 1632 - None, # 1633 - None, # 1634 - None, # 1635 - None, # 1636 - None, # 1637 - None, # 1638 - None, # 1639 - None, # 1640 - None, # 1641 - None, # 1642 - None, # 1643 - None, # 1644 - None, # 1645 - None, # 1646 - None, # 1647 - None, # 1648 - None, # 1649 - None, # 1650 - None, # 1651 - None, # 1652 - None, # 1653 - None, # 1654 - None, # 1655 - None, # 1656 - None, # 1657 - None, # 1658 - None, # 1659 - None, # 1660 - None, # 1661 - None, # 1662 - None, # 1663 - None, # 1664 - None, # 1665 - None, # 1666 - None, # 1667 - None, # 1668 - None, # 1669 - None, # 1670 - None, # 1671 - None, # 1672 - None, # 1673 - None, # 1674 - None, # 1675 - None, # 1676 - None, # 1677 - None, # 1678 - None, # 1679 - None, # 1680 - None, # 1681 - None, # 1682 - None, # 1683 - None, # 1684 - None, # 1685 - None, # 1686 - None, # 1687 - None, # 1688 - None, # 1689 - None, # 1690 - None, # 1691 - None, # 1692 - None, # 1693 - None, # 1694 - None, # 1695 - None, # 1696 - None, # 1697 - None, # 1698 - None, # 1699 - None, # 1700 - None, # 1701 - None, # 1702 - None, # 1703 - None, # 1704 - None, # 1705 - None, # 1706 - None, # 1707 - None, # 1708 - None, # 1709 - None, # 1710 - None, # 1711 - None, # 1712 - None, # 1713 - None, # 1714 - None, # 1715 - None, # 1716 - None, # 1717 - None, # 1718 - None, # 1719 - None, # 1720 - None, # 1721 - None, # 1722 - None, # 1723 - None, # 1724 - None, # 1725 - None, # 1726 - None, # 1727 - None, # 1728 - None, # 1729 - None, # 1730 - None, # 1731 - None, # 1732 - None, # 1733 - None, # 1734 - None, # 1735 - None, # 1736 - None, # 1737 - None, # 1738 - None, # 1739 - None, # 1740 - None, # 1741 - None, # 1742 - None, # 1743 - None, # 1744 - None, # 1745 - None, # 1746 - None, # 1747 - None, # 1748 - None, # 1749 - None, # 1750 - None, # 1751 - None, # 1752 - None, # 1753 - None, # 1754 - None, # 1755 - None, # 1756 - None, # 1757 - None, # 1758 - None, # 1759 - None, # 1760 - None, # 1761 - None, # 1762 - None, # 1763 - None, # 1764 - None, # 1765 - None, # 1766 - None, # 1767 - None, # 1768 - None, # 1769 - None, # 1770 - None, # 1771 - None, # 1772 - None, # 1773 - None, # 1774 - None, # 1775 - None, # 1776 - None, # 1777 - None, # 1778 - None, # 1779 - None, # 1780 - None, # 1781 - None, # 1782 - None, # 1783 - None, # 1784 - None, # 1785 - None, # 1786 - None, # 1787 - None, # 1788 - None, # 1789 - None, # 1790 - None, # 1791 - None, # 1792 - None, # 1793 - None, # 1794 - None, # 1795 - None, # 1796 - None, # 1797 - None, # 1798 - None, # 1799 - None, # 1800 - None, # 1801 - None, # 1802 - None, # 1803 - None, # 1804 - None, # 1805 - None, # 1806 - None, # 1807 - None, # 1808 - None, # 1809 - None, # 1810 - None, # 1811 - None, # 1812 - None, # 1813 - None, # 1814 - None, # 1815 - None, # 1816 - None, # 1817 - None, # 1818 - None, # 1819 - None, # 1820 - None, # 1821 - None, # 1822 - None, # 1823 - None, # 1824 - None, # 1825 - None, # 1826 - None, # 1827 - None, # 1828 - None, # 1829 - None, # 1830 - None, # 1831 - None, # 1832 - None, # 1833 - None, # 1834 - None, # 1835 - None, # 1836 - None, # 1837 - None, # 1838 - None, # 1839 - None, # 1840 - None, # 1841 - None, # 1842 - None, # 1843 - None, # 1844 - None, # 1845 - None, # 1846 - None, # 1847 - None, # 1848 - None, # 1849 - None, # 1850 - None, # 1851 - None, # 1852 - None, # 1853 - None, # 1854 - None, # 1855 - None, # 1856 - None, # 1857 - None, # 1858 - None, # 1859 - None, # 1860 - None, # 1861 - None, # 1862 - None, # 1863 - None, # 1864 - None, # 1865 - None, # 1866 - None, # 1867 - None, # 1868 - None, # 1869 - None, # 1870 - None, # 1871 - None, # 1872 - None, # 1873 - None, # 1874 - None, # 1875 - None, # 1876 - None, # 1877 - None, # 1878 - None, # 1879 - None, # 1880 - None, # 1881 - None, # 1882 - None, # 1883 - None, # 1884 - None, # 1885 - None, # 1886 - None, # 1887 - None, # 1888 - None, # 1889 - None, # 1890 - None, # 1891 - None, # 1892 - None, # 1893 - None, # 1894 - None, # 1895 - None, # 1896 - None, # 1897 - None, # 1898 - None, # 1899 - None, # 1900 - None, # 1901 - None, # 1902 - None, # 1903 - None, # 1904 - None, # 1905 - None, # 1906 - None, # 1907 - None, # 1908 - None, # 1909 - None, # 1910 - None, # 1911 - None, # 1912 - None, # 1913 - None, # 1914 - None, # 1915 - None, # 1916 - None, # 1917 - None, # 1918 - None, # 1919 - None, # 1920 - None, # 1921 - None, # 1922 - None, # 1923 - None, # 1924 - None, # 1925 - None, # 1926 - None, # 1927 - None, # 1928 - None, # 1929 - None, # 1930 - None, # 1931 - None, # 1932 - None, # 1933 - None, # 1934 - None, # 1935 - None, # 1936 - None, # 1937 - None, # 1938 - None, # 1939 - None, # 1940 - None, # 1941 - None, # 1942 - None, # 1943 - None, # 1944 - None, # 1945 - None, # 1946 - None, # 1947 - None, # 1948 - None, # 1949 - None, # 1950 - None, # 1951 - None, # 1952 - None, # 1953 - None, # 1954 - None, # 1955 - None, # 1956 - None, # 1957 - None, # 1958 - None, # 1959 - None, # 1960 - None, # 1961 - None, # 1962 - None, # 1963 - None, # 1964 - None, # 1965 - None, # 1966 - None, # 1967 - None, # 1968 - None, # 1969 - None, # 1970 - None, # 1971 - None, # 1972 - None, # 1973 - None, # 1974 - None, # 1975 - None, # 1976 - None, # 1977 - None, # 1978 - None, # 1979 - None, # 1980 - None, # 1981 - None, # 1982 - None, # 1983 - None, # 1984 - None, # 1985 - None, # 1986 - None, # 1987 - None, # 1988 - None, # 1989 - None, # 1990 - None, # 1991 - None, # 1992 - None, # 1993 - None, # 1994 - None, # 1995 - None, # 1996 - None, # 1997 - None, # 1998 - None, # 1999 - None, # 2000 - None, # 2001 - None, # 2002 - None, # 2003 - None, # 2004 - None, # 2005 - None, # 2006 - None, # 2007 - None, # 2008 - None, # 2009 - None, # 2010 - None, # 2011 - None, # 2012 - None, # 2013 - None, # 2014 - None, # 2015 - None, # 2016 - None, # 2017 - None, # 2018 - None, # 2019 - None, # 2020 - None, # 2021 - None, # 2022 - None, # 2023 - None, # 2024 - None, # 2025 - None, # 2026 - None, # 2027 - None, # 2028 - None, # 2029 - None, # 2030 - None, # 2031 - None, # 2032 - None, # 2033 - None, # 2034 - None, # 2035 - None, # 2036 - None, # 2037 - None, # 2038 - None, # 2039 - None, # 2040 - None, # 2041 - None, # 2042 - None, # 2043 - None, # 2044 - None, # 2045 - None, # 2046 - None, # 2047 - None, # 2048 - None, # 2049 - None, # 2050 - None, # 2051 - None, # 2052 - None, # 2053 - None, # 2054 - None, # 2055 - None, # 2056 - None, # 2057 - None, # 2058 - None, # 2059 - None, # 2060 - None, # 2061 - None, # 2062 - None, # 2063 - None, # 2064 - None, # 2065 - None, # 2066 - None, # 2067 - None, # 2068 - None, # 2069 - None, # 2070 - None, # 2071 - None, # 2072 - None, # 2073 - None, # 2074 - None, # 2075 - None, # 2076 - None, # 2077 - None, # 2078 - None, # 2079 - None, # 2080 - None, # 2081 - None, # 2082 - None, # 2083 - None, # 2084 - None, # 2085 - None, # 2086 - None, # 2087 - None, # 2088 - None, # 2089 - None, # 2090 - None, # 2091 - None, # 2092 - None, # 2093 - None, # 2094 - None, # 2095 - None, # 2096 - None, # 2097 - None, # 2098 - None, # 2099 - None, # 2100 - None, # 2101 - None, # 2102 - None, # 2103 - None, # 2104 - None, # 2105 - None, # 2106 - None, # 2107 - None, # 2108 - None, # 2109 - None, # 2110 - None, # 2111 - None, # 2112 - None, # 2113 - None, # 2114 - None, # 2115 - None, # 2116 - None, # 2117 - None, # 2118 - None, # 2119 - None, # 2120 - None, # 2121 - None, # 2122 - None, # 2123 - None, # 2124 - None, # 2125 - None, # 2126 - None, # 2127 - None, # 2128 - None, # 2129 - None, # 2130 - None, # 2131 - None, # 2132 - None, # 2133 - None, # 2134 - None, # 2135 - None, # 2136 - None, # 2137 - None, # 2138 - None, # 2139 - None, # 2140 - None, # 2141 - None, # 2142 - None, # 2143 - None, # 2144 - None, # 2145 - None, # 2146 - None, # 2147 - None, # 2148 - None, # 2149 - None, # 2150 - None, # 2151 - None, # 2152 - None, # 2153 - None, # 2154 - None, # 2155 - None, # 2156 - None, # 2157 - None, # 2158 - None, # 2159 - None, # 2160 - None, # 2161 - None, # 2162 - None, # 2163 - None, # 2164 - None, # 2165 - None, # 2166 - None, # 2167 - None, # 2168 - None, # 2169 - None, # 2170 - None, # 2171 - None, # 2172 - None, # 2173 - None, # 2174 - None, # 2175 - None, # 2176 - None, # 2177 - None, # 2178 - None, # 2179 - None, # 2180 - None, # 2181 - None, # 2182 - None, # 2183 - None, # 2184 - None, # 2185 - None, # 2186 - None, # 2187 - None, # 2188 - None, # 2189 - None, # 2190 - None, # 2191 - None, # 2192 - None, # 2193 - None, # 2194 - None, # 2195 - None, # 2196 - None, # 2197 - None, # 2198 - None, # 2199 - None, # 2200 - None, # 2201 - None, # 2202 - None, # 2203 - None, # 2204 - None, # 2205 - None, # 2206 - None, # 2207 - None, # 2208 - None, # 2209 - None, # 2210 - None, # 2211 - None, # 2212 - None, # 2213 - None, # 2214 - None, # 2215 - None, # 2216 - None, # 2217 - None, # 2218 - None, # 2219 - None, # 2220 - None, # 2221 - None, # 2222 - None, # 2223 - None, # 2224 - None, # 2225 - None, # 2226 - None, # 2227 - None, # 2228 - None, # 2229 - None, # 2230 - None, # 2231 - None, # 2232 - None, # 2233 - None, # 2234 - None, # 2235 - None, # 2236 - None, # 2237 - None, # 2238 - None, # 2239 - None, # 2240 - None, # 2241 - None, # 2242 - None, # 2243 - None, # 2244 - None, # 2245 - None, # 2246 - None, # 2247 - None, # 2248 - None, # 2249 - None, # 2250 - None, # 2251 - None, # 2252 - None, # 2253 - None, # 2254 - None, # 2255 - None, # 2256 - None, # 2257 - None, # 2258 - None, # 2259 - None, # 2260 - None, # 2261 - None, # 2262 - None, # 2263 - None, # 2264 - None, # 2265 - None, # 2266 - None, # 2267 - None, # 2268 - None, # 2269 - None, # 2270 - None, # 2271 - None, # 2272 - None, # 2273 - None, # 2274 - None, # 2275 - None, # 2276 - None, # 2277 - None, # 2278 - None, # 2279 - None, # 2280 - None, # 2281 - None, # 2282 - None, # 2283 - None, # 2284 - None, # 2285 - None, # 2286 - None, # 2287 - None, # 2288 - None, # 2289 - None, # 2290 - None, # 2291 - None, # 2292 - None, # 2293 - None, # 2294 - None, # 2295 - None, # 2296 - None, # 2297 - None, # 2298 - None, # 2299 - None, # 2300 - None, # 2301 - None, # 2302 - None, # 2303 - None, # 2304 - None, # 2305 - None, # 2306 - None, # 2307 - None, # 2308 - None, # 2309 - None, # 2310 - None, # 2311 - None, # 2312 - None, # 2313 - None, # 2314 - None, # 2315 - None, # 2316 - None, # 2317 - None, # 2318 - None, # 2319 - None, # 2320 - None, # 2321 - None, # 2322 - None, # 2323 - None, # 2324 - None, # 2325 - None, # 2326 - None, # 2327 - None, # 2328 - None, # 2329 - None, # 2330 - None, # 2331 - None, # 2332 - None, # 2333 - None, # 2334 - None, # 2335 - None, # 2336 - None, # 2337 - None, # 2338 - None, # 2339 - None, # 2340 - None, # 2341 - None, # 2342 - None, # 2343 - None, # 2344 - None, # 2345 - None, # 2346 - None, # 2347 - None, # 2348 - None, # 2349 - None, # 2350 - None, # 2351 - None, # 2352 - None, # 2353 - None, # 2354 - None, # 2355 - None, # 2356 - None, # 2357 - None, # 2358 - None, # 2359 - None, # 2360 - None, # 2361 - None, # 2362 - None, # 2363 - None, # 2364 - None, # 2365 - None, # 2366 - None, # 2367 - None, # 2368 - None, # 2369 - None, # 2370 - None, # 2371 - None, # 2372 - None, # 2373 - None, # 2374 - None, # 2375 - None, # 2376 - None, # 2377 - None, # 2378 - None, # 2379 - None, # 2380 - None, # 2381 - None, # 2382 - None, # 2383 - None, # 2384 - None, # 2385 - None, # 2386 - None, # 2387 - None, # 2388 - None, # 2389 - None, # 2390 - None, # 2391 - None, # 2392 - None, # 2393 - None, # 2394 - None, # 2395 - None, # 2396 - None, # 2397 - None, # 2398 - None, # 2399 - None, # 2400 - None, # 2401 - None, # 2402 - None, # 2403 - None, # 2404 - None, # 2405 - None, # 2406 - None, # 2407 - None, # 2408 - None, # 2409 - None, # 2410 - None, # 2411 - None, # 2412 - None, # 2413 - None, # 2414 - None, # 2415 - None, # 2416 - None, # 2417 - None, # 2418 - None, # 2419 - None, # 2420 - None, # 2421 - None, # 2422 - None, # 2423 - None, # 2424 - None, # 2425 - None, # 2426 - None, # 2427 - None, # 2428 - None, # 2429 - None, # 2430 - None, # 2431 - None, # 2432 - None, # 2433 - None, # 2434 - None, # 2435 - None, # 2436 - None, # 2437 - None, # 2438 - None, # 2439 - None, # 2440 - None, # 2441 - None, # 2442 - None, # 2443 - None, # 2444 - None, # 2445 - None, # 2446 - None, # 2447 - None, # 2448 - None, # 2449 - None, # 2450 - None, # 2451 - None, # 2452 - None, # 2453 - None, # 2454 - None, # 2455 - None, # 2456 - None, # 2457 - None, # 2458 - None, # 2459 - None, # 2460 - None, # 2461 - None, # 2462 - None, # 2463 - None, # 2464 - None, # 2465 - None, # 2466 - None, # 2467 - None, # 2468 - None, # 2469 - None, # 2470 - None, # 2471 - None, # 2472 - None, # 2473 - None, # 2474 - None, # 2475 - None, # 2476 - None, # 2477 - None, # 2478 - None, # 2479 - None, # 2480 - None, # 2481 - None, # 2482 - None, # 2483 - None, # 2484 - None, # 2485 - None, # 2486 - None, # 2487 - None, # 2488 - None, # 2489 - None, # 2490 - None, # 2491 - None, # 2492 - None, # 2493 - None, # 2494 - None, # 2495 - None, # 2496 - None, # 2497 - None, # 2498 - None, # 2499 - None, # 2500 - None, # 2501 - None, # 2502 - None, # 2503 - None, # 2504 - None, # 2505 - None, # 2506 - None, # 2507 - None, # 2508 - None, # 2509 - None, # 2510 - None, # 2511 - None, # 2512 - None, # 2513 - None, # 2514 - None, # 2515 - None, # 2516 - None, # 2517 - None, # 2518 - None, # 2519 - None, # 2520 - None, # 2521 - None, # 2522 - None, # 2523 - None, # 2524 - None, # 2525 - None, # 2526 - None, # 2527 - None, # 2528 - None, # 2529 - None, # 2530 - None, # 2531 - None, # 2532 - None, # 2533 - None, # 2534 - None, # 2535 - None, # 2536 - None, # 2537 - None, # 2538 - None, # 2539 - None, # 2540 - None, # 2541 - None, # 2542 - None, # 2543 - None, # 2544 - None, # 2545 - None, # 2546 - None, # 2547 - None, # 2548 - None, # 2549 - None, # 2550 - None, # 2551 - None, # 2552 - None, # 2553 - None, # 2554 - None, # 2555 - None, # 2556 - None, # 2557 - None, # 2558 - None, # 2559 - None, # 2560 - None, # 2561 - None, # 2562 - None, # 2563 - None, # 2564 - None, # 2565 - None, # 2566 - None, # 2567 - None, # 2568 - None, # 2569 - None, # 2570 - None, # 2571 - None, # 2572 - None, # 2573 - None, # 2574 - None, # 2575 - None, # 2576 - None, # 2577 - None, # 2578 - None, # 2579 - None, # 2580 - None, # 2581 - None, # 2582 - None, # 2583 - None, # 2584 - None, # 2585 - None, # 2586 - None, # 2587 - None, # 2588 - None, # 2589 - None, # 2590 - None, # 2591 - None, # 2592 - None, # 2593 - None, # 2594 - None, # 2595 - None, # 2596 - None, # 2597 - None, # 2598 - None, # 2599 - None, # 2600 - None, # 2601 - None, # 2602 - None, # 2603 - None, # 2604 - None, # 2605 - None, # 2606 - None, # 2607 - None, # 2608 - None, # 2609 - None, # 2610 - None, # 2611 - None, # 2612 - None, # 2613 - None, # 2614 - None, # 2615 - None, # 2616 - None, # 2617 - None, # 2618 - None, # 2619 - None, # 2620 - None, # 2621 - None, # 2622 - None, # 2623 - None, # 2624 - None, # 2625 - None, # 2626 - None, # 2627 - None, # 2628 - None, # 2629 - None, # 2630 - None, # 2631 - None, # 2632 - None, # 2633 - None, # 2634 - None, # 2635 - None, # 2636 - None, # 2637 - None, # 2638 - None, # 2639 - None, # 2640 - None, # 2641 - None, # 2642 - None, # 2643 - None, # 2644 - None, # 2645 - None, # 2646 - None, # 2647 - None, # 2648 - None, # 2649 - None, # 2650 - None, # 2651 - None, # 2652 - None, # 2653 - None, # 2654 - None, # 2655 - None, # 2656 - None, # 2657 - None, # 2658 - None, # 2659 - None, # 2660 - None, # 2661 - None, # 2662 - None, # 2663 - None, # 2664 - None, # 2665 - None, # 2666 - None, # 2667 - None, # 2668 - None, # 2669 - None, # 2670 - None, # 2671 - None, # 2672 - None, # 2673 - None, # 2674 - None, # 2675 - None, # 2676 - None, # 2677 - None, # 2678 - None, # 2679 - None, # 2680 - None, # 2681 - None, # 2682 - None, # 2683 - None, # 2684 - None, # 2685 - None, # 2686 - None, # 2687 - None, # 2688 - None, # 2689 - None, # 2690 - None, # 2691 - None, # 2692 - None, # 2693 - None, # 2694 - None, # 2695 - None, # 2696 - None, # 2697 - None, # 2698 - None, # 2699 - None, # 2700 - None, # 2701 - None, # 2702 - None, # 2703 - None, # 2704 - None, # 2705 - None, # 2706 - None, # 2707 - None, # 2708 - None, # 2709 - None, # 2710 - None, # 2711 - None, # 2712 - None, # 2713 - None, # 2714 - None, # 2715 - None, # 2716 - None, # 2717 - None, # 2718 - None, # 2719 - None, # 2720 - None, # 2721 - None, # 2722 - None, # 2723 - None, # 2724 - None, # 2725 - None, # 2726 - None, # 2727 - None, # 2728 - None, # 2729 - None, # 2730 - None, # 2731 - None, # 2732 - None, # 2733 - None, # 2734 - None, # 2735 - None, # 2736 - None, # 2737 - None, # 2738 - None, # 2739 - None, # 2740 - None, # 2741 - None, # 2742 - None, # 2743 - None, # 2744 - None, # 2745 - None, # 2746 - None, # 2747 - None, # 2748 - None, # 2749 - None, # 2750 - None, # 2751 - None, # 2752 - None, # 2753 - None, # 2754 - None, # 2755 - None, # 2756 - None, # 2757 - None, # 2758 - None, # 2759 - None, # 2760 - None, # 2761 - None, # 2762 - None, # 2763 - None, # 2764 - None, # 2765 - None, # 2766 - None, # 2767 - None, # 2768 - None, # 2769 - None, # 2770 - None, # 2771 - None, # 2772 - None, # 2773 - None, # 2774 - None, # 2775 - None, # 2776 - None, # 2777 - None, # 2778 - None, # 2779 - None, # 2780 - None, # 2781 - None, # 2782 - None, # 2783 - None, # 2784 - None, # 2785 - None, # 2786 - None, # 2787 - None, # 2788 - None, # 2789 - None, # 2790 - None, # 2791 - None, # 2792 - None, # 2793 - None, # 2794 - None, # 2795 - None, # 2796 - None, # 2797 - None, # 2798 - None, # 2799 - None, # 2800 - None, # 2801 - None, # 2802 - None, # 2803 - None, # 2804 - None, # 2805 - None, # 2806 - None, # 2807 - None, # 2808 - None, # 2809 - None, # 2810 - None, # 2811 - None, # 2812 - None, # 2813 - None, # 2814 - None, # 2815 - None, # 2816 - None, # 2817 - None, # 2818 - None, # 2819 - None, # 2820 - None, # 2821 - None, # 2822 - None, # 2823 - None, # 2824 - None, # 2825 - None, # 2826 - None, # 2827 - None, # 2828 - None, # 2829 - None, # 2830 - None, # 2831 - None, # 2832 - None, # 2833 - None, # 2834 - None, # 2835 - None, # 2836 - None, # 2837 - None, # 2838 - None, # 2839 - None, # 2840 - None, # 2841 - None, # 2842 - None, # 2843 - None, # 2844 - None, # 2845 - None, # 2846 - None, # 2847 - None, # 2848 - None, # 2849 - None, # 2850 - None, # 2851 - None, # 2852 - None, # 2853 - None, # 2854 - None, # 2855 - None, # 2856 - None, # 2857 - None, # 2858 - None, # 2859 - None, # 2860 - None, # 2861 - None, # 2862 - None, # 2863 - None, # 2864 - None, # 2865 - None, # 2866 - None, # 2867 - None, # 2868 - None, # 2869 - None, # 2870 - None, # 2871 - None, # 2872 - None, # 2873 - None, # 2874 - None, # 2875 - None, # 2876 - None, # 2877 - None, # 2878 - None, # 2879 - None, # 2880 - None, # 2881 - None, # 2882 - None, # 2883 - None, # 2884 - None, # 2885 - None, # 2886 - None, # 2887 - None, # 2888 - None, # 2889 - None, # 2890 - None, # 2891 - None, # 2892 - None, # 2893 - None, # 2894 - None, # 2895 - None, # 2896 - None, # 2897 - None, # 2898 - None, # 2899 - None, # 2900 - None, # 2901 - None, # 2902 - None, # 2903 - None, # 2904 - None, # 2905 - None, # 2906 - None, # 2907 - None, # 2908 - None, # 2909 - None, # 2910 - None, # 2911 - None, # 2912 - None, # 2913 - None, # 2914 - None, # 2915 - None, # 2916 - None, # 2917 - None, # 2918 - None, # 2919 - None, # 2920 - None, # 2921 - None, # 2922 - None, # 2923 - None, # 2924 - None, # 2925 - None, # 2926 - None, # 2927 - None, # 2928 - None, # 2929 - None, # 2930 - None, # 2931 - None, # 2932 - None, # 2933 - None, # 2934 - None, # 2935 - None, # 2936 - None, # 2937 - None, # 2938 - None, # 2939 - None, # 2940 - None, # 2941 - None, # 2942 - None, # 2943 - None, # 2944 - None, # 2945 - None, # 2946 - None, # 2947 - None, # 2948 - None, # 2949 - None, # 2950 - None, # 2951 - None, # 2952 - None, # 2953 - None, # 2954 - None, # 2955 - None, # 2956 - None, # 2957 - None, # 2958 - None, # 2959 - None, # 2960 - None, # 2961 - None, # 2962 - None, # 2963 - None, # 2964 - None, # 2965 - None, # 2966 - None, # 2967 - None, # 2968 - None, # 2969 - None, # 2970 - None, # 2971 - None, # 2972 - None, # 2973 - None, # 2974 - None, # 2975 - None, # 2976 - None, # 2977 - None, # 2978 - None, # 2979 - None, # 2980 - None, # 2981 - None, # 2982 - None, # 2983 - None, # 2984 - None, # 2985 - None, # 2986 - None, # 2987 - None, # 2988 - None, # 2989 - None, # 2990 - None, # 2991 - None, # 2992 - None, # 2993 - None, # 2994 - None, # 2995 - None, # 2996 - None, # 2997 - None, # 2998 - None, # 2999 - None, # 3000 - None, # 3001 - None, # 3002 - None, # 3003 - None, # 3004 - None, # 3005 - None, # 3006 - None, # 3007 - None, # 3008 - None, # 3009 - None, # 3010 - None, # 3011 - None, # 3012 - None, # 3013 - None, # 3014 - None, # 3015 - None, # 3016 - None, # 3017 - None, # 3018 - None, # 3019 - None, # 3020 - None, # 3021 - None, # 3022 - None, # 3023 - None, # 3024 - None, # 3025 - None, # 3026 - None, # 3027 - None, # 3028 - None, # 3029 - None, # 3030 - None, # 3031 - None, # 3032 - None, # 3033 - None, # 3034 - None, # 3035 - None, # 3036 - None, # 3037 - None, # 3038 - None, # 3039 - None, # 3040 - None, # 3041 - None, # 3042 - None, # 3043 - None, # 3044 - None, # 3045 - None, # 3046 - None, # 3047 - None, # 3048 - None, # 3049 - None, # 3050 - None, # 3051 - None, # 3052 - None, # 3053 - None, # 3054 - None, # 3055 - None, # 3056 - None, # 3057 - None, # 3058 - None, # 3059 - None, # 3060 - None, # 3061 - None, # 3062 - None, # 3063 - None, # 3064 - None, # 3065 - None, # 3066 - None, # 3067 - None, # 3068 - None, # 3069 - None, # 3070 - None, # 3071 - None, # 3072 - None, # 3073 - None, # 3074 - None, # 3075 - None, # 3076 - None, # 3077 - None, # 3078 - None, # 3079 - None, # 3080 - None, # 3081 - None, # 3082 - None, # 3083 - None, # 3084 - None, # 3085 - None, # 3086 - None, # 3087 - None, # 3088 - None, # 3089 - None, # 3090 - None, # 3091 - None, # 3092 - None, # 3093 - None, # 3094 - None, # 3095 - None, # 3096 - None, # 3097 - None, # 3098 - None, # 3099 - None, # 3100 - None, # 3101 - None, # 3102 - None, # 3103 - None, # 3104 - None, # 3105 - None, # 3106 - None, # 3107 - None, # 3108 - None, # 3109 - None, # 3110 - None, # 3111 - None, # 3112 - None, # 3113 - None, # 3114 - None, # 3115 - None, # 3116 - None, # 3117 - None, # 3118 - None, # 3119 - None, # 3120 - None, # 3121 - None, # 3122 - None, # 3123 - None, # 3124 - None, # 3125 - None, # 3126 - None, # 3127 - None, # 3128 - None, # 3129 - None, # 3130 - None, # 3131 - None, # 3132 - None, # 3133 - None, # 3134 - None, # 3135 - None, # 3136 - None, # 3137 - None, # 3138 - None, # 3139 - None, # 3140 - None, # 3141 - None, # 3142 - None, # 3143 - None, # 3144 - None, # 3145 - None, # 3146 - None, # 3147 - None, # 3148 - None, # 3149 - None, # 3150 - None, # 3151 - None, # 3152 - None, # 3153 - None, # 3154 - None, # 3155 - None, # 3156 - None, # 3157 - None, # 3158 - None, # 3159 - None, # 3160 - None, # 3161 - None, # 3162 - None, # 3163 - None, # 3164 - None, # 3165 - None, # 3166 - None, # 3167 - None, # 3168 - None, # 3169 - None, # 3170 - None, # 3171 - None, # 3172 - None, # 3173 - None, # 3174 - None, # 3175 - None, # 3176 - None, # 3177 - None, # 3178 - None, # 3179 - None, # 3180 - None, # 3181 - None, # 3182 - None, # 3183 - None, # 3184 - None, # 3185 - None, # 3186 - None, # 3187 - None, # 3188 - None, # 3189 - None, # 3190 - None, # 3191 - None, # 3192 - None, # 3193 - None, # 3194 - None, # 3195 - None, # 3196 - None, # 3197 - None, # 3198 - None, # 3199 - None, # 3200 - None, # 3201 - None, # 3202 - None, # 3203 - None, # 3204 - None, # 3205 - None, # 3206 - None, # 3207 - None, # 3208 - None, # 3209 - None, # 3210 - None, # 3211 - None, # 3212 - None, # 3213 - None, # 3214 - None, # 3215 - None, # 3216 - None, # 3217 - None, # 3218 - None, # 3219 - None, # 3220 - None, # 3221 - None, # 3222 - None, # 3223 - None, # 3224 - None, # 3225 - None, # 3226 - None, # 3227 - None, # 3228 - None, # 3229 - None, # 3230 - None, # 3231 - None, # 3232 - None, # 3233 - None, # 3234 - None, # 3235 - None, # 3236 - None, # 3237 - None, # 3238 - None, # 3239 - None, # 3240 - None, # 3241 - None, # 3242 - None, # 3243 - None, # 3244 - None, # 3245 - None, # 3246 - None, # 3247 - None, # 3248 - None, # 3249 - None, # 3250 - None, # 3251 - None, # 3252 - None, # 3253 - None, # 3254 - None, # 3255 - None, # 3256 - None, # 3257 - None, # 3258 - None, # 3259 - None, # 3260 - None, # 3261 - None, # 3262 - None, # 3263 - None, # 3264 - None, # 3265 - None, # 3266 - None, # 3267 - None, # 3268 - None, # 3269 - None, # 3270 - None, # 3271 - None, # 3272 - None, # 3273 - None, # 3274 - None, # 3275 - None, # 3276 - None, # 3277 - None, # 3278 - None, # 3279 - None, # 3280 - None, # 3281 - None, # 3282 - None, # 3283 - None, # 3284 - None, # 3285 - None, # 3286 - None, # 3287 - None, # 3288 - None, # 3289 - None, # 3290 - None, # 3291 - None, # 3292 - None, # 3293 - None, # 3294 - None, # 3295 - None, # 3296 - None, # 3297 - None, # 3298 - None, # 3299 - None, # 3300 - None, # 3301 - None, # 3302 - None, # 3303 - None, # 3304 - None, # 3305 - None, # 3306 - None, # 3307 - None, # 3308 - None, # 3309 - None, # 3310 - None, # 3311 - None, # 3312 - None, # 3313 - None, # 3314 - None, # 3315 - None, # 3316 - None, # 3317 - None, # 3318 - None, # 3319 - None, # 3320 - None, # 3321 - None, # 3322 - None, # 3323 - None, # 3324 - None, # 3325 - None, # 3326 - None, # 3327 - None, # 3328 - (3329, TType.STRING, 'responseValidation', 'BINARY', None, ), # 3329 -) -all_structs.append(TNamespace) -TNamespace.thrift_spec = ( - None, # 0 - (1, TType.STRING, 'catalogName', 'UTF8', None, ), # 1 - (2, TType.STRING, 'schemaName', 'UTF8', None, ), # 2 -) -all_structs.append(THandleIdentifier) -THandleIdentifier.thrift_spec = ( - None, # 0 - (1, TType.STRING, 'guid', 'BINARY', None, ), # 1 - (2, TType.STRING, 'secret', 'BINARY', None, ), # 2 - None, # 3 - None, # 4 - None, # 5 - None, # 6 - None, # 7 - None, # 8 - None, # 9 - None, # 10 - None, # 11 - None, # 12 - None, # 13 - None, # 14 - None, # 15 - None, # 16 - None, # 17 - None, # 18 - None, # 19 - None, # 20 - None, # 21 - None, # 22 - None, # 23 - None, # 24 - None, # 25 - None, # 26 - None, # 27 - None, # 28 - None, # 29 - None, # 30 - None, # 31 - None, # 32 - None, # 33 - None, # 34 - None, # 35 - None, # 36 - None, # 37 - None, # 38 - None, # 39 - None, # 40 - None, # 41 - None, # 42 - None, # 43 - None, # 44 - None, # 45 - None, # 46 - None, # 47 - None, # 48 - None, # 49 - None, # 50 - None, # 51 - None, # 52 - None, # 53 - None, # 54 - None, # 55 - None, # 56 - None, # 57 - None, # 58 - None, # 59 - None, # 60 - None, # 61 - None, # 62 - None, # 63 - None, # 64 - None, # 65 - None, # 66 - None, # 67 - None, # 68 - None, # 69 - None, # 70 - None, # 71 - None, # 72 - None, # 73 - None, # 74 - None, # 75 - None, # 76 - None, # 77 - None, # 78 - None, # 79 - None, # 80 - None, # 81 - None, # 82 - None, # 83 - None, # 84 - None, # 85 - None, # 86 - None, # 87 - None, # 88 - None, # 89 - None, # 90 - None, # 91 - None, # 92 - None, # 93 - None, # 94 - None, # 95 - None, # 96 - None, # 97 - None, # 98 - None, # 99 - None, # 100 - None, # 101 - None, # 102 - None, # 103 - None, # 104 - None, # 105 - None, # 106 - None, # 107 - None, # 108 - None, # 109 - None, # 110 - None, # 111 - None, # 112 - None, # 113 - None, # 114 - None, # 115 - None, # 116 - None, # 117 - None, # 118 - None, # 119 - None, # 120 - None, # 121 - None, # 122 - None, # 123 - None, # 124 - None, # 125 - None, # 126 - None, # 127 - None, # 128 - None, # 129 - None, # 130 - None, # 131 - None, # 132 - None, # 133 - None, # 134 - None, # 135 - None, # 136 - None, # 137 - None, # 138 - None, # 139 - None, # 140 - None, # 141 - None, # 142 - None, # 143 - None, # 144 - None, # 145 - None, # 146 - None, # 147 - None, # 148 - None, # 149 - None, # 150 - None, # 151 - None, # 152 - None, # 153 - None, # 154 - None, # 155 - None, # 156 - None, # 157 - None, # 158 - None, # 159 - None, # 160 - None, # 161 - None, # 162 - None, # 163 - None, # 164 - None, # 165 - None, # 166 - None, # 167 - None, # 168 - None, # 169 - None, # 170 - None, # 171 - None, # 172 - None, # 173 - None, # 174 - None, # 175 - None, # 176 - None, # 177 - None, # 178 - None, # 179 - None, # 180 - None, # 181 - None, # 182 - None, # 183 - None, # 184 - None, # 185 - None, # 186 - None, # 187 - None, # 188 - None, # 189 - None, # 190 - None, # 191 - None, # 192 - None, # 193 - None, # 194 - None, # 195 - None, # 196 - None, # 197 - None, # 198 - None, # 199 - None, # 200 - None, # 201 - None, # 202 - None, # 203 - None, # 204 - None, # 205 - None, # 206 - None, # 207 - None, # 208 - None, # 209 - None, # 210 - None, # 211 - None, # 212 - None, # 213 - None, # 214 - None, # 215 - None, # 216 - None, # 217 - None, # 218 - None, # 219 - None, # 220 - None, # 221 - None, # 222 - None, # 223 - None, # 224 - None, # 225 - None, # 226 - None, # 227 - None, # 228 - None, # 229 - None, # 230 - None, # 231 - None, # 232 - None, # 233 - None, # 234 - None, # 235 - None, # 236 - None, # 237 - None, # 238 - None, # 239 - None, # 240 - None, # 241 - None, # 242 - None, # 243 - None, # 244 - None, # 245 - None, # 246 - None, # 247 - None, # 248 - None, # 249 - None, # 250 - None, # 251 - None, # 252 - None, # 253 - None, # 254 - None, # 255 - None, # 256 - None, # 257 - None, # 258 - None, # 259 - None, # 260 - None, # 261 - None, # 262 - None, # 263 - None, # 264 - None, # 265 - None, # 266 - None, # 267 - None, # 268 - None, # 269 - None, # 270 - None, # 271 - None, # 272 - None, # 273 - None, # 274 - None, # 275 - None, # 276 - None, # 277 - None, # 278 - None, # 279 - None, # 280 - None, # 281 - None, # 282 - None, # 283 - None, # 284 - None, # 285 - None, # 286 - None, # 287 - None, # 288 - None, # 289 - None, # 290 - None, # 291 - None, # 292 - None, # 293 - None, # 294 - None, # 295 - None, # 296 - None, # 297 - None, # 298 - None, # 299 - None, # 300 - None, # 301 - None, # 302 - None, # 303 - None, # 304 - None, # 305 - None, # 306 - None, # 307 - None, # 308 - None, # 309 - None, # 310 - None, # 311 - None, # 312 - None, # 313 - None, # 314 - None, # 315 - None, # 316 - None, # 317 - None, # 318 - None, # 319 - None, # 320 - None, # 321 - None, # 322 - None, # 323 - None, # 324 - None, # 325 - None, # 326 - None, # 327 - None, # 328 - None, # 329 - None, # 330 - None, # 331 - None, # 332 - None, # 333 - None, # 334 - None, # 335 - None, # 336 - None, # 337 - None, # 338 - None, # 339 - None, # 340 - None, # 341 - None, # 342 - None, # 343 - None, # 344 - None, # 345 - None, # 346 - None, # 347 - None, # 348 - None, # 349 - None, # 350 - None, # 351 - None, # 352 - None, # 353 - None, # 354 - None, # 355 - None, # 356 - None, # 357 - None, # 358 - None, # 359 - None, # 360 - None, # 361 - None, # 362 - None, # 363 - None, # 364 - None, # 365 - None, # 366 - None, # 367 - None, # 368 - None, # 369 - None, # 370 - None, # 371 - None, # 372 - None, # 373 - None, # 374 - None, # 375 - None, # 376 - None, # 377 - None, # 378 - None, # 379 - None, # 380 - None, # 381 - None, # 382 - None, # 383 - None, # 384 - None, # 385 - None, # 386 - None, # 387 - None, # 388 - None, # 389 - None, # 390 - None, # 391 - None, # 392 - None, # 393 - None, # 394 - None, # 395 - None, # 396 - None, # 397 - None, # 398 - None, # 399 - None, # 400 - None, # 401 - None, # 402 - None, # 403 - None, # 404 - None, # 405 - None, # 406 - None, # 407 - None, # 408 - None, # 409 - None, # 410 - None, # 411 - None, # 412 - None, # 413 - None, # 414 - None, # 415 - None, # 416 - None, # 417 - None, # 418 - None, # 419 - None, # 420 - None, # 421 - None, # 422 - None, # 423 - None, # 424 - None, # 425 - None, # 426 - None, # 427 - None, # 428 - None, # 429 - None, # 430 - None, # 431 - None, # 432 - None, # 433 - None, # 434 - None, # 435 - None, # 436 - None, # 437 - None, # 438 - None, # 439 - None, # 440 - None, # 441 - None, # 442 - None, # 443 - None, # 444 - None, # 445 - None, # 446 - None, # 447 - None, # 448 - None, # 449 - None, # 450 - None, # 451 - None, # 452 - None, # 453 - None, # 454 - None, # 455 - None, # 456 - None, # 457 - None, # 458 - None, # 459 - None, # 460 - None, # 461 - None, # 462 - None, # 463 - None, # 464 - None, # 465 - None, # 466 - None, # 467 - None, # 468 - None, # 469 - None, # 470 - None, # 471 - None, # 472 - None, # 473 - None, # 474 - None, # 475 - None, # 476 - None, # 477 - None, # 478 - None, # 479 - None, # 480 - None, # 481 - None, # 482 - None, # 483 - None, # 484 - None, # 485 - None, # 486 - None, # 487 - None, # 488 - None, # 489 - None, # 490 - None, # 491 - None, # 492 - None, # 493 - None, # 494 - None, # 495 - None, # 496 - None, # 497 - None, # 498 - None, # 499 - None, # 500 - None, # 501 - None, # 502 - None, # 503 - None, # 504 - None, # 505 - None, # 506 - None, # 507 - None, # 508 - None, # 509 - None, # 510 - None, # 511 - None, # 512 - None, # 513 - None, # 514 - None, # 515 - None, # 516 - None, # 517 - None, # 518 - None, # 519 - None, # 520 - None, # 521 - None, # 522 - None, # 523 - None, # 524 - None, # 525 - None, # 526 - None, # 527 - None, # 528 - None, # 529 - None, # 530 - None, # 531 - None, # 532 - None, # 533 - None, # 534 - None, # 535 - None, # 536 - None, # 537 - None, # 538 - None, # 539 - None, # 540 - None, # 541 - None, # 542 - None, # 543 - None, # 544 - None, # 545 - None, # 546 - None, # 547 - None, # 548 - None, # 549 - None, # 550 - None, # 551 - None, # 552 - None, # 553 - None, # 554 - None, # 555 - None, # 556 - None, # 557 - None, # 558 - None, # 559 - None, # 560 - None, # 561 - None, # 562 - None, # 563 - None, # 564 - None, # 565 - None, # 566 - None, # 567 - None, # 568 - None, # 569 - None, # 570 - None, # 571 - None, # 572 - None, # 573 - None, # 574 - None, # 575 - None, # 576 - None, # 577 - None, # 578 - None, # 579 - None, # 580 - None, # 581 - None, # 582 - None, # 583 - None, # 584 - None, # 585 - None, # 586 - None, # 587 - None, # 588 - None, # 589 - None, # 590 - None, # 591 - None, # 592 - None, # 593 - None, # 594 - None, # 595 - None, # 596 - None, # 597 - None, # 598 - None, # 599 - None, # 600 - None, # 601 - None, # 602 - None, # 603 - None, # 604 - None, # 605 - None, # 606 - None, # 607 - None, # 608 - None, # 609 - None, # 610 - None, # 611 - None, # 612 - None, # 613 - None, # 614 - None, # 615 - None, # 616 - None, # 617 - None, # 618 - None, # 619 - None, # 620 - None, # 621 - None, # 622 - None, # 623 - None, # 624 - None, # 625 - None, # 626 - None, # 627 - None, # 628 - None, # 629 - None, # 630 - None, # 631 - None, # 632 - None, # 633 - None, # 634 - None, # 635 - None, # 636 - None, # 637 - None, # 638 - None, # 639 - None, # 640 - None, # 641 - None, # 642 - None, # 643 - None, # 644 - None, # 645 - None, # 646 - None, # 647 - None, # 648 - None, # 649 - None, # 650 - None, # 651 - None, # 652 - None, # 653 - None, # 654 - None, # 655 - None, # 656 - None, # 657 - None, # 658 - None, # 659 - None, # 660 - None, # 661 - None, # 662 - None, # 663 - None, # 664 - None, # 665 - None, # 666 - None, # 667 - None, # 668 - None, # 669 - None, # 670 - None, # 671 - None, # 672 - None, # 673 - None, # 674 - None, # 675 - None, # 676 - None, # 677 - None, # 678 - None, # 679 - None, # 680 - None, # 681 - None, # 682 - None, # 683 - None, # 684 - None, # 685 - None, # 686 - None, # 687 - None, # 688 - None, # 689 - None, # 690 - None, # 691 - None, # 692 - None, # 693 - None, # 694 - None, # 695 - None, # 696 - None, # 697 - None, # 698 - None, # 699 - None, # 700 - None, # 701 - None, # 702 - None, # 703 - None, # 704 - None, # 705 - None, # 706 - None, # 707 - None, # 708 - None, # 709 - None, # 710 - None, # 711 - None, # 712 - None, # 713 - None, # 714 - None, # 715 - None, # 716 - None, # 717 - None, # 718 - None, # 719 - None, # 720 - None, # 721 - None, # 722 - None, # 723 - None, # 724 - None, # 725 - None, # 726 - None, # 727 - None, # 728 - None, # 729 - None, # 730 - None, # 731 - None, # 732 - None, # 733 - None, # 734 - None, # 735 - None, # 736 - None, # 737 - None, # 738 - None, # 739 - None, # 740 - None, # 741 - None, # 742 - None, # 743 - None, # 744 - None, # 745 - None, # 746 - None, # 747 - None, # 748 - None, # 749 - None, # 750 - None, # 751 - None, # 752 - None, # 753 - None, # 754 - None, # 755 - None, # 756 - None, # 757 - None, # 758 - None, # 759 - None, # 760 - None, # 761 - None, # 762 - None, # 763 - None, # 764 - None, # 765 - None, # 766 - None, # 767 - None, # 768 - None, # 769 - None, # 770 - None, # 771 - None, # 772 - None, # 773 - None, # 774 - None, # 775 - None, # 776 - None, # 777 - None, # 778 - None, # 779 - None, # 780 - None, # 781 - None, # 782 - None, # 783 - None, # 784 - None, # 785 - None, # 786 - None, # 787 - None, # 788 - None, # 789 - None, # 790 - None, # 791 - None, # 792 - None, # 793 - None, # 794 - None, # 795 - None, # 796 - None, # 797 - None, # 798 - None, # 799 - None, # 800 - None, # 801 - None, # 802 - None, # 803 - None, # 804 - None, # 805 - None, # 806 - None, # 807 - None, # 808 - None, # 809 - None, # 810 - None, # 811 - None, # 812 - None, # 813 - None, # 814 - None, # 815 - None, # 816 - None, # 817 - None, # 818 - None, # 819 - None, # 820 - None, # 821 - None, # 822 - None, # 823 - None, # 824 - None, # 825 - None, # 826 - None, # 827 - None, # 828 - None, # 829 - None, # 830 - None, # 831 - None, # 832 - None, # 833 - None, # 834 - None, # 835 - None, # 836 - None, # 837 - None, # 838 - None, # 839 - None, # 840 - None, # 841 - None, # 842 - None, # 843 - None, # 844 - None, # 845 - None, # 846 - None, # 847 - None, # 848 - None, # 849 - None, # 850 - None, # 851 - None, # 852 - None, # 853 - None, # 854 - None, # 855 - None, # 856 - None, # 857 - None, # 858 - None, # 859 - None, # 860 - None, # 861 - None, # 862 - None, # 863 - None, # 864 - None, # 865 - None, # 866 - None, # 867 - None, # 868 - None, # 869 - None, # 870 - None, # 871 - None, # 872 - None, # 873 - None, # 874 - None, # 875 - None, # 876 - None, # 877 - None, # 878 - None, # 879 - None, # 880 - None, # 881 - None, # 882 - None, # 883 - None, # 884 - None, # 885 - None, # 886 - None, # 887 - None, # 888 - None, # 889 - None, # 890 - None, # 891 - None, # 892 - None, # 893 - None, # 894 - None, # 895 - None, # 896 - None, # 897 - None, # 898 - None, # 899 - None, # 900 - None, # 901 - None, # 902 - None, # 903 - None, # 904 - None, # 905 - None, # 906 - None, # 907 - None, # 908 - None, # 909 - None, # 910 - None, # 911 - None, # 912 - None, # 913 - None, # 914 - None, # 915 - None, # 916 - None, # 917 - None, # 918 - None, # 919 - None, # 920 - None, # 921 - None, # 922 - None, # 923 - None, # 924 - None, # 925 - None, # 926 - None, # 927 - None, # 928 - None, # 929 - None, # 930 - None, # 931 - None, # 932 - None, # 933 - None, # 934 - None, # 935 - None, # 936 - None, # 937 - None, # 938 - None, # 939 - None, # 940 - None, # 941 - None, # 942 - None, # 943 - None, # 944 - None, # 945 - None, # 946 - None, # 947 - None, # 948 - None, # 949 - None, # 950 - None, # 951 - None, # 952 - None, # 953 - None, # 954 - None, # 955 - None, # 956 - None, # 957 - None, # 958 - None, # 959 - None, # 960 - None, # 961 - None, # 962 - None, # 963 - None, # 964 - None, # 965 - None, # 966 - None, # 967 - None, # 968 - None, # 969 - None, # 970 - None, # 971 - None, # 972 - None, # 973 - None, # 974 - None, # 975 - None, # 976 - None, # 977 - None, # 978 - None, # 979 - None, # 980 - None, # 981 - None, # 982 - None, # 983 - None, # 984 - None, # 985 - None, # 986 - None, # 987 - None, # 988 - None, # 989 - None, # 990 - None, # 991 - None, # 992 - None, # 993 - None, # 994 - None, # 995 - None, # 996 - None, # 997 - None, # 998 - None, # 999 - None, # 1000 - None, # 1001 - None, # 1002 - None, # 1003 - None, # 1004 - None, # 1005 - None, # 1006 - None, # 1007 - None, # 1008 - None, # 1009 - None, # 1010 - None, # 1011 - None, # 1012 - None, # 1013 - None, # 1014 - None, # 1015 - None, # 1016 - None, # 1017 - None, # 1018 - None, # 1019 - None, # 1020 - None, # 1021 - None, # 1022 - None, # 1023 - None, # 1024 - None, # 1025 - None, # 1026 - None, # 1027 - None, # 1028 - None, # 1029 - None, # 1030 - None, # 1031 - None, # 1032 - None, # 1033 - None, # 1034 - None, # 1035 - None, # 1036 - None, # 1037 - None, # 1038 - None, # 1039 - None, # 1040 - None, # 1041 - None, # 1042 - None, # 1043 - None, # 1044 - None, # 1045 - None, # 1046 - None, # 1047 - None, # 1048 - None, # 1049 - None, # 1050 - None, # 1051 - None, # 1052 - None, # 1053 - None, # 1054 - None, # 1055 - None, # 1056 - None, # 1057 - None, # 1058 - None, # 1059 - None, # 1060 - None, # 1061 - None, # 1062 - None, # 1063 - None, # 1064 - None, # 1065 - None, # 1066 - None, # 1067 - None, # 1068 - None, # 1069 - None, # 1070 - None, # 1071 - None, # 1072 - None, # 1073 - None, # 1074 - None, # 1075 - None, # 1076 - None, # 1077 - None, # 1078 - None, # 1079 - None, # 1080 - None, # 1081 - None, # 1082 - None, # 1083 - None, # 1084 - None, # 1085 - None, # 1086 - None, # 1087 - None, # 1088 - None, # 1089 - None, # 1090 - None, # 1091 - None, # 1092 - None, # 1093 - None, # 1094 - None, # 1095 - None, # 1096 - None, # 1097 - None, # 1098 - None, # 1099 - None, # 1100 - None, # 1101 - None, # 1102 - None, # 1103 - None, # 1104 - None, # 1105 - None, # 1106 - None, # 1107 - None, # 1108 - None, # 1109 - None, # 1110 - None, # 1111 - None, # 1112 - None, # 1113 - None, # 1114 - None, # 1115 - None, # 1116 - None, # 1117 - None, # 1118 - None, # 1119 - None, # 1120 - None, # 1121 - None, # 1122 - None, # 1123 - None, # 1124 - None, # 1125 - None, # 1126 - None, # 1127 - None, # 1128 - None, # 1129 - None, # 1130 - None, # 1131 - None, # 1132 - None, # 1133 - None, # 1134 - None, # 1135 - None, # 1136 - None, # 1137 - None, # 1138 - None, # 1139 - None, # 1140 - None, # 1141 - None, # 1142 - None, # 1143 - None, # 1144 - None, # 1145 - None, # 1146 - None, # 1147 - None, # 1148 - None, # 1149 - None, # 1150 - None, # 1151 - None, # 1152 - None, # 1153 - None, # 1154 - None, # 1155 - None, # 1156 - None, # 1157 - None, # 1158 - None, # 1159 - None, # 1160 - None, # 1161 - None, # 1162 - None, # 1163 - None, # 1164 - None, # 1165 - None, # 1166 - None, # 1167 - None, # 1168 - None, # 1169 - None, # 1170 - None, # 1171 - None, # 1172 - None, # 1173 - None, # 1174 - None, # 1175 - None, # 1176 - None, # 1177 - None, # 1178 - None, # 1179 - None, # 1180 - None, # 1181 - None, # 1182 - None, # 1183 - None, # 1184 - None, # 1185 - None, # 1186 - None, # 1187 - None, # 1188 - None, # 1189 - None, # 1190 - None, # 1191 - None, # 1192 - None, # 1193 - None, # 1194 - None, # 1195 - None, # 1196 - None, # 1197 - None, # 1198 - None, # 1199 - None, # 1200 - None, # 1201 - None, # 1202 - None, # 1203 - None, # 1204 - None, # 1205 - None, # 1206 - None, # 1207 - None, # 1208 - None, # 1209 - None, # 1210 - None, # 1211 - None, # 1212 - None, # 1213 - None, # 1214 - None, # 1215 - None, # 1216 - None, # 1217 - None, # 1218 - None, # 1219 - None, # 1220 - None, # 1221 - None, # 1222 - None, # 1223 - None, # 1224 - None, # 1225 - None, # 1226 - None, # 1227 - None, # 1228 - None, # 1229 - None, # 1230 - None, # 1231 - None, # 1232 - None, # 1233 - None, # 1234 - None, # 1235 - None, # 1236 - None, # 1237 - None, # 1238 - None, # 1239 - None, # 1240 - None, # 1241 - None, # 1242 - None, # 1243 - None, # 1244 - None, # 1245 - None, # 1246 - None, # 1247 - None, # 1248 - None, # 1249 - None, # 1250 - None, # 1251 - None, # 1252 - None, # 1253 - None, # 1254 - None, # 1255 - None, # 1256 - None, # 1257 - None, # 1258 - None, # 1259 - None, # 1260 - None, # 1261 - None, # 1262 - None, # 1263 - None, # 1264 - None, # 1265 - None, # 1266 - None, # 1267 - None, # 1268 - None, # 1269 - None, # 1270 - None, # 1271 - None, # 1272 - None, # 1273 - None, # 1274 - None, # 1275 - None, # 1276 - None, # 1277 - None, # 1278 - None, # 1279 - None, # 1280 - None, # 1281 - None, # 1282 - None, # 1283 - None, # 1284 - None, # 1285 - None, # 1286 - None, # 1287 - None, # 1288 - None, # 1289 - None, # 1290 - None, # 1291 - None, # 1292 - None, # 1293 - None, # 1294 - None, # 1295 - None, # 1296 - None, # 1297 - None, # 1298 - None, # 1299 - None, # 1300 - None, # 1301 - None, # 1302 - None, # 1303 - None, # 1304 - None, # 1305 - None, # 1306 - None, # 1307 - None, # 1308 - None, # 1309 - None, # 1310 - None, # 1311 - None, # 1312 - None, # 1313 - None, # 1314 - None, # 1315 - None, # 1316 - None, # 1317 - None, # 1318 - None, # 1319 - None, # 1320 - None, # 1321 - None, # 1322 - None, # 1323 - None, # 1324 - None, # 1325 - None, # 1326 - None, # 1327 - None, # 1328 - None, # 1329 - None, # 1330 - None, # 1331 - None, # 1332 - None, # 1333 - None, # 1334 - None, # 1335 - None, # 1336 - None, # 1337 - None, # 1338 - None, # 1339 - None, # 1340 - None, # 1341 - None, # 1342 - None, # 1343 - None, # 1344 - None, # 1345 - None, # 1346 - None, # 1347 - None, # 1348 - None, # 1349 - None, # 1350 - None, # 1351 - None, # 1352 - None, # 1353 - None, # 1354 - None, # 1355 - None, # 1356 - None, # 1357 - None, # 1358 - None, # 1359 - None, # 1360 - None, # 1361 - None, # 1362 - None, # 1363 - None, # 1364 - None, # 1365 - None, # 1366 - None, # 1367 - None, # 1368 - None, # 1369 - None, # 1370 - None, # 1371 - None, # 1372 - None, # 1373 - None, # 1374 - None, # 1375 - None, # 1376 - None, # 1377 - None, # 1378 - None, # 1379 - None, # 1380 - None, # 1381 - None, # 1382 - None, # 1383 - None, # 1384 - None, # 1385 - None, # 1386 - None, # 1387 - None, # 1388 - None, # 1389 - None, # 1390 - None, # 1391 - None, # 1392 - None, # 1393 - None, # 1394 - None, # 1395 - None, # 1396 - None, # 1397 - None, # 1398 - None, # 1399 - None, # 1400 - None, # 1401 - None, # 1402 - None, # 1403 - None, # 1404 - None, # 1405 - None, # 1406 - None, # 1407 - None, # 1408 - None, # 1409 - None, # 1410 - None, # 1411 - None, # 1412 - None, # 1413 - None, # 1414 - None, # 1415 - None, # 1416 - None, # 1417 - None, # 1418 - None, # 1419 - None, # 1420 - None, # 1421 - None, # 1422 - None, # 1423 - None, # 1424 - None, # 1425 - None, # 1426 - None, # 1427 - None, # 1428 - None, # 1429 - None, # 1430 - None, # 1431 - None, # 1432 - None, # 1433 - None, # 1434 - None, # 1435 - None, # 1436 - None, # 1437 - None, # 1438 - None, # 1439 - None, # 1440 - None, # 1441 - None, # 1442 - None, # 1443 - None, # 1444 - None, # 1445 - None, # 1446 - None, # 1447 - None, # 1448 - None, # 1449 - None, # 1450 - None, # 1451 - None, # 1452 - None, # 1453 - None, # 1454 - None, # 1455 - None, # 1456 - None, # 1457 - None, # 1458 - None, # 1459 - None, # 1460 - None, # 1461 - None, # 1462 - None, # 1463 - None, # 1464 - None, # 1465 - None, # 1466 - None, # 1467 - None, # 1468 - None, # 1469 - None, # 1470 - None, # 1471 - None, # 1472 - None, # 1473 - None, # 1474 - None, # 1475 - None, # 1476 - None, # 1477 - None, # 1478 - None, # 1479 - None, # 1480 - None, # 1481 - None, # 1482 - None, # 1483 - None, # 1484 - None, # 1485 - None, # 1486 - None, # 1487 - None, # 1488 - None, # 1489 - None, # 1490 - None, # 1491 - None, # 1492 - None, # 1493 - None, # 1494 - None, # 1495 - None, # 1496 - None, # 1497 - None, # 1498 - None, # 1499 - None, # 1500 - None, # 1501 - None, # 1502 - None, # 1503 - None, # 1504 - None, # 1505 - None, # 1506 - None, # 1507 - None, # 1508 - None, # 1509 - None, # 1510 - None, # 1511 - None, # 1512 - None, # 1513 - None, # 1514 - None, # 1515 - None, # 1516 - None, # 1517 - None, # 1518 - None, # 1519 - None, # 1520 - None, # 1521 - None, # 1522 - None, # 1523 - None, # 1524 - None, # 1525 - None, # 1526 - None, # 1527 - None, # 1528 - None, # 1529 - None, # 1530 - None, # 1531 - None, # 1532 - None, # 1533 - None, # 1534 - None, # 1535 - None, # 1536 - None, # 1537 - None, # 1538 - None, # 1539 - None, # 1540 - None, # 1541 - None, # 1542 - None, # 1543 - None, # 1544 - None, # 1545 - None, # 1546 - None, # 1547 - None, # 1548 - None, # 1549 - None, # 1550 - None, # 1551 - None, # 1552 - None, # 1553 - None, # 1554 - None, # 1555 - None, # 1556 - None, # 1557 - None, # 1558 - None, # 1559 - None, # 1560 - None, # 1561 - None, # 1562 - None, # 1563 - None, # 1564 - None, # 1565 - None, # 1566 - None, # 1567 - None, # 1568 - None, # 1569 - None, # 1570 - None, # 1571 - None, # 1572 - None, # 1573 - None, # 1574 - None, # 1575 - None, # 1576 - None, # 1577 - None, # 1578 - None, # 1579 - None, # 1580 - None, # 1581 - None, # 1582 - None, # 1583 - None, # 1584 - None, # 1585 - None, # 1586 - None, # 1587 - None, # 1588 - None, # 1589 - None, # 1590 - None, # 1591 - None, # 1592 - None, # 1593 - None, # 1594 - None, # 1595 - None, # 1596 - None, # 1597 - None, # 1598 - None, # 1599 - None, # 1600 - None, # 1601 - None, # 1602 - None, # 1603 - None, # 1604 - None, # 1605 - None, # 1606 - None, # 1607 - None, # 1608 - None, # 1609 - None, # 1610 - None, # 1611 - None, # 1612 - None, # 1613 - None, # 1614 - None, # 1615 - None, # 1616 - None, # 1617 - None, # 1618 - None, # 1619 - None, # 1620 - None, # 1621 - None, # 1622 - None, # 1623 - None, # 1624 - None, # 1625 - None, # 1626 - None, # 1627 - None, # 1628 - None, # 1629 - None, # 1630 - None, # 1631 - None, # 1632 - None, # 1633 - None, # 1634 - None, # 1635 - None, # 1636 - None, # 1637 - None, # 1638 - None, # 1639 - None, # 1640 - None, # 1641 - None, # 1642 - None, # 1643 - None, # 1644 - None, # 1645 - None, # 1646 - None, # 1647 - None, # 1648 - None, # 1649 - None, # 1650 - None, # 1651 - None, # 1652 - None, # 1653 - None, # 1654 - None, # 1655 - None, # 1656 - None, # 1657 - None, # 1658 - None, # 1659 - None, # 1660 - None, # 1661 - None, # 1662 - None, # 1663 - None, # 1664 - None, # 1665 - None, # 1666 - None, # 1667 - None, # 1668 - None, # 1669 - None, # 1670 - None, # 1671 - None, # 1672 - None, # 1673 - None, # 1674 - None, # 1675 - None, # 1676 - None, # 1677 - None, # 1678 - None, # 1679 - None, # 1680 - None, # 1681 - None, # 1682 - None, # 1683 - None, # 1684 - None, # 1685 - None, # 1686 - None, # 1687 - None, # 1688 - None, # 1689 - None, # 1690 - None, # 1691 - None, # 1692 - None, # 1693 - None, # 1694 - None, # 1695 - None, # 1696 - None, # 1697 - None, # 1698 - None, # 1699 - None, # 1700 - None, # 1701 - None, # 1702 - None, # 1703 - None, # 1704 - None, # 1705 - None, # 1706 - None, # 1707 - None, # 1708 - None, # 1709 - None, # 1710 - None, # 1711 - None, # 1712 - None, # 1713 - None, # 1714 - None, # 1715 - None, # 1716 - None, # 1717 - None, # 1718 - None, # 1719 - None, # 1720 - None, # 1721 - None, # 1722 - None, # 1723 - None, # 1724 - None, # 1725 - None, # 1726 - None, # 1727 - None, # 1728 - None, # 1729 - None, # 1730 - None, # 1731 - None, # 1732 - None, # 1733 - None, # 1734 - None, # 1735 - None, # 1736 - None, # 1737 - None, # 1738 - None, # 1739 - None, # 1740 - None, # 1741 - None, # 1742 - None, # 1743 - None, # 1744 - None, # 1745 - None, # 1746 - None, # 1747 - None, # 1748 - None, # 1749 - None, # 1750 - None, # 1751 - None, # 1752 - None, # 1753 - None, # 1754 - None, # 1755 - None, # 1756 - None, # 1757 - None, # 1758 - None, # 1759 - None, # 1760 - None, # 1761 - None, # 1762 - None, # 1763 - None, # 1764 - None, # 1765 - None, # 1766 - None, # 1767 - None, # 1768 - None, # 1769 - None, # 1770 - None, # 1771 - None, # 1772 - None, # 1773 - None, # 1774 - None, # 1775 - None, # 1776 - None, # 1777 - None, # 1778 - None, # 1779 - None, # 1780 - None, # 1781 - None, # 1782 - None, # 1783 - None, # 1784 - None, # 1785 - None, # 1786 - None, # 1787 - None, # 1788 - None, # 1789 - None, # 1790 - None, # 1791 - None, # 1792 - None, # 1793 - None, # 1794 - None, # 1795 - None, # 1796 - None, # 1797 - None, # 1798 - None, # 1799 - None, # 1800 - None, # 1801 - None, # 1802 - None, # 1803 - None, # 1804 - None, # 1805 - None, # 1806 - None, # 1807 - None, # 1808 - None, # 1809 - None, # 1810 - None, # 1811 - None, # 1812 - None, # 1813 - None, # 1814 - None, # 1815 - None, # 1816 - None, # 1817 - None, # 1818 - None, # 1819 - None, # 1820 - None, # 1821 - None, # 1822 - None, # 1823 - None, # 1824 - None, # 1825 - None, # 1826 - None, # 1827 - None, # 1828 - None, # 1829 - None, # 1830 - None, # 1831 - None, # 1832 - None, # 1833 - None, # 1834 - None, # 1835 - None, # 1836 - None, # 1837 - None, # 1838 - None, # 1839 - None, # 1840 - None, # 1841 - None, # 1842 - None, # 1843 - None, # 1844 - None, # 1845 - None, # 1846 - None, # 1847 - None, # 1848 - None, # 1849 - None, # 1850 - None, # 1851 - None, # 1852 - None, # 1853 - None, # 1854 - None, # 1855 - None, # 1856 - None, # 1857 - None, # 1858 - None, # 1859 - None, # 1860 - None, # 1861 - None, # 1862 - None, # 1863 - None, # 1864 - None, # 1865 - None, # 1866 - None, # 1867 - None, # 1868 - None, # 1869 - None, # 1870 - None, # 1871 - None, # 1872 - None, # 1873 - None, # 1874 - None, # 1875 - None, # 1876 - None, # 1877 - None, # 1878 - None, # 1879 - None, # 1880 - None, # 1881 - None, # 1882 - None, # 1883 - None, # 1884 - None, # 1885 - None, # 1886 - None, # 1887 - None, # 1888 - None, # 1889 - None, # 1890 - None, # 1891 - None, # 1892 - None, # 1893 - None, # 1894 - None, # 1895 - None, # 1896 - None, # 1897 - None, # 1898 - None, # 1899 - None, # 1900 - None, # 1901 - None, # 1902 - None, # 1903 - None, # 1904 - None, # 1905 - None, # 1906 - None, # 1907 - None, # 1908 - None, # 1909 - None, # 1910 - None, # 1911 - None, # 1912 - None, # 1913 - None, # 1914 - None, # 1915 - None, # 1916 - None, # 1917 - None, # 1918 - None, # 1919 - None, # 1920 - None, # 1921 - None, # 1922 - None, # 1923 - None, # 1924 - None, # 1925 - None, # 1926 - None, # 1927 - None, # 1928 - None, # 1929 - None, # 1930 - None, # 1931 - None, # 1932 - None, # 1933 - None, # 1934 - None, # 1935 - None, # 1936 - None, # 1937 - None, # 1938 - None, # 1939 - None, # 1940 - None, # 1941 - None, # 1942 - None, # 1943 - None, # 1944 - None, # 1945 - None, # 1946 - None, # 1947 - None, # 1948 - None, # 1949 - None, # 1950 - None, # 1951 - None, # 1952 - None, # 1953 - None, # 1954 - None, # 1955 - None, # 1956 - None, # 1957 - None, # 1958 - None, # 1959 - None, # 1960 - None, # 1961 - None, # 1962 - None, # 1963 - None, # 1964 - None, # 1965 - None, # 1966 - None, # 1967 - None, # 1968 - None, # 1969 - None, # 1970 - None, # 1971 - None, # 1972 - None, # 1973 - None, # 1974 - None, # 1975 - None, # 1976 - None, # 1977 - None, # 1978 - None, # 1979 - None, # 1980 - None, # 1981 - None, # 1982 - None, # 1983 - None, # 1984 - None, # 1985 - None, # 1986 - None, # 1987 - None, # 1988 - None, # 1989 - None, # 1990 - None, # 1991 - None, # 1992 - None, # 1993 - None, # 1994 - None, # 1995 - None, # 1996 - None, # 1997 - None, # 1998 - None, # 1999 - None, # 2000 - None, # 2001 - None, # 2002 - None, # 2003 - None, # 2004 - None, # 2005 - None, # 2006 - None, # 2007 - None, # 2008 - None, # 2009 - None, # 2010 - None, # 2011 - None, # 2012 - None, # 2013 - None, # 2014 - None, # 2015 - None, # 2016 - None, # 2017 - None, # 2018 - None, # 2019 - None, # 2020 - None, # 2021 - None, # 2022 - None, # 2023 - None, # 2024 - None, # 2025 - None, # 2026 - None, # 2027 - None, # 2028 - None, # 2029 - None, # 2030 - None, # 2031 - None, # 2032 - None, # 2033 - None, # 2034 - None, # 2035 - None, # 2036 - None, # 2037 - None, # 2038 - None, # 2039 - None, # 2040 - None, # 2041 - None, # 2042 - None, # 2043 - None, # 2044 - None, # 2045 - None, # 2046 - None, # 2047 - None, # 2048 - None, # 2049 - None, # 2050 - None, # 2051 - None, # 2052 - None, # 2053 - None, # 2054 - None, # 2055 - None, # 2056 - None, # 2057 - None, # 2058 - None, # 2059 - None, # 2060 - None, # 2061 - None, # 2062 - None, # 2063 - None, # 2064 - None, # 2065 - None, # 2066 - None, # 2067 - None, # 2068 - None, # 2069 - None, # 2070 - None, # 2071 - None, # 2072 - None, # 2073 - None, # 2074 - None, # 2075 - None, # 2076 - None, # 2077 - None, # 2078 - None, # 2079 - None, # 2080 - None, # 2081 - None, # 2082 - None, # 2083 - None, # 2084 - None, # 2085 - None, # 2086 - None, # 2087 - None, # 2088 - None, # 2089 - None, # 2090 - None, # 2091 - None, # 2092 - None, # 2093 - None, # 2094 - None, # 2095 - None, # 2096 - None, # 2097 - None, # 2098 - None, # 2099 - None, # 2100 - None, # 2101 - None, # 2102 - None, # 2103 - None, # 2104 - None, # 2105 - None, # 2106 - None, # 2107 - None, # 2108 - None, # 2109 - None, # 2110 - None, # 2111 - None, # 2112 - None, # 2113 - None, # 2114 - None, # 2115 - None, # 2116 - None, # 2117 - None, # 2118 - None, # 2119 - None, # 2120 - None, # 2121 - None, # 2122 - None, # 2123 - None, # 2124 - None, # 2125 - None, # 2126 - None, # 2127 - None, # 2128 - None, # 2129 - None, # 2130 - None, # 2131 - None, # 2132 - None, # 2133 - None, # 2134 - None, # 2135 - None, # 2136 - None, # 2137 - None, # 2138 - None, # 2139 - None, # 2140 - None, # 2141 - None, # 2142 - None, # 2143 - None, # 2144 - None, # 2145 - None, # 2146 - None, # 2147 - None, # 2148 - None, # 2149 - None, # 2150 - None, # 2151 - None, # 2152 - None, # 2153 - None, # 2154 - None, # 2155 - None, # 2156 - None, # 2157 - None, # 2158 - None, # 2159 - None, # 2160 - None, # 2161 - None, # 2162 - None, # 2163 - None, # 2164 - None, # 2165 - None, # 2166 - None, # 2167 - None, # 2168 - None, # 2169 - None, # 2170 - None, # 2171 - None, # 2172 - None, # 2173 - None, # 2174 - None, # 2175 - None, # 2176 - None, # 2177 - None, # 2178 - None, # 2179 - None, # 2180 - None, # 2181 - None, # 2182 - None, # 2183 - None, # 2184 - None, # 2185 - None, # 2186 - None, # 2187 - None, # 2188 - None, # 2189 - None, # 2190 - None, # 2191 - None, # 2192 - None, # 2193 - None, # 2194 - None, # 2195 - None, # 2196 - None, # 2197 - None, # 2198 - None, # 2199 - None, # 2200 - None, # 2201 - None, # 2202 - None, # 2203 - None, # 2204 - None, # 2205 - None, # 2206 - None, # 2207 - None, # 2208 - None, # 2209 - None, # 2210 - None, # 2211 - None, # 2212 - None, # 2213 - None, # 2214 - None, # 2215 - None, # 2216 - None, # 2217 - None, # 2218 - None, # 2219 - None, # 2220 - None, # 2221 - None, # 2222 - None, # 2223 - None, # 2224 - None, # 2225 - None, # 2226 - None, # 2227 - None, # 2228 - None, # 2229 - None, # 2230 - None, # 2231 - None, # 2232 - None, # 2233 - None, # 2234 - None, # 2235 - None, # 2236 - None, # 2237 - None, # 2238 - None, # 2239 - None, # 2240 - None, # 2241 - None, # 2242 - None, # 2243 - None, # 2244 - None, # 2245 - None, # 2246 - None, # 2247 - None, # 2248 - None, # 2249 - None, # 2250 - None, # 2251 - None, # 2252 - None, # 2253 - None, # 2254 - None, # 2255 - None, # 2256 - None, # 2257 - None, # 2258 - None, # 2259 - None, # 2260 - None, # 2261 - None, # 2262 - None, # 2263 - None, # 2264 - None, # 2265 - None, # 2266 - None, # 2267 - None, # 2268 - None, # 2269 - None, # 2270 - None, # 2271 - None, # 2272 - None, # 2273 - None, # 2274 - None, # 2275 - None, # 2276 - None, # 2277 - None, # 2278 - None, # 2279 - None, # 2280 - None, # 2281 - None, # 2282 - None, # 2283 - None, # 2284 - None, # 2285 - None, # 2286 - None, # 2287 - None, # 2288 - None, # 2289 - None, # 2290 - None, # 2291 - None, # 2292 - None, # 2293 - None, # 2294 - None, # 2295 - None, # 2296 - None, # 2297 - None, # 2298 - None, # 2299 - None, # 2300 - None, # 2301 - None, # 2302 - None, # 2303 - None, # 2304 - None, # 2305 - None, # 2306 - None, # 2307 - None, # 2308 - None, # 2309 - None, # 2310 - None, # 2311 - None, # 2312 - None, # 2313 - None, # 2314 - None, # 2315 - None, # 2316 - None, # 2317 - None, # 2318 - None, # 2319 - None, # 2320 - None, # 2321 - None, # 2322 - None, # 2323 - None, # 2324 - None, # 2325 - None, # 2326 - None, # 2327 - None, # 2328 - None, # 2329 - None, # 2330 - None, # 2331 - None, # 2332 - None, # 2333 - None, # 2334 - None, # 2335 - None, # 2336 - None, # 2337 - None, # 2338 - None, # 2339 - None, # 2340 - None, # 2341 - None, # 2342 - None, # 2343 - None, # 2344 - None, # 2345 - None, # 2346 - None, # 2347 - None, # 2348 - None, # 2349 - None, # 2350 - None, # 2351 - None, # 2352 - None, # 2353 - None, # 2354 - None, # 2355 - None, # 2356 - None, # 2357 - None, # 2358 - None, # 2359 - None, # 2360 - None, # 2361 - None, # 2362 - None, # 2363 - None, # 2364 - None, # 2365 - None, # 2366 - None, # 2367 - None, # 2368 - None, # 2369 - None, # 2370 - None, # 2371 - None, # 2372 - None, # 2373 - None, # 2374 - None, # 2375 - None, # 2376 - None, # 2377 - None, # 2378 - None, # 2379 - None, # 2380 - None, # 2381 - None, # 2382 - None, # 2383 - None, # 2384 - None, # 2385 - None, # 2386 - None, # 2387 - None, # 2388 - None, # 2389 - None, # 2390 - None, # 2391 - None, # 2392 - None, # 2393 - None, # 2394 - None, # 2395 - None, # 2396 - None, # 2397 - None, # 2398 - None, # 2399 - None, # 2400 - None, # 2401 - None, # 2402 - None, # 2403 - None, # 2404 - None, # 2405 - None, # 2406 - None, # 2407 - None, # 2408 - None, # 2409 - None, # 2410 - None, # 2411 - None, # 2412 - None, # 2413 - None, # 2414 - None, # 2415 - None, # 2416 - None, # 2417 - None, # 2418 - None, # 2419 - None, # 2420 - None, # 2421 - None, # 2422 - None, # 2423 - None, # 2424 - None, # 2425 - None, # 2426 - None, # 2427 - None, # 2428 - None, # 2429 - None, # 2430 - None, # 2431 - None, # 2432 - None, # 2433 - None, # 2434 - None, # 2435 - None, # 2436 - None, # 2437 - None, # 2438 - None, # 2439 - None, # 2440 - None, # 2441 - None, # 2442 - None, # 2443 - None, # 2444 - None, # 2445 - None, # 2446 - None, # 2447 - None, # 2448 - None, # 2449 - None, # 2450 - None, # 2451 - None, # 2452 - None, # 2453 - None, # 2454 - None, # 2455 - None, # 2456 - None, # 2457 - None, # 2458 - None, # 2459 - None, # 2460 - None, # 2461 - None, # 2462 - None, # 2463 - None, # 2464 - None, # 2465 - None, # 2466 - None, # 2467 - None, # 2468 - None, # 2469 - None, # 2470 - None, # 2471 - None, # 2472 - None, # 2473 - None, # 2474 - None, # 2475 - None, # 2476 - None, # 2477 - None, # 2478 - None, # 2479 - None, # 2480 - None, # 2481 - None, # 2482 - None, # 2483 - None, # 2484 - None, # 2485 - None, # 2486 - None, # 2487 - None, # 2488 - None, # 2489 - None, # 2490 - None, # 2491 - None, # 2492 - None, # 2493 - None, # 2494 - None, # 2495 - None, # 2496 - None, # 2497 - None, # 2498 - None, # 2499 - None, # 2500 - None, # 2501 - None, # 2502 - None, # 2503 - None, # 2504 - None, # 2505 - None, # 2506 - None, # 2507 - None, # 2508 - None, # 2509 - None, # 2510 - None, # 2511 - None, # 2512 - None, # 2513 - None, # 2514 - None, # 2515 - None, # 2516 - None, # 2517 - None, # 2518 - None, # 2519 - None, # 2520 - None, # 2521 - None, # 2522 - None, # 2523 - None, # 2524 - None, # 2525 - None, # 2526 - None, # 2527 - None, # 2528 - None, # 2529 - None, # 2530 - None, # 2531 - None, # 2532 - None, # 2533 - None, # 2534 - None, # 2535 - None, # 2536 - None, # 2537 - None, # 2538 - None, # 2539 - None, # 2540 - None, # 2541 - None, # 2542 - None, # 2543 - None, # 2544 - None, # 2545 - None, # 2546 - None, # 2547 - None, # 2548 - None, # 2549 - None, # 2550 - None, # 2551 - None, # 2552 - None, # 2553 - None, # 2554 - None, # 2555 - None, # 2556 - None, # 2557 - None, # 2558 - None, # 2559 - None, # 2560 - None, # 2561 - None, # 2562 - None, # 2563 - None, # 2564 - None, # 2565 - None, # 2566 - None, # 2567 - None, # 2568 - None, # 2569 - None, # 2570 - None, # 2571 - None, # 2572 - None, # 2573 - None, # 2574 - None, # 2575 - None, # 2576 - None, # 2577 - None, # 2578 - None, # 2579 - None, # 2580 - None, # 2581 - None, # 2582 - None, # 2583 - None, # 2584 - None, # 2585 - None, # 2586 - None, # 2587 - None, # 2588 - None, # 2589 - None, # 2590 - None, # 2591 - None, # 2592 - None, # 2593 - None, # 2594 - None, # 2595 - None, # 2596 - None, # 2597 - None, # 2598 - None, # 2599 - None, # 2600 - None, # 2601 - None, # 2602 - None, # 2603 - None, # 2604 - None, # 2605 - None, # 2606 - None, # 2607 - None, # 2608 - None, # 2609 - None, # 2610 - None, # 2611 - None, # 2612 - None, # 2613 - None, # 2614 - None, # 2615 - None, # 2616 - None, # 2617 - None, # 2618 - None, # 2619 - None, # 2620 - None, # 2621 - None, # 2622 - None, # 2623 - None, # 2624 - None, # 2625 - None, # 2626 - None, # 2627 - None, # 2628 - None, # 2629 - None, # 2630 - None, # 2631 - None, # 2632 - None, # 2633 - None, # 2634 - None, # 2635 - None, # 2636 - None, # 2637 - None, # 2638 - None, # 2639 - None, # 2640 - None, # 2641 - None, # 2642 - None, # 2643 - None, # 2644 - None, # 2645 - None, # 2646 - None, # 2647 - None, # 2648 - None, # 2649 - None, # 2650 - None, # 2651 - None, # 2652 - None, # 2653 - None, # 2654 - None, # 2655 - None, # 2656 - None, # 2657 - None, # 2658 - None, # 2659 - None, # 2660 - None, # 2661 - None, # 2662 - None, # 2663 - None, # 2664 - None, # 2665 - None, # 2666 - None, # 2667 - None, # 2668 - None, # 2669 - None, # 2670 - None, # 2671 - None, # 2672 - None, # 2673 - None, # 2674 - None, # 2675 - None, # 2676 - None, # 2677 - None, # 2678 - None, # 2679 - None, # 2680 - None, # 2681 - None, # 2682 - None, # 2683 - None, # 2684 - None, # 2685 - None, # 2686 - None, # 2687 - None, # 2688 - None, # 2689 - None, # 2690 - None, # 2691 - None, # 2692 - None, # 2693 - None, # 2694 - None, # 2695 - None, # 2696 - None, # 2697 - None, # 2698 - None, # 2699 - None, # 2700 - None, # 2701 - None, # 2702 - None, # 2703 - None, # 2704 - None, # 2705 - None, # 2706 - None, # 2707 - None, # 2708 - None, # 2709 - None, # 2710 - None, # 2711 - None, # 2712 - None, # 2713 - None, # 2714 - None, # 2715 - None, # 2716 - None, # 2717 - None, # 2718 - None, # 2719 - None, # 2720 - None, # 2721 - None, # 2722 - None, # 2723 - None, # 2724 - None, # 2725 - None, # 2726 - None, # 2727 - None, # 2728 - None, # 2729 - None, # 2730 - None, # 2731 - None, # 2732 - None, # 2733 - None, # 2734 - None, # 2735 - None, # 2736 - None, # 2737 - None, # 2738 - None, # 2739 - None, # 2740 - None, # 2741 - None, # 2742 - None, # 2743 - None, # 2744 - None, # 2745 - None, # 2746 - None, # 2747 - None, # 2748 - None, # 2749 - None, # 2750 - None, # 2751 - None, # 2752 - None, # 2753 - None, # 2754 - None, # 2755 - None, # 2756 - None, # 2757 - None, # 2758 - None, # 2759 - None, # 2760 - None, # 2761 - None, # 2762 - None, # 2763 - None, # 2764 - None, # 2765 - None, # 2766 - None, # 2767 - None, # 2768 - None, # 2769 - None, # 2770 - None, # 2771 - None, # 2772 - None, # 2773 - None, # 2774 - None, # 2775 - None, # 2776 - None, # 2777 - None, # 2778 - None, # 2779 - None, # 2780 - None, # 2781 - None, # 2782 - None, # 2783 - None, # 2784 - None, # 2785 - None, # 2786 - None, # 2787 - None, # 2788 - None, # 2789 - None, # 2790 - None, # 2791 - None, # 2792 - None, # 2793 - None, # 2794 - None, # 2795 - None, # 2796 - None, # 2797 - None, # 2798 - None, # 2799 - None, # 2800 - None, # 2801 - None, # 2802 - None, # 2803 - None, # 2804 - None, # 2805 - None, # 2806 - None, # 2807 - None, # 2808 - None, # 2809 - None, # 2810 - None, # 2811 - None, # 2812 - None, # 2813 - None, # 2814 - None, # 2815 - None, # 2816 - None, # 2817 - None, # 2818 - None, # 2819 - None, # 2820 - None, # 2821 - None, # 2822 - None, # 2823 - None, # 2824 - None, # 2825 - None, # 2826 - None, # 2827 - None, # 2828 - None, # 2829 - None, # 2830 - None, # 2831 - None, # 2832 - None, # 2833 - None, # 2834 - None, # 2835 - None, # 2836 - None, # 2837 - None, # 2838 - None, # 2839 - None, # 2840 - None, # 2841 - None, # 2842 - None, # 2843 - None, # 2844 - None, # 2845 - None, # 2846 - None, # 2847 - None, # 2848 - None, # 2849 - None, # 2850 - None, # 2851 - None, # 2852 - None, # 2853 - None, # 2854 - None, # 2855 - None, # 2856 - None, # 2857 - None, # 2858 - None, # 2859 - None, # 2860 - None, # 2861 - None, # 2862 - None, # 2863 - None, # 2864 - None, # 2865 - None, # 2866 - None, # 2867 - None, # 2868 - None, # 2869 - None, # 2870 - None, # 2871 - None, # 2872 - None, # 2873 - None, # 2874 - None, # 2875 - None, # 2876 - None, # 2877 - None, # 2878 - None, # 2879 - None, # 2880 - None, # 2881 - None, # 2882 - None, # 2883 - None, # 2884 - None, # 2885 - None, # 2886 - None, # 2887 - None, # 2888 - None, # 2889 - None, # 2890 - None, # 2891 - None, # 2892 - None, # 2893 - None, # 2894 - None, # 2895 - None, # 2896 - None, # 2897 - None, # 2898 - None, # 2899 - None, # 2900 - None, # 2901 - None, # 2902 - None, # 2903 - None, # 2904 - None, # 2905 - None, # 2906 - None, # 2907 - None, # 2908 - None, # 2909 - None, # 2910 - None, # 2911 - None, # 2912 - None, # 2913 - None, # 2914 - None, # 2915 - None, # 2916 - None, # 2917 - None, # 2918 - None, # 2919 - None, # 2920 - None, # 2921 - None, # 2922 - None, # 2923 - None, # 2924 - None, # 2925 - None, # 2926 - None, # 2927 - None, # 2928 - None, # 2929 - None, # 2930 - None, # 2931 - None, # 2932 - None, # 2933 - None, # 2934 - None, # 2935 - None, # 2936 - None, # 2937 - None, # 2938 - None, # 2939 - None, # 2940 - None, # 2941 - None, # 2942 - None, # 2943 - None, # 2944 - None, # 2945 - None, # 2946 - None, # 2947 - None, # 2948 - None, # 2949 - None, # 2950 - None, # 2951 - None, # 2952 - None, # 2953 - None, # 2954 - None, # 2955 - None, # 2956 - None, # 2957 - None, # 2958 - None, # 2959 - None, # 2960 - None, # 2961 - None, # 2962 - None, # 2963 - None, # 2964 - None, # 2965 - None, # 2966 - None, # 2967 - None, # 2968 - None, # 2969 - None, # 2970 - None, # 2971 - None, # 2972 - None, # 2973 - None, # 2974 - None, # 2975 - None, # 2976 - None, # 2977 - None, # 2978 - None, # 2979 - None, # 2980 - None, # 2981 - None, # 2982 - None, # 2983 - None, # 2984 - None, # 2985 - None, # 2986 - None, # 2987 - None, # 2988 - None, # 2989 - None, # 2990 - None, # 2991 - None, # 2992 - None, # 2993 - None, # 2994 - None, # 2995 - None, # 2996 - None, # 2997 - None, # 2998 - None, # 2999 - None, # 3000 - None, # 3001 - None, # 3002 - None, # 3003 - None, # 3004 - None, # 3005 - None, # 3006 - None, # 3007 - None, # 3008 - None, # 3009 - None, # 3010 - None, # 3011 - None, # 3012 - None, # 3013 - None, # 3014 - None, # 3015 - None, # 3016 - None, # 3017 - None, # 3018 - None, # 3019 - None, # 3020 - None, # 3021 - None, # 3022 - None, # 3023 - None, # 3024 - None, # 3025 - None, # 3026 - None, # 3027 - None, # 3028 - None, # 3029 - None, # 3030 - None, # 3031 - None, # 3032 - None, # 3033 - None, # 3034 - None, # 3035 - None, # 3036 - None, # 3037 - None, # 3038 - None, # 3039 - None, # 3040 - None, # 3041 - None, # 3042 - None, # 3043 - None, # 3044 - None, # 3045 - None, # 3046 - None, # 3047 - None, # 3048 - None, # 3049 - None, # 3050 - None, # 3051 - None, # 3052 - None, # 3053 - None, # 3054 - None, # 3055 - None, # 3056 - None, # 3057 - None, # 3058 - None, # 3059 - None, # 3060 - None, # 3061 - None, # 3062 - None, # 3063 - None, # 3064 - None, # 3065 - None, # 3066 - None, # 3067 - None, # 3068 - None, # 3069 - None, # 3070 - None, # 3071 - None, # 3072 - None, # 3073 - None, # 3074 - None, # 3075 - None, # 3076 - None, # 3077 - None, # 3078 - None, # 3079 - None, # 3080 - None, # 3081 - None, # 3082 - None, # 3083 - None, # 3084 - None, # 3085 - None, # 3086 - None, # 3087 - None, # 3088 - None, # 3089 - None, # 3090 - None, # 3091 - None, # 3092 - None, # 3093 - None, # 3094 - None, # 3095 - None, # 3096 - None, # 3097 - None, # 3098 - None, # 3099 - None, # 3100 - None, # 3101 - None, # 3102 - None, # 3103 - None, # 3104 - None, # 3105 - None, # 3106 - None, # 3107 - None, # 3108 - None, # 3109 - None, # 3110 - None, # 3111 - None, # 3112 - None, # 3113 - None, # 3114 - None, # 3115 - None, # 3116 - None, # 3117 - None, # 3118 - None, # 3119 - None, # 3120 - None, # 3121 - None, # 3122 - None, # 3123 - None, # 3124 - None, # 3125 - None, # 3126 - None, # 3127 - None, # 3128 - None, # 3129 - None, # 3130 - None, # 3131 - None, # 3132 - None, # 3133 - None, # 3134 - None, # 3135 - None, # 3136 - None, # 3137 - None, # 3138 - None, # 3139 - None, # 3140 - None, # 3141 - None, # 3142 - None, # 3143 - None, # 3144 - None, # 3145 - None, # 3146 - None, # 3147 - None, # 3148 - None, # 3149 - None, # 3150 - None, # 3151 - None, # 3152 - None, # 3153 - None, # 3154 - None, # 3155 - None, # 3156 - None, # 3157 - None, # 3158 - None, # 3159 - None, # 3160 - None, # 3161 - None, # 3162 - None, # 3163 - None, # 3164 - None, # 3165 - None, # 3166 - None, # 3167 - None, # 3168 - None, # 3169 - None, # 3170 - None, # 3171 - None, # 3172 - None, # 3173 - None, # 3174 - None, # 3175 - None, # 3176 - None, # 3177 - None, # 3178 - None, # 3179 - None, # 3180 - None, # 3181 - None, # 3182 - None, # 3183 - None, # 3184 - None, # 3185 - None, # 3186 - None, # 3187 - None, # 3188 - None, # 3189 - None, # 3190 - None, # 3191 - None, # 3192 - None, # 3193 - None, # 3194 - None, # 3195 - None, # 3196 - None, # 3197 - None, # 3198 - None, # 3199 - None, # 3200 - None, # 3201 - None, # 3202 - None, # 3203 - None, # 3204 - None, # 3205 - None, # 3206 - None, # 3207 - None, # 3208 - None, # 3209 - None, # 3210 - None, # 3211 - None, # 3212 - None, # 3213 - None, # 3214 - None, # 3215 - None, # 3216 - None, # 3217 - None, # 3218 - None, # 3219 - None, # 3220 - None, # 3221 - None, # 3222 - None, # 3223 - None, # 3224 - None, # 3225 - None, # 3226 - None, # 3227 - None, # 3228 - None, # 3229 - None, # 3230 - None, # 3231 - None, # 3232 - None, # 3233 - None, # 3234 - None, # 3235 - None, # 3236 - None, # 3237 - None, # 3238 - None, # 3239 - None, # 3240 - None, # 3241 - None, # 3242 - None, # 3243 - None, # 3244 - None, # 3245 - None, # 3246 - None, # 3247 - None, # 3248 - None, # 3249 - None, # 3250 - None, # 3251 - None, # 3252 - None, # 3253 - None, # 3254 - None, # 3255 - None, # 3256 - None, # 3257 - None, # 3258 - None, # 3259 - None, # 3260 - None, # 3261 - None, # 3262 - None, # 3263 - None, # 3264 - None, # 3265 - None, # 3266 - None, # 3267 - None, # 3268 - None, # 3269 - None, # 3270 - None, # 3271 - None, # 3272 - None, # 3273 - None, # 3274 - None, # 3275 - None, # 3276 - None, # 3277 - None, # 3278 - None, # 3279 - None, # 3280 - None, # 3281 - None, # 3282 - None, # 3283 - None, # 3284 - None, # 3285 - None, # 3286 - None, # 3287 - None, # 3288 - None, # 3289 - None, # 3290 - None, # 3291 - None, # 3292 - None, # 3293 - None, # 3294 - None, # 3295 - None, # 3296 - None, # 3297 - None, # 3298 - None, # 3299 - None, # 3300 - None, # 3301 - None, # 3302 - None, # 3303 - None, # 3304 - None, # 3305 - None, # 3306 - None, # 3307 - None, # 3308 - None, # 3309 - None, # 3310 - None, # 3311 - None, # 3312 - None, # 3313 - None, # 3314 - None, # 3315 - None, # 3316 - None, # 3317 - None, # 3318 - None, # 3319 - None, # 3320 - None, # 3321 - None, # 3322 - None, # 3323 - None, # 3324 - None, # 3325 - None, # 3326 - None, # 3327 - None, # 3328 - (3329, TType.I16, 'executionVersion', None, None, ), # 3329 -) -all_structs.append(TSessionHandle) -TSessionHandle.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'sessionId', [THandleIdentifier, None], None, ), # 1 - None, # 2 - None, # 3 - None, # 4 - None, # 5 - None, # 6 - None, # 7 - None, # 8 - None, # 9 - None, # 10 - None, # 11 - None, # 12 - None, # 13 - None, # 14 - None, # 15 - None, # 16 - None, # 17 - None, # 18 - None, # 19 - None, # 20 - None, # 21 - None, # 22 - None, # 23 - None, # 24 - None, # 25 - None, # 26 - None, # 27 - None, # 28 - None, # 29 - None, # 30 - None, # 31 - None, # 32 - None, # 33 - None, # 34 - None, # 35 - None, # 36 - None, # 37 - None, # 38 - None, # 39 - None, # 40 - None, # 41 - None, # 42 - None, # 43 - None, # 44 - None, # 45 - None, # 46 - None, # 47 - None, # 48 - None, # 49 - None, # 50 - None, # 51 - None, # 52 - None, # 53 - None, # 54 - None, # 55 - None, # 56 - None, # 57 - None, # 58 - None, # 59 - None, # 60 - None, # 61 - None, # 62 - None, # 63 - None, # 64 - None, # 65 - None, # 66 - None, # 67 - None, # 68 - None, # 69 - None, # 70 - None, # 71 - None, # 72 - None, # 73 - None, # 74 - None, # 75 - None, # 76 - None, # 77 - None, # 78 - None, # 79 - None, # 80 - None, # 81 - None, # 82 - None, # 83 - None, # 84 - None, # 85 - None, # 86 - None, # 87 - None, # 88 - None, # 89 - None, # 90 - None, # 91 - None, # 92 - None, # 93 - None, # 94 - None, # 95 - None, # 96 - None, # 97 - None, # 98 - None, # 99 - None, # 100 - None, # 101 - None, # 102 - None, # 103 - None, # 104 - None, # 105 - None, # 106 - None, # 107 - None, # 108 - None, # 109 - None, # 110 - None, # 111 - None, # 112 - None, # 113 - None, # 114 - None, # 115 - None, # 116 - None, # 117 - None, # 118 - None, # 119 - None, # 120 - None, # 121 - None, # 122 - None, # 123 - None, # 124 - None, # 125 - None, # 126 - None, # 127 - None, # 128 - None, # 129 - None, # 130 - None, # 131 - None, # 132 - None, # 133 - None, # 134 - None, # 135 - None, # 136 - None, # 137 - None, # 138 - None, # 139 - None, # 140 - None, # 141 - None, # 142 - None, # 143 - None, # 144 - None, # 145 - None, # 146 - None, # 147 - None, # 148 - None, # 149 - None, # 150 - None, # 151 - None, # 152 - None, # 153 - None, # 154 - None, # 155 - None, # 156 - None, # 157 - None, # 158 - None, # 159 - None, # 160 - None, # 161 - None, # 162 - None, # 163 - None, # 164 - None, # 165 - None, # 166 - None, # 167 - None, # 168 - None, # 169 - None, # 170 - None, # 171 - None, # 172 - None, # 173 - None, # 174 - None, # 175 - None, # 176 - None, # 177 - None, # 178 - None, # 179 - None, # 180 - None, # 181 - None, # 182 - None, # 183 - None, # 184 - None, # 185 - None, # 186 - None, # 187 - None, # 188 - None, # 189 - None, # 190 - None, # 191 - None, # 192 - None, # 193 - None, # 194 - None, # 195 - None, # 196 - None, # 197 - None, # 198 - None, # 199 - None, # 200 - None, # 201 - None, # 202 - None, # 203 - None, # 204 - None, # 205 - None, # 206 - None, # 207 - None, # 208 - None, # 209 - None, # 210 - None, # 211 - None, # 212 - None, # 213 - None, # 214 - None, # 215 - None, # 216 - None, # 217 - None, # 218 - None, # 219 - None, # 220 - None, # 221 - None, # 222 - None, # 223 - None, # 224 - None, # 225 - None, # 226 - None, # 227 - None, # 228 - None, # 229 - None, # 230 - None, # 231 - None, # 232 - None, # 233 - None, # 234 - None, # 235 - None, # 236 - None, # 237 - None, # 238 - None, # 239 - None, # 240 - None, # 241 - None, # 242 - None, # 243 - None, # 244 - None, # 245 - None, # 246 - None, # 247 - None, # 248 - None, # 249 - None, # 250 - None, # 251 - None, # 252 - None, # 253 - None, # 254 - None, # 255 - None, # 256 - None, # 257 - None, # 258 - None, # 259 - None, # 260 - None, # 261 - None, # 262 - None, # 263 - None, # 264 - None, # 265 - None, # 266 - None, # 267 - None, # 268 - None, # 269 - None, # 270 - None, # 271 - None, # 272 - None, # 273 - None, # 274 - None, # 275 - None, # 276 - None, # 277 - None, # 278 - None, # 279 - None, # 280 - None, # 281 - None, # 282 - None, # 283 - None, # 284 - None, # 285 - None, # 286 - None, # 287 - None, # 288 - None, # 289 - None, # 290 - None, # 291 - None, # 292 - None, # 293 - None, # 294 - None, # 295 - None, # 296 - None, # 297 - None, # 298 - None, # 299 - None, # 300 - None, # 301 - None, # 302 - None, # 303 - None, # 304 - None, # 305 - None, # 306 - None, # 307 - None, # 308 - None, # 309 - None, # 310 - None, # 311 - None, # 312 - None, # 313 - None, # 314 - None, # 315 - None, # 316 - None, # 317 - None, # 318 - None, # 319 - None, # 320 - None, # 321 - None, # 322 - None, # 323 - None, # 324 - None, # 325 - None, # 326 - None, # 327 - None, # 328 - None, # 329 - None, # 330 - None, # 331 - None, # 332 - None, # 333 - None, # 334 - None, # 335 - None, # 336 - None, # 337 - None, # 338 - None, # 339 - None, # 340 - None, # 341 - None, # 342 - None, # 343 - None, # 344 - None, # 345 - None, # 346 - None, # 347 - None, # 348 - None, # 349 - None, # 350 - None, # 351 - None, # 352 - None, # 353 - None, # 354 - None, # 355 - None, # 356 - None, # 357 - None, # 358 - None, # 359 - None, # 360 - None, # 361 - None, # 362 - None, # 363 - None, # 364 - None, # 365 - None, # 366 - None, # 367 - None, # 368 - None, # 369 - None, # 370 - None, # 371 - None, # 372 - None, # 373 - None, # 374 - None, # 375 - None, # 376 - None, # 377 - None, # 378 - None, # 379 - None, # 380 - None, # 381 - None, # 382 - None, # 383 - None, # 384 - None, # 385 - None, # 386 - None, # 387 - None, # 388 - None, # 389 - None, # 390 - None, # 391 - None, # 392 - None, # 393 - None, # 394 - None, # 395 - None, # 396 - None, # 397 - None, # 398 - None, # 399 - None, # 400 - None, # 401 - None, # 402 - None, # 403 - None, # 404 - None, # 405 - None, # 406 - None, # 407 - None, # 408 - None, # 409 - None, # 410 - None, # 411 - None, # 412 - None, # 413 - None, # 414 - None, # 415 - None, # 416 - None, # 417 - None, # 418 - None, # 419 - None, # 420 - None, # 421 - None, # 422 - None, # 423 - None, # 424 - None, # 425 - None, # 426 - None, # 427 - None, # 428 - None, # 429 - None, # 430 - None, # 431 - None, # 432 - None, # 433 - None, # 434 - None, # 435 - None, # 436 - None, # 437 - None, # 438 - None, # 439 - None, # 440 - None, # 441 - None, # 442 - None, # 443 - None, # 444 - None, # 445 - None, # 446 - None, # 447 - None, # 448 - None, # 449 - None, # 450 - None, # 451 - None, # 452 - None, # 453 - None, # 454 - None, # 455 - None, # 456 - None, # 457 - None, # 458 - None, # 459 - None, # 460 - None, # 461 - None, # 462 - None, # 463 - None, # 464 - None, # 465 - None, # 466 - None, # 467 - None, # 468 - None, # 469 - None, # 470 - None, # 471 - None, # 472 - None, # 473 - None, # 474 - None, # 475 - None, # 476 - None, # 477 - None, # 478 - None, # 479 - None, # 480 - None, # 481 - None, # 482 - None, # 483 - None, # 484 - None, # 485 - None, # 486 - None, # 487 - None, # 488 - None, # 489 - None, # 490 - None, # 491 - None, # 492 - None, # 493 - None, # 494 - None, # 495 - None, # 496 - None, # 497 - None, # 498 - None, # 499 - None, # 500 - None, # 501 - None, # 502 - None, # 503 - None, # 504 - None, # 505 - None, # 506 - None, # 507 - None, # 508 - None, # 509 - None, # 510 - None, # 511 - None, # 512 - None, # 513 - None, # 514 - None, # 515 - None, # 516 - None, # 517 - None, # 518 - None, # 519 - None, # 520 - None, # 521 - None, # 522 - None, # 523 - None, # 524 - None, # 525 - None, # 526 - None, # 527 - None, # 528 - None, # 529 - None, # 530 - None, # 531 - None, # 532 - None, # 533 - None, # 534 - None, # 535 - None, # 536 - None, # 537 - None, # 538 - None, # 539 - None, # 540 - None, # 541 - None, # 542 - None, # 543 - None, # 544 - None, # 545 - None, # 546 - None, # 547 - None, # 548 - None, # 549 - None, # 550 - None, # 551 - None, # 552 - None, # 553 - None, # 554 - None, # 555 - None, # 556 - None, # 557 - None, # 558 - None, # 559 - None, # 560 - None, # 561 - None, # 562 - None, # 563 - None, # 564 - None, # 565 - None, # 566 - None, # 567 - None, # 568 - None, # 569 - None, # 570 - None, # 571 - None, # 572 - None, # 573 - None, # 574 - None, # 575 - None, # 576 - None, # 577 - None, # 578 - None, # 579 - None, # 580 - None, # 581 - None, # 582 - None, # 583 - None, # 584 - None, # 585 - None, # 586 - None, # 587 - None, # 588 - None, # 589 - None, # 590 - None, # 591 - None, # 592 - None, # 593 - None, # 594 - None, # 595 - None, # 596 - None, # 597 - None, # 598 - None, # 599 - None, # 600 - None, # 601 - None, # 602 - None, # 603 - None, # 604 - None, # 605 - None, # 606 - None, # 607 - None, # 608 - None, # 609 - None, # 610 - None, # 611 - None, # 612 - None, # 613 - None, # 614 - None, # 615 - None, # 616 - None, # 617 - None, # 618 - None, # 619 - None, # 620 - None, # 621 - None, # 622 - None, # 623 - None, # 624 - None, # 625 - None, # 626 - None, # 627 - None, # 628 - None, # 629 - None, # 630 - None, # 631 - None, # 632 - None, # 633 - None, # 634 - None, # 635 - None, # 636 - None, # 637 - None, # 638 - None, # 639 - None, # 640 - None, # 641 - None, # 642 - None, # 643 - None, # 644 - None, # 645 - None, # 646 - None, # 647 - None, # 648 - None, # 649 - None, # 650 - None, # 651 - None, # 652 - None, # 653 - None, # 654 - None, # 655 - None, # 656 - None, # 657 - None, # 658 - None, # 659 - None, # 660 - None, # 661 - None, # 662 - None, # 663 - None, # 664 - None, # 665 - None, # 666 - None, # 667 - None, # 668 - None, # 669 - None, # 670 - None, # 671 - None, # 672 - None, # 673 - None, # 674 - None, # 675 - None, # 676 - None, # 677 - None, # 678 - None, # 679 - None, # 680 - None, # 681 - None, # 682 - None, # 683 - None, # 684 - None, # 685 - None, # 686 - None, # 687 - None, # 688 - None, # 689 - None, # 690 - None, # 691 - None, # 692 - None, # 693 - None, # 694 - None, # 695 - None, # 696 - None, # 697 - None, # 698 - None, # 699 - None, # 700 - None, # 701 - None, # 702 - None, # 703 - None, # 704 - None, # 705 - None, # 706 - None, # 707 - None, # 708 - None, # 709 - None, # 710 - None, # 711 - None, # 712 - None, # 713 - None, # 714 - None, # 715 - None, # 716 - None, # 717 - None, # 718 - None, # 719 - None, # 720 - None, # 721 - None, # 722 - None, # 723 - None, # 724 - None, # 725 - None, # 726 - None, # 727 - None, # 728 - None, # 729 - None, # 730 - None, # 731 - None, # 732 - None, # 733 - None, # 734 - None, # 735 - None, # 736 - None, # 737 - None, # 738 - None, # 739 - None, # 740 - None, # 741 - None, # 742 - None, # 743 - None, # 744 - None, # 745 - None, # 746 - None, # 747 - None, # 748 - None, # 749 - None, # 750 - None, # 751 - None, # 752 - None, # 753 - None, # 754 - None, # 755 - None, # 756 - None, # 757 - None, # 758 - None, # 759 - None, # 760 - None, # 761 - None, # 762 - None, # 763 - None, # 764 - None, # 765 - None, # 766 - None, # 767 - None, # 768 - None, # 769 - None, # 770 - None, # 771 - None, # 772 - None, # 773 - None, # 774 - None, # 775 - None, # 776 - None, # 777 - None, # 778 - None, # 779 - None, # 780 - None, # 781 - None, # 782 - None, # 783 - None, # 784 - None, # 785 - None, # 786 - None, # 787 - None, # 788 - None, # 789 - None, # 790 - None, # 791 - None, # 792 - None, # 793 - None, # 794 - None, # 795 - None, # 796 - None, # 797 - None, # 798 - None, # 799 - None, # 800 - None, # 801 - None, # 802 - None, # 803 - None, # 804 - None, # 805 - None, # 806 - None, # 807 - None, # 808 - None, # 809 - None, # 810 - None, # 811 - None, # 812 - None, # 813 - None, # 814 - None, # 815 - None, # 816 - None, # 817 - None, # 818 - None, # 819 - None, # 820 - None, # 821 - None, # 822 - None, # 823 - None, # 824 - None, # 825 - None, # 826 - None, # 827 - None, # 828 - None, # 829 - None, # 830 - None, # 831 - None, # 832 - None, # 833 - None, # 834 - None, # 835 - None, # 836 - None, # 837 - None, # 838 - None, # 839 - None, # 840 - None, # 841 - None, # 842 - None, # 843 - None, # 844 - None, # 845 - None, # 846 - None, # 847 - None, # 848 - None, # 849 - None, # 850 - None, # 851 - None, # 852 - None, # 853 - None, # 854 - None, # 855 - None, # 856 - None, # 857 - None, # 858 - None, # 859 - None, # 860 - None, # 861 - None, # 862 - None, # 863 - None, # 864 - None, # 865 - None, # 866 - None, # 867 - None, # 868 - None, # 869 - None, # 870 - None, # 871 - None, # 872 - None, # 873 - None, # 874 - None, # 875 - None, # 876 - None, # 877 - None, # 878 - None, # 879 - None, # 880 - None, # 881 - None, # 882 - None, # 883 - None, # 884 - None, # 885 - None, # 886 - None, # 887 - None, # 888 - None, # 889 - None, # 890 - None, # 891 - None, # 892 - None, # 893 - None, # 894 - None, # 895 - None, # 896 - None, # 897 - None, # 898 - None, # 899 - None, # 900 - None, # 901 - None, # 902 - None, # 903 - None, # 904 - None, # 905 - None, # 906 - None, # 907 - None, # 908 - None, # 909 - None, # 910 - None, # 911 - None, # 912 - None, # 913 - None, # 914 - None, # 915 - None, # 916 - None, # 917 - None, # 918 - None, # 919 - None, # 920 - None, # 921 - None, # 922 - None, # 923 - None, # 924 - None, # 925 - None, # 926 - None, # 927 - None, # 928 - None, # 929 - None, # 930 - None, # 931 - None, # 932 - None, # 933 - None, # 934 - None, # 935 - None, # 936 - None, # 937 - None, # 938 - None, # 939 - None, # 940 - None, # 941 - None, # 942 - None, # 943 - None, # 944 - None, # 945 - None, # 946 - None, # 947 - None, # 948 - None, # 949 - None, # 950 - None, # 951 - None, # 952 - None, # 953 - None, # 954 - None, # 955 - None, # 956 - None, # 957 - None, # 958 - None, # 959 - None, # 960 - None, # 961 - None, # 962 - None, # 963 - None, # 964 - None, # 965 - None, # 966 - None, # 967 - None, # 968 - None, # 969 - None, # 970 - None, # 971 - None, # 972 - None, # 973 - None, # 974 - None, # 975 - None, # 976 - None, # 977 - None, # 978 - None, # 979 - None, # 980 - None, # 981 - None, # 982 - None, # 983 - None, # 984 - None, # 985 - None, # 986 - None, # 987 - None, # 988 - None, # 989 - None, # 990 - None, # 991 - None, # 992 - None, # 993 - None, # 994 - None, # 995 - None, # 996 - None, # 997 - None, # 998 - None, # 999 - None, # 1000 - None, # 1001 - None, # 1002 - None, # 1003 - None, # 1004 - None, # 1005 - None, # 1006 - None, # 1007 - None, # 1008 - None, # 1009 - None, # 1010 - None, # 1011 - None, # 1012 - None, # 1013 - None, # 1014 - None, # 1015 - None, # 1016 - None, # 1017 - None, # 1018 - None, # 1019 - None, # 1020 - None, # 1021 - None, # 1022 - None, # 1023 - None, # 1024 - None, # 1025 - None, # 1026 - None, # 1027 - None, # 1028 - None, # 1029 - None, # 1030 - None, # 1031 - None, # 1032 - None, # 1033 - None, # 1034 - None, # 1035 - None, # 1036 - None, # 1037 - None, # 1038 - None, # 1039 - None, # 1040 - None, # 1041 - None, # 1042 - None, # 1043 - None, # 1044 - None, # 1045 - None, # 1046 - None, # 1047 - None, # 1048 - None, # 1049 - None, # 1050 - None, # 1051 - None, # 1052 - None, # 1053 - None, # 1054 - None, # 1055 - None, # 1056 - None, # 1057 - None, # 1058 - None, # 1059 - None, # 1060 - None, # 1061 - None, # 1062 - None, # 1063 - None, # 1064 - None, # 1065 - None, # 1066 - None, # 1067 - None, # 1068 - None, # 1069 - None, # 1070 - None, # 1071 - None, # 1072 - None, # 1073 - None, # 1074 - None, # 1075 - None, # 1076 - None, # 1077 - None, # 1078 - None, # 1079 - None, # 1080 - None, # 1081 - None, # 1082 - None, # 1083 - None, # 1084 - None, # 1085 - None, # 1086 - None, # 1087 - None, # 1088 - None, # 1089 - None, # 1090 - None, # 1091 - None, # 1092 - None, # 1093 - None, # 1094 - None, # 1095 - None, # 1096 - None, # 1097 - None, # 1098 - None, # 1099 - None, # 1100 - None, # 1101 - None, # 1102 - None, # 1103 - None, # 1104 - None, # 1105 - None, # 1106 - None, # 1107 - None, # 1108 - None, # 1109 - None, # 1110 - None, # 1111 - None, # 1112 - None, # 1113 - None, # 1114 - None, # 1115 - None, # 1116 - None, # 1117 - None, # 1118 - None, # 1119 - None, # 1120 - None, # 1121 - None, # 1122 - None, # 1123 - None, # 1124 - None, # 1125 - None, # 1126 - None, # 1127 - None, # 1128 - None, # 1129 - None, # 1130 - None, # 1131 - None, # 1132 - None, # 1133 - None, # 1134 - None, # 1135 - None, # 1136 - None, # 1137 - None, # 1138 - None, # 1139 - None, # 1140 - None, # 1141 - None, # 1142 - None, # 1143 - None, # 1144 - None, # 1145 - None, # 1146 - None, # 1147 - None, # 1148 - None, # 1149 - None, # 1150 - None, # 1151 - None, # 1152 - None, # 1153 - None, # 1154 - None, # 1155 - None, # 1156 - None, # 1157 - None, # 1158 - None, # 1159 - None, # 1160 - None, # 1161 - None, # 1162 - None, # 1163 - None, # 1164 - None, # 1165 - None, # 1166 - None, # 1167 - None, # 1168 - None, # 1169 - None, # 1170 - None, # 1171 - None, # 1172 - None, # 1173 - None, # 1174 - None, # 1175 - None, # 1176 - None, # 1177 - None, # 1178 - None, # 1179 - None, # 1180 - None, # 1181 - None, # 1182 - None, # 1183 - None, # 1184 - None, # 1185 - None, # 1186 - None, # 1187 - None, # 1188 - None, # 1189 - None, # 1190 - None, # 1191 - None, # 1192 - None, # 1193 - None, # 1194 - None, # 1195 - None, # 1196 - None, # 1197 - None, # 1198 - None, # 1199 - None, # 1200 - None, # 1201 - None, # 1202 - None, # 1203 - None, # 1204 - None, # 1205 - None, # 1206 - None, # 1207 - None, # 1208 - None, # 1209 - None, # 1210 - None, # 1211 - None, # 1212 - None, # 1213 - None, # 1214 - None, # 1215 - None, # 1216 - None, # 1217 - None, # 1218 - None, # 1219 - None, # 1220 - None, # 1221 - None, # 1222 - None, # 1223 - None, # 1224 - None, # 1225 - None, # 1226 - None, # 1227 - None, # 1228 - None, # 1229 - None, # 1230 - None, # 1231 - None, # 1232 - None, # 1233 - None, # 1234 - None, # 1235 - None, # 1236 - None, # 1237 - None, # 1238 - None, # 1239 - None, # 1240 - None, # 1241 - None, # 1242 - None, # 1243 - None, # 1244 - None, # 1245 - None, # 1246 - None, # 1247 - None, # 1248 - None, # 1249 - None, # 1250 - None, # 1251 - None, # 1252 - None, # 1253 - None, # 1254 - None, # 1255 - None, # 1256 - None, # 1257 - None, # 1258 - None, # 1259 - None, # 1260 - None, # 1261 - None, # 1262 - None, # 1263 - None, # 1264 - None, # 1265 - None, # 1266 - None, # 1267 - None, # 1268 - None, # 1269 - None, # 1270 - None, # 1271 - None, # 1272 - None, # 1273 - None, # 1274 - None, # 1275 - None, # 1276 - None, # 1277 - None, # 1278 - None, # 1279 - None, # 1280 - None, # 1281 - None, # 1282 - None, # 1283 - None, # 1284 - None, # 1285 - None, # 1286 - None, # 1287 - None, # 1288 - None, # 1289 - None, # 1290 - None, # 1291 - None, # 1292 - None, # 1293 - None, # 1294 - None, # 1295 - None, # 1296 - None, # 1297 - None, # 1298 - None, # 1299 - None, # 1300 - None, # 1301 - None, # 1302 - None, # 1303 - None, # 1304 - None, # 1305 - None, # 1306 - None, # 1307 - None, # 1308 - None, # 1309 - None, # 1310 - None, # 1311 - None, # 1312 - None, # 1313 - None, # 1314 - None, # 1315 - None, # 1316 - None, # 1317 - None, # 1318 - None, # 1319 - None, # 1320 - None, # 1321 - None, # 1322 - None, # 1323 - None, # 1324 - None, # 1325 - None, # 1326 - None, # 1327 - None, # 1328 - None, # 1329 - None, # 1330 - None, # 1331 - None, # 1332 - None, # 1333 - None, # 1334 - None, # 1335 - None, # 1336 - None, # 1337 - None, # 1338 - None, # 1339 - None, # 1340 - None, # 1341 - None, # 1342 - None, # 1343 - None, # 1344 - None, # 1345 - None, # 1346 - None, # 1347 - None, # 1348 - None, # 1349 - None, # 1350 - None, # 1351 - None, # 1352 - None, # 1353 - None, # 1354 - None, # 1355 - None, # 1356 - None, # 1357 - None, # 1358 - None, # 1359 - None, # 1360 - None, # 1361 - None, # 1362 - None, # 1363 - None, # 1364 - None, # 1365 - None, # 1366 - None, # 1367 - None, # 1368 - None, # 1369 - None, # 1370 - None, # 1371 - None, # 1372 - None, # 1373 - None, # 1374 - None, # 1375 - None, # 1376 - None, # 1377 - None, # 1378 - None, # 1379 - None, # 1380 - None, # 1381 - None, # 1382 - None, # 1383 - None, # 1384 - None, # 1385 - None, # 1386 - None, # 1387 - None, # 1388 - None, # 1389 - None, # 1390 - None, # 1391 - None, # 1392 - None, # 1393 - None, # 1394 - None, # 1395 - None, # 1396 - None, # 1397 - None, # 1398 - None, # 1399 - None, # 1400 - None, # 1401 - None, # 1402 - None, # 1403 - None, # 1404 - None, # 1405 - None, # 1406 - None, # 1407 - None, # 1408 - None, # 1409 - None, # 1410 - None, # 1411 - None, # 1412 - None, # 1413 - None, # 1414 - None, # 1415 - None, # 1416 - None, # 1417 - None, # 1418 - None, # 1419 - None, # 1420 - None, # 1421 - None, # 1422 - None, # 1423 - None, # 1424 - None, # 1425 - None, # 1426 - None, # 1427 - None, # 1428 - None, # 1429 - None, # 1430 - None, # 1431 - None, # 1432 - None, # 1433 - None, # 1434 - None, # 1435 - None, # 1436 - None, # 1437 - None, # 1438 - None, # 1439 - None, # 1440 - None, # 1441 - None, # 1442 - None, # 1443 - None, # 1444 - None, # 1445 - None, # 1446 - None, # 1447 - None, # 1448 - None, # 1449 - None, # 1450 - None, # 1451 - None, # 1452 - None, # 1453 - None, # 1454 - None, # 1455 - None, # 1456 - None, # 1457 - None, # 1458 - None, # 1459 - None, # 1460 - None, # 1461 - None, # 1462 - None, # 1463 - None, # 1464 - None, # 1465 - None, # 1466 - None, # 1467 - None, # 1468 - None, # 1469 - None, # 1470 - None, # 1471 - None, # 1472 - None, # 1473 - None, # 1474 - None, # 1475 - None, # 1476 - None, # 1477 - None, # 1478 - None, # 1479 - None, # 1480 - None, # 1481 - None, # 1482 - None, # 1483 - None, # 1484 - None, # 1485 - None, # 1486 - None, # 1487 - None, # 1488 - None, # 1489 - None, # 1490 - None, # 1491 - None, # 1492 - None, # 1493 - None, # 1494 - None, # 1495 - None, # 1496 - None, # 1497 - None, # 1498 - None, # 1499 - None, # 1500 - None, # 1501 - None, # 1502 - None, # 1503 - None, # 1504 - None, # 1505 - None, # 1506 - None, # 1507 - None, # 1508 - None, # 1509 - None, # 1510 - None, # 1511 - None, # 1512 - None, # 1513 - None, # 1514 - None, # 1515 - None, # 1516 - None, # 1517 - None, # 1518 - None, # 1519 - None, # 1520 - None, # 1521 - None, # 1522 - None, # 1523 - None, # 1524 - None, # 1525 - None, # 1526 - None, # 1527 - None, # 1528 - None, # 1529 - None, # 1530 - None, # 1531 - None, # 1532 - None, # 1533 - None, # 1534 - None, # 1535 - None, # 1536 - None, # 1537 - None, # 1538 - None, # 1539 - None, # 1540 - None, # 1541 - None, # 1542 - None, # 1543 - None, # 1544 - None, # 1545 - None, # 1546 - None, # 1547 - None, # 1548 - None, # 1549 - None, # 1550 - None, # 1551 - None, # 1552 - None, # 1553 - None, # 1554 - None, # 1555 - None, # 1556 - None, # 1557 - None, # 1558 - None, # 1559 - None, # 1560 - None, # 1561 - None, # 1562 - None, # 1563 - None, # 1564 - None, # 1565 - None, # 1566 - None, # 1567 - None, # 1568 - None, # 1569 - None, # 1570 - None, # 1571 - None, # 1572 - None, # 1573 - None, # 1574 - None, # 1575 - None, # 1576 - None, # 1577 - None, # 1578 - None, # 1579 - None, # 1580 - None, # 1581 - None, # 1582 - None, # 1583 - None, # 1584 - None, # 1585 - None, # 1586 - None, # 1587 - None, # 1588 - None, # 1589 - None, # 1590 - None, # 1591 - None, # 1592 - None, # 1593 - None, # 1594 - None, # 1595 - None, # 1596 - None, # 1597 - None, # 1598 - None, # 1599 - None, # 1600 - None, # 1601 - None, # 1602 - None, # 1603 - None, # 1604 - None, # 1605 - None, # 1606 - None, # 1607 - None, # 1608 - None, # 1609 - None, # 1610 - None, # 1611 - None, # 1612 - None, # 1613 - None, # 1614 - None, # 1615 - None, # 1616 - None, # 1617 - None, # 1618 - None, # 1619 - None, # 1620 - None, # 1621 - None, # 1622 - None, # 1623 - None, # 1624 - None, # 1625 - None, # 1626 - None, # 1627 - None, # 1628 - None, # 1629 - None, # 1630 - None, # 1631 - None, # 1632 - None, # 1633 - None, # 1634 - None, # 1635 - None, # 1636 - None, # 1637 - None, # 1638 - None, # 1639 - None, # 1640 - None, # 1641 - None, # 1642 - None, # 1643 - None, # 1644 - None, # 1645 - None, # 1646 - None, # 1647 - None, # 1648 - None, # 1649 - None, # 1650 - None, # 1651 - None, # 1652 - None, # 1653 - None, # 1654 - None, # 1655 - None, # 1656 - None, # 1657 - None, # 1658 - None, # 1659 - None, # 1660 - None, # 1661 - None, # 1662 - None, # 1663 - None, # 1664 - None, # 1665 - None, # 1666 - None, # 1667 - None, # 1668 - None, # 1669 - None, # 1670 - None, # 1671 - None, # 1672 - None, # 1673 - None, # 1674 - None, # 1675 - None, # 1676 - None, # 1677 - None, # 1678 - None, # 1679 - None, # 1680 - None, # 1681 - None, # 1682 - None, # 1683 - None, # 1684 - None, # 1685 - None, # 1686 - None, # 1687 - None, # 1688 - None, # 1689 - None, # 1690 - None, # 1691 - None, # 1692 - None, # 1693 - None, # 1694 - None, # 1695 - None, # 1696 - None, # 1697 - None, # 1698 - None, # 1699 - None, # 1700 - None, # 1701 - None, # 1702 - None, # 1703 - None, # 1704 - None, # 1705 - None, # 1706 - None, # 1707 - None, # 1708 - None, # 1709 - None, # 1710 - None, # 1711 - None, # 1712 - None, # 1713 - None, # 1714 - None, # 1715 - None, # 1716 - None, # 1717 - None, # 1718 - None, # 1719 - None, # 1720 - None, # 1721 - None, # 1722 - None, # 1723 - None, # 1724 - None, # 1725 - None, # 1726 - None, # 1727 - None, # 1728 - None, # 1729 - None, # 1730 - None, # 1731 - None, # 1732 - None, # 1733 - None, # 1734 - None, # 1735 - None, # 1736 - None, # 1737 - None, # 1738 - None, # 1739 - None, # 1740 - None, # 1741 - None, # 1742 - None, # 1743 - None, # 1744 - None, # 1745 - None, # 1746 - None, # 1747 - None, # 1748 - None, # 1749 - None, # 1750 - None, # 1751 - None, # 1752 - None, # 1753 - None, # 1754 - None, # 1755 - None, # 1756 - None, # 1757 - None, # 1758 - None, # 1759 - None, # 1760 - None, # 1761 - None, # 1762 - None, # 1763 - None, # 1764 - None, # 1765 - None, # 1766 - None, # 1767 - None, # 1768 - None, # 1769 - None, # 1770 - None, # 1771 - None, # 1772 - None, # 1773 - None, # 1774 - None, # 1775 - None, # 1776 - None, # 1777 - None, # 1778 - None, # 1779 - None, # 1780 - None, # 1781 - None, # 1782 - None, # 1783 - None, # 1784 - None, # 1785 - None, # 1786 - None, # 1787 - None, # 1788 - None, # 1789 - None, # 1790 - None, # 1791 - None, # 1792 - None, # 1793 - None, # 1794 - None, # 1795 - None, # 1796 - None, # 1797 - None, # 1798 - None, # 1799 - None, # 1800 - None, # 1801 - None, # 1802 - None, # 1803 - None, # 1804 - None, # 1805 - None, # 1806 - None, # 1807 - None, # 1808 - None, # 1809 - None, # 1810 - None, # 1811 - None, # 1812 - None, # 1813 - None, # 1814 - None, # 1815 - None, # 1816 - None, # 1817 - None, # 1818 - None, # 1819 - None, # 1820 - None, # 1821 - None, # 1822 - None, # 1823 - None, # 1824 - None, # 1825 - None, # 1826 - None, # 1827 - None, # 1828 - None, # 1829 - None, # 1830 - None, # 1831 - None, # 1832 - None, # 1833 - None, # 1834 - None, # 1835 - None, # 1836 - None, # 1837 - None, # 1838 - None, # 1839 - None, # 1840 - None, # 1841 - None, # 1842 - None, # 1843 - None, # 1844 - None, # 1845 - None, # 1846 - None, # 1847 - None, # 1848 - None, # 1849 - None, # 1850 - None, # 1851 - None, # 1852 - None, # 1853 - None, # 1854 - None, # 1855 - None, # 1856 - None, # 1857 - None, # 1858 - None, # 1859 - None, # 1860 - None, # 1861 - None, # 1862 - None, # 1863 - None, # 1864 - None, # 1865 - None, # 1866 - None, # 1867 - None, # 1868 - None, # 1869 - None, # 1870 - None, # 1871 - None, # 1872 - None, # 1873 - None, # 1874 - None, # 1875 - None, # 1876 - None, # 1877 - None, # 1878 - None, # 1879 - None, # 1880 - None, # 1881 - None, # 1882 - None, # 1883 - None, # 1884 - None, # 1885 - None, # 1886 - None, # 1887 - None, # 1888 - None, # 1889 - None, # 1890 - None, # 1891 - None, # 1892 - None, # 1893 - None, # 1894 - None, # 1895 - None, # 1896 - None, # 1897 - None, # 1898 - None, # 1899 - None, # 1900 - None, # 1901 - None, # 1902 - None, # 1903 - None, # 1904 - None, # 1905 - None, # 1906 - None, # 1907 - None, # 1908 - None, # 1909 - None, # 1910 - None, # 1911 - None, # 1912 - None, # 1913 - None, # 1914 - None, # 1915 - None, # 1916 - None, # 1917 - None, # 1918 - None, # 1919 - None, # 1920 - None, # 1921 - None, # 1922 - None, # 1923 - None, # 1924 - None, # 1925 - None, # 1926 - None, # 1927 - None, # 1928 - None, # 1929 - None, # 1930 - None, # 1931 - None, # 1932 - None, # 1933 - None, # 1934 - None, # 1935 - None, # 1936 - None, # 1937 - None, # 1938 - None, # 1939 - None, # 1940 - None, # 1941 - None, # 1942 - None, # 1943 - None, # 1944 - None, # 1945 - None, # 1946 - None, # 1947 - None, # 1948 - None, # 1949 - None, # 1950 - None, # 1951 - None, # 1952 - None, # 1953 - None, # 1954 - None, # 1955 - None, # 1956 - None, # 1957 - None, # 1958 - None, # 1959 - None, # 1960 - None, # 1961 - None, # 1962 - None, # 1963 - None, # 1964 - None, # 1965 - None, # 1966 - None, # 1967 - None, # 1968 - None, # 1969 - None, # 1970 - None, # 1971 - None, # 1972 - None, # 1973 - None, # 1974 - None, # 1975 - None, # 1976 - None, # 1977 - None, # 1978 - None, # 1979 - None, # 1980 - None, # 1981 - None, # 1982 - None, # 1983 - None, # 1984 - None, # 1985 - None, # 1986 - None, # 1987 - None, # 1988 - None, # 1989 - None, # 1990 - None, # 1991 - None, # 1992 - None, # 1993 - None, # 1994 - None, # 1995 - None, # 1996 - None, # 1997 - None, # 1998 - None, # 1999 - None, # 2000 - None, # 2001 - None, # 2002 - None, # 2003 - None, # 2004 - None, # 2005 - None, # 2006 - None, # 2007 - None, # 2008 - None, # 2009 - None, # 2010 - None, # 2011 - None, # 2012 - None, # 2013 - None, # 2014 - None, # 2015 - None, # 2016 - None, # 2017 - None, # 2018 - None, # 2019 - None, # 2020 - None, # 2021 - None, # 2022 - None, # 2023 - None, # 2024 - None, # 2025 - None, # 2026 - None, # 2027 - None, # 2028 - None, # 2029 - None, # 2030 - None, # 2031 - None, # 2032 - None, # 2033 - None, # 2034 - None, # 2035 - None, # 2036 - None, # 2037 - None, # 2038 - None, # 2039 - None, # 2040 - None, # 2041 - None, # 2042 - None, # 2043 - None, # 2044 - None, # 2045 - None, # 2046 - None, # 2047 - None, # 2048 - None, # 2049 - None, # 2050 - None, # 2051 - None, # 2052 - None, # 2053 - None, # 2054 - None, # 2055 - None, # 2056 - None, # 2057 - None, # 2058 - None, # 2059 - None, # 2060 - None, # 2061 - None, # 2062 - None, # 2063 - None, # 2064 - None, # 2065 - None, # 2066 - None, # 2067 - None, # 2068 - None, # 2069 - None, # 2070 - None, # 2071 - None, # 2072 - None, # 2073 - None, # 2074 - None, # 2075 - None, # 2076 - None, # 2077 - None, # 2078 - None, # 2079 - None, # 2080 - None, # 2081 - None, # 2082 - None, # 2083 - None, # 2084 - None, # 2085 - None, # 2086 - None, # 2087 - None, # 2088 - None, # 2089 - None, # 2090 - None, # 2091 - None, # 2092 - None, # 2093 - None, # 2094 - None, # 2095 - None, # 2096 - None, # 2097 - None, # 2098 - None, # 2099 - None, # 2100 - None, # 2101 - None, # 2102 - None, # 2103 - None, # 2104 - None, # 2105 - None, # 2106 - None, # 2107 - None, # 2108 - None, # 2109 - None, # 2110 - None, # 2111 - None, # 2112 - None, # 2113 - None, # 2114 - None, # 2115 - None, # 2116 - None, # 2117 - None, # 2118 - None, # 2119 - None, # 2120 - None, # 2121 - None, # 2122 - None, # 2123 - None, # 2124 - None, # 2125 - None, # 2126 - None, # 2127 - None, # 2128 - None, # 2129 - None, # 2130 - None, # 2131 - None, # 2132 - None, # 2133 - None, # 2134 - None, # 2135 - None, # 2136 - None, # 2137 - None, # 2138 - None, # 2139 - None, # 2140 - None, # 2141 - None, # 2142 - None, # 2143 - None, # 2144 - None, # 2145 - None, # 2146 - None, # 2147 - None, # 2148 - None, # 2149 - None, # 2150 - None, # 2151 - None, # 2152 - None, # 2153 - None, # 2154 - None, # 2155 - None, # 2156 - None, # 2157 - None, # 2158 - None, # 2159 - None, # 2160 - None, # 2161 - None, # 2162 - None, # 2163 - None, # 2164 - None, # 2165 - None, # 2166 - None, # 2167 - None, # 2168 - None, # 2169 - None, # 2170 - None, # 2171 - None, # 2172 - None, # 2173 - None, # 2174 - None, # 2175 - None, # 2176 - None, # 2177 - None, # 2178 - None, # 2179 - None, # 2180 - None, # 2181 - None, # 2182 - None, # 2183 - None, # 2184 - None, # 2185 - None, # 2186 - None, # 2187 - None, # 2188 - None, # 2189 - None, # 2190 - None, # 2191 - None, # 2192 - None, # 2193 - None, # 2194 - None, # 2195 - None, # 2196 - None, # 2197 - None, # 2198 - None, # 2199 - None, # 2200 - None, # 2201 - None, # 2202 - None, # 2203 - None, # 2204 - None, # 2205 - None, # 2206 - None, # 2207 - None, # 2208 - None, # 2209 - None, # 2210 - None, # 2211 - None, # 2212 - None, # 2213 - None, # 2214 - None, # 2215 - None, # 2216 - None, # 2217 - None, # 2218 - None, # 2219 - None, # 2220 - None, # 2221 - None, # 2222 - None, # 2223 - None, # 2224 - None, # 2225 - None, # 2226 - None, # 2227 - None, # 2228 - None, # 2229 - None, # 2230 - None, # 2231 - None, # 2232 - None, # 2233 - None, # 2234 - None, # 2235 - None, # 2236 - None, # 2237 - None, # 2238 - None, # 2239 - None, # 2240 - None, # 2241 - None, # 2242 - None, # 2243 - None, # 2244 - None, # 2245 - None, # 2246 - None, # 2247 - None, # 2248 - None, # 2249 - None, # 2250 - None, # 2251 - None, # 2252 - None, # 2253 - None, # 2254 - None, # 2255 - None, # 2256 - None, # 2257 - None, # 2258 - None, # 2259 - None, # 2260 - None, # 2261 - None, # 2262 - None, # 2263 - None, # 2264 - None, # 2265 - None, # 2266 - None, # 2267 - None, # 2268 - None, # 2269 - None, # 2270 - None, # 2271 - None, # 2272 - None, # 2273 - None, # 2274 - None, # 2275 - None, # 2276 - None, # 2277 - None, # 2278 - None, # 2279 - None, # 2280 - None, # 2281 - None, # 2282 - None, # 2283 - None, # 2284 - None, # 2285 - None, # 2286 - None, # 2287 - None, # 2288 - None, # 2289 - None, # 2290 - None, # 2291 - None, # 2292 - None, # 2293 - None, # 2294 - None, # 2295 - None, # 2296 - None, # 2297 - None, # 2298 - None, # 2299 - None, # 2300 - None, # 2301 - None, # 2302 - None, # 2303 - None, # 2304 - None, # 2305 - None, # 2306 - None, # 2307 - None, # 2308 - None, # 2309 - None, # 2310 - None, # 2311 - None, # 2312 - None, # 2313 - None, # 2314 - None, # 2315 - None, # 2316 - None, # 2317 - None, # 2318 - None, # 2319 - None, # 2320 - None, # 2321 - None, # 2322 - None, # 2323 - None, # 2324 - None, # 2325 - None, # 2326 - None, # 2327 - None, # 2328 - None, # 2329 - None, # 2330 - None, # 2331 - None, # 2332 - None, # 2333 - None, # 2334 - None, # 2335 - None, # 2336 - None, # 2337 - None, # 2338 - None, # 2339 - None, # 2340 - None, # 2341 - None, # 2342 - None, # 2343 - None, # 2344 - None, # 2345 - None, # 2346 - None, # 2347 - None, # 2348 - None, # 2349 - None, # 2350 - None, # 2351 - None, # 2352 - None, # 2353 - None, # 2354 - None, # 2355 - None, # 2356 - None, # 2357 - None, # 2358 - None, # 2359 - None, # 2360 - None, # 2361 - None, # 2362 - None, # 2363 - None, # 2364 - None, # 2365 - None, # 2366 - None, # 2367 - None, # 2368 - None, # 2369 - None, # 2370 - None, # 2371 - None, # 2372 - None, # 2373 - None, # 2374 - None, # 2375 - None, # 2376 - None, # 2377 - None, # 2378 - None, # 2379 - None, # 2380 - None, # 2381 - None, # 2382 - None, # 2383 - None, # 2384 - None, # 2385 - None, # 2386 - None, # 2387 - None, # 2388 - None, # 2389 - None, # 2390 - None, # 2391 - None, # 2392 - None, # 2393 - None, # 2394 - None, # 2395 - None, # 2396 - None, # 2397 - None, # 2398 - None, # 2399 - None, # 2400 - None, # 2401 - None, # 2402 - None, # 2403 - None, # 2404 - None, # 2405 - None, # 2406 - None, # 2407 - None, # 2408 - None, # 2409 - None, # 2410 - None, # 2411 - None, # 2412 - None, # 2413 - None, # 2414 - None, # 2415 - None, # 2416 - None, # 2417 - None, # 2418 - None, # 2419 - None, # 2420 - None, # 2421 - None, # 2422 - None, # 2423 - None, # 2424 - None, # 2425 - None, # 2426 - None, # 2427 - None, # 2428 - None, # 2429 - None, # 2430 - None, # 2431 - None, # 2432 - None, # 2433 - None, # 2434 - None, # 2435 - None, # 2436 - None, # 2437 - None, # 2438 - None, # 2439 - None, # 2440 - None, # 2441 - None, # 2442 - None, # 2443 - None, # 2444 - None, # 2445 - None, # 2446 - None, # 2447 - None, # 2448 - None, # 2449 - None, # 2450 - None, # 2451 - None, # 2452 - None, # 2453 - None, # 2454 - None, # 2455 - None, # 2456 - None, # 2457 - None, # 2458 - None, # 2459 - None, # 2460 - None, # 2461 - None, # 2462 - None, # 2463 - None, # 2464 - None, # 2465 - None, # 2466 - None, # 2467 - None, # 2468 - None, # 2469 - None, # 2470 - None, # 2471 - None, # 2472 - None, # 2473 - None, # 2474 - None, # 2475 - None, # 2476 - None, # 2477 - None, # 2478 - None, # 2479 - None, # 2480 - None, # 2481 - None, # 2482 - None, # 2483 - None, # 2484 - None, # 2485 - None, # 2486 - None, # 2487 - None, # 2488 - None, # 2489 - None, # 2490 - None, # 2491 - None, # 2492 - None, # 2493 - None, # 2494 - None, # 2495 - None, # 2496 - None, # 2497 - None, # 2498 - None, # 2499 - None, # 2500 - None, # 2501 - None, # 2502 - None, # 2503 - None, # 2504 - None, # 2505 - None, # 2506 - None, # 2507 - None, # 2508 - None, # 2509 - None, # 2510 - None, # 2511 - None, # 2512 - None, # 2513 - None, # 2514 - None, # 2515 - None, # 2516 - None, # 2517 - None, # 2518 - None, # 2519 - None, # 2520 - None, # 2521 - None, # 2522 - None, # 2523 - None, # 2524 - None, # 2525 - None, # 2526 - None, # 2527 - None, # 2528 - None, # 2529 - None, # 2530 - None, # 2531 - None, # 2532 - None, # 2533 - None, # 2534 - None, # 2535 - None, # 2536 - None, # 2537 - None, # 2538 - None, # 2539 - None, # 2540 - None, # 2541 - None, # 2542 - None, # 2543 - None, # 2544 - None, # 2545 - None, # 2546 - None, # 2547 - None, # 2548 - None, # 2549 - None, # 2550 - None, # 2551 - None, # 2552 - None, # 2553 - None, # 2554 - None, # 2555 - None, # 2556 - None, # 2557 - None, # 2558 - None, # 2559 - None, # 2560 - None, # 2561 - None, # 2562 - None, # 2563 - None, # 2564 - None, # 2565 - None, # 2566 - None, # 2567 - None, # 2568 - None, # 2569 - None, # 2570 - None, # 2571 - None, # 2572 - None, # 2573 - None, # 2574 - None, # 2575 - None, # 2576 - None, # 2577 - None, # 2578 - None, # 2579 - None, # 2580 - None, # 2581 - None, # 2582 - None, # 2583 - None, # 2584 - None, # 2585 - None, # 2586 - None, # 2587 - None, # 2588 - None, # 2589 - None, # 2590 - None, # 2591 - None, # 2592 - None, # 2593 - None, # 2594 - None, # 2595 - None, # 2596 - None, # 2597 - None, # 2598 - None, # 2599 - None, # 2600 - None, # 2601 - None, # 2602 - None, # 2603 - None, # 2604 - None, # 2605 - None, # 2606 - None, # 2607 - None, # 2608 - None, # 2609 - None, # 2610 - None, # 2611 - None, # 2612 - None, # 2613 - None, # 2614 - None, # 2615 - None, # 2616 - None, # 2617 - None, # 2618 - None, # 2619 - None, # 2620 - None, # 2621 - None, # 2622 - None, # 2623 - None, # 2624 - None, # 2625 - None, # 2626 - None, # 2627 - None, # 2628 - None, # 2629 - None, # 2630 - None, # 2631 - None, # 2632 - None, # 2633 - None, # 2634 - None, # 2635 - None, # 2636 - None, # 2637 - None, # 2638 - None, # 2639 - None, # 2640 - None, # 2641 - None, # 2642 - None, # 2643 - None, # 2644 - None, # 2645 - None, # 2646 - None, # 2647 - None, # 2648 - None, # 2649 - None, # 2650 - None, # 2651 - None, # 2652 - None, # 2653 - None, # 2654 - None, # 2655 - None, # 2656 - None, # 2657 - None, # 2658 - None, # 2659 - None, # 2660 - None, # 2661 - None, # 2662 - None, # 2663 - None, # 2664 - None, # 2665 - None, # 2666 - None, # 2667 - None, # 2668 - None, # 2669 - None, # 2670 - None, # 2671 - None, # 2672 - None, # 2673 - None, # 2674 - None, # 2675 - None, # 2676 - None, # 2677 - None, # 2678 - None, # 2679 - None, # 2680 - None, # 2681 - None, # 2682 - None, # 2683 - None, # 2684 - None, # 2685 - None, # 2686 - None, # 2687 - None, # 2688 - None, # 2689 - None, # 2690 - None, # 2691 - None, # 2692 - None, # 2693 - None, # 2694 - None, # 2695 - None, # 2696 - None, # 2697 - None, # 2698 - None, # 2699 - None, # 2700 - None, # 2701 - None, # 2702 - None, # 2703 - None, # 2704 - None, # 2705 - None, # 2706 - None, # 2707 - None, # 2708 - None, # 2709 - None, # 2710 - None, # 2711 - None, # 2712 - None, # 2713 - None, # 2714 - None, # 2715 - None, # 2716 - None, # 2717 - None, # 2718 - None, # 2719 - None, # 2720 - None, # 2721 - None, # 2722 - None, # 2723 - None, # 2724 - None, # 2725 - None, # 2726 - None, # 2727 - None, # 2728 - None, # 2729 - None, # 2730 - None, # 2731 - None, # 2732 - None, # 2733 - None, # 2734 - None, # 2735 - None, # 2736 - None, # 2737 - None, # 2738 - None, # 2739 - None, # 2740 - None, # 2741 - None, # 2742 - None, # 2743 - None, # 2744 - None, # 2745 - None, # 2746 - None, # 2747 - None, # 2748 - None, # 2749 - None, # 2750 - None, # 2751 - None, # 2752 - None, # 2753 - None, # 2754 - None, # 2755 - None, # 2756 - None, # 2757 - None, # 2758 - None, # 2759 - None, # 2760 - None, # 2761 - None, # 2762 - None, # 2763 - None, # 2764 - None, # 2765 - None, # 2766 - None, # 2767 - None, # 2768 - None, # 2769 - None, # 2770 - None, # 2771 - None, # 2772 - None, # 2773 - None, # 2774 - None, # 2775 - None, # 2776 - None, # 2777 - None, # 2778 - None, # 2779 - None, # 2780 - None, # 2781 - None, # 2782 - None, # 2783 - None, # 2784 - None, # 2785 - None, # 2786 - None, # 2787 - None, # 2788 - None, # 2789 - None, # 2790 - None, # 2791 - None, # 2792 - None, # 2793 - None, # 2794 - None, # 2795 - None, # 2796 - None, # 2797 - None, # 2798 - None, # 2799 - None, # 2800 - None, # 2801 - None, # 2802 - None, # 2803 - None, # 2804 - None, # 2805 - None, # 2806 - None, # 2807 - None, # 2808 - None, # 2809 - None, # 2810 - None, # 2811 - None, # 2812 - None, # 2813 - None, # 2814 - None, # 2815 - None, # 2816 - None, # 2817 - None, # 2818 - None, # 2819 - None, # 2820 - None, # 2821 - None, # 2822 - None, # 2823 - None, # 2824 - None, # 2825 - None, # 2826 - None, # 2827 - None, # 2828 - None, # 2829 - None, # 2830 - None, # 2831 - None, # 2832 - None, # 2833 - None, # 2834 - None, # 2835 - None, # 2836 - None, # 2837 - None, # 2838 - None, # 2839 - None, # 2840 - None, # 2841 - None, # 2842 - None, # 2843 - None, # 2844 - None, # 2845 - None, # 2846 - None, # 2847 - None, # 2848 - None, # 2849 - None, # 2850 - None, # 2851 - None, # 2852 - None, # 2853 - None, # 2854 - None, # 2855 - None, # 2856 - None, # 2857 - None, # 2858 - None, # 2859 - None, # 2860 - None, # 2861 - None, # 2862 - None, # 2863 - None, # 2864 - None, # 2865 - None, # 2866 - None, # 2867 - None, # 2868 - None, # 2869 - None, # 2870 - None, # 2871 - None, # 2872 - None, # 2873 - None, # 2874 - None, # 2875 - None, # 2876 - None, # 2877 - None, # 2878 - None, # 2879 - None, # 2880 - None, # 2881 - None, # 2882 - None, # 2883 - None, # 2884 - None, # 2885 - None, # 2886 - None, # 2887 - None, # 2888 - None, # 2889 - None, # 2890 - None, # 2891 - None, # 2892 - None, # 2893 - None, # 2894 - None, # 2895 - None, # 2896 - None, # 2897 - None, # 2898 - None, # 2899 - None, # 2900 - None, # 2901 - None, # 2902 - None, # 2903 - None, # 2904 - None, # 2905 - None, # 2906 - None, # 2907 - None, # 2908 - None, # 2909 - None, # 2910 - None, # 2911 - None, # 2912 - None, # 2913 - None, # 2914 - None, # 2915 - None, # 2916 - None, # 2917 - None, # 2918 - None, # 2919 - None, # 2920 - None, # 2921 - None, # 2922 - None, # 2923 - None, # 2924 - None, # 2925 - None, # 2926 - None, # 2927 - None, # 2928 - None, # 2929 - None, # 2930 - None, # 2931 - None, # 2932 - None, # 2933 - None, # 2934 - None, # 2935 - None, # 2936 - None, # 2937 - None, # 2938 - None, # 2939 - None, # 2940 - None, # 2941 - None, # 2942 - None, # 2943 - None, # 2944 - None, # 2945 - None, # 2946 - None, # 2947 - None, # 2948 - None, # 2949 - None, # 2950 - None, # 2951 - None, # 2952 - None, # 2953 - None, # 2954 - None, # 2955 - None, # 2956 - None, # 2957 - None, # 2958 - None, # 2959 - None, # 2960 - None, # 2961 - None, # 2962 - None, # 2963 - None, # 2964 - None, # 2965 - None, # 2966 - None, # 2967 - None, # 2968 - None, # 2969 - None, # 2970 - None, # 2971 - None, # 2972 - None, # 2973 - None, # 2974 - None, # 2975 - None, # 2976 - None, # 2977 - None, # 2978 - None, # 2979 - None, # 2980 - None, # 2981 - None, # 2982 - None, # 2983 - None, # 2984 - None, # 2985 - None, # 2986 - None, # 2987 - None, # 2988 - None, # 2989 - None, # 2990 - None, # 2991 - None, # 2992 - None, # 2993 - None, # 2994 - None, # 2995 - None, # 2996 - None, # 2997 - None, # 2998 - None, # 2999 - None, # 3000 - None, # 3001 - None, # 3002 - None, # 3003 - None, # 3004 - None, # 3005 - None, # 3006 - None, # 3007 - None, # 3008 - None, # 3009 - None, # 3010 - None, # 3011 - None, # 3012 - None, # 3013 - None, # 3014 - None, # 3015 - None, # 3016 - None, # 3017 - None, # 3018 - None, # 3019 - None, # 3020 - None, # 3021 - None, # 3022 - None, # 3023 - None, # 3024 - None, # 3025 - None, # 3026 - None, # 3027 - None, # 3028 - None, # 3029 - None, # 3030 - None, # 3031 - None, # 3032 - None, # 3033 - None, # 3034 - None, # 3035 - None, # 3036 - None, # 3037 - None, # 3038 - None, # 3039 - None, # 3040 - None, # 3041 - None, # 3042 - None, # 3043 - None, # 3044 - None, # 3045 - None, # 3046 - None, # 3047 - None, # 3048 - None, # 3049 - None, # 3050 - None, # 3051 - None, # 3052 - None, # 3053 - None, # 3054 - None, # 3055 - None, # 3056 - None, # 3057 - None, # 3058 - None, # 3059 - None, # 3060 - None, # 3061 - None, # 3062 - None, # 3063 - None, # 3064 - None, # 3065 - None, # 3066 - None, # 3067 - None, # 3068 - None, # 3069 - None, # 3070 - None, # 3071 - None, # 3072 - None, # 3073 - None, # 3074 - None, # 3075 - None, # 3076 - None, # 3077 - None, # 3078 - None, # 3079 - None, # 3080 - None, # 3081 - None, # 3082 - None, # 3083 - None, # 3084 - None, # 3085 - None, # 3086 - None, # 3087 - None, # 3088 - None, # 3089 - None, # 3090 - None, # 3091 - None, # 3092 - None, # 3093 - None, # 3094 - None, # 3095 - None, # 3096 - None, # 3097 - None, # 3098 - None, # 3099 - None, # 3100 - None, # 3101 - None, # 3102 - None, # 3103 - None, # 3104 - None, # 3105 - None, # 3106 - None, # 3107 - None, # 3108 - None, # 3109 - None, # 3110 - None, # 3111 - None, # 3112 - None, # 3113 - None, # 3114 - None, # 3115 - None, # 3116 - None, # 3117 - None, # 3118 - None, # 3119 - None, # 3120 - None, # 3121 - None, # 3122 - None, # 3123 - None, # 3124 - None, # 3125 - None, # 3126 - None, # 3127 - None, # 3128 - None, # 3129 - None, # 3130 - None, # 3131 - None, # 3132 - None, # 3133 - None, # 3134 - None, # 3135 - None, # 3136 - None, # 3137 - None, # 3138 - None, # 3139 - None, # 3140 - None, # 3141 - None, # 3142 - None, # 3143 - None, # 3144 - None, # 3145 - None, # 3146 - None, # 3147 - None, # 3148 - None, # 3149 - None, # 3150 - None, # 3151 - None, # 3152 - None, # 3153 - None, # 3154 - None, # 3155 - None, # 3156 - None, # 3157 - None, # 3158 - None, # 3159 - None, # 3160 - None, # 3161 - None, # 3162 - None, # 3163 - None, # 3164 - None, # 3165 - None, # 3166 - None, # 3167 - None, # 3168 - None, # 3169 - None, # 3170 - None, # 3171 - None, # 3172 - None, # 3173 - None, # 3174 - None, # 3175 - None, # 3176 - None, # 3177 - None, # 3178 - None, # 3179 - None, # 3180 - None, # 3181 - None, # 3182 - None, # 3183 - None, # 3184 - None, # 3185 - None, # 3186 - None, # 3187 - None, # 3188 - None, # 3189 - None, # 3190 - None, # 3191 - None, # 3192 - None, # 3193 - None, # 3194 - None, # 3195 - None, # 3196 - None, # 3197 - None, # 3198 - None, # 3199 - None, # 3200 - None, # 3201 - None, # 3202 - None, # 3203 - None, # 3204 - None, # 3205 - None, # 3206 - None, # 3207 - None, # 3208 - None, # 3209 - None, # 3210 - None, # 3211 - None, # 3212 - None, # 3213 - None, # 3214 - None, # 3215 - None, # 3216 - None, # 3217 - None, # 3218 - None, # 3219 - None, # 3220 - None, # 3221 - None, # 3222 - None, # 3223 - None, # 3224 - None, # 3225 - None, # 3226 - None, # 3227 - None, # 3228 - None, # 3229 - None, # 3230 - None, # 3231 - None, # 3232 - None, # 3233 - None, # 3234 - None, # 3235 - None, # 3236 - None, # 3237 - None, # 3238 - None, # 3239 - None, # 3240 - None, # 3241 - None, # 3242 - None, # 3243 - None, # 3244 - None, # 3245 - None, # 3246 - None, # 3247 - None, # 3248 - None, # 3249 - None, # 3250 - None, # 3251 - None, # 3252 - None, # 3253 - None, # 3254 - None, # 3255 - None, # 3256 - None, # 3257 - None, # 3258 - None, # 3259 - None, # 3260 - None, # 3261 - None, # 3262 - None, # 3263 - None, # 3264 - None, # 3265 - None, # 3266 - None, # 3267 - None, # 3268 - None, # 3269 - None, # 3270 - None, # 3271 - None, # 3272 - None, # 3273 - None, # 3274 - None, # 3275 - None, # 3276 - None, # 3277 - None, # 3278 - None, # 3279 - None, # 3280 - None, # 3281 - None, # 3282 - None, # 3283 - None, # 3284 - None, # 3285 - None, # 3286 - None, # 3287 - None, # 3288 - None, # 3289 - None, # 3290 - None, # 3291 - None, # 3292 - None, # 3293 - None, # 3294 - None, # 3295 - None, # 3296 - None, # 3297 - None, # 3298 - None, # 3299 - None, # 3300 - None, # 3301 - None, # 3302 - None, # 3303 - None, # 3304 - None, # 3305 - None, # 3306 - None, # 3307 - None, # 3308 - None, # 3309 - None, # 3310 - None, # 3311 - None, # 3312 - None, # 3313 - None, # 3314 - None, # 3315 - None, # 3316 - None, # 3317 - None, # 3318 - None, # 3319 - None, # 3320 - None, # 3321 - None, # 3322 - None, # 3323 - None, # 3324 - None, # 3325 - None, # 3326 - None, # 3327 - None, # 3328 - (3329, TType.I32, 'serverProtocolVersion', None, None, ), # 3329 ) -all_structs.append(TOperationHandle) -TOperationHandle.thrift_spec = ( +all_structs.append(TDBSqlTempView) +TDBSqlTempView.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 1 - (2, TType.I32, 'operationType', None, None, ), # 2 - (3, TType.BOOL, 'hasResultSet', None, None, ), # 3 - (4, TType.DOUBLE, 'modifiedRowCount', None, None, ), # 4 + (1, TType.STRING, 'name', 'UTF8', None, ), # 1 + (2, TType.STRING, 'sqlStatement', 'UTF8', None, ), # 2 + (3, TType.MAP, 'properties', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 3 + (4, TType.STRING, 'viewSchema', 'UTF8', None, ), # 4 ) -all_structs.append(TOpenSessionReq) -TOpenSessionReq.thrift_spec = ( +all_structs.append(TDBSqlSessionCapabilities) +TDBSqlSessionCapabilities.thrift_spec = ( None, # 0 - (1, TType.I32, 'client_protocol', None, -7, ), # 1 - (2, TType.STRING, 'username', 'UTF8', None, ), # 2 - (3, TType.STRING, 'password', 'UTF8', None, ), # 3 - (4, TType.MAP, 'configuration', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 4 - None, # 5 - None, # 6 + (1, TType.BOOL, 'supportsMultipleCatalogs', None, None, ), # 1 +) +all_structs.append(TExpressionInfo) +TExpressionInfo.thrift_spec = ( + None, # 0 + (1, TType.STRING, 'className', 'UTF8', None, ), # 1 + (2, TType.STRING, 'usage', 'UTF8', None, ), # 2 + (3, TType.STRING, 'name', 'UTF8', None, ), # 3 + (4, TType.STRING, 'extended', 'UTF8', None, ), # 4 + (5, TType.STRING, 'db', 'UTF8', None, ), # 5 + (6, TType.STRING, 'arguments', 'UTF8', None, ), # 6 + (7, TType.STRING, 'examples', 'UTF8', None, ), # 7 + (8, TType.STRING, 'note', 'UTF8', None, ), # 8 + (9, TType.STRING, 'group', 'UTF8', None, ), # 9 + (10, TType.STRING, 'since', 'UTF8', None, ), # 10 + (11, TType.STRING, 'deprecated', 'UTF8', None, ), # 11 + (12, TType.STRING, 'source', 'UTF8', None, ), # 12 +) +all_structs.append(TDBSqlConfValue) +TDBSqlConfValue.thrift_spec = ( + None, # 0 + (1, TType.STRING, 'value', 'UTF8', None, ), # 1 +) +all_structs.append(TDBSqlSessionConf) +TDBSqlSessionConf.thrift_spec = ( + None, # 0 + (1, TType.MAP, 'confs', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 1 + (2, TType.LIST, 'tempViews', (TType.STRUCT, [TDBSqlTempView, None], False), None, ), # 2 + (3, TType.STRING, 'currentDatabase', 'UTF8', None, ), # 3 + (4, TType.STRING, 'currentCatalog', 'UTF8', None, ), # 4 + (5, TType.STRUCT, 'sessionCapabilities', [TDBSqlSessionCapabilities, None], None, ), # 5 + (6, TType.LIST, 'expressionsInfos', (TType.STRUCT, [TExpressionInfo, None], False), None, ), # 6 + (7, TType.MAP, 'internalConfs', (TType.STRING, 'UTF8', TType.STRUCT, [TDBSqlConfValue, None], False), None, ), # 7 +) +all_structs.append(TStatus) +TStatus.thrift_spec = ( + None, # 0 + (1, TType.I32, 'statusCode', None, None, ), # 1 + (2, TType.LIST, 'infoMessages', (TType.STRING, 'UTF8', False), None, ), # 2 + (3, TType.STRING, 'sqlState', 'UTF8', None, ), # 3 + (4, TType.I32, 'errorCode', None, None, ), # 4 + (5, TType.STRING, 'errorMessage', 'UTF8', None, ), # 5 + (6, TType.STRING, 'displayMessage', 'UTF8', None, ), # 6 None, # 7 None, # 8 None, # 9 @@ -25398,11 +12726,11 @@ def __ne__(self, other): None, # 1278 None, # 1279 None, # 1280 - (1281, TType.LIST, 'getInfos', (TType.I32, None, False), None, ), # 1281 - (1282, TType.I64, 'client_protocol_i64', None, None, ), # 1282 - (1283, TType.MAP, 'connectionProperties', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 1283 - (1284, TType.STRUCT, 'initialNamespace', [TNamespace, None], None, ), # 1284 - (1285, TType.BOOL, 'canUseMultipleCatalogs', None, None, ), # 1285 + None, # 1281 + None, # 1282 + None, # 1283 + None, # 1284 + None, # 1285 None, # 1286 None, # 1287 None, # 1288 @@ -27446,15 +14774,21 @@ def __ne__(self, other): None, # 3326 None, # 3327 None, # 3328 - (3329, TType.STRUCT, 'sessionId', [THandleIdentifier, None], None, ), # 3329 + (3329, TType.STRING, 'responseValidation', 'BINARY', None, ), # 3329 ) -all_structs.append(TOpenSessionResp) -TOpenSessionResp.thrift_spec = ( +all_structs.append(TNamespace) +TNamespace.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 - (2, TType.I32, 'serverProtocolVersion', None, None, ), # 2 - (3, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 3 - (4, TType.MAP, 'configuration', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 4 + (1, TType.STRING, 'catalogName', 'UTF8', None, ), # 1 + (2, TType.STRING, 'schemaName', 'UTF8', None, ), # 2 +) +all_structs.append(THandleIdentifier) +THandleIdentifier.thrift_spec = ( + None, # 0 + (1, TType.STRING, 'guid', 'BINARY', None, ), # 1 + (2, TType.STRING, 'secret', 'BINARY', None, ), # 2 + None, # 3 + None, # 4 None, # 5 None, # 6 None, # 7 @@ -28731,37 +16065,2061 @@ def __ne__(self, other): None, # 1278 None, # 1279 None, # 1280 - (1281, TType.LIST, 'getInfos', (TType.STRUCT, [TGetInfoValue, None], False), None, ), # 1281 + None, # 1281 None, # 1282 None, # 1283 - (1284, TType.STRUCT, 'initialNamespace', [TNamespace, None], None, ), # 1284 - (1285, TType.BOOL, 'canUseMultipleCatalogs', None, None, ), # 1285 -) -all_structs.append(TCloseSessionReq) -TCloseSessionReq.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 -) -all_structs.append(TCloseSessionResp) -TCloseSessionResp.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 -) -all_structs.append(TGetInfoValue) -TGetInfoValue.thrift_spec = ( - None, # 0 - (1, TType.STRING, 'stringValue', 'UTF8', None, ), # 1 - (2, TType.I16, 'smallIntValue', None, None, ), # 2 - (3, TType.I32, 'integerBitmask', None, None, ), # 3 - (4, TType.I32, 'integerFlag', None, None, ), # 4 - (5, TType.I32, 'binaryValue', None, None, ), # 5 - (6, TType.I64, 'lenValue', None, None, ), # 6 + None, # 1284 + None, # 1285 + None, # 1286 + None, # 1287 + None, # 1288 + None, # 1289 + None, # 1290 + None, # 1291 + None, # 1292 + None, # 1293 + None, # 1294 + None, # 1295 + None, # 1296 + None, # 1297 + None, # 1298 + None, # 1299 + None, # 1300 + None, # 1301 + None, # 1302 + None, # 1303 + None, # 1304 + None, # 1305 + None, # 1306 + None, # 1307 + None, # 1308 + None, # 1309 + None, # 1310 + None, # 1311 + None, # 1312 + None, # 1313 + None, # 1314 + None, # 1315 + None, # 1316 + None, # 1317 + None, # 1318 + None, # 1319 + None, # 1320 + None, # 1321 + None, # 1322 + None, # 1323 + None, # 1324 + None, # 1325 + None, # 1326 + None, # 1327 + None, # 1328 + None, # 1329 + None, # 1330 + None, # 1331 + None, # 1332 + None, # 1333 + None, # 1334 + None, # 1335 + None, # 1336 + None, # 1337 + None, # 1338 + None, # 1339 + None, # 1340 + None, # 1341 + None, # 1342 + None, # 1343 + None, # 1344 + None, # 1345 + None, # 1346 + None, # 1347 + None, # 1348 + None, # 1349 + None, # 1350 + None, # 1351 + None, # 1352 + None, # 1353 + None, # 1354 + None, # 1355 + None, # 1356 + None, # 1357 + None, # 1358 + None, # 1359 + None, # 1360 + None, # 1361 + None, # 1362 + None, # 1363 + None, # 1364 + None, # 1365 + None, # 1366 + None, # 1367 + None, # 1368 + None, # 1369 + None, # 1370 + None, # 1371 + None, # 1372 + None, # 1373 + None, # 1374 + None, # 1375 + None, # 1376 + None, # 1377 + None, # 1378 + None, # 1379 + None, # 1380 + None, # 1381 + None, # 1382 + None, # 1383 + None, # 1384 + None, # 1385 + None, # 1386 + None, # 1387 + None, # 1388 + None, # 1389 + None, # 1390 + None, # 1391 + None, # 1392 + None, # 1393 + None, # 1394 + None, # 1395 + None, # 1396 + None, # 1397 + None, # 1398 + None, # 1399 + None, # 1400 + None, # 1401 + None, # 1402 + None, # 1403 + None, # 1404 + None, # 1405 + None, # 1406 + None, # 1407 + None, # 1408 + None, # 1409 + None, # 1410 + None, # 1411 + None, # 1412 + None, # 1413 + None, # 1414 + None, # 1415 + None, # 1416 + None, # 1417 + None, # 1418 + None, # 1419 + None, # 1420 + None, # 1421 + None, # 1422 + None, # 1423 + None, # 1424 + None, # 1425 + None, # 1426 + None, # 1427 + None, # 1428 + None, # 1429 + None, # 1430 + None, # 1431 + None, # 1432 + None, # 1433 + None, # 1434 + None, # 1435 + None, # 1436 + None, # 1437 + None, # 1438 + None, # 1439 + None, # 1440 + None, # 1441 + None, # 1442 + None, # 1443 + None, # 1444 + None, # 1445 + None, # 1446 + None, # 1447 + None, # 1448 + None, # 1449 + None, # 1450 + None, # 1451 + None, # 1452 + None, # 1453 + None, # 1454 + None, # 1455 + None, # 1456 + None, # 1457 + None, # 1458 + None, # 1459 + None, # 1460 + None, # 1461 + None, # 1462 + None, # 1463 + None, # 1464 + None, # 1465 + None, # 1466 + None, # 1467 + None, # 1468 + None, # 1469 + None, # 1470 + None, # 1471 + None, # 1472 + None, # 1473 + None, # 1474 + None, # 1475 + None, # 1476 + None, # 1477 + None, # 1478 + None, # 1479 + None, # 1480 + None, # 1481 + None, # 1482 + None, # 1483 + None, # 1484 + None, # 1485 + None, # 1486 + None, # 1487 + None, # 1488 + None, # 1489 + None, # 1490 + None, # 1491 + None, # 1492 + None, # 1493 + None, # 1494 + None, # 1495 + None, # 1496 + None, # 1497 + None, # 1498 + None, # 1499 + None, # 1500 + None, # 1501 + None, # 1502 + None, # 1503 + None, # 1504 + None, # 1505 + None, # 1506 + None, # 1507 + None, # 1508 + None, # 1509 + None, # 1510 + None, # 1511 + None, # 1512 + None, # 1513 + None, # 1514 + None, # 1515 + None, # 1516 + None, # 1517 + None, # 1518 + None, # 1519 + None, # 1520 + None, # 1521 + None, # 1522 + None, # 1523 + None, # 1524 + None, # 1525 + None, # 1526 + None, # 1527 + None, # 1528 + None, # 1529 + None, # 1530 + None, # 1531 + None, # 1532 + None, # 1533 + None, # 1534 + None, # 1535 + None, # 1536 + None, # 1537 + None, # 1538 + None, # 1539 + None, # 1540 + None, # 1541 + None, # 1542 + None, # 1543 + None, # 1544 + None, # 1545 + None, # 1546 + None, # 1547 + None, # 1548 + None, # 1549 + None, # 1550 + None, # 1551 + None, # 1552 + None, # 1553 + None, # 1554 + None, # 1555 + None, # 1556 + None, # 1557 + None, # 1558 + None, # 1559 + None, # 1560 + None, # 1561 + None, # 1562 + None, # 1563 + None, # 1564 + None, # 1565 + None, # 1566 + None, # 1567 + None, # 1568 + None, # 1569 + None, # 1570 + None, # 1571 + None, # 1572 + None, # 1573 + None, # 1574 + None, # 1575 + None, # 1576 + None, # 1577 + None, # 1578 + None, # 1579 + None, # 1580 + None, # 1581 + None, # 1582 + None, # 1583 + None, # 1584 + None, # 1585 + None, # 1586 + None, # 1587 + None, # 1588 + None, # 1589 + None, # 1590 + None, # 1591 + None, # 1592 + None, # 1593 + None, # 1594 + None, # 1595 + None, # 1596 + None, # 1597 + None, # 1598 + None, # 1599 + None, # 1600 + None, # 1601 + None, # 1602 + None, # 1603 + None, # 1604 + None, # 1605 + None, # 1606 + None, # 1607 + None, # 1608 + None, # 1609 + None, # 1610 + None, # 1611 + None, # 1612 + None, # 1613 + None, # 1614 + None, # 1615 + None, # 1616 + None, # 1617 + None, # 1618 + None, # 1619 + None, # 1620 + None, # 1621 + None, # 1622 + None, # 1623 + None, # 1624 + None, # 1625 + None, # 1626 + None, # 1627 + None, # 1628 + None, # 1629 + None, # 1630 + None, # 1631 + None, # 1632 + None, # 1633 + None, # 1634 + None, # 1635 + None, # 1636 + None, # 1637 + None, # 1638 + None, # 1639 + None, # 1640 + None, # 1641 + None, # 1642 + None, # 1643 + None, # 1644 + None, # 1645 + None, # 1646 + None, # 1647 + None, # 1648 + None, # 1649 + None, # 1650 + None, # 1651 + None, # 1652 + None, # 1653 + None, # 1654 + None, # 1655 + None, # 1656 + None, # 1657 + None, # 1658 + None, # 1659 + None, # 1660 + None, # 1661 + None, # 1662 + None, # 1663 + None, # 1664 + None, # 1665 + None, # 1666 + None, # 1667 + None, # 1668 + None, # 1669 + None, # 1670 + None, # 1671 + None, # 1672 + None, # 1673 + None, # 1674 + None, # 1675 + None, # 1676 + None, # 1677 + None, # 1678 + None, # 1679 + None, # 1680 + None, # 1681 + None, # 1682 + None, # 1683 + None, # 1684 + None, # 1685 + None, # 1686 + None, # 1687 + None, # 1688 + None, # 1689 + None, # 1690 + None, # 1691 + None, # 1692 + None, # 1693 + None, # 1694 + None, # 1695 + None, # 1696 + None, # 1697 + None, # 1698 + None, # 1699 + None, # 1700 + None, # 1701 + None, # 1702 + None, # 1703 + None, # 1704 + None, # 1705 + None, # 1706 + None, # 1707 + None, # 1708 + None, # 1709 + None, # 1710 + None, # 1711 + None, # 1712 + None, # 1713 + None, # 1714 + None, # 1715 + None, # 1716 + None, # 1717 + None, # 1718 + None, # 1719 + None, # 1720 + None, # 1721 + None, # 1722 + None, # 1723 + None, # 1724 + None, # 1725 + None, # 1726 + None, # 1727 + None, # 1728 + None, # 1729 + None, # 1730 + None, # 1731 + None, # 1732 + None, # 1733 + None, # 1734 + None, # 1735 + None, # 1736 + None, # 1737 + None, # 1738 + None, # 1739 + None, # 1740 + None, # 1741 + None, # 1742 + None, # 1743 + None, # 1744 + None, # 1745 + None, # 1746 + None, # 1747 + None, # 1748 + None, # 1749 + None, # 1750 + None, # 1751 + None, # 1752 + None, # 1753 + None, # 1754 + None, # 1755 + None, # 1756 + None, # 1757 + None, # 1758 + None, # 1759 + None, # 1760 + None, # 1761 + None, # 1762 + None, # 1763 + None, # 1764 + None, # 1765 + None, # 1766 + None, # 1767 + None, # 1768 + None, # 1769 + None, # 1770 + None, # 1771 + None, # 1772 + None, # 1773 + None, # 1774 + None, # 1775 + None, # 1776 + None, # 1777 + None, # 1778 + None, # 1779 + None, # 1780 + None, # 1781 + None, # 1782 + None, # 1783 + None, # 1784 + None, # 1785 + None, # 1786 + None, # 1787 + None, # 1788 + None, # 1789 + None, # 1790 + None, # 1791 + None, # 1792 + None, # 1793 + None, # 1794 + None, # 1795 + None, # 1796 + None, # 1797 + None, # 1798 + None, # 1799 + None, # 1800 + None, # 1801 + None, # 1802 + None, # 1803 + None, # 1804 + None, # 1805 + None, # 1806 + None, # 1807 + None, # 1808 + None, # 1809 + None, # 1810 + None, # 1811 + None, # 1812 + None, # 1813 + None, # 1814 + None, # 1815 + None, # 1816 + None, # 1817 + None, # 1818 + None, # 1819 + None, # 1820 + None, # 1821 + None, # 1822 + None, # 1823 + None, # 1824 + None, # 1825 + None, # 1826 + None, # 1827 + None, # 1828 + None, # 1829 + None, # 1830 + None, # 1831 + None, # 1832 + None, # 1833 + None, # 1834 + None, # 1835 + None, # 1836 + None, # 1837 + None, # 1838 + None, # 1839 + None, # 1840 + None, # 1841 + None, # 1842 + None, # 1843 + None, # 1844 + None, # 1845 + None, # 1846 + None, # 1847 + None, # 1848 + None, # 1849 + None, # 1850 + None, # 1851 + None, # 1852 + None, # 1853 + None, # 1854 + None, # 1855 + None, # 1856 + None, # 1857 + None, # 1858 + None, # 1859 + None, # 1860 + None, # 1861 + None, # 1862 + None, # 1863 + None, # 1864 + None, # 1865 + None, # 1866 + None, # 1867 + None, # 1868 + None, # 1869 + None, # 1870 + None, # 1871 + None, # 1872 + None, # 1873 + None, # 1874 + None, # 1875 + None, # 1876 + None, # 1877 + None, # 1878 + None, # 1879 + None, # 1880 + None, # 1881 + None, # 1882 + None, # 1883 + None, # 1884 + None, # 1885 + None, # 1886 + None, # 1887 + None, # 1888 + None, # 1889 + None, # 1890 + None, # 1891 + None, # 1892 + None, # 1893 + None, # 1894 + None, # 1895 + None, # 1896 + None, # 1897 + None, # 1898 + None, # 1899 + None, # 1900 + None, # 1901 + None, # 1902 + None, # 1903 + None, # 1904 + None, # 1905 + None, # 1906 + None, # 1907 + None, # 1908 + None, # 1909 + None, # 1910 + None, # 1911 + None, # 1912 + None, # 1913 + None, # 1914 + None, # 1915 + None, # 1916 + None, # 1917 + None, # 1918 + None, # 1919 + None, # 1920 + None, # 1921 + None, # 1922 + None, # 1923 + None, # 1924 + None, # 1925 + None, # 1926 + None, # 1927 + None, # 1928 + None, # 1929 + None, # 1930 + None, # 1931 + None, # 1932 + None, # 1933 + None, # 1934 + None, # 1935 + None, # 1936 + None, # 1937 + None, # 1938 + None, # 1939 + None, # 1940 + None, # 1941 + None, # 1942 + None, # 1943 + None, # 1944 + None, # 1945 + None, # 1946 + None, # 1947 + None, # 1948 + None, # 1949 + None, # 1950 + None, # 1951 + None, # 1952 + None, # 1953 + None, # 1954 + None, # 1955 + None, # 1956 + None, # 1957 + None, # 1958 + None, # 1959 + None, # 1960 + None, # 1961 + None, # 1962 + None, # 1963 + None, # 1964 + None, # 1965 + None, # 1966 + None, # 1967 + None, # 1968 + None, # 1969 + None, # 1970 + None, # 1971 + None, # 1972 + None, # 1973 + None, # 1974 + None, # 1975 + None, # 1976 + None, # 1977 + None, # 1978 + None, # 1979 + None, # 1980 + None, # 1981 + None, # 1982 + None, # 1983 + None, # 1984 + None, # 1985 + None, # 1986 + None, # 1987 + None, # 1988 + None, # 1989 + None, # 1990 + None, # 1991 + None, # 1992 + None, # 1993 + None, # 1994 + None, # 1995 + None, # 1996 + None, # 1997 + None, # 1998 + None, # 1999 + None, # 2000 + None, # 2001 + None, # 2002 + None, # 2003 + None, # 2004 + None, # 2005 + None, # 2006 + None, # 2007 + None, # 2008 + None, # 2009 + None, # 2010 + None, # 2011 + None, # 2012 + None, # 2013 + None, # 2014 + None, # 2015 + None, # 2016 + None, # 2017 + None, # 2018 + None, # 2019 + None, # 2020 + None, # 2021 + None, # 2022 + None, # 2023 + None, # 2024 + None, # 2025 + None, # 2026 + None, # 2027 + None, # 2028 + None, # 2029 + None, # 2030 + None, # 2031 + None, # 2032 + None, # 2033 + None, # 2034 + None, # 2035 + None, # 2036 + None, # 2037 + None, # 2038 + None, # 2039 + None, # 2040 + None, # 2041 + None, # 2042 + None, # 2043 + None, # 2044 + None, # 2045 + None, # 2046 + None, # 2047 + None, # 2048 + None, # 2049 + None, # 2050 + None, # 2051 + None, # 2052 + None, # 2053 + None, # 2054 + None, # 2055 + None, # 2056 + None, # 2057 + None, # 2058 + None, # 2059 + None, # 2060 + None, # 2061 + None, # 2062 + None, # 2063 + None, # 2064 + None, # 2065 + None, # 2066 + None, # 2067 + None, # 2068 + None, # 2069 + None, # 2070 + None, # 2071 + None, # 2072 + None, # 2073 + None, # 2074 + None, # 2075 + None, # 2076 + None, # 2077 + None, # 2078 + None, # 2079 + None, # 2080 + None, # 2081 + None, # 2082 + None, # 2083 + None, # 2084 + None, # 2085 + None, # 2086 + None, # 2087 + None, # 2088 + None, # 2089 + None, # 2090 + None, # 2091 + None, # 2092 + None, # 2093 + None, # 2094 + None, # 2095 + None, # 2096 + None, # 2097 + None, # 2098 + None, # 2099 + None, # 2100 + None, # 2101 + None, # 2102 + None, # 2103 + None, # 2104 + None, # 2105 + None, # 2106 + None, # 2107 + None, # 2108 + None, # 2109 + None, # 2110 + None, # 2111 + None, # 2112 + None, # 2113 + None, # 2114 + None, # 2115 + None, # 2116 + None, # 2117 + None, # 2118 + None, # 2119 + None, # 2120 + None, # 2121 + None, # 2122 + None, # 2123 + None, # 2124 + None, # 2125 + None, # 2126 + None, # 2127 + None, # 2128 + None, # 2129 + None, # 2130 + None, # 2131 + None, # 2132 + None, # 2133 + None, # 2134 + None, # 2135 + None, # 2136 + None, # 2137 + None, # 2138 + None, # 2139 + None, # 2140 + None, # 2141 + None, # 2142 + None, # 2143 + None, # 2144 + None, # 2145 + None, # 2146 + None, # 2147 + None, # 2148 + None, # 2149 + None, # 2150 + None, # 2151 + None, # 2152 + None, # 2153 + None, # 2154 + None, # 2155 + None, # 2156 + None, # 2157 + None, # 2158 + None, # 2159 + None, # 2160 + None, # 2161 + None, # 2162 + None, # 2163 + None, # 2164 + None, # 2165 + None, # 2166 + None, # 2167 + None, # 2168 + None, # 2169 + None, # 2170 + None, # 2171 + None, # 2172 + None, # 2173 + None, # 2174 + None, # 2175 + None, # 2176 + None, # 2177 + None, # 2178 + None, # 2179 + None, # 2180 + None, # 2181 + None, # 2182 + None, # 2183 + None, # 2184 + None, # 2185 + None, # 2186 + None, # 2187 + None, # 2188 + None, # 2189 + None, # 2190 + None, # 2191 + None, # 2192 + None, # 2193 + None, # 2194 + None, # 2195 + None, # 2196 + None, # 2197 + None, # 2198 + None, # 2199 + None, # 2200 + None, # 2201 + None, # 2202 + None, # 2203 + None, # 2204 + None, # 2205 + None, # 2206 + None, # 2207 + None, # 2208 + None, # 2209 + None, # 2210 + None, # 2211 + None, # 2212 + None, # 2213 + None, # 2214 + None, # 2215 + None, # 2216 + None, # 2217 + None, # 2218 + None, # 2219 + None, # 2220 + None, # 2221 + None, # 2222 + None, # 2223 + None, # 2224 + None, # 2225 + None, # 2226 + None, # 2227 + None, # 2228 + None, # 2229 + None, # 2230 + None, # 2231 + None, # 2232 + None, # 2233 + None, # 2234 + None, # 2235 + None, # 2236 + None, # 2237 + None, # 2238 + None, # 2239 + None, # 2240 + None, # 2241 + None, # 2242 + None, # 2243 + None, # 2244 + None, # 2245 + None, # 2246 + None, # 2247 + None, # 2248 + None, # 2249 + None, # 2250 + None, # 2251 + None, # 2252 + None, # 2253 + None, # 2254 + None, # 2255 + None, # 2256 + None, # 2257 + None, # 2258 + None, # 2259 + None, # 2260 + None, # 2261 + None, # 2262 + None, # 2263 + None, # 2264 + None, # 2265 + None, # 2266 + None, # 2267 + None, # 2268 + None, # 2269 + None, # 2270 + None, # 2271 + None, # 2272 + None, # 2273 + None, # 2274 + None, # 2275 + None, # 2276 + None, # 2277 + None, # 2278 + None, # 2279 + None, # 2280 + None, # 2281 + None, # 2282 + None, # 2283 + None, # 2284 + None, # 2285 + None, # 2286 + None, # 2287 + None, # 2288 + None, # 2289 + None, # 2290 + None, # 2291 + None, # 2292 + None, # 2293 + None, # 2294 + None, # 2295 + None, # 2296 + None, # 2297 + None, # 2298 + None, # 2299 + None, # 2300 + None, # 2301 + None, # 2302 + None, # 2303 + None, # 2304 + None, # 2305 + None, # 2306 + None, # 2307 + None, # 2308 + None, # 2309 + None, # 2310 + None, # 2311 + None, # 2312 + None, # 2313 + None, # 2314 + None, # 2315 + None, # 2316 + None, # 2317 + None, # 2318 + None, # 2319 + None, # 2320 + None, # 2321 + None, # 2322 + None, # 2323 + None, # 2324 + None, # 2325 + None, # 2326 + None, # 2327 + None, # 2328 + None, # 2329 + None, # 2330 + None, # 2331 + None, # 2332 + None, # 2333 + None, # 2334 + None, # 2335 + None, # 2336 + None, # 2337 + None, # 2338 + None, # 2339 + None, # 2340 + None, # 2341 + None, # 2342 + None, # 2343 + None, # 2344 + None, # 2345 + None, # 2346 + None, # 2347 + None, # 2348 + None, # 2349 + None, # 2350 + None, # 2351 + None, # 2352 + None, # 2353 + None, # 2354 + None, # 2355 + None, # 2356 + None, # 2357 + None, # 2358 + None, # 2359 + None, # 2360 + None, # 2361 + None, # 2362 + None, # 2363 + None, # 2364 + None, # 2365 + None, # 2366 + None, # 2367 + None, # 2368 + None, # 2369 + None, # 2370 + None, # 2371 + None, # 2372 + None, # 2373 + None, # 2374 + None, # 2375 + None, # 2376 + None, # 2377 + None, # 2378 + None, # 2379 + None, # 2380 + None, # 2381 + None, # 2382 + None, # 2383 + None, # 2384 + None, # 2385 + None, # 2386 + None, # 2387 + None, # 2388 + None, # 2389 + None, # 2390 + None, # 2391 + None, # 2392 + None, # 2393 + None, # 2394 + None, # 2395 + None, # 2396 + None, # 2397 + None, # 2398 + None, # 2399 + None, # 2400 + None, # 2401 + None, # 2402 + None, # 2403 + None, # 2404 + None, # 2405 + None, # 2406 + None, # 2407 + None, # 2408 + None, # 2409 + None, # 2410 + None, # 2411 + None, # 2412 + None, # 2413 + None, # 2414 + None, # 2415 + None, # 2416 + None, # 2417 + None, # 2418 + None, # 2419 + None, # 2420 + None, # 2421 + None, # 2422 + None, # 2423 + None, # 2424 + None, # 2425 + None, # 2426 + None, # 2427 + None, # 2428 + None, # 2429 + None, # 2430 + None, # 2431 + None, # 2432 + None, # 2433 + None, # 2434 + None, # 2435 + None, # 2436 + None, # 2437 + None, # 2438 + None, # 2439 + None, # 2440 + None, # 2441 + None, # 2442 + None, # 2443 + None, # 2444 + None, # 2445 + None, # 2446 + None, # 2447 + None, # 2448 + None, # 2449 + None, # 2450 + None, # 2451 + None, # 2452 + None, # 2453 + None, # 2454 + None, # 2455 + None, # 2456 + None, # 2457 + None, # 2458 + None, # 2459 + None, # 2460 + None, # 2461 + None, # 2462 + None, # 2463 + None, # 2464 + None, # 2465 + None, # 2466 + None, # 2467 + None, # 2468 + None, # 2469 + None, # 2470 + None, # 2471 + None, # 2472 + None, # 2473 + None, # 2474 + None, # 2475 + None, # 2476 + None, # 2477 + None, # 2478 + None, # 2479 + None, # 2480 + None, # 2481 + None, # 2482 + None, # 2483 + None, # 2484 + None, # 2485 + None, # 2486 + None, # 2487 + None, # 2488 + None, # 2489 + None, # 2490 + None, # 2491 + None, # 2492 + None, # 2493 + None, # 2494 + None, # 2495 + None, # 2496 + None, # 2497 + None, # 2498 + None, # 2499 + None, # 2500 + None, # 2501 + None, # 2502 + None, # 2503 + None, # 2504 + None, # 2505 + None, # 2506 + None, # 2507 + None, # 2508 + None, # 2509 + None, # 2510 + None, # 2511 + None, # 2512 + None, # 2513 + None, # 2514 + None, # 2515 + None, # 2516 + None, # 2517 + None, # 2518 + None, # 2519 + None, # 2520 + None, # 2521 + None, # 2522 + None, # 2523 + None, # 2524 + None, # 2525 + None, # 2526 + None, # 2527 + None, # 2528 + None, # 2529 + None, # 2530 + None, # 2531 + None, # 2532 + None, # 2533 + None, # 2534 + None, # 2535 + None, # 2536 + None, # 2537 + None, # 2538 + None, # 2539 + None, # 2540 + None, # 2541 + None, # 2542 + None, # 2543 + None, # 2544 + None, # 2545 + None, # 2546 + None, # 2547 + None, # 2548 + None, # 2549 + None, # 2550 + None, # 2551 + None, # 2552 + None, # 2553 + None, # 2554 + None, # 2555 + None, # 2556 + None, # 2557 + None, # 2558 + None, # 2559 + None, # 2560 + None, # 2561 + None, # 2562 + None, # 2563 + None, # 2564 + None, # 2565 + None, # 2566 + None, # 2567 + None, # 2568 + None, # 2569 + None, # 2570 + None, # 2571 + None, # 2572 + None, # 2573 + None, # 2574 + None, # 2575 + None, # 2576 + None, # 2577 + None, # 2578 + None, # 2579 + None, # 2580 + None, # 2581 + None, # 2582 + None, # 2583 + None, # 2584 + None, # 2585 + None, # 2586 + None, # 2587 + None, # 2588 + None, # 2589 + None, # 2590 + None, # 2591 + None, # 2592 + None, # 2593 + None, # 2594 + None, # 2595 + None, # 2596 + None, # 2597 + None, # 2598 + None, # 2599 + None, # 2600 + None, # 2601 + None, # 2602 + None, # 2603 + None, # 2604 + None, # 2605 + None, # 2606 + None, # 2607 + None, # 2608 + None, # 2609 + None, # 2610 + None, # 2611 + None, # 2612 + None, # 2613 + None, # 2614 + None, # 2615 + None, # 2616 + None, # 2617 + None, # 2618 + None, # 2619 + None, # 2620 + None, # 2621 + None, # 2622 + None, # 2623 + None, # 2624 + None, # 2625 + None, # 2626 + None, # 2627 + None, # 2628 + None, # 2629 + None, # 2630 + None, # 2631 + None, # 2632 + None, # 2633 + None, # 2634 + None, # 2635 + None, # 2636 + None, # 2637 + None, # 2638 + None, # 2639 + None, # 2640 + None, # 2641 + None, # 2642 + None, # 2643 + None, # 2644 + None, # 2645 + None, # 2646 + None, # 2647 + None, # 2648 + None, # 2649 + None, # 2650 + None, # 2651 + None, # 2652 + None, # 2653 + None, # 2654 + None, # 2655 + None, # 2656 + None, # 2657 + None, # 2658 + None, # 2659 + None, # 2660 + None, # 2661 + None, # 2662 + None, # 2663 + None, # 2664 + None, # 2665 + None, # 2666 + None, # 2667 + None, # 2668 + None, # 2669 + None, # 2670 + None, # 2671 + None, # 2672 + None, # 2673 + None, # 2674 + None, # 2675 + None, # 2676 + None, # 2677 + None, # 2678 + None, # 2679 + None, # 2680 + None, # 2681 + None, # 2682 + None, # 2683 + None, # 2684 + None, # 2685 + None, # 2686 + None, # 2687 + None, # 2688 + None, # 2689 + None, # 2690 + None, # 2691 + None, # 2692 + None, # 2693 + None, # 2694 + None, # 2695 + None, # 2696 + None, # 2697 + None, # 2698 + None, # 2699 + None, # 2700 + None, # 2701 + None, # 2702 + None, # 2703 + None, # 2704 + None, # 2705 + None, # 2706 + None, # 2707 + None, # 2708 + None, # 2709 + None, # 2710 + None, # 2711 + None, # 2712 + None, # 2713 + None, # 2714 + None, # 2715 + None, # 2716 + None, # 2717 + None, # 2718 + None, # 2719 + None, # 2720 + None, # 2721 + None, # 2722 + None, # 2723 + None, # 2724 + None, # 2725 + None, # 2726 + None, # 2727 + None, # 2728 + None, # 2729 + None, # 2730 + None, # 2731 + None, # 2732 + None, # 2733 + None, # 2734 + None, # 2735 + None, # 2736 + None, # 2737 + None, # 2738 + None, # 2739 + None, # 2740 + None, # 2741 + None, # 2742 + None, # 2743 + None, # 2744 + None, # 2745 + None, # 2746 + None, # 2747 + None, # 2748 + None, # 2749 + None, # 2750 + None, # 2751 + None, # 2752 + None, # 2753 + None, # 2754 + None, # 2755 + None, # 2756 + None, # 2757 + None, # 2758 + None, # 2759 + None, # 2760 + None, # 2761 + None, # 2762 + None, # 2763 + None, # 2764 + None, # 2765 + None, # 2766 + None, # 2767 + None, # 2768 + None, # 2769 + None, # 2770 + None, # 2771 + None, # 2772 + None, # 2773 + None, # 2774 + None, # 2775 + None, # 2776 + None, # 2777 + None, # 2778 + None, # 2779 + None, # 2780 + None, # 2781 + None, # 2782 + None, # 2783 + None, # 2784 + None, # 2785 + None, # 2786 + None, # 2787 + None, # 2788 + None, # 2789 + None, # 2790 + None, # 2791 + None, # 2792 + None, # 2793 + None, # 2794 + None, # 2795 + None, # 2796 + None, # 2797 + None, # 2798 + None, # 2799 + None, # 2800 + None, # 2801 + None, # 2802 + None, # 2803 + None, # 2804 + None, # 2805 + None, # 2806 + None, # 2807 + None, # 2808 + None, # 2809 + None, # 2810 + None, # 2811 + None, # 2812 + None, # 2813 + None, # 2814 + None, # 2815 + None, # 2816 + None, # 2817 + None, # 2818 + None, # 2819 + None, # 2820 + None, # 2821 + None, # 2822 + None, # 2823 + None, # 2824 + None, # 2825 + None, # 2826 + None, # 2827 + None, # 2828 + None, # 2829 + None, # 2830 + None, # 2831 + None, # 2832 + None, # 2833 + None, # 2834 + None, # 2835 + None, # 2836 + None, # 2837 + None, # 2838 + None, # 2839 + None, # 2840 + None, # 2841 + None, # 2842 + None, # 2843 + None, # 2844 + None, # 2845 + None, # 2846 + None, # 2847 + None, # 2848 + None, # 2849 + None, # 2850 + None, # 2851 + None, # 2852 + None, # 2853 + None, # 2854 + None, # 2855 + None, # 2856 + None, # 2857 + None, # 2858 + None, # 2859 + None, # 2860 + None, # 2861 + None, # 2862 + None, # 2863 + None, # 2864 + None, # 2865 + None, # 2866 + None, # 2867 + None, # 2868 + None, # 2869 + None, # 2870 + None, # 2871 + None, # 2872 + None, # 2873 + None, # 2874 + None, # 2875 + None, # 2876 + None, # 2877 + None, # 2878 + None, # 2879 + None, # 2880 + None, # 2881 + None, # 2882 + None, # 2883 + None, # 2884 + None, # 2885 + None, # 2886 + None, # 2887 + None, # 2888 + None, # 2889 + None, # 2890 + None, # 2891 + None, # 2892 + None, # 2893 + None, # 2894 + None, # 2895 + None, # 2896 + None, # 2897 + None, # 2898 + None, # 2899 + None, # 2900 + None, # 2901 + None, # 2902 + None, # 2903 + None, # 2904 + None, # 2905 + None, # 2906 + None, # 2907 + None, # 2908 + None, # 2909 + None, # 2910 + None, # 2911 + None, # 2912 + None, # 2913 + None, # 2914 + None, # 2915 + None, # 2916 + None, # 2917 + None, # 2918 + None, # 2919 + None, # 2920 + None, # 2921 + None, # 2922 + None, # 2923 + None, # 2924 + None, # 2925 + None, # 2926 + None, # 2927 + None, # 2928 + None, # 2929 + None, # 2930 + None, # 2931 + None, # 2932 + None, # 2933 + None, # 2934 + None, # 2935 + None, # 2936 + None, # 2937 + None, # 2938 + None, # 2939 + None, # 2940 + None, # 2941 + None, # 2942 + None, # 2943 + None, # 2944 + None, # 2945 + None, # 2946 + None, # 2947 + None, # 2948 + None, # 2949 + None, # 2950 + None, # 2951 + None, # 2952 + None, # 2953 + None, # 2954 + None, # 2955 + None, # 2956 + None, # 2957 + None, # 2958 + None, # 2959 + None, # 2960 + None, # 2961 + None, # 2962 + None, # 2963 + None, # 2964 + None, # 2965 + None, # 2966 + None, # 2967 + None, # 2968 + None, # 2969 + None, # 2970 + None, # 2971 + None, # 2972 + None, # 2973 + None, # 2974 + None, # 2975 + None, # 2976 + None, # 2977 + None, # 2978 + None, # 2979 + None, # 2980 + None, # 2981 + None, # 2982 + None, # 2983 + None, # 2984 + None, # 2985 + None, # 2986 + None, # 2987 + None, # 2988 + None, # 2989 + None, # 2990 + None, # 2991 + None, # 2992 + None, # 2993 + None, # 2994 + None, # 2995 + None, # 2996 + None, # 2997 + None, # 2998 + None, # 2999 + None, # 3000 + None, # 3001 + None, # 3002 + None, # 3003 + None, # 3004 + None, # 3005 + None, # 3006 + None, # 3007 + None, # 3008 + None, # 3009 + None, # 3010 + None, # 3011 + None, # 3012 + None, # 3013 + None, # 3014 + None, # 3015 + None, # 3016 + None, # 3017 + None, # 3018 + None, # 3019 + None, # 3020 + None, # 3021 + None, # 3022 + None, # 3023 + None, # 3024 + None, # 3025 + None, # 3026 + None, # 3027 + None, # 3028 + None, # 3029 + None, # 3030 + None, # 3031 + None, # 3032 + None, # 3033 + None, # 3034 + None, # 3035 + None, # 3036 + None, # 3037 + None, # 3038 + None, # 3039 + None, # 3040 + None, # 3041 + None, # 3042 + None, # 3043 + None, # 3044 + None, # 3045 + None, # 3046 + None, # 3047 + None, # 3048 + None, # 3049 + None, # 3050 + None, # 3051 + None, # 3052 + None, # 3053 + None, # 3054 + None, # 3055 + None, # 3056 + None, # 3057 + None, # 3058 + None, # 3059 + None, # 3060 + None, # 3061 + None, # 3062 + None, # 3063 + None, # 3064 + None, # 3065 + None, # 3066 + None, # 3067 + None, # 3068 + None, # 3069 + None, # 3070 + None, # 3071 + None, # 3072 + None, # 3073 + None, # 3074 + None, # 3075 + None, # 3076 + None, # 3077 + None, # 3078 + None, # 3079 + None, # 3080 + None, # 3081 + None, # 3082 + None, # 3083 + None, # 3084 + None, # 3085 + None, # 3086 + None, # 3087 + None, # 3088 + None, # 3089 + None, # 3090 + None, # 3091 + None, # 3092 + None, # 3093 + None, # 3094 + None, # 3095 + None, # 3096 + None, # 3097 + None, # 3098 + None, # 3099 + None, # 3100 + None, # 3101 + None, # 3102 + None, # 3103 + None, # 3104 + None, # 3105 + None, # 3106 + None, # 3107 + None, # 3108 + None, # 3109 + None, # 3110 + None, # 3111 + None, # 3112 + None, # 3113 + None, # 3114 + None, # 3115 + None, # 3116 + None, # 3117 + None, # 3118 + None, # 3119 + None, # 3120 + None, # 3121 + None, # 3122 + None, # 3123 + None, # 3124 + None, # 3125 + None, # 3126 + None, # 3127 + None, # 3128 + None, # 3129 + None, # 3130 + None, # 3131 + None, # 3132 + None, # 3133 + None, # 3134 + None, # 3135 + None, # 3136 + None, # 3137 + None, # 3138 + None, # 3139 + None, # 3140 + None, # 3141 + None, # 3142 + None, # 3143 + None, # 3144 + None, # 3145 + None, # 3146 + None, # 3147 + None, # 3148 + None, # 3149 + None, # 3150 + None, # 3151 + None, # 3152 + None, # 3153 + None, # 3154 + None, # 3155 + None, # 3156 + None, # 3157 + None, # 3158 + None, # 3159 + None, # 3160 + None, # 3161 + None, # 3162 + None, # 3163 + None, # 3164 + None, # 3165 + None, # 3166 + None, # 3167 + None, # 3168 + None, # 3169 + None, # 3170 + None, # 3171 + None, # 3172 + None, # 3173 + None, # 3174 + None, # 3175 + None, # 3176 + None, # 3177 + None, # 3178 + None, # 3179 + None, # 3180 + None, # 3181 + None, # 3182 + None, # 3183 + None, # 3184 + None, # 3185 + None, # 3186 + None, # 3187 + None, # 3188 + None, # 3189 + None, # 3190 + None, # 3191 + None, # 3192 + None, # 3193 + None, # 3194 + None, # 3195 + None, # 3196 + None, # 3197 + None, # 3198 + None, # 3199 + None, # 3200 + None, # 3201 + None, # 3202 + None, # 3203 + None, # 3204 + None, # 3205 + None, # 3206 + None, # 3207 + None, # 3208 + None, # 3209 + None, # 3210 + None, # 3211 + None, # 3212 + None, # 3213 + None, # 3214 + None, # 3215 + None, # 3216 + None, # 3217 + None, # 3218 + None, # 3219 + None, # 3220 + None, # 3221 + None, # 3222 + None, # 3223 + None, # 3224 + None, # 3225 + None, # 3226 + None, # 3227 + None, # 3228 + None, # 3229 + None, # 3230 + None, # 3231 + None, # 3232 + None, # 3233 + None, # 3234 + None, # 3235 + None, # 3236 + None, # 3237 + None, # 3238 + None, # 3239 + None, # 3240 + None, # 3241 + None, # 3242 + None, # 3243 + None, # 3244 + None, # 3245 + None, # 3246 + None, # 3247 + None, # 3248 + None, # 3249 + None, # 3250 + None, # 3251 + None, # 3252 + None, # 3253 + None, # 3254 + None, # 3255 + None, # 3256 + None, # 3257 + None, # 3258 + None, # 3259 + None, # 3260 + None, # 3261 + None, # 3262 + None, # 3263 + None, # 3264 + None, # 3265 + None, # 3266 + None, # 3267 + None, # 3268 + None, # 3269 + None, # 3270 + None, # 3271 + None, # 3272 + None, # 3273 + None, # 3274 + None, # 3275 + None, # 3276 + None, # 3277 + None, # 3278 + None, # 3279 + None, # 3280 + None, # 3281 + None, # 3282 + None, # 3283 + None, # 3284 + None, # 3285 + None, # 3286 + None, # 3287 + None, # 3288 + None, # 3289 + None, # 3290 + None, # 3291 + None, # 3292 + None, # 3293 + None, # 3294 + None, # 3295 + None, # 3296 + None, # 3297 + None, # 3298 + None, # 3299 + None, # 3300 + None, # 3301 + None, # 3302 + None, # 3303 + None, # 3304 + None, # 3305 + None, # 3306 + None, # 3307 + None, # 3308 + None, # 3309 + None, # 3310 + None, # 3311 + None, # 3312 + None, # 3313 + None, # 3314 + None, # 3315 + None, # 3316 + None, # 3317 + None, # 3318 + None, # 3319 + None, # 3320 + None, # 3321 + None, # 3322 + None, # 3323 + None, # 3324 + None, # 3325 + None, # 3326 + None, # 3327 + None, # 3328 + (3329, TType.I16, 'executionVersion', None, None, ), # 3329 ) -all_structs.append(TGetInfoReq) -TGetInfoReq.thrift_spec = ( +all_structs.append(TSessionHandle) +TSessionHandle.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.I32, 'infoType', None, None, ), # 2 + (1, TType.STRUCT, 'sessionId', [THandleIdentifier, None], None, ), # 1 + None, # 2 None, # 3 None, # 4 None, # 5 @@ -32088,45 +21446,24 @@ def __ne__(self, other): None, # 3326 None, # 3327 None, # 3328 - (3329, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3329 -) -all_structs.append(TGetInfoResp) -TGetInfoResp.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 - (2, TType.STRUCT, 'infoValue', [TGetInfoValue, None], None, ), # 2 -) -all_structs.append(TSparkGetDirectResults) -TSparkGetDirectResults.thrift_spec = ( - None, # 0 - (1, TType.I64, 'maxRows', None, None, ), # 1 - (2, TType.I64, 'maxBytes', None, None, ), # 2 -) -all_structs.append(TSparkDirectResults) -TSparkDirectResults.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'operationStatus', [TGetOperationStatusResp, None], None, ), # 1 - (2, TType.STRUCT, 'resultSetMetadata', [TGetResultSetMetadataResp, None], None, ), # 2 - (3, TType.STRUCT, 'resultSet', [TFetchResultsResp, None], None, ), # 3 - (4, TType.STRUCT, 'closeOperation', [TCloseOperationResp, None], None, ), # 4 + (3329, TType.I32, 'serverProtocolVersion', None, None, ), # 3329 ) -all_structs.append(TSparkArrowTypes) -TSparkArrowTypes.thrift_spec = ( +all_structs.append(TOperationHandle) +TOperationHandle.thrift_spec = ( None, # 0 - (1, TType.BOOL, 'timestampAsArrow', None, None, ), # 1 - (2, TType.BOOL, 'decimalAsArrow', None, None, ), # 2 - (3, TType.BOOL, 'complexTypesAsArrow', None, None, ), # 3 - (4, TType.BOOL, 'intervalTypesAsArrow', None, None, ), # 4 - (5, TType.BOOL, 'nullTypeAsArrow', None, None, ), # 5 + (1, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 1 + (2, TType.I32, 'operationType', None, None, ), # 2 + (3, TType.BOOL, 'hasResultSet', None, None, ), # 3 + (4, TType.DOUBLE, 'modifiedRowCount', None, None, ), # 4 ) -all_structs.append(TExecuteStatementReq) -TExecuteStatementReq.thrift_spec = ( +all_structs.append(TOpenSessionReq) +TOpenSessionReq.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.STRING, 'statement', 'UTF8', None, ), # 2 - (3, TType.MAP, 'confOverlay', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 3 - (4, TType.BOOL, 'runAsync', None, False, ), # 4 - (5, TType.I64, 'queryTimeout', None, 0, ), # 5 + (1, TType.I32, 'client_protocol', None, -7, ), # 1 + (2, TType.STRING, 'username', 'UTF8', None, ), # 2 + (3, TType.STRING, 'password', 'UTF8', None, ), # 3 + (4, TType.MAP, 'configuration', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 4 + None, # 5 None, # 6 None, # 7 None, # 8 @@ -33402,22 +22739,22 @@ def __ne__(self, other): None, # 1278 None, # 1279 None, # 1280 - (1281, TType.STRUCT, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 - (1282, TType.BOOL, 'canReadArrowResult', None, None, ), # 1282 - (1283, TType.BOOL, 'canDownloadResult', None, None, ), # 1283 - (1284, TType.BOOL, 'canDecompressLZ4Result', None, None, ), # 1284 - (1285, TType.I64, 'maxBytesPerFile', None, None, ), # 1285 - (1286, TType.STRUCT, 'useArrowNativeTypes', [TSparkArrowTypes, None], None, ), # 1286 - (1287, TType.I64, 'resultRowLimit', None, None, ), # 1287 - (1288, TType.LIST, 'parameters', (TType.STRUCT, [TSparkParameter, None], False), None, ), # 1288 - (1289, TType.I64, 'maxBytesPerBatch', None, None, ), # 1289 + (1281, TType.LIST, 'getInfos', (TType.I32, None, False), None, ), # 1281 + (1282, TType.I64, 'client_protocol_i64', None, None, ), # 1282 + (1283, TType.MAP, 'connectionProperties', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 1283 + (1284, TType.STRUCT, 'initialNamespace', [TNamespace, None], None, ), # 1284 + (1285, TType.BOOL, 'canUseMultipleCatalogs', None, None, ), # 1285 + None, # 1286 + None, # 1287 + None, # 1288 + None, # 1289 None, # 1290 None, # 1291 None, # 1292 None, # 1293 None, # 1294 None, # 1295 - (1296, TType.STRUCT, 'statementConf', [TStatementConf, None], None, ), # 1296 + None, # 1296 None, # 1297 None, # 1298 None, # 1299 @@ -35444,79 +24781,1328 @@ def __ne__(self, other): None, # 3320 None, # 3321 None, # 3322 - None, # 3323 - None, # 3324 - None, # 3325 - None, # 3326 - None, # 3327 - None, # 3328 - (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 - (3331, TType.BOOL, 'rejectHighCostQueries', None, None, ), # 3331 - (3332, TType.DOUBLE, 'estimatedCost', None, None, ), # 3332 - (3333, TType.I16, 'executionVersion', None, None, ), # 3333 - (3334, TType.STRING, 'requestValidation', 'BINARY', None, ), # 3334 - (3335, TType.I32, 'resultPersistenceMode', None, None, ), # 3335 - (3336, TType.BOOL, 'trimArrowBatchesToLimit', None, None, ), # 3336 - (3337, TType.I32, 'fetchDisposition', None, None, ), # 3337 - None, # 3338 - None, # 3339 - None, # 3340 - None, # 3341 - None, # 3342 - None, # 3343 - (3344, TType.BOOL, 'enforceResultPersistenceMode', None, None, ), # 3344 - (3345, TType.LIST, 'statementList', (TType.STRUCT, [TDBSqlStatement, None], False), None, ), # 3345 - (3346, TType.BOOL, 'persistResultManifest', None, None, ), # 3346 - (3347, TType.I64, 'resultRetentionSeconds', None, None, ), # 3347 - (3348, TType.I64, 'resultByteLimit', None, None, ), # 3348 - (3349, TType.STRUCT, 'resultDataFormat', [TDBSqlResultFormat, None], None, ), # 3349 - (3350, TType.STRING, 'originatingClientIdentity', 'UTF8', None, ), # 3350 - (3351, TType.BOOL, 'preferSingleFileResult', None, None, ), # 3351 - (3352, TType.BOOL, 'preferDriverOnlyUpload', None, None, ), # 3352 - (3353, TType.BOOL, 'enforceEmbeddedSchemaCorrectness', None, False, ), # 3353 - None, # 3354 - None, # 3355 - None, # 3356 - None, # 3357 - None, # 3358 - None, # 3359 - (3360, TType.STRING, 'idempotencyToken', 'UTF8', None, ), # 3360 - (3361, TType.BOOL, 'throwErrorOnByteLimitTruncation', None, None, ), # 3361 + None, # 3323 + None, # 3324 + None, # 3325 + None, # 3326 + None, # 3327 + None, # 3328 + (3329, TType.STRUCT, 'sessionId', [THandleIdentifier, None], None, ), # 3329 ) -all_structs.append(TDBSqlStatement) -TDBSqlStatement.thrift_spec = ( +all_structs.append(TOpenSessionResp) +TOpenSessionResp.thrift_spec = ( None, # 0 - (1, TType.STRING, 'statement', 'UTF8', None, ), # 1 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.I32, 'serverProtocolVersion', None, None, ), # 2 + (3, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 3 + (4, TType.MAP, 'configuration', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 4 + None, # 5 + None, # 6 + None, # 7 + None, # 8 + None, # 9 + None, # 10 + None, # 11 + None, # 12 + None, # 13 + None, # 14 + None, # 15 + None, # 16 + None, # 17 + None, # 18 + None, # 19 + None, # 20 + None, # 21 + None, # 22 + None, # 23 + None, # 24 + None, # 25 + None, # 26 + None, # 27 + None, # 28 + None, # 29 + None, # 30 + None, # 31 + None, # 32 + None, # 33 + None, # 34 + None, # 35 + None, # 36 + None, # 37 + None, # 38 + None, # 39 + None, # 40 + None, # 41 + None, # 42 + None, # 43 + None, # 44 + None, # 45 + None, # 46 + None, # 47 + None, # 48 + None, # 49 + None, # 50 + None, # 51 + None, # 52 + None, # 53 + None, # 54 + None, # 55 + None, # 56 + None, # 57 + None, # 58 + None, # 59 + None, # 60 + None, # 61 + None, # 62 + None, # 63 + None, # 64 + None, # 65 + None, # 66 + None, # 67 + None, # 68 + None, # 69 + None, # 70 + None, # 71 + None, # 72 + None, # 73 + None, # 74 + None, # 75 + None, # 76 + None, # 77 + None, # 78 + None, # 79 + None, # 80 + None, # 81 + None, # 82 + None, # 83 + None, # 84 + None, # 85 + None, # 86 + None, # 87 + None, # 88 + None, # 89 + None, # 90 + None, # 91 + None, # 92 + None, # 93 + None, # 94 + None, # 95 + None, # 96 + None, # 97 + None, # 98 + None, # 99 + None, # 100 + None, # 101 + None, # 102 + None, # 103 + None, # 104 + None, # 105 + None, # 106 + None, # 107 + None, # 108 + None, # 109 + None, # 110 + None, # 111 + None, # 112 + None, # 113 + None, # 114 + None, # 115 + None, # 116 + None, # 117 + None, # 118 + None, # 119 + None, # 120 + None, # 121 + None, # 122 + None, # 123 + None, # 124 + None, # 125 + None, # 126 + None, # 127 + None, # 128 + None, # 129 + None, # 130 + None, # 131 + None, # 132 + None, # 133 + None, # 134 + None, # 135 + None, # 136 + None, # 137 + None, # 138 + None, # 139 + None, # 140 + None, # 141 + None, # 142 + None, # 143 + None, # 144 + None, # 145 + None, # 146 + None, # 147 + None, # 148 + None, # 149 + None, # 150 + None, # 151 + None, # 152 + None, # 153 + None, # 154 + None, # 155 + None, # 156 + None, # 157 + None, # 158 + None, # 159 + None, # 160 + None, # 161 + None, # 162 + None, # 163 + None, # 164 + None, # 165 + None, # 166 + None, # 167 + None, # 168 + None, # 169 + None, # 170 + None, # 171 + None, # 172 + None, # 173 + None, # 174 + None, # 175 + None, # 176 + None, # 177 + None, # 178 + None, # 179 + None, # 180 + None, # 181 + None, # 182 + None, # 183 + None, # 184 + None, # 185 + None, # 186 + None, # 187 + None, # 188 + None, # 189 + None, # 190 + None, # 191 + None, # 192 + None, # 193 + None, # 194 + None, # 195 + None, # 196 + None, # 197 + None, # 198 + None, # 199 + None, # 200 + None, # 201 + None, # 202 + None, # 203 + None, # 204 + None, # 205 + None, # 206 + None, # 207 + None, # 208 + None, # 209 + None, # 210 + None, # 211 + None, # 212 + None, # 213 + None, # 214 + None, # 215 + None, # 216 + None, # 217 + None, # 218 + None, # 219 + None, # 220 + None, # 221 + None, # 222 + None, # 223 + None, # 224 + None, # 225 + None, # 226 + None, # 227 + None, # 228 + None, # 229 + None, # 230 + None, # 231 + None, # 232 + None, # 233 + None, # 234 + None, # 235 + None, # 236 + None, # 237 + None, # 238 + None, # 239 + None, # 240 + None, # 241 + None, # 242 + None, # 243 + None, # 244 + None, # 245 + None, # 246 + None, # 247 + None, # 248 + None, # 249 + None, # 250 + None, # 251 + None, # 252 + None, # 253 + None, # 254 + None, # 255 + None, # 256 + None, # 257 + None, # 258 + None, # 259 + None, # 260 + None, # 261 + None, # 262 + None, # 263 + None, # 264 + None, # 265 + None, # 266 + None, # 267 + None, # 268 + None, # 269 + None, # 270 + None, # 271 + None, # 272 + None, # 273 + None, # 274 + None, # 275 + None, # 276 + None, # 277 + None, # 278 + None, # 279 + None, # 280 + None, # 281 + None, # 282 + None, # 283 + None, # 284 + None, # 285 + None, # 286 + None, # 287 + None, # 288 + None, # 289 + None, # 290 + None, # 291 + None, # 292 + None, # 293 + None, # 294 + None, # 295 + None, # 296 + None, # 297 + None, # 298 + None, # 299 + None, # 300 + None, # 301 + None, # 302 + None, # 303 + None, # 304 + None, # 305 + None, # 306 + None, # 307 + None, # 308 + None, # 309 + None, # 310 + None, # 311 + None, # 312 + None, # 313 + None, # 314 + None, # 315 + None, # 316 + None, # 317 + None, # 318 + None, # 319 + None, # 320 + None, # 321 + None, # 322 + None, # 323 + None, # 324 + None, # 325 + None, # 326 + None, # 327 + None, # 328 + None, # 329 + None, # 330 + None, # 331 + None, # 332 + None, # 333 + None, # 334 + None, # 335 + None, # 336 + None, # 337 + None, # 338 + None, # 339 + None, # 340 + None, # 341 + None, # 342 + None, # 343 + None, # 344 + None, # 345 + None, # 346 + None, # 347 + None, # 348 + None, # 349 + None, # 350 + None, # 351 + None, # 352 + None, # 353 + None, # 354 + None, # 355 + None, # 356 + None, # 357 + None, # 358 + None, # 359 + None, # 360 + None, # 361 + None, # 362 + None, # 363 + None, # 364 + None, # 365 + None, # 366 + None, # 367 + None, # 368 + None, # 369 + None, # 370 + None, # 371 + None, # 372 + None, # 373 + None, # 374 + None, # 375 + None, # 376 + None, # 377 + None, # 378 + None, # 379 + None, # 380 + None, # 381 + None, # 382 + None, # 383 + None, # 384 + None, # 385 + None, # 386 + None, # 387 + None, # 388 + None, # 389 + None, # 390 + None, # 391 + None, # 392 + None, # 393 + None, # 394 + None, # 395 + None, # 396 + None, # 397 + None, # 398 + None, # 399 + None, # 400 + None, # 401 + None, # 402 + None, # 403 + None, # 404 + None, # 405 + None, # 406 + None, # 407 + None, # 408 + None, # 409 + None, # 410 + None, # 411 + None, # 412 + None, # 413 + None, # 414 + None, # 415 + None, # 416 + None, # 417 + None, # 418 + None, # 419 + None, # 420 + None, # 421 + None, # 422 + None, # 423 + None, # 424 + None, # 425 + None, # 426 + None, # 427 + None, # 428 + None, # 429 + None, # 430 + None, # 431 + None, # 432 + None, # 433 + None, # 434 + None, # 435 + None, # 436 + None, # 437 + None, # 438 + None, # 439 + None, # 440 + None, # 441 + None, # 442 + None, # 443 + None, # 444 + None, # 445 + None, # 446 + None, # 447 + None, # 448 + None, # 449 + None, # 450 + None, # 451 + None, # 452 + None, # 453 + None, # 454 + None, # 455 + None, # 456 + None, # 457 + None, # 458 + None, # 459 + None, # 460 + None, # 461 + None, # 462 + None, # 463 + None, # 464 + None, # 465 + None, # 466 + None, # 467 + None, # 468 + None, # 469 + None, # 470 + None, # 471 + None, # 472 + None, # 473 + None, # 474 + None, # 475 + None, # 476 + None, # 477 + None, # 478 + None, # 479 + None, # 480 + None, # 481 + None, # 482 + None, # 483 + None, # 484 + None, # 485 + None, # 486 + None, # 487 + None, # 488 + None, # 489 + None, # 490 + None, # 491 + None, # 492 + None, # 493 + None, # 494 + None, # 495 + None, # 496 + None, # 497 + None, # 498 + None, # 499 + None, # 500 + None, # 501 + None, # 502 + None, # 503 + None, # 504 + None, # 505 + None, # 506 + None, # 507 + None, # 508 + None, # 509 + None, # 510 + None, # 511 + None, # 512 + None, # 513 + None, # 514 + None, # 515 + None, # 516 + None, # 517 + None, # 518 + None, # 519 + None, # 520 + None, # 521 + None, # 522 + None, # 523 + None, # 524 + None, # 525 + None, # 526 + None, # 527 + None, # 528 + None, # 529 + None, # 530 + None, # 531 + None, # 532 + None, # 533 + None, # 534 + None, # 535 + None, # 536 + None, # 537 + None, # 538 + None, # 539 + None, # 540 + None, # 541 + None, # 542 + None, # 543 + None, # 544 + None, # 545 + None, # 546 + None, # 547 + None, # 548 + None, # 549 + None, # 550 + None, # 551 + None, # 552 + None, # 553 + None, # 554 + None, # 555 + None, # 556 + None, # 557 + None, # 558 + None, # 559 + None, # 560 + None, # 561 + None, # 562 + None, # 563 + None, # 564 + None, # 565 + None, # 566 + None, # 567 + None, # 568 + None, # 569 + None, # 570 + None, # 571 + None, # 572 + None, # 573 + None, # 574 + None, # 575 + None, # 576 + None, # 577 + None, # 578 + None, # 579 + None, # 580 + None, # 581 + None, # 582 + None, # 583 + None, # 584 + None, # 585 + None, # 586 + None, # 587 + None, # 588 + None, # 589 + None, # 590 + None, # 591 + None, # 592 + None, # 593 + None, # 594 + None, # 595 + None, # 596 + None, # 597 + None, # 598 + None, # 599 + None, # 600 + None, # 601 + None, # 602 + None, # 603 + None, # 604 + None, # 605 + None, # 606 + None, # 607 + None, # 608 + None, # 609 + None, # 610 + None, # 611 + None, # 612 + None, # 613 + None, # 614 + None, # 615 + None, # 616 + None, # 617 + None, # 618 + None, # 619 + None, # 620 + None, # 621 + None, # 622 + None, # 623 + None, # 624 + None, # 625 + None, # 626 + None, # 627 + None, # 628 + None, # 629 + None, # 630 + None, # 631 + None, # 632 + None, # 633 + None, # 634 + None, # 635 + None, # 636 + None, # 637 + None, # 638 + None, # 639 + None, # 640 + None, # 641 + None, # 642 + None, # 643 + None, # 644 + None, # 645 + None, # 646 + None, # 647 + None, # 648 + None, # 649 + None, # 650 + None, # 651 + None, # 652 + None, # 653 + None, # 654 + None, # 655 + None, # 656 + None, # 657 + None, # 658 + None, # 659 + None, # 660 + None, # 661 + None, # 662 + None, # 663 + None, # 664 + None, # 665 + None, # 666 + None, # 667 + None, # 668 + None, # 669 + None, # 670 + None, # 671 + None, # 672 + None, # 673 + None, # 674 + None, # 675 + None, # 676 + None, # 677 + None, # 678 + None, # 679 + None, # 680 + None, # 681 + None, # 682 + None, # 683 + None, # 684 + None, # 685 + None, # 686 + None, # 687 + None, # 688 + None, # 689 + None, # 690 + None, # 691 + None, # 692 + None, # 693 + None, # 694 + None, # 695 + None, # 696 + None, # 697 + None, # 698 + None, # 699 + None, # 700 + None, # 701 + None, # 702 + None, # 703 + None, # 704 + None, # 705 + None, # 706 + None, # 707 + None, # 708 + None, # 709 + None, # 710 + None, # 711 + None, # 712 + None, # 713 + None, # 714 + None, # 715 + None, # 716 + None, # 717 + None, # 718 + None, # 719 + None, # 720 + None, # 721 + None, # 722 + None, # 723 + None, # 724 + None, # 725 + None, # 726 + None, # 727 + None, # 728 + None, # 729 + None, # 730 + None, # 731 + None, # 732 + None, # 733 + None, # 734 + None, # 735 + None, # 736 + None, # 737 + None, # 738 + None, # 739 + None, # 740 + None, # 741 + None, # 742 + None, # 743 + None, # 744 + None, # 745 + None, # 746 + None, # 747 + None, # 748 + None, # 749 + None, # 750 + None, # 751 + None, # 752 + None, # 753 + None, # 754 + None, # 755 + None, # 756 + None, # 757 + None, # 758 + None, # 759 + None, # 760 + None, # 761 + None, # 762 + None, # 763 + None, # 764 + None, # 765 + None, # 766 + None, # 767 + None, # 768 + None, # 769 + None, # 770 + None, # 771 + None, # 772 + None, # 773 + None, # 774 + None, # 775 + None, # 776 + None, # 777 + None, # 778 + None, # 779 + None, # 780 + None, # 781 + None, # 782 + None, # 783 + None, # 784 + None, # 785 + None, # 786 + None, # 787 + None, # 788 + None, # 789 + None, # 790 + None, # 791 + None, # 792 + None, # 793 + None, # 794 + None, # 795 + None, # 796 + None, # 797 + None, # 798 + None, # 799 + None, # 800 + None, # 801 + None, # 802 + None, # 803 + None, # 804 + None, # 805 + None, # 806 + None, # 807 + None, # 808 + None, # 809 + None, # 810 + None, # 811 + None, # 812 + None, # 813 + None, # 814 + None, # 815 + None, # 816 + None, # 817 + None, # 818 + None, # 819 + None, # 820 + None, # 821 + None, # 822 + None, # 823 + None, # 824 + None, # 825 + None, # 826 + None, # 827 + None, # 828 + None, # 829 + None, # 830 + None, # 831 + None, # 832 + None, # 833 + None, # 834 + None, # 835 + None, # 836 + None, # 837 + None, # 838 + None, # 839 + None, # 840 + None, # 841 + None, # 842 + None, # 843 + None, # 844 + None, # 845 + None, # 846 + None, # 847 + None, # 848 + None, # 849 + None, # 850 + None, # 851 + None, # 852 + None, # 853 + None, # 854 + None, # 855 + None, # 856 + None, # 857 + None, # 858 + None, # 859 + None, # 860 + None, # 861 + None, # 862 + None, # 863 + None, # 864 + None, # 865 + None, # 866 + None, # 867 + None, # 868 + None, # 869 + None, # 870 + None, # 871 + None, # 872 + None, # 873 + None, # 874 + None, # 875 + None, # 876 + None, # 877 + None, # 878 + None, # 879 + None, # 880 + None, # 881 + None, # 882 + None, # 883 + None, # 884 + None, # 885 + None, # 886 + None, # 887 + None, # 888 + None, # 889 + None, # 890 + None, # 891 + None, # 892 + None, # 893 + None, # 894 + None, # 895 + None, # 896 + None, # 897 + None, # 898 + None, # 899 + None, # 900 + None, # 901 + None, # 902 + None, # 903 + None, # 904 + None, # 905 + None, # 906 + None, # 907 + None, # 908 + None, # 909 + None, # 910 + None, # 911 + None, # 912 + None, # 913 + None, # 914 + None, # 915 + None, # 916 + None, # 917 + None, # 918 + None, # 919 + None, # 920 + None, # 921 + None, # 922 + None, # 923 + None, # 924 + None, # 925 + None, # 926 + None, # 927 + None, # 928 + None, # 929 + None, # 930 + None, # 931 + None, # 932 + None, # 933 + None, # 934 + None, # 935 + None, # 936 + None, # 937 + None, # 938 + None, # 939 + None, # 940 + None, # 941 + None, # 942 + None, # 943 + None, # 944 + None, # 945 + None, # 946 + None, # 947 + None, # 948 + None, # 949 + None, # 950 + None, # 951 + None, # 952 + None, # 953 + None, # 954 + None, # 955 + None, # 956 + None, # 957 + None, # 958 + None, # 959 + None, # 960 + None, # 961 + None, # 962 + None, # 963 + None, # 964 + None, # 965 + None, # 966 + None, # 967 + None, # 968 + None, # 969 + None, # 970 + None, # 971 + None, # 972 + None, # 973 + None, # 974 + None, # 975 + None, # 976 + None, # 977 + None, # 978 + None, # 979 + None, # 980 + None, # 981 + None, # 982 + None, # 983 + None, # 984 + None, # 985 + None, # 986 + None, # 987 + None, # 988 + None, # 989 + None, # 990 + None, # 991 + None, # 992 + None, # 993 + None, # 994 + None, # 995 + None, # 996 + None, # 997 + None, # 998 + None, # 999 + None, # 1000 + None, # 1001 + None, # 1002 + None, # 1003 + None, # 1004 + None, # 1005 + None, # 1006 + None, # 1007 + None, # 1008 + None, # 1009 + None, # 1010 + None, # 1011 + None, # 1012 + None, # 1013 + None, # 1014 + None, # 1015 + None, # 1016 + None, # 1017 + None, # 1018 + None, # 1019 + None, # 1020 + None, # 1021 + None, # 1022 + None, # 1023 + None, # 1024 + None, # 1025 + None, # 1026 + None, # 1027 + None, # 1028 + None, # 1029 + None, # 1030 + None, # 1031 + None, # 1032 + None, # 1033 + None, # 1034 + None, # 1035 + None, # 1036 + None, # 1037 + None, # 1038 + None, # 1039 + None, # 1040 + None, # 1041 + None, # 1042 + None, # 1043 + None, # 1044 + None, # 1045 + None, # 1046 + None, # 1047 + None, # 1048 + None, # 1049 + None, # 1050 + None, # 1051 + None, # 1052 + None, # 1053 + None, # 1054 + None, # 1055 + None, # 1056 + None, # 1057 + None, # 1058 + None, # 1059 + None, # 1060 + None, # 1061 + None, # 1062 + None, # 1063 + None, # 1064 + None, # 1065 + None, # 1066 + None, # 1067 + None, # 1068 + None, # 1069 + None, # 1070 + None, # 1071 + None, # 1072 + None, # 1073 + None, # 1074 + None, # 1075 + None, # 1076 + None, # 1077 + None, # 1078 + None, # 1079 + None, # 1080 + None, # 1081 + None, # 1082 + None, # 1083 + None, # 1084 + None, # 1085 + None, # 1086 + None, # 1087 + None, # 1088 + None, # 1089 + None, # 1090 + None, # 1091 + None, # 1092 + None, # 1093 + None, # 1094 + None, # 1095 + None, # 1096 + None, # 1097 + None, # 1098 + None, # 1099 + None, # 1100 + None, # 1101 + None, # 1102 + None, # 1103 + None, # 1104 + None, # 1105 + None, # 1106 + None, # 1107 + None, # 1108 + None, # 1109 + None, # 1110 + None, # 1111 + None, # 1112 + None, # 1113 + None, # 1114 + None, # 1115 + None, # 1116 + None, # 1117 + None, # 1118 + None, # 1119 + None, # 1120 + None, # 1121 + None, # 1122 + None, # 1123 + None, # 1124 + None, # 1125 + None, # 1126 + None, # 1127 + None, # 1128 + None, # 1129 + None, # 1130 + None, # 1131 + None, # 1132 + None, # 1133 + None, # 1134 + None, # 1135 + None, # 1136 + None, # 1137 + None, # 1138 + None, # 1139 + None, # 1140 + None, # 1141 + None, # 1142 + None, # 1143 + None, # 1144 + None, # 1145 + None, # 1146 + None, # 1147 + None, # 1148 + None, # 1149 + None, # 1150 + None, # 1151 + None, # 1152 + None, # 1153 + None, # 1154 + None, # 1155 + None, # 1156 + None, # 1157 + None, # 1158 + None, # 1159 + None, # 1160 + None, # 1161 + None, # 1162 + None, # 1163 + None, # 1164 + None, # 1165 + None, # 1166 + None, # 1167 + None, # 1168 + None, # 1169 + None, # 1170 + None, # 1171 + None, # 1172 + None, # 1173 + None, # 1174 + None, # 1175 + None, # 1176 + None, # 1177 + None, # 1178 + None, # 1179 + None, # 1180 + None, # 1181 + None, # 1182 + None, # 1183 + None, # 1184 + None, # 1185 + None, # 1186 + None, # 1187 + None, # 1188 + None, # 1189 + None, # 1190 + None, # 1191 + None, # 1192 + None, # 1193 + None, # 1194 + None, # 1195 + None, # 1196 + None, # 1197 + None, # 1198 + None, # 1199 + None, # 1200 + None, # 1201 + None, # 1202 + None, # 1203 + None, # 1204 + None, # 1205 + None, # 1206 + None, # 1207 + None, # 1208 + None, # 1209 + None, # 1210 + None, # 1211 + None, # 1212 + None, # 1213 + None, # 1214 + None, # 1215 + None, # 1216 + None, # 1217 + None, # 1218 + None, # 1219 + None, # 1220 + None, # 1221 + None, # 1222 + None, # 1223 + None, # 1224 + None, # 1225 + None, # 1226 + None, # 1227 + None, # 1228 + None, # 1229 + None, # 1230 + None, # 1231 + None, # 1232 + None, # 1233 + None, # 1234 + None, # 1235 + None, # 1236 + None, # 1237 + None, # 1238 + None, # 1239 + None, # 1240 + None, # 1241 + None, # 1242 + None, # 1243 + None, # 1244 + None, # 1245 + None, # 1246 + None, # 1247 + None, # 1248 + None, # 1249 + None, # 1250 + None, # 1251 + None, # 1252 + None, # 1253 + None, # 1254 + None, # 1255 + None, # 1256 + None, # 1257 + None, # 1258 + None, # 1259 + None, # 1260 + None, # 1261 + None, # 1262 + None, # 1263 + None, # 1264 + None, # 1265 + None, # 1266 + None, # 1267 + None, # 1268 + None, # 1269 + None, # 1270 + None, # 1271 + None, # 1272 + None, # 1273 + None, # 1274 + None, # 1275 + None, # 1276 + None, # 1277 + None, # 1278 + None, # 1279 + None, # 1280 + (1281, TType.LIST, 'getInfos', (TType.STRUCT, [TGetInfoValue, None], False), None, ), # 1281 + None, # 1282 + None, # 1283 + (1284, TType.STRUCT, 'initialNamespace', [TNamespace, None], None, ), # 1284 + (1285, TType.BOOL, 'canUseMultipleCatalogs', None, None, ), # 1285 ) -all_structs.append(TSparkParameterValue) -TSparkParameterValue.thrift_spec = ( +all_structs.append(TCloseSessionReq) +TCloseSessionReq.thrift_spec = ( None, # 0 - (1, TType.STRING, 'stringValue', 'UTF8', None, ), # 1 - (2, TType.DOUBLE, 'doubleValue', None, None, ), # 2 - (3, TType.BOOL, 'booleanValue', None, None, ), # 3 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 ) -all_structs.append(TSparkParameter) -TSparkParameter.thrift_spec = ( +all_structs.append(TCloseSessionResp) +TCloseSessionResp.thrift_spec = ( None, # 0 - (1, TType.I32, 'ordinal', None, None, ), # 1 - (2, TType.STRING, 'name', 'UTF8', None, ), # 2 - (3, TType.STRING, 'type', 'UTF8', None, ), # 3 - (4, TType.STRUCT, 'value', [TSparkParameterValue, None], None, ), # 4 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 ) -all_structs.append(TStatementConf) -TStatementConf.thrift_spec = ( +all_structs.append(TGetInfoValue) +TGetInfoValue.thrift_spec = ( None, # 0 - (1, TType.BOOL, 'sessionless', None, None, ), # 1 - (2, TType.STRUCT, 'initialNamespace', [TNamespace, None], None, ), # 2 - (3, TType.I32, 'client_protocol', None, None, ), # 3 - (4, TType.I64, 'client_protocol_i64', None, None, ), # 4 + (1, TType.STRING, 'stringValue', 'UTF8', None, ), # 1 + (2, TType.I16, 'smallIntValue', None, None, ), # 2 + (3, TType.I32, 'integerBitmask', None, None, ), # 3 + (4, TType.I32, 'integerFlag', None, None, ), # 4 + (5, TType.I32, 'binaryValue', None, None, ), # 5 + (6, TType.I64, 'lenValue', None, None, ), # 6 ) -all_structs.append(TExecuteStatementResp) -TExecuteStatementResp.thrift_spec = ( +all_structs.append(TGetInfoReq) +TGetInfoReq.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 - (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 + (2, TType.I32, 'infoType', None, None, ), # 2 None, # 3 None, # 4 None, # 5 @@ -36795,7 +27381,7 @@ def __ne__(self, other): None, # 1278 None, # 1279 None, # 1280 - (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 + None, # 1281 None, # 1282 None, # 1283 None, # 1284 @@ -38843,24 +29429,44 @@ def __ne__(self, other): None, # 3326 None, # 3327 None, # 3328 - (3329, TType.BOOL, 'executionRejected', None, None, ), # 3329 - (3330, TType.DOUBLE, 'maxClusterCapacity', None, None, ), # 3330 - (3331, TType.DOUBLE, 'queryCost', None, None, ), # 3331 - (3332, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3332 - (3333, TType.DOUBLE, 'currentClusterLoad', None, None, ), # 3333 - (3334, TType.I32, 'idempotencyType', None, None, ), # 3334 - (3335, TType.BOOL, 'remoteResultCacheEnabled', None, None, ), # 3335 - (3336, TType.BOOL, 'isServerless', None, None, ), # 3336 - (3337, TType.LIST, 'operationHandles', (TType.STRUCT, [TOperationHandle, None], False), None, ), # 3337 + (3329, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3329 ) -all_structs.append(TGetTypeInfoReq) -TGetTypeInfoReq.thrift_spec = ( +all_structs.append(TGetInfoResp) +TGetInfoResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.STRUCT, 'infoValue', [TGetInfoValue, None], None, ), # 2 +) +all_structs.append(TSparkGetDirectResults) +TSparkGetDirectResults.thrift_spec = ( + None, # 0 + (1, TType.I64, 'maxRows', None, None, ), # 1 + (2, TType.I64, 'maxBytes', None, None, ), # 2 +) +all_structs.append(TSparkDirectResults) +TSparkDirectResults.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'operationStatus', [TGetOperationStatusResp, None], None, ), # 1 + (2, TType.STRUCT, 'resultSetMetadata', [TGetResultSetMetadataResp, None], None, ), # 2 + (3, TType.STRUCT, 'resultSet', [TFetchResultsResp, None], None, ), # 3 + (4, TType.STRUCT, 'closeOperation', [TCloseOperationResp, None], None, ), # 4 +) +all_structs.append(TSparkArrowTypes) +TSparkArrowTypes.thrift_spec = ( + None, # 0 + (1, TType.BOOL, 'timestampAsArrow', None, None, ), # 1 + (2, TType.BOOL, 'decimalAsArrow', None, None, ), # 2 + (3, TType.BOOL, 'complexTypesAsArrow', None, None, ), # 3 + (4, TType.BOOL, 'intervalTypesAsArrow', None, None, ), # 4 +) +all_structs.append(TExecuteStatementReq) +TExecuteStatementReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - None, # 2 - None, # 3 - None, # 4 - None, # 5 + (2, TType.STRING, 'statement', 'UTF8', None, ), # 2 + (3, TType.MAP, 'confOverlay', (TType.STRING, 'UTF8', TType.STRING, 'UTF8', False), None, ), # 3 + (4, TType.BOOL, 'runAsync', None, False, ), # 4 + (5, TType.I64, 'queryTimeout', None, 0, ), # 5 None, # 6 None, # 7 None, # 8 @@ -40137,12 +30743,12 @@ def __ne__(self, other): None, # 1279 None, # 1280 (1281, TType.STRUCT, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 - (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 - None, # 1283 - None, # 1284 - None, # 1285 - None, # 1286 - None, # 1287 + (1282, TType.BOOL, 'canReadArrowResult', None, None, ), # 1282 + (1283, TType.BOOL, 'canDownloadResult', None, None, ), # 1283 + (1284, TType.BOOL, 'canDecompressLZ4Result', None, None, ), # 1284 + (1285, TType.I64, 'maxBytesPerFile', None, None, ), # 1285 + (1286, TType.STRUCT, 'useArrowNativeTypes', [TSparkArrowTypes, None], None, ), # 1286 + (1287, TType.I64, 'resultRowLimit', None, None, ), # 1287 None, # 1288 None, # 1289 None, # 1290 @@ -42186,9 +32792,15 @@ def __ne__(self, other): None, # 3328 (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 + (3331, TType.BOOL, 'rejectHighCostQueries', None, None, ), # 3331 + (3332, TType.DOUBLE, 'estimatedCost', None, None, ), # 3332 + (3333, TType.I16, 'executionVersion', None, None, ), # 3333 + (3334, TType.STRING, 'requestValidation', 'BINARY', None, ), # 3334 + (3335, TType.I32, 'resultPersistenceMode', None, None, ), # 3335 + (3336, TType.BOOL, 'trimArrowBatchesToLimit', None, None, ), # 3336 ) -all_structs.append(TGetTypeInfoResp) -TGetTypeInfoResp.thrift_spec = ( +all_structs.append(TExecuteStatementResp) +TExecuteStatementResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -43471,9 +34083,2062 @@ def __ne__(self, other): None, # 1279 None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 + None, # 1282 + None, # 1283 + None, # 1284 + None, # 1285 + None, # 1286 + None, # 1287 + None, # 1288 + None, # 1289 + None, # 1290 + None, # 1291 + None, # 1292 + None, # 1293 + None, # 1294 + None, # 1295 + None, # 1296 + None, # 1297 + None, # 1298 + None, # 1299 + None, # 1300 + None, # 1301 + None, # 1302 + None, # 1303 + None, # 1304 + None, # 1305 + None, # 1306 + None, # 1307 + None, # 1308 + None, # 1309 + None, # 1310 + None, # 1311 + None, # 1312 + None, # 1313 + None, # 1314 + None, # 1315 + None, # 1316 + None, # 1317 + None, # 1318 + None, # 1319 + None, # 1320 + None, # 1321 + None, # 1322 + None, # 1323 + None, # 1324 + None, # 1325 + None, # 1326 + None, # 1327 + None, # 1328 + None, # 1329 + None, # 1330 + None, # 1331 + None, # 1332 + None, # 1333 + None, # 1334 + None, # 1335 + None, # 1336 + None, # 1337 + None, # 1338 + None, # 1339 + None, # 1340 + None, # 1341 + None, # 1342 + None, # 1343 + None, # 1344 + None, # 1345 + None, # 1346 + None, # 1347 + None, # 1348 + None, # 1349 + None, # 1350 + None, # 1351 + None, # 1352 + None, # 1353 + None, # 1354 + None, # 1355 + None, # 1356 + None, # 1357 + None, # 1358 + None, # 1359 + None, # 1360 + None, # 1361 + None, # 1362 + None, # 1363 + None, # 1364 + None, # 1365 + None, # 1366 + None, # 1367 + None, # 1368 + None, # 1369 + None, # 1370 + None, # 1371 + None, # 1372 + None, # 1373 + None, # 1374 + None, # 1375 + None, # 1376 + None, # 1377 + None, # 1378 + None, # 1379 + None, # 1380 + None, # 1381 + None, # 1382 + None, # 1383 + None, # 1384 + None, # 1385 + None, # 1386 + None, # 1387 + None, # 1388 + None, # 1389 + None, # 1390 + None, # 1391 + None, # 1392 + None, # 1393 + None, # 1394 + None, # 1395 + None, # 1396 + None, # 1397 + None, # 1398 + None, # 1399 + None, # 1400 + None, # 1401 + None, # 1402 + None, # 1403 + None, # 1404 + None, # 1405 + None, # 1406 + None, # 1407 + None, # 1408 + None, # 1409 + None, # 1410 + None, # 1411 + None, # 1412 + None, # 1413 + None, # 1414 + None, # 1415 + None, # 1416 + None, # 1417 + None, # 1418 + None, # 1419 + None, # 1420 + None, # 1421 + None, # 1422 + None, # 1423 + None, # 1424 + None, # 1425 + None, # 1426 + None, # 1427 + None, # 1428 + None, # 1429 + None, # 1430 + None, # 1431 + None, # 1432 + None, # 1433 + None, # 1434 + None, # 1435 + None, # 1436 + None, # 1437 + None, # 1438 + None, # 1439 + None, # 1440 + None, # 1441 + None, # 1442 + None, # 1443 + None, # 1444 + None, # 1445 + None, # 1446 + None, # 1447 + None, # 1448 + None, # 1449 + None, # 1450 + None, # 1451 + None, # 1452 + None, # 1453 + None, # 1454 + None, # 1455 + None, # 1456 + None, # 1457 + None, # 1458 + None, # 1459 + None, # 1460 + None, # 1461 + None, # 1462 + None, # 1463 + None, # 1464 + None, # 1465 + None, # 1466 + None, # 1467 + None, # 1468 + None, # 1469 + None, # 1470 + None, # 1471 + None, # 1472 + None, # 1473 + None, # 1474 + None, # 1475 + None, # 1476 + None, # 1477 + None, # 1478 + None, # 1479 + None, # 1480 + None, # 1481 + None, # 1482 + None, # 1483 + None, # 1484 + None, # 1485 + None, # 1486 + None, # 1487 + None, # 1488 + None, # 1489 + None, # 1490 + None, # 1491 + None, # 1492 + None, # 1493 + None, # 1494 + None, # 1495 + None, # 1496 + None, # 1497 + None, # 1498 + None, # 1499 + None, # 1500 + None, # 1501 + None, # 1502 + None, # 1503 + None, # 1504 + None, # 1505 + None, # 1506 + None, # 1507 + None, # 1508 + None, # 1509 + None, # 1510 + None, # 1511 + None, # 1512 + None, # 1513 + None, # 1514 + None, # 1515 + None, # 1516 + None, # 1517 + None, # 1518 + None, # 1519 + None, # 1520 + None, # 1521 + None, # 1522 + None, # 1523 + None, # 1524 + None, # 1525 + None, # 1526 + None, # 1527 + None, # 1528 + None, # 1529 + None, # 1530 + None, # 1531 + None, # 1532 + None, # 1533 + None, # 1534 + None, # 1535 + None, # 1536 + None, # 1537 + None, # 1538 + None, # 1539 + None, # 1540 + None, # 1541 + None, # 1542 + None, # 1543 + None, # 1544 + None, # 1545 + None, # 1546 + None, # 1547 + None, # 1548 + None, # 1549 + None, # 1550 + None, # 1551 + None, # 1552 + None, # 1553 + None, # 1554 + None, # 1555 + None, # 1556 + None, # 1557 + None, # 1558 + None, # 1559 + None, # 1560 + None, # 1561 + None, # 1562 + None, # 1563 + None, # 1564 + None, # 1565 + None, # 1566 + None, # 1567 + None, # 1568 + None, # 1569 + None, # 1570 + None, # 1571 + None, # 1572 + None, # 1573 + None, # 1574 + None, # 1575 + None, # 1576 + None, # 1577 + None, # 1578 + None, # 1579 + None, # 1580 + None, # 1581 + None, # 1582 + None, # 1583 + None, # 1584 + None, # 1585 + None, # 1586 + None, # 1587 + None, # 1588 + None, # 1589 + None, # 1590 + None, # 1591 + None, # 1592 + None, # 1593 + None, # 1594 + None, # 1595 + None, # 1596 + None, # 1597 + None, # 1598 + None, # 1599 + None, # 1600 + None, # 1601 + None, # 1602 + None, # 1603 + None, # 1604 + None, # 1605 + None, # 1606 + None, # 1607 + None, # 1608 + None, # 1609 + None, # 1610 + None, # 1611 + None, # 1612 + None, # 1613 + None, # 1614 + None, # 1615 + None, # 1616 + None, # 1617 + None, # 1618 + None, # 1619 + None, # 1620 + None, # 1621 + None, # 1622 + None, # 1623 + None, # 1624 + None, # 1625 + None, # 1626 + None, # 1627 + None, # 1628 + None, # 1629 + None, # 1630 + None, # 1631 + None, # 1632 + None, # 1633 + None, # 1634 + None, # 1635 + None, # 1636 + None, # 1637 + None, # 1638 + None, # 1639 + None, # 1640 + None, # 1641 + None, # 1642 + None, # 1643 + None, # 1644 + None, # 1645 + None, # 1646 + None, # 1647 + None, # 1648 + None, # 1649 + None, # 1650 + None, # 1651 + None, # 1652 + None, # 1653 + None, # 1654 + None, # 1655 + None, # 1656 + None, # 1657 + None, # 1658 + None, # 1659 + None, # 1660 + None, # 1661 + None, # 1662 + None, # 1663 + None, # 1664 + None, # 1665 + None, # 1666 + None, # 1667 + None, # 1668 + None, # 1669 + None, # 1670 + None, # 1671 + None, # 1672 + None, # 1673 + None, # 1674 + None, # 1675 + None, # 1676 + None, # 1677 + None, # 1678 + None, # 1679 + None, # 1680 + None, # 1681 + None, # 1682 + None, # 1683 + None, # 1684 + None, # 1685 + None, # 1686 + None, # 1687 + None, # 1688 + None, # 1689 + None, # 1690 + None, # 1691 + None, # 1692 + None, # 1693 + None, # 1694 + None, # 1695 + None, # 1696 + None, # 1697 + None, # 1698 + None, # 1699 + None, # 1700 + None, # 1701 + None, # 1702 + None, # 1703 + None, # 1704 + None, # 1705 + None, # 1706 + None, # 1707 + None, # 1708 + None, # 1709 + None, # 1710 + None, # 1711 + None, # 1712 + None, # 1713 + None, # 1714 + None, # 1715 + None, # 1716 + None, # 1717 + None, # 1718 + None, # 1719 + None, # 1720 + None, # 1721 + None, # 1722 + None, # 1723 + None, # 1724 + None, # 1725 + None, # 1726 + None, # 1727 + None, # 1728 + None, # 1729 + None, # 1730 + None, # 1731 + None, # 1732 + None, # 1733 + None, # 1734 + None, # 1735 + None, # 1736 + None, # 1737 + None, # 1738 + None, # 1739 + None, # 1740 + None, # 1741 + None, # 1742 + None, # 1743 + None, # 1744 + None, # 1745 + None, # 1746 + None, # 1747 + None, # 1748 + None, # 1749 + None, # 1750 + None, # 1751 + None, # 1752 + None, # 1753 + None, # 1754 + None, # 1755 + None, # 1756 + None, # 1757 + None, # 1758 + None, # 1759 + None, # 1760 + None, # 1761 + None, # 1762 + None, # 1763 + None, # 1764 + None, # 1765 + None, # 1766 + None, # 1767 + None, # 1768 + None, # 1769 + None, # 1770 + None, # 1771 + None, # 1772 + None, # 1773 + None, # 1774 + None, # 1775 + None, # 1776 + None, # 1777 + None, # 1778 + None, # 1779 + None, # 1780 + None, # 1781 + None, # 1782 + None, # 1783 + None, # 1784 + None, # 1785 + None, # 1786 + None, # 1787 + None, # 1788 + None, # 1789 + None, # 1790 + None, # 1791 + None, # 1792 + None, # 1793 + None, # 1794 + None, # 1795 + None, # 1796 + None, # 1797 + None, # 1798 + None, # 1799 + None, # 1800 + None, # 1801 + None, # 1802 + None, # 1803 + None, # 1804 + None, # 1805 + None, # 1806 + None, # 1807 + None, # 1808 + None, # 1809 + None, # 1810 + None, # 1811 + None, # 1812 + None, # 1813 + None, # 1814 + None, # 1815 + None, # 1816 + None, # 1817 + None, # 1818 + None, # 1819 + None, # 1820 + None, # 1821 + None, # 1822 + None, # 1823 + None, # 1824 + None, # 1825 + None, # 1826 + None, # 1827 + None, # 1828 + None, # 1829 + None, # 1830 + None, # 1831 + None, # 1832 + None, # 1833 + None, # 1834 + None, # 1835 + None, # 1836 + None, # 1837 + None, # 1838 + None, # 1839 + None, # 1840 + None, # 1841 + None, # 1842 + None, # 1843 + None, # 1844 + None, # 1845 + None, # 1846 + None, # 1847 + None, # 1848 + None, # 1849 + None, # 1850 + None, # 1851 + None, # 1852 + None, # 1853 + None, # 1854 + None, # 1855 + None, # 1856 + None, # 1857 + None, # 1858 + None, # 1859 + None, # 1860 + None, # 1861 + None, # 1862 + None, # 1863 + None, # 1864 + None, # 1865 + None, # 1866 + None, # 1867 + None, # 1868 + None, # 1869 + None, # 1870 + None, # 1871 + None, # 1872 + None, # 1873 + None, # 1874 + None, # 1875 + None, # 1876 + None, # 1877 + None, # 1878 + None, # 1879 + None, # 1880 + None, # 1881 + None, # 1882 + None, # 1883 + None, # 1884 + None, # 1885 + None, # 1886 + None, # 1887 + None, # 1888 + None, # 1889 + None, # 1890 + None, # 1891 + None, # 1892 + None, # 1893 + None, # 1894 + None, # 1895 + None, # 1896 + None, # 1897 + None, # 1898 + None, # 1899 + None, # 1900 + None, # 1901 + None, # 1902 + None, # 1903 + None, # 1904 + None, # 1905 + None, # 1906 + None, # 1907 + None, # 1908 + None, # 1909 + None, # 1910 + None, # 1911 + None, # 1912 + None, # 1913 + None, # 1914 + None, # 1915 + None, # 1916 + None, # 1917 + None, # 1918 + None, # 1919 + None, # 1920 + None, # 1921 + None, # 1922 + None, # 1923 + None, # 1924 + None, # 1925 + None, # 1926 + None, # 1927 + None, # 1928 + None, # 1929 + None, # 1930 + None, # 1931 + None, # 1932 + None, # 1933 + None, # 1934 + None, # 1935 + None, # 1936 + None, # 1937 + None, # 1938 + None, # 1939 + None, # 1940 + None, # 1941 + None, # 1942 + None, # 1943 + None, # 1944 + None, # 1945 + None, # 1946 + None, # 1947 + None, # 1948 + None, # 1949 + None, # 1950 + None, # 1951 + None, # 1952 + None, # 1953 + None, # 1954 + None, # 1955 + None, # 1956 + None, # 1957 + None, # 1958 + None, # 1959 + None, # 1960 + None, # 1961 + None, # 1962 + None, # 1963 + None, # 1964 + None, # 1965 + None, # 1966 + None, # 1967 + None, # 1968 + None, # 1969 + None, # 1970 + None, # 1971 + None, # 1972 + None, # 1973 + None, # 1974 + None, # 1975 + None, # 1976 + None, # 1977 + None, # 1978 + None, # 1979 + None, # 1980 + None, # 1981 + None, # 1982 + None, # 1983 + None, # 1984 + None, # 1985 + None, # 1986 + None, # 1987 + None, # 1988 + None, # 1989 + None, # 1990 + None, # 1991 + None, # 1992 + None, # 1993 + None, # 1994 + None, # 1995 + None, # 1996 + None, # 1997 + None, # 1998 + None, # 1999 + None, # 2000 + None, # 2001 + None, # 2002 + None, # 2003 + None, # 2004 + None, # 2005 + None, # 2006 + None, # 2007 + None, # 2008 + None, # 2009 + None, # 2010 + None, # 2011 + None, # 2012 + None, # 2013 + None, # 2014 + None, # 2015 + None, # 2016 + None, # 2017 + None, # 2018 + None, # 2019 + None, # 2020 + None, # 2021 + None, # 2022 + None, # 2023 + None, # 2024 + None, # 2025 + None, # 2026 + None, # 2027 + None, # 2028 + None, # 2029 + None, # 2030 + None, # 2031 + None, # 2032 + None, # 2033 + None, # 2034 + None, # 2035 + None, # 2036 + None, # 2037 + None, # 2038 + None, # 2039 + None, # 2040 + None, # 2041 + None, # 2042 + None, # 2043 + None, # 2044 + None, # 2045 + None, # 2046 + None, # 2047 + None, # 2048 + None, # 2049 + None, # 2050 + None, # 2051 + None, # 2052 + None, # 2053 + None, # 2054 + None, # 2055 + None, # 2056 + None, # 2057 + None, # 2058 + None, # 2059 + None, # 2060 + None, # 2061 + None, # 2062 + None, # 2063 + None, # 2064 + None, # 2065 + None, # 2066 + None, # 2067 + None, # 2068 + None, # 2069 + None, # 2070 + None, # 2071 + None, # 2072 + None, # 2073 + None, # 2074 + None, # 2075 + None, # 2076 + None, # 2077 + None, # 2078 + None, # 2079 + None, # 2080 + None, # 2081 + None, # 2082 + None, # 2083 + None, # 2084 + None, # 2085 + None, # 2086 + None, # 2087 + None, # 2088 + None, # 2089 + None, # 2090 + None, # 2091 + None, # 2092 + None, # 2093 + None, # 2094 + None, # 2095 + None, # 2096 + None, # 2097 + None, # 2098 + None, # 2099 + None, # 2100 + None, # 2101 + None, # 2102 + None, # 2103 + None, # 2104 + None, # 2105 + None, # 2106 + None, # 2107 + None, # 2108 + None, # 2109 + None, # 2110 + None, # 2111 + None, # 2112 + None, # 2113 + None, # 2114 + None, # 2115 + None, # 2116 + None, # 2117 + None, # 2118 + None, # 2119 + None, # 2120 + None, # 2121 + None, # 2122 + None, # 2123 + None, # 2124 + None, # 2125 + None, # 2126 + None, # 2127 + None, # 2128 + None, # 2129 + None, # 2130 + None, # 2131 + None, # 2132 + None, # 2133 + None, # 2134 + None, # 2135 + None, # 2136 + None, # 2137 + None, # 2138 + None, # 2139 + None, # 2140 + None, # 2141 + None, # 2142 + None, # 2143 + None, # 2144 + None, # 2145 + None, # 2146 + None, # 2147 + None, # 2148 + None, # 2149 + None, # 2150 + None, # 2151 + None, # 2152 + None, # 2153 + None, # 2154 + None, # 2155 + None, # 2156 + None, # 2157 + None, # 2158 + None, # 2159 + None, # 2160 + None, # 2161 + None, # 2162 + None, # 2163 + None, # 2164 + None, # 2165 + None, # 2166 + None, # 2167 + None, # 2168 + None, # 2169 + None, # 2170 + None, # 2171 + None, # 2172 + None, # 2173 + None, # 2174 + None, # 2175 + None, # 2176 + None, # 2177 + None, # 2178 + None, # 2179 + None, # 2180 + None, # 2181 + None, # 2182 + None, # 2183 + None, # 2184 + None, # 2185 + None, # 2186 + None, # 2187 + None, # 2188 + None, # 2189 + None, # 2190 + None, # 2191 + None, # 2192 + None, # 2193 + None, # 2194 + None, # 2195 + None, # 2196 + None, # 2197 + None, # 2198 + None, # 2199 + None, # 2200 + None, # 2201 + None, # 2202 + None, # 2203 + None, # 2204 + None, # 2205 + None, # 2206 + None, # 2207 + None, # 2208 + None, # 2209 + None, # 2210 + None, # 2211 + None, # 2212 + None, # 2213 + None, # 2214 + None, # 2215 + None, # 2216 + None, # 2217 + None, # 2218 + None, # 2219 + None, # 2220 + None, # 2221 + None, # 2222 + None, # 2223 + None, # 2224 + None, # 2225 + None, # 2226 + None, # 2227 + None, # 2228 + None, # 2229 + None, # 2230 + None, # 2231 + None, # 2232 + None, # 2233 + None, # 2234 + None, # 2235 + None, # 2236 + None, # 2237 + None, # 2238 + None, # 2239 + None, # 2240 + None, # 2241 + None, # 2242 + None, # 2243 + None, # 2244 + None, # 2245 + None, # 2246 + None, # 2247 + None, # 2248 + None, # 2249 + None, # 2250 + None, # 2251 + None, # 2252 + None, # 2253 + None, # 2254 + None, # 2255 + None, # 2256 + None, # 2257 + None, # 2258 + None, # 2259 + None, # 2260 + None, # 2261 + None, # 2262 + None, # 2263 + None, # 2264 + None, # 2265 + None, # 2266 + None, # 2267 + None, # 2268 + None, # 2269 + None, # 2270 + None, # 2271 + None, # 2272 + None, # 2273 + None, # 2274 + None, # 2275 + None, # 2276 + None, # 2277 + None, # 2278 + None, # 2279 + None, # 2280 + None, # 2281 + None, # 2282 + None, # 2283 + None, # 2284 + None, # 2285 + None, # 2286 + None, # 2287 + None, # 2288 + None, # 2289 + None, # 2290 + None, # 2291 + None, # 2292 + None, # 2293 + None, # 2294 + None, # 2295 + None, # 2296 + None, # 2297 + None, # 2298 + None, # 2299 + None, # 2300 + None, # 2301 + None, # 2302 + None, # 2303 + None, # 2304 + None, # 2305 + None, # 2306 + None, # 2307 + None, # 2308 + None, # 2309 + None, # 2310 + None, # 2311 + None, # 2312 + None, # 2313 + None, # 2314 + None, # 2315 + None, # 2316 + None, # 2317 + None, # 2318 + None, # 2319 + None, # 2320 + None, # 2321 + None, # 2322 + None, # 2323 + None, # 2324 + None, # 2325 + None, # 2326 + None, # 2327 + None, # 2328 + None, # 2329 + None, # 2330 + None, # 2331 + None, # 2332 + None, # 2333 + None, # 2334 + None, # 2335 + None, # 2336 + None, # 2337 + None, # 2338 + None, # 2339 + None, # 2340 + None, # 2341 + None, # 2342 + None, # 2343 + None, # 2344 + None, # 2345 + None, # 2346 + None, # 2347 + None, # 2348 + None, # 2349 + None, # 2350 + None, # 2351 + None, # 2352 + None, # 2353 + None, # 2354 + None, # 2355 + None, # 2356 + None, # 2357 + None, # 2358 + None, # 2359 + None, # 2360 + None, # 2361 + None, # 2362 + None, # 2363 + None, # 2364 + None, # 2365 + None, # 2366 + None, # 2367 + None, # 2368 + None, # 2369 + None, # 2370 + None, # 2371 + None, # 2372 + None, # 2373 + None, # 2374 + None, # 2375 + None, # 2376 + None, # 2377 + None, # 2378 + None, # 2379 + None, # 2380 + None, # 2381 + None, # 2382 + None, # 2383 + None, # 2384 + None, # 2385 + None, # 2386 + None, # 2387 + None, # 2388 + None, # 2389 + None, # 2390 + None, # 2391 + None, # 2392 + None, # 2393 + None, # 2394 + None, # 2395 + None, # 2396 + None, # 2397 + None, # 2398 + None, # 2399 + None, # 2400 + None, # 2401 + None, # 2402 + None, # 2403 + None, # 2404 + None, # 2405 + None, # 2406 + None, # 2407 + None, # 2408 + None, # 2409 + None, # 2410 + None, # 2411 + None, # 2412 + None, # 2413 + None, # 2414 + None, # 2415 + None, # 2416 + None, # 2417 + None, # 2418 + None, # 2419 + None, # 2420 + None, # 2421 + None, # 2422 + None, # 2423 + None, # 2424 + None, # 2425 + None, # 2426 + None, # 2427 + None, # 2428 + None, # 2429 + None, # 2430 + None, # 2431 + None, # 2432 + None, # 2433 + None, # 2434 + None, # 2435 + None, # 2436 + None, # 2437 + None, # 2438 + None, # 2439 + None, # 2440 + None, # 2441 + None, # 2442 + None, # 2443 + None, # 2444 + None, # 2445 + None, # 2446 + None, # 2447 + None, # 2448 + None, # 2449 + None, # 2450 + None, # 2451 + None, # 2452 + None, # 2453 + None, # 2454 + None, # 2455 + None, # 2456 + None, # 2457 + None, # 2458 + None, # 2459 + None, # 2460 + None, # 2461 + None, # 2462 + None, # 2463 + None, # 2464 + None, # 2465 + None, # 2466 + None, # 2467 + None, # 2468 + None, # 2469 + None, # 2470 + None, # 2471 + None, # 2472 + None, # 2473 + None, # 2474 + None, # 2475 + None, # 2476 + None, # 2477 + None, # 2478 + None, # 2479 + None, # 2480 + None, # 2481 + None, # 2482 + None, # 2483 + None, # 2484 + None, # 2485 + None, # 2486 + None, # 2487 + None, # 2488 + None, # 2489 + None, # 2490 + None, # 2491 + None, # 2492 + None, # 2493 + None, # 2494 + None, # 2495 + None, # 2496 + None, # 2497 + None, # 2498 + None, # 2499 + None, # 2500 + None, # 2501 + None, # 2502 + None, # 2503 + None, # 2504 + None, # 2505 + None, # 2506 + None, # 2507 + None, # 2508 + None, # 2509 + None, # 2510 + None, # 2511 + None, # 2512 + None, # 2513 + None, # 2514 + None, # 2515 + None, # 2516 + None, # 2517 + None, # 2518 + None, # 2519 + None, # 2520 + None, # 2521 + None, # 2522 + None, # 2523 + None, # 2524 + None, # 2525 + None, # 2526 + None, # 2527 + None, # 2528 + None, # 2529 + None, # 2530 + None, # 2531 + None, # 2532 + None, # 2533 + None, # 2534 + None, # 2535 + None, # 2536 + None, # 2537 + None, # 2538 + None, # 2539 + None, # 2540 + None, # 2541 + None, # 2542 + None, # 2543 + None, # 2544 + None, # 2545 + None, # 2546 + None, # 2547 + None, # 2548 + None, # 2549 + None, # 2550 + None, # 2551 + None, # 2552 + None, # 2553 + None, # 2554 + None, # 2555 + None, # 2556 + None, # 2557 + None, # 2558 + None, # 2559 + None, # 2560 + None, # 2561 + None, # 2562 + None, # 2563 + None, # 2564 + None, # 2565 + None, # 2566 + None, # 2567 + None, # 2568 + None, # 2569 + None, # 2570 + None, # 2571 + None, # 2572 + None, # 2573 + None, # 2574 + None, # 2575 + None, # 2576 + None, # 2577 + None, # 2578 + None, # 2579 + None, # 2580 + None, # 2581 + None, # 2582 + None, # 2583 + None, # 2584 + None, # 2585 + None, # 2586 + None, # 2587 + None, # 2588 + None, # 2589 + None, # 2590 + None, # 2591 + None, # 2592 + None, # 2593 + None, # 2594 + None, # 2595 + None, # 2596 + None, # 2597 + None, # 2598 + None, # 2599 + None, # 2600 + None, # 2601 + None, # 2602 + None, # 2603 + None, # 2604 + None, # 2605 + None, # 2606 + None, # 2607 + None, # 2608 + None, # 2609 + None, # 2610 + None, # 2611 + None, # 2612 + None, # 2613 + None, # 2614 + None, # 2615 + None, # 2616 + None, # 2617 + None, # 2618 + None, # 2619 + None, # 2620 + None, # 2621 + None, # 2622 + None, # 2623 + None, # 2624 + None, # 2625 + None, # 2626 + None, # 2627 + None, # 2628 + None, # 2629 + None, # 2630 + None, # 2631 + None, # 2632 + None, # 2633 + None, # 2634 + None, # 2635 + None, # 2636 + None, # 2637 + None, # 2638 + None, # 2639 + None, # 2640 + None, # 2641 + None, # 2642 + None, # 2643 + None, # 2644 + None, # 2645 + None, # 2646 + None, # 2647 + None, # 2648 + None, # 2649 + None, # 2650 + None, # 2651 + None, # 2652 + None, # 2653 + None, # 2654 + None, # 2655 + None, # 2656 + None, # 2657 + None, # 2658 + None, # 2659 + None, # 2660 + None, # 2661 + None, # 2662 + None, # 2663 + None, # 2664 + None, # 2665 + None, # 2666 + None, # 2667 + None, # 2668 + None, # 2669 + None, # 2670 + None, # 2671 + None, # 2672 + None, # 2673 + None, # 2674 + None, # 2675 + None, # 2676 + None, # 2677 + None, # 2678 + None, # 2679 + None, # 2680 + None, # 2681 + None, # 2682 + None, # 2683 + None, # 2684 + None, # 2685 + None, # 2686 + None, # 2687 + None, # 2688 + None, # 2689 + None, # 2690 + None, # 2691 + None, # 2692 + None, # 2693 + None, # 2694 + None, # 2695 + None, # 2696 + None, # 2697 + None, # 2698 + None, # 2699 + None, # 2700 + None, # 2701 + None, # 2702 + None, # 2703 + None, # 2704 + None, # 2705 + None, # 2706 + None, # 2707 + None, # 2708 + None, # 2709 + None, # 2710 + None, # 2711 + None, # 2712 + None, # 2713 + None, # 2714 + None, # 2715 + None, # 2716 + None, # 2717 + None, # 2718 + None, # 2719 + None, # 2720 + None, # 2721 + None, # 2722 + None, # 2723 + None, # 2724 + None, # 2725 + None, # 2726 + None, # 2727 + None, # 2728 + None, # 2729 + None, # 2730 + None, # 2731 + None, # 2732 + None, # 2733 + None, # 2734 + None, # 2735 + None, # 2736 + None, # 2737 + None, # 2738 + None, # 2739 + None, # 2740 + None, # 2741 + None, # 2742 + None, # 2743 + None, # 2744 + None, # 2745 + None, # 2746 + None, # 2747 + None, # 2748 + None, # 2749 + None, # 2750 + None, # 2751 + None, # 2752 + None, # 2753 + None, # 2754 + None, # 2755 + None, # 2756 + None, # 2757 + None, # 2758 + None, # 2759 + None, # 2760 + None, # 2761 + None, # 2762 + None, # 2763 + None, # 2764 + None, # 2765 + None, # 2766 + None, # 2767 + None, # 2768 + None, # 2769 + None, # 2770 + None, # 2771 + None, # 2772 + None, # 2773 + None, # 2774 + None, # 2775 + None, # 2776 + None, # 2777 + None, # 2778 + None, # 2779 + None, # 2780 + None, # 2781 + None, # 2782 + None, # 2783 + None, # 2784 + None, # 2785 + None, # 2786 + None, # 2787 + None, # 2788 + None, # 2789 + None, # 2790 + None, # 2791 + None, # 2792 + None, # 2793 + None, # 2794 + None, # 2795 + None, # 2796 + None, # 2797 + None, # 2798 + None, # 2799 + None, # 2800 + None, # 2801 + None, # 2802 + None, # 2803 + None, # 2804 + None, # 2805 + None, # 2806 + None, # 2807 + None, # 2808 + None, # 2809 + None, # 2810 + None, # 2811 + None, # 2812 + None, # 2813 + None, # 2814 + None, # 2815 + None, # 2816 + None, # 2817 + None, # 2818 + None, # 2819 + None, # 2820 + None, # 2821 + None, # 2822 + None, # 2823 + None, # 2824 + None, # 2825 + None, # 2826 + None, # 2827 + None, # 2828 + None, # 2829 + None, # 2830 + None, # 2831 + None, # 2832 + None, # 2833 + None, # 2834 + None, # 2835 + None, # 2836 + None, # 2837 + None, # 2838 + None, # 2839 + None, # 2840 + None, # 2841 + None, # 2842 + None, # 2843 + None, # 2844 + None, # 2845 + None, # 2846 + None, # 2847 + None, # 2848 + None, # 2849 + None, # 2850 + None, # 2851 + None, # 2852 + None, # 2853 + None, # 2854 + None, # 2855 + None, # 2856 + None, # 2857 + None, # 2858 + None, # 2859 + None, # 2860 + None, # 2861 + None, # 2862 + None, # 2863 + None, # 2864 + None, # 2865 + None, # 2866 + None, # 2867 + None, # 2868 + None, # 2869 + None, # 2870 + None, # 2871 + None, # 2872 + None, # 2873 + None, # 2874 + None, # 2875 + None, # 2876 + None, # 2877 + None, # 2878 + None, # 2879 + None, # 2880 + None, # 2881 + None, # 2882 + None, # 2883 + None, # 2884 + None, # 2885 + None, # 2886 + None, # 2887 + None, # 2888 + None, # 2889 + None, # 2890 + None, # 2891 + None, # 2892 + None, # 2893 + None, # 2894 + None, # 2895 + None, # 2896 + None, # 2897 + None, # 2898 + None, # 2899 + None, # 2900 + None, # 2901 + None, # 2902 + None, # 2903 + None, # 2904 + None, # 2905 + None, # 2906 + None, # 2907 + None, # 2908 + None, # 2909 + None, # 2910 + None, # 2911 + None, # 2912 + None, # 2913 + None, # 2914 + None, # 2915 + None, # 2916 + None, # 2917 + None, # 2918 + None, # 2919 + None, # 2920 + None, # 2921 + None, # 2922 + None, # 2923 + None, # 2924 + None, # 2925 + None, # 2926 + None, # 2927 + None, # 2928 + None, # 2929 + None, # 2930 + None, # 2931 + None, # 2932 + None, # 2933 + None, # 2934 + None, # 2935 + None, # 2936 + None, # 2937 + None, # 2938 + None, # 2939 + None, # 2940 + None, # 2941 + None, # 2942 + None, # 2943 + None, # 2944 + None, # 2945 + None, # 2946 + None, # 2947 + None, # 2948 + None, # 2949 + None, # 2950 + None, # 2951 + None, # 2952 + None, # 2953 + None, # 2954 + None, # 2955 + None, # 2956 + None, # 2957 + None, # 2958 + None, # 2959 + None, # 2960 + None, # 2961 + None, # 2962 + None, # 2963 + None, # 2964 + None, # 2965 + None, # 2966 + None, # 2967 + None, # 2968 + None, # 2969 + None, # 2970 + None, # 2971 + None, # 2972 + None, # 2973 + None, # 2974 + None, # 2975 + None, # 2976 + None, # 2977 + None, # 2978 + None, # 2979 + None, # 2980 + None, # 2981 + None, # 2982 + None, # 2983 + None, # 2984 + None, # 2985 + None, # 2986 + None, # 2987 + None, # 2988 + None, # 2989 + None, # 2990 + None, # 2991 + None, # 2992 + None, # 2993 + None, # 2994 + None, # 2995 + None, # 2996 + None, # 2997 + None, # 2998 + None, # 2999 + None, # 3000 + None, # 3001 + None, # 3002 + None, # 3003 + None, # 3004 + None, # 3005 + None, # 3006 + None, # 3007 + None, # 3008 + None, # 3009 + None, # 3010 + None, # 3011 + None, # 3012 + None, # 3013 + None, # 3014 + None, # 3015 + None, # 3016 + None, # 3017 + None, # 3018 + None, # 3019 + None, # 3020 + None, # 3021 + None, # 3022 + None, # 3023 + None, # 3024 + None, # 3025 + None, # 3026 + None, # 3027 + None, # 3028 + None, # 3029 + None, # 3030 + None, # 3031 + None, # 3032 + None, # 3033 + None, # 3034 + None, # 3035 + None, # 3036 + None, # 3037 + None, # 3038 + None, # 3039 + None, # 3040 + None, # 3041 + None, # 3042 + None, # 3043 + None, # 3044 + None, # 3045 + None, # 3046 + None, # 3047 + None, # 3048 + None, # 3049 + None, # 3050 + None, # 3051 + None, # 3052 + None, # 3053 + None, # 3054 + None, # 3055 + None, # 3056 + None, # 3057 + None, # 3058 + None, # 3059 + None, # 3060 + None, # 3061 + None, # 3062 + None, # 3063 + None, # 3064 + None, # 3065 + None, # 3066 + None, # 3067 + None, # 3068 + None, # 3069 + None, # 3070 + None, # 3071 + None, # 3072 + None, # 3073 + None, # 3074 + None, # 3075 + None, # 3076 + None, # 3077 + None, # 3078 + None, # 3079 + None, # 3080 + None, # 3081 + None, # 3082 + None, # 3083 + None, # 3084 + None, # 3085 + None, # 3086 + None, # 3087 + None, # 3088 + None, # 3089 + None, # 3090 + None, # 3091 + None, # 3092 + None, # 3093 + None, # 3094 + None, # 3095 + None, # 3096 + None, # 3097 + None, # 3098 + None, # 3099 + None, # 3100 + None, # 3101 + None, # 3102 + None, # 3103 + None, # 3104 + None, # 3105 + None, # 3106 + None, # 3107 + None, # 3108 + None, # 3109 + None, # 3110 + None, # 3111 + None, # 3112 + None, # 3113 + None, # 3114 + None, # 3115 + None, # 3116 + None, # 3117 + None, # 3118 + None, # 3119 + None, # 3120 + None, # 3121 + None, # 3122 + None, # 3123 + None, # 3124 + None, # 3125 + None, # 3126 + None, # 3127 + None, # 3128 + None, # 3129 + None, # 3130 + None, # 3131 + None, # 3132 + None, # 3133 + None, # 3134 + None, # 3135 + None, # 3136 + None, # 3137 + None, # 3138 + None, # 3139 + None, # 3140 + None, # 3141 + None, # 3142 + None, # 3143 + None, # 3144 + None, # 3145 + None, # 3146 + None, # 3147 + None, # 3148 + None, # 3149 + None, # 3150 + None, # 3151 + None, # 3152 + None, # 3153 + None, # 3154 + None, # 3155 + None, # 3156 + None, # 3157 + None, # 3158 + None, # 3159 + None, # 3160 + None, # 3161 + None, # 3162 + None, # 3163 + None, # 3164 + None, # 3165 + None, # 3166 + None, # 3167 + None, # 3168 + None, # 3169 + None, # 3170 + None, # 3171 + None, # 3172 + None, # 3173 + None, # 3174 + None, # 3175 + None, # 3176 + None, # 3177 + None, # 3178 + None, # 3179 + None, # 3180 + None, # 3181 + None, # 3182 + None, # 3183 + None, # 3184 + None, # 3185 + None, # 3186 + None, # 3187 + None, # 3188 + None, # 3189 + None, # 3190 + None, # 3191 + None, # 3192 + None, # 3193 + None, # 3194 + None, # 3195 + None, # 3196 + None, # 3197 + None, # 3198 + None, # 3199 + None, # 3200 + None, # 3201 + None, # 3202 + None, # 3203 + None, # 3204 + None, # 3205 + None, # 3206 + None, # 3207 + None, # 3208 + None, # 3209 + None, # 3210 + None, # 3211 + None, # 3212 + None, # 3213 + None, # 3214 + None, # 3215 + None, # 3216 + None, # 3217 + None, # 3218 + None, # 3219 + None, # 3220 + None, # 3221 + None, # 3222 + None, # 3223 + None, # 3224 + None, # 3225 + None, # 3226 + None, # 3227 + None, # 3228 + None, # 3229 + None, # 3230 + None, # 3231 + None, # 3232 + None, # 3233 + None, # 3234 + None, # 3235 + None, # 3236 + None, # 3237 + None, # 3238 + None, # 3239 + None, # 3240 + None, # 3241 + None, # 3242 + None, # 3243 + None, # 3244 + None, # 3245 + None, # 3246 + None, # 3247 + None, # 3248 + None, # 3249 + None, # 3250 + None, # 3251 + None, # 3252 + None, # 3253 + None, # 3254 + None, # 3255 + None, # 3256 + None, # 3257 + None, # 3258 + None, # 3259 + None, # 3260 + None, # 3261 + None, # 3262 + None, # 3263 + None, # 3264 + None, # 3265 + None, # 3266 + None, # 3267 + None, # 3268 + None, # 3269 + None, # 3270 + None, # 3271 + None, # 3272 + None, # 3273 + None, # 3274 + None, # 3275 + None, # 3276 + None, # 3277 + None, # 3278 + None, # 3279 + None, # 3280 + None, # 3281 + None, # 3282 + None, # 3283 + None, # 3284 + None, # 3285 + None, # 3286 + None, # 3287 + None, # 3288 + None, # 3289 + None, # 3290 + None, # 3291 + None, # 3292 + None, # 3293 + None, # 3294 + None, # 3295 + None, # 3296 + None, # 3297 + None, # 3298 + None, # 3299 + None, # 3300 + None, # 3301 + None, # 3302 + None, # 3303 + None, # 3304 + None, # 3305 + None, # 3306 + None, # 3307 + None, # 3308 + None, # 3309 + None, # 3310 + None, # 3311 + None, # 3312 + None, # 3313 + None, # 3314 + None, # 3315 + None, # 3316 + None, # 3317 + None, # 3318 + None, # 3319 + None, # 3320 + None, # 3321 + None, # 3322 + None, # 3323 + None, # 3324 + None, # 3325 + None, # 3326 + None, # 3327 + None, # 3328 + (3329, TType.BOOL, 'executionRejected', None, None, ), # 3329 + (3330, TType.DOUBLE, 'maxClusterCapacity', None, None, ), # 3330 + (3331, TType.DOUBLE, 'queryCost', None, None, ), # 3331 + (3332, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3332 + (3333, TType.DOUBLE, 'currentClusterLoad', None, None, ), # 3333 + (3334, TType.I32, 'idempotencyType', None, None, ), # 3334 ) -all_structs.append(TGetCatalogsReq) -TGetCatalogsReq.thrift_spec = ( +all_structs.append(TGetTypeInfoReq) +TGetTypeInfoReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 None, # 2 @@ -46806,8 +39471,8 @@ def __ne__(self, other): (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 ) -all_structs.append(TGetCatalogsResp) -TGetCatalogsResp.thrift_spec = ( +all_structs.append(TGetTypeInfoResp) +TGetTypeInfoResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -48091,12 +40756,12 @@ def __ne__(self, other): None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TGetSchemasReq) -TGetSchemasReq.thrift_spec = ( +all_structs.append(TGetCatalogsReq) +TGetCatalogsReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.STRING, 'catalogName', 'UTF8', None, ), # 2 - (3, TType.STRING, 'schemaName', 'UTF8', None, ), # 3 + None, # 2 + None, # 3 None, # 4 None, # 5 None, # 6 @@ -51425,8 +44090,8 @@ def __ne__(self, other): (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 ) -all_structs.append(TGetSchemasResp) -TGetSchemasResp.thrift_spec = ( +all_structs.append(TGetCatalogsResp) +TGetCatalogsResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -52710,14 +45375,14 @@ def __ne__(self, other): None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TGetTablesReq) -TGetTablesReq.thrift_spec = ( +all_structs.append(TGetSchemasReq) +TGetSchemasReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 (2, TType.STRING, 'catalogName', 'UTF8', None, ), # 2 (3, TType.STRING, 'schemaName', 'UTF8', None, ), # 3 - (4, TType.STRING, 'tableName', 'UTF8', None, ), # 4 - (5, TType.LIST, 'tableTypes', (TType.STRING, 'UTF8', False), None, ), # 5 + None, # 4 + None, # 5 None, # 6 None, # 7 None, # 8 @@ -56044,8 +48709,8 @@ def __ne__(self, other): (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 ) -all_structs.append(TGetTablesResp) -TGetTablesResp.thrift_spec = ( +all_structs.append(TGetSchemasResp) +TGetSchemasResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -57329,14 +49994,14 @@ def __ne__(self, other): None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TGetTableTypesReq) -TGetTableTypesReq.thrift_spec = ( +all_structs.append(TGetTablesReq) +TGetTablesReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - None, # 2 - None, # 3 - None, # 4 - None, # 5 + (2, TType.STRING, 'catalogName', 'UTF8', None, ), # 2 + (3, TType.STRING, 'schemaName', 'UTF8', None, ), # 3 + (4, TType.STRING, 'tableName', 'UTF8', None, ), # 4 + (5, TType.LIST, 'tableTypes', (TType.STRING, 'UTF8', False), None, ), # 5 None, # 6 None, # 7 None, # 8 @@ -60663,8 +53328,8 @@ def __ne__(self, other): (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 ) -all_structs.append(TGetTableTypesResp) -TGetTableTypesResp.thrift_spec = ( +all_structs.append(TGetTablesResp) +TGetTablesResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -61948,14 +54613,14 @@ def __ne__(self, other): None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TGetColumnsReq) -TGetColumnsReq.thrift_spec = ( +all_structs.append(TGetTableTypesReq) +TGetTableTypesReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.STRING, 'catalogName', 'UTF8', None, ), # 2 - (3, TType.STRING, 'schemaName', 'UTF8', None, ), # 3 - (4, TType.STRING, 'tableName', 'UTF8', None, ), # 4 - (5, TType.STRING, 'columnName', 'UTF8', None, ), # 5 + None, # 2 + None, # 3 + None, # 4 + None, # 5 None, # 6 None, # 7 None, # 8 @@ -65282,8 +57947,8 @@ def __ne__(self, other): (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 ) -all_structs.append(TGetColumnsResp) -TGetColumnsResp.thrift_spec = ( +all_structs.append(TGetTableTypesResp) +TGetTableTypesResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -66567,14 +59232,14 @@ def __ne__(self, other): None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TGetFunctionsReq) -TGetFunctionsReq.thrift_spec = ( +all_structs.append(TGetColumnsReq) +TGetColumnsReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 (2, TType.STRING, 'catalogName', 'UTF8', None, ), # 2 (3, TType.STRING, 'schemaName', 'UTF8', None, ), # 3 - (4, TType.STRING, 'functionName', 'UTF8', None, ), # 4 - None, # 5 + (4, TType.STRING, 'tableName', 'UTF8', None, ), # 4 + (5, TType.STRING, 'columnName', 'UTF8', None, ), # 5 None, # 6 None, # 7 None, # 8 @@ -69901,8 +62566,8 @@ def __ne__(self, other): (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 ) -all_structs.append(TGetFunctionsResp) -TGetFunctionsResp.thrift_spec = ( +all_structs.append(TGetColumnsResp) +TGetColumnsResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -71186,13 +63851,13 @@ def __ne__(self, other): None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TGetPrimaryKeysReq) -TGetPrimaryKeysReq.thrift_spec = ( +all_structs.append(TGetFunctionsReq) +TGetFunctionsReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 (2, TType.STRING, 'catalogName', 'UTF8', None, ), # 2 (3, TType.STRING, 'schemaName', 'UTF8', None, ), # 3 - (4, TType.STRING, 'tableName', 'UTF8', None, ), # 4 + (4, TType.STRING, 'functionName', 'UTF8', None, ), # 4 None, # 5 None, # 6 None, # 7 @@ -74520,8 +67185,8 @@ def __ne__(self, other): (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 ) -all_structs.append(TGetPrimaryKeysResp) -TGetPrimaryKeysResp.thrift_spec = ( +all_structs.append(TGetFunctionsResp) +TGetFunctionsResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -75805,16 +68470,16 @@ def __ne__(self, other): None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TGetCrossReferenceReq) -TGetCrossReferenceReq.thrift_spec = ( +all_structs.append(TGetPrimaryKeysReq) +TGetPrimaryKeysReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.STRING, 'parentCatalogName', 'UTF8', None, ), # 2 - (3, TType.STRING, 'parentSchemaName', 'UTF8', None, ), # 3 - (4, TType.STRING, 'parentTableName', 'UTF8', None, ), # 4 - (5, TType.STRING, 'foreignCatalogName', 'UTF8', None, ), # 5 - (6, TType.STRING, 'foreignSchemaName', 'UTF8', None, ), # 6 - (7, TType.STRING, 'foreignTableName', 'UTF8', None, ), # 7 + (2, TType.STRING, 'catalogName', 'UTF8', None, ), # 2 + (3, TType.STRING, 'schemaName', 'UTF8', None, ), # 3 + (4, TType.STRING, 'tableName', 'UTF8', None, ), # 4 + None, # 5 + None, # 6 + None, # 7 None, # 8 None, # 9 None, # 10 @@ -79139,8 +71804,8 @@ def __ne__(self, other): (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 ) -all_structs.append(TGetCrossReferenceResp) -TGetCrossReferenceResp.thrift_spec = ( +all_structs.append(TGetPrimaryKeysResp) +TGetPrimaryKeysResp.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 @@ -80424,26 +73089,20 @@ def __ne__(self, other): None, # 1280 (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TGetOperationStatusReq) -TGetOperationStatusReq.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 1 - (2, TType.BOOL, 'getProgressUpdate', None, None, ), # 2 -) -all_structs.append(TGetOperationStatusResp) -TGetOperationStatusResp.thrift_spec = ( +all_structs.append(TGetCrossReferenceReq) +TGetCrossReferenceReq.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 - (2, TType.I32, 'operationState', None, None, ), # 2 - (3, TType.STRING, 'sqlState', 'UTF8', None, ), # 3 - (4, TType.I32, 'errorCode', None, None, ), # 4 - (5, TType.STRING, 'errorMessage', 'UTF8', None, ), # 5 - (6, TType.STRING, 'taskStatus', 'UTF8', None, ), # 6 - (7, TType.I64, 'operationStarted', None, None, ), # 7 - (8, TType.I64, 'operationCompleted', None, None, ), # 8 - (9, TType.BOOL, 'hasResultSet', None, None, ), # 9 - (10, TType.STRUCT, 'progressUpdateResponse', [TProgressUpdateResp, None], None, ), # 10 - (11, TType.I64, 'numModifiedRows', None, None, ), # 11 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 + (2, TType.STRING, 'parentCatalogName', 'UTF8', None, ), # 2 + (3, TType.STRING, 'parentSchemaName', 'UTF8', None, ), # 3 + (4, TType.STRING, 'parentTableName', 'UTF8', None, ), # 4 + (5, TType.STRING, 'foreignCatalogName', 'UTF8', None, ), # 5 + (6, TType.STRING, 'foreignSchemaName', 'UTF8', None, ), # 6 + (7, TType.STRING, 'foreignTableName', 'UTF8', None, ), # 7 + None, # 8 + None, # 9 + None, # 10 + None, # 11 None, # 12 None, # 13 None, # 14 @@ -81713,9 +74372,9 @@ def __ne__(self, other): None, # 1278 None, # 1279 None, # 1280 - (1281, TType.STRING, 'displayMessage', 'UTF8', None, ), # 1281 - (1282, TType.STRING, 'diagnosticInfo', 'UTF8', None, ), # 1282 - (1283, TType.STRING, 'errorDetailsJson', 'UTF8', None, ), # 1283 + (1281, TType.STRUCT, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 + None, # 1283 None, # 1284 None, # 1285 None, # 1286 @@ -83761,25 +76420,1314 @@ def __ne__(self, other): None, # 3326 None, # 3327 None, # 3328 - (3329, TType.STRING, 'responseValidation', 'BINARY', None, ), # 3329 - (3330, TType.I32, 'idempotencyType', None, None, ), # 3330 - (3331, TType.I64, 'statementTimeout', None, None, ), # 3331 - (3332, TType.I32, 'statementTimeoutLevel', None, None, ), # 3332 + (3329, TType.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 + (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 +) +all_structs.append(TGetCrossReferenceResp) +TGetCrossReferenceResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 + None, # 3 + None, # 4 + None, # 5 + None, # 6 + None, # 7 + None, # 8 + None, # 9 + None, # 10 + None, # 11 + None, # 12 + None, # 13 + None, # 14 + None, # 15 + None, # 16 + None, # 17 + None, # 18 + None, # 19 + None, # 20 + None, # 21 + None, # 22 + None, # 23 + None, # 24 + None, # 25 + None, # 26 + None, # 27 + None, # 28 + None, # 29 + None, # 30 + None, # 31 + None, # 32 + None, # 33 + None, # 34 + None, # 35 + None, # 36 + None, # 37 + None, # 38 + None, # 39 + None, # 40 + None, # 41 + None, # 42 + None, # 43 + None, # 44 + None, # 45 + None, # 46 + None, # 47 + None, # 48 + None, # 49 + None, # 50 + None, # 51 + None, # 52 + None, # 53 + None, # 54 + None, # 55 + None, # 56 + None, # 57 + None, # 58 + None, # 59 + None, # 60 + None, # 61 + None, # 62 + None, # 63 + None, # 64 + None, # 65 + None, # 66 + None, # 67 + None, # 68 + None, # 69 + None, # 70 + None, # 71 + None, # 72 + None, # 73 + None, # 74 + None, # 75 + None, # 76 + None, # 77 + None, # 78 + None, # 79 + None, # 80 + None, # 81 + None, # 82 + None, # 83 + None, # 84 + None, # 85 + None, # 86 + None, # 87 + None, # 88 + None, # 89 + None, # 90 + None, # 91 + None, # 92 + None, # 93 + None, # 94 + None, # 95 + None, # 96 + None, # 97 + None, # 98 + None, # 99 + None, # 100 + None, # 101 + None, # 102 + None, # 103 + None, # 104 + None, # 105 + None, # 106 + None, # 107 + None, # 108 + None, # 109 + None, # 110 + None, # 111 + None, # 112 + None, # 113 + None, # 114 + None, # 115 + None, # 116 + None, # 117 + None, # 118 + None, # 119 + None, # 120 + None, # 121 + None, # 122 + None, # 123 + None, # 124 + None, # 125 + None, # 126 + None, # 127 + None, # 128 + None, # 129 + None, # 130 + None, # 131 + None, # 132 + None, # 133 + None, # 134 + None, # 135 + None, # 136 + None, # 137 + None, # 138 + None, # 139 + None, # 140 + None, # 141 + None, # 142 + None, # 143 + None, # 144 + None, # 145 + None, # 146 + None, # 147 + None, # 148 + None, # 149 + None, # 150 + None, # 151 + None, # 152 + None, # 153 + None, # 154 + None, # 155 + None, # 156 + None, # 157 + None, # 158 + None, # 159 + None, # 160 + None, # 161 + None, # 162 + None, # 163 + None, # 164 + None, # 165 + None, # 166 + None, # 167 + None, # 168 + None, # 169 + None, # 170 + None, # 171 + None, # 172 + None, # 173 + None, # 174 + None, # 175 + None, # 176 + None, # 177 + None, # 178 + None, # 179 + None, # 180 + None, # 181 + None, # 182 + None, # 183 + None, # 184 + None, # 185 + None, # 186 + None, # 187 + None, # 188 + None, # 189 + None, # 190 + None, # 191 + None, # 192 + None, # 193 + None, # 194 + None, # 195 + None, # 196 + None, # 197 + None, # 198 + None, # 199 + None, # 200 + None, # 201 + None, # 202 + None, # 203 + None, # 204 + None, # 205 + None, # 206 + None, # 207 + None, # 208 + None, # 209 + None, # 210 + None, # 211 + None, # 212 + None, # 213 + None, # 214 + None, # 215 + None, # 216 + None, # 217 + None, # 218 + None, # 219 + None, # 220 + None, # 221 + None, # 222 + None, # 223 + None, # 224 + None, # 225 + None, # 226 + None, # 227 + None, # 228 + None, # 229 + None, # 230 + None, # 231 + None, # 232 + None, # 233 + None, # 234 + None, # 235 + None, # 236 + None, # 237 + None, # 238 + None, # 239 + None, # 240 + None, # 241 + None, # 242 + None, # 243 + None, # 244 + None, # 245 + None, # 246 + None, # 247 + None, # 248 + None, # 249 + None, # 250 + None, # 251 + None, # 252 + None, # 253 + None, # 254 + None, # 255 + None, # 256 + None, # 257 + None, # 258 + None, # 259 + None, # 260 + None, # 261 + None, # 262 + None, # 263 + None, # 264 + None, # 265 + None, # 266 + None, # 267 + None, # 268 + None, # 269 + None, # 270 + None, # 271 + None, # 272 + None, # 273 + None, # 274 + None, # 275 + None, # 276 + None, # 277 + None, # 278 + None, # 279 + None, # 280 + None, # 281 + None, # 282 + None, # 283 + None, # 284 + None, # 285 + None, # 286 + None, # 287 + None, # 288 + None, # 289 + None, # 290 + None, # 291 + None, # 292 + None, # 293 + None, # 294 + None, # 295 + None, # 296 + None, # 297 + None, # 298 + None, # 299 + None, # 300 + None, # 301 + None, # 302 + None, # 303 + None, # 304 + None, # 305 + None, # 306 + None, # 307 + None, # 308 + None, # 309 + None, # 310 + None, # 311 + None, # 312 + None, # 313 + None, # 314 + None, # 315 + None, # 316 + None, # 317 + None, # 318 + None, # 319 + None, # 320 + None, # 321 + None, # 322 + None, # 323 + None, # 324 + None, # 325 + None, # 326 + None, # 327 + None, # 328 + None, # 329 + None, # 330 + None, # 331 + None, # 332 + None, # 333 + None, # 334 + None, # 335 + None, # 336 + None, # 337 + None, # 338 + None, # 339 + None, # 340 + None, # 341 + None, # 342 + None, # 343 + None, # 344 + None, # 345 + None, # 346 + None, # 347 + None, # 348 + None, # 349 + None, # 350 + None, # 351 + None, # 352 + None, # 353 + None, # 354 + None, # 355 + None, # 356 + None, # 357 + None, # 358 + None, # 359 + None, # 360 + None, # 361 + None, # 362 + None, # 363 + None, # 364 + None, # 365 + None, # 366 + None, # 367 + None, # 368 + None, # 369 + None, # 370 + None, # 371 + None, # 372 + None, # 373 + None, # 374 + None, # 375 + None, # 376 + None, # 377 + None, # 378 + None, # 379 + None, # 380 + None, # 381 + None, # 382 + None, # 383 + None, # 384 + None, # 385 + None, # 386 + None, # 387 + None, # 388 + None, # 389 + None, # 390 + None, # 391 + None, # 392 + None, # 393 + None, # 394 + None, # 395 + None, # 396 + None, # 397 + None, # 398 + None, # 399 + None, # 400 + None, # 401 + None, # 402 + None, # 403 + None, # 404 + None, # 405 + None, # 406 + None, # 407 + None, # 408 + None, # 409 + None, # 410 + None, # 411 + None, # 412 + None, # 413 + None, # 414 + None, # 415 + None, # 416 + None, # 417 + None, # 418 + None, # 419 + None, # 420 + None, # 421 + None, # 422 + None, # 423 + None, # 424 + None, # 425 + None, # 426 + None, # 427 + None, # 428 + None, # 429 + None, # 430 + None, # 431 + None, # 432 + None, # 433 + None, # 434 + None, # 435 + None, # 436 + None, # 437 + None, # 438 + None, # 439 + None, # 440 + None, # 441 + None, # 442 + None, # 443 + None, # 444 + None, # 445 + None, # 446 + None, # 447 + None, # 448 + None, # 449 + None, # 450 + None, # 451 + None, # 452 + None, # 453 + None, # 454 + None, # 455 + None, # 456 + None, # 457 + None, # 458 + None, # 459 + None, # 460 + None, # 461 + None, # 462 + None, # 463 + None, # 464 + None, # 465 + None, # 466 + None, # 467 + None, # 468 + None, # 469 + None, # 470 + None, # 471 + None, # 472 + None, # 473 + None, # 474 + None, # 475 + None, # 476 + None, # 477 + None, # 478 + None, # 479 + None, # 480 + None, # 481 + None, # 482 + None, # 483 + None, # 484 + None, # 485 + None, # 486 + None, # 487 + None, # 488 + None, # 489 + None, # 490 + None, # 491 + None, # 492 + None, # 493 + None, # 494 + None, # 495 + None, # 496 + None, # 497 + None, # 498 + None, # 499 + None, # 500 + None, # 501 + None, # 502 + None, # 503 + None, # 504 + None, # 505 + None, # 506 + None, # 507 + None, # 508 + None, # 509 + None, # 510 + None, # 511 + None, # 512 + None, # 513 + None, # 514 + None, # 515 + None, # 516 + None, # 517 + None, # 518 + None, # 519 + None, # 520 + None, # 521 + None, # 522 + None, # 523 + None, # 524 + None, # 525 + None, # 526 + None, # 527 + None, # 528 + None, # 529 + None, # 530 + None, # 531 + None, # 532 + None, # 533 + None, # 534 + None, # 535 + None, # 536 + None, # 537 + None, # 538 + None, # 539 + None, # 540 + None, # 541 + None, # 542 + None, # 543 + None, # 544 + None, # 545 + None, # 546 + None, # 547 + None, # 548 + None, # 549 + None, # 550 + None, # 551 + None, # 552 + None, # 553 + None, # 554 + None, # 555 + None, # 556 + None, # 557 + None, # 558 + None, # 559 + None, # 560 + None, # 561 + None, # 562 + None, # 563 + None, # 564 + None, # 565 + None, # 566 + None, # 567 + None, # 568 + None, # 569 + None, # 570 + None, # 571 + None, # 572 + None, # 573 + None, # 574 + None, # 575 + None, # 576 + None, # 577 + None, # 578 + None, # 579 + None, # 580 + None, # 581 + None, # 582 + None, # 583 + None, # 584 + None, # 585 + None, # 586 + None, # 587 + None, # 588 + None, # 589 + None, # 590 + None, # 591 + None, # 592 + None, # 593 + None, # 594 + None, # 595 + None, # 596 + None, # 597 + None, # 598 + None, # 599 + None, # 600 + None, # 601 + None, # 602 + None, # 603 + None, # 604 + None, # 605 + None, # 606 + None, # 607 + None, # 608 + None, # 609 + None, # 610 + None, # 611 + None, # 612 + None, # 613 + None, # 614 + None, # 615 + None, # 616 + None, # 617 + None, # 618 + None, # 619 + None, # 620 + None, # 621 + None, # 622 + None, # 623 + None, # 624 + None, # 625 + None, # 626 + None, # 627 + None, # 628 + None, # 629 + None, # 630 + None, # 631 + None, # 632 + None, # 633 + None, # 634 + None, # 635 + None, # 636 + None, # 637 + None, # 638 + None, # 639 + None, # 640 + None, # 641 + None, # 642 + None, # 643 + None, # 644 + None, # 645 + None, # 646 + None, # 647 + None, # 648 + None, # 649 + None, # 650 + None, # 651 + None, # 652 + None, # 653 + None, # 654 + None, # 655 + None, # 656 + None, # 657 + None, # 658 + None, # 659 + None, # 660 + None, # 661 + None, # 662 + None, # 663 + None, # 664 + None, # 665 + None, # 666 + None, # 667 + None, # 668 + None, # 669 + None, # 670 + None, # 671 + None, # 672 + None, # 673 + None, # 674 + None, # 675 + None, # 676 + None, # 677 + None, # 678 + None, # 679 + None, # 680 + None, # 681 + None, # 682 + None, # 683 + None, # 684 + None, # 685 + None, # 686 + None, # 687 + None, # 688 + None, # 689 + None, # 690 + None, # 691 + None, # 692 + None, # 693 + None, # 694 + None, # 695 + None, # 696 + None, # 697 + None, # 698 + None, # 699 + None, # 700 + None, # 701 + None, # 702 + None, # 703 + None, # 704 + None, # 705 + None, # 706 + None, # 707 + None, # 708 + None, # 709 + None, # 710 + None, # 711 + None, # 712 + None, # 713 + None, # 714 + None, # 715 + None, # 716 + None, # 717 + None, # 718 + None, # 719 + None, # 720 + None, # 721 + None, # 722 + None, # 723 + None, # 724 + None, # 725 + None, # 726 + None, # 727 + None, # 728 + None, # 729 + None, # 730 + None, # 731 + None, # 732 + None, # 733 + None, # 734 + None, # 735 + None, # 736 + None, # 737 + None, # 738 + None, # 739 + None, # 740 + None, # 741 + None, # 742 + None, # 743 + None, # 744 + None, # 745 + None, # 746 + None, # 747 + None, # 748 + None, # 749 + None, # 750 + None, # 751 + None, # 752 + None, # 753 + None, # 754 + None, # 755 + None, # 756 + None, # 757 + None, # 758 + None, # 759 + None, # 760 + None, # 761 + None, # 762 + None, # 763 + None, # 764 + None, # 765 + None, # 766 + None, # 767 + None, # 768 + None, # 769 + None, # 770 + None, # 771 + None, # 772 + None, # 773 + None, # 774 + None, # 775 + None, # 776 + None, # 777 + None, # 778 + None, # 779 + None, # 780 + None, # 781 + None, # 782 + None, # 783 + None, # 784 + None, # 785 + None, # 786 + None, # 787 + None, # 788 + None, # 789 + None, # 790 + None, # 791 + None, # 792 + None, # 793 + None, # 794 + None, # 795 + None, # 796 + None, # 797 + None, # 798 + None, # 799 + None, # 800 + None, # 801 + None, # 802 + None, # 803 + None, # 804 + None, # 805 + None, # 806 + None, # 807 + None, # 808 + None, # 809 + None, # 810 + None, # 811 + None, # 812 + None, # 813 + None, # 814 + None, # 815 + None, # 816 + None, # 817 + None, # 818 + None, # 819 + None, # 820 + None, # 821 + None, # 822 + None, # 823 + None, # 824 + None, # 825 + None, # 826 + None, # 827 + None, # 828 + None, # 829 + None, # 830 + None, # 831 + None, # 832 + None, # 833 + None, # 834 + None, # 835 + None, # 836 + None, # 837 + None, # 838 + None, # 839 + None, # 840 + None, # 841 + None, # 842 + None, # 843 + None, # 844 + None, # 845 + None, # 846 + None, # 847 + None, # 848 + None, # 849 + None, # 850 + None, # 851 + None, # 852 + None, # 853 + None, # 854 + None, # 855 + None, # 856 + None, # 857 + None, # 858 + None, # 859 + None, # 860 + None, # 861 + None, # 862 + None, # 863 + None, # 864 + None, # 865 + None, # 866 + None, # 867 + None, # 868 + None, # 869 + None, # 870 + None, # 871 + None, # 872 + None, # 873 + None, # 874 + None, # 875 + None, # 876 + None, # 877 + None, # 878 + None, # 879 + None, # 880 + None, # 881 + None, # 882 + None, # 883 + None, # 884 + None, # 885 + None, # 886 + None, # 887 + None, # 888 + None, # 889 + None, # 890 + None, # 891 + None, # 892 + None, # 893 + None, # 894 + None, # 895 + None, # 896 + None, # 897 + None, # 898 + None, # 899 + None, # 900 + None, # 901 + None, # 902 + None, # 903 + None, # 904 + None, # 905 + None, # 906 + None, # 907 + None, # 908 + None, # 909 + None, # 910 + None, # 911 + None, # 912 + None, # 913 + None, # 914 + None, # 915 + None, # 916 + None, # 917 + None, # 918 + None, # 919 + None, # 920 + None, # 921 + None, # 922 + None, # 923 + None, # 924 + None, # 925 + None, # 926 + None, # 927 + None, # 928 + None, # 929 + None, # 930 + None, # 931 + None, # 932 + None, # 933 + None, # 934 + None, # 935 + None, # 936 + None, # 937 + None, # 938 + None, # 939 + None, # 940 + None, # 941 + None, # 942 + None, # 943 + None, # 944 + None, # 945 + None, # 946 + None, # 947 + None, # 948 + None, # 949 + None, # 950 + None, # 951 + None, # 952 + None, # 953 + None, # 954 + None, # 955 + None, # 956 + None, # 957 + None, # 958 + None, # 959 + None, # 960 + None, # 961 + None, # 962 + None, # 963 + None, # 964 + None, # 965 + None, # 966 + None, # 967 + None, # 968 + None, # 969 + None, # 970 + None, # 971 + None, # 972 + None, # 973 + None, # 974 + None, # 975 + None, # 976 + None, # 977 + None, # 978 + None, # 979 + None, # 980 + None, # 981 + None, # 982 + None, # 983 + None, # 984 + None, # 985 + None, # 986 + None, # 987 + None, # 988 + None, # 989 + None, # 990 + None, # 991 + None, # 992 + None, # 993 + None, # 994 + None, # 995 + None, # 996 + None, # 997 + None, # 998 + None, # 999 + None, # 1000 + None, # 1001 + None, # 1002 + None, # 1003 + None, # 1004 + None, # 1005 + None, # 1006 + None, # 1007 + None, # 1008 + None, # 1009 + None, # 1010 + None, # 1011 + None, # 1012 + None, # 1013 + None, # 1014 + None, # 1015 + None, # 1016 + None, # 1017 + None, # 1018 + None, # 1019 + None, # 1020 + None, # 1021 + None, # 1022 + None, # 1023 + None, # 1024 + None, # 1025 + None, # 1026 + None, # 1027 + None, # 1028 + None, # 1029 + None, # 1030 + None, # 1031 + None, # 1032 + None, # 1033 + None, # 1034 + None, # 1035 + None, # 1036 + None, # 1037 + None, # 1038 + None, # 1039 + None, # 1040 + None, # 1041 + None, # 1042 + None, # 1043 + None, # 1044 + None, # 1045 + None, # 1046 + None, # 1047 + None, # 1048 + None, # 1049 + None, # 1050 + None, # 1051 + None, # 1052 + None, # 1053 + None, # 1054 + None, # 1055 + None, # 1056 + None, # 1057 + None, # 1058 + None, # 1059 + None, # 1060 + None, # 1061 + None, # 1062 + None, # 1063 + None, # 1064 + None, # 1065 + None, # 1066 + None, # 1067 + None, # 1068 + None, # 1069 + None, # 1070 + None, # 1071 + None, # 1072 + None, # 1073 + None, # 1074 + None, # 1075 + None, # 1076 + None, # 1077 + None, # 1078 + None, # 1079 + None, # 1080 + None, # 1081 + None, # 1082 + None, # 1083 + None, # 1084 + None, # 1085 + None, # 1086 + None, # 1087 + None, # 1088 + None, # 1089 + None, # 1090 + None, # 1091 + None, # 1092 + None, # 1093 + None, # 1094 + None, # 1095 + None, # 1096 + None, # 1097 + None, # 1098 + None, # 1099 + None, # 1100 + None, # 1101 + None, # 1102 + None, # 1103 + None, # 1104 + None, # 1105 + None, # 1106 + None, # 1107 + None, # 1108 + None, # 1109 + None, # 1110 + None, # 1111 + None, # 1112 + None, # 1113 + None, # 1114 + None, # 1115 + None, # 1116 + None, # 1117 + None, # 1118 + None, # 1119 + None, # 1120 + None, # 1121 + None, # 1122 + None, # 1123 + None, # 1124 + None, # 1125 + None, # 1126 + None, # 1127 + None, # 1128 + None, # 1129 + None, # 1130 + None, # 1131 + None, # 1132 + None, # 1133 + None, # 1134 + None, # 1135 + None, # 1136 + None, # 1137 + None, # 1138 + None, # 1139 + None, # 1140 + None, # 1141 + None, # 1142 + None, # 1143 + None, # 1144 + None, # 1145 + None, # 1146 + None, # 1147 + None, # 1148 + None, # 1149 + None, # 1150 + None, # 1151 + None, # 1152 + None, # 1153 + None, # 1154 + None, # 1155 + None, # 1156 + None, # 1157 + None, # 1158 + None, # 1159 + None, # 1160 + None, # 1161 + None, # 1162 + None, # 1163 + None, # 1164 + None, # 1165 + None, # 1166 + None, # 1167 + None, # 1168 + None, # 1169 + None, # 1170 + None, # 1171 + None, # 1172 + None, # 1173 + None, # 1174 + None, # 1175 + None, # 1176 + None, # 1177 + None, # 1178 + None, # 1179 + None, # 1180 + None, # 1181 + None, # 1182 + None, # 1183 + None, # 1184 + None, # 1185 + None, # 1186 + None, # 1187 + None, # 1188 + None, # 1189 + None, # 1190 + None, # 1191 + None, # 1192 + None, # 1193 + None, # 1194 + None, # 1195 + None, # 1196 + None, # 1197 + None, # 1198 + None, # 1199 + None, # 1200 + None, # 1201 + None, # 1202 + None, # 1203 + None, # 1204 + None, # 1205 + None, # 1206 + None, # 1207 + None, # 1208 + None, # 1209 + None, # 1210 + None, # 1211 + None, # 1212 + None, # 1213 + None, # 1214 + None, # 1215 + None, # 1216 + None, # 1217 + None, # 1218 + None, # 1219 + None, # 1220 + None, # 1221 + None, # 1222 + None, # 1223 + None, # 1224 + None, # 1225 + None, # 1226 + None, # 1227 + None, # 1228 + None, # 1229 + None, # 1230 + None, # 1231 + None, # 1232 + None, # 1233 + None, # 1234 + None, # 1235 + None, # 1236 + None, # 1237 + None, # 1238 + None, # 1239 + None, # 1240 + None, # 1241 + None, # 1242 + None, # 1243 + None, # 1244 + None, # 1245 + None, # 1246 + None, # 1247 + None, # 1248 + None, # 1249 + None, # 1250 + None, # 1251 + None, # 1252 + None, # 1253 + None, # 1254 + None, # 1255 + None, # 1256 + None, # 1257 + None, # 1258 + None, # 1259 + None, # 1260 + None, # 1261 + None, # 1262 + None, # 1263 + None, # 1264 + None, # 1265 + None, # 1266 + None, # 1267 + None, # 1268 + None, # 1269 + None, # 1270 + None, # 1271 + None, # 1272 + None, # 1273 + None, # 1274 + None, # 1275 + None, # 1276 + None, # 1277 + None, # 1278 + None, # 1279 + None, # 1280 + (1281, TType.STRUCT, 'directResults', [TSparkDirectResults, None], None, ), # 1281 ) -all_structs.append(TCancelOperationReq) -TCancelOperationReq.thrift_spec = ( +all_structs.append(TGetOperationStatusReq) +TGetOperationStatusReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 1 - None, # 2 - None, # 3 - None, # 4 - None, # 5 - None, # 6 - None, # 7 - None, # 8 - None, # 9 - None, # 10 - None, # 11 + (2, TType.BOOL, 'getProgressUpdate', None, None, ), # 2 +) +all_structs.append(TGetOperationStatusResp) +TGetOperationStatusResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.I32, 'operationState', None, None, ), # 2 + (3, TType.STRING, 'sqlState', 'UTF8', None, ), # 3 + (4, TType.I32, 'errorCode', None, None, ), # 4 + (5, TType.STRING, 'errorMessage', 'UTF8', None, ), # 5 + (6, TType.STRING, 'taskStatus', 'UTF8', None, ), # 6 + (7, TType.I64, 'operationStarted', None, None, ), # 7 + (8, TType.I64, 'operationCompleted', None, None, ), # 8 + (9, TType.BOOL, 'hasResultSet', None, None, ), # 9 + (10, TType.STRUCT, 'progressUpdateResponse', [TProgressUpdateResp, None], None, ), # 10 + (11, TType.I64, 'numModifiedRows', None, None, ), # 11 None, # 12 None, # 13 None, # 14 @@ -85049,8 +78997,8 @@ def __ne__(self, other): None, # 1278 None, # 1279 None, # 1280 - None, # 1281 - None, # 1282 + (1281, TType.STRING, 'displayMessage', 'UTF8', None, ), # 1281 + (1282, TType.STRING, 'diagnosticInfo', 'UTF8', None, ), # 1282 None, # 1283 None, # 1284 None, # 1285 @@ -87097,16 +81045,13 @@ def __ne__(self, other): None, # 3326 None, # 3327 None, # 3328 - (3329, TType.I16, 'executionVersion', None, None, ), # 3329 - (3330, TType.BOOL, 'replacedByNextAttempt', None, None, ), # 3330 -) -all_structs.append(TCancelOperationResp) -TCancelOperationResp.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (3329, TType.STRING, 'responseValidation', 'BINARY', None, ), # 3329 + (3330, TType.I32, 'idempotencyType', None, None, ), # 3330 + (3331, TType.I64, 'statementTimeout', None, None, ), # 3331 + (3332, TType.I32, 'statementTimeoutLevel', None, None, ), # 3332 ) -all_structs.append(TCloseOperationReq) -TCloseOperationReq.thrift_spec = ( +all_structs.append(TCancelOperationReq) +TCancelOperationReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 1 None, # 2 @@ -90436,7 +84381,18 @@ def __ne__(self, other): None, # 3326 None, # 3327 None, # 3328 - (3329, TType.I32, 'closeReason', None, 0, ), # 3329 + (3329, TType.I16, 'executionVersion', None, None, ), # 3329 + (3330, TType.BOOL, 'replacedByNextAttempt', None, None, ), # 3330 +) +all_structs.append(TCancelOperationResp) +TCancelOperationResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 +) +all_structs.append(TCloseOperationReq) +TCloseOperationReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 1 ) all_structs.append(TCloseOperationResp) TCloseOperationResp.thrift_spec = ( @@ -97110,21 +91066,7 @@ def __ne__(self, other): (3329, TType.I32, 'reasonForNoCloudFetch', None, None, ), # 3329 (3330, TType.LIST, 'resultFiles', (TType.STRUCT, [TDBSqlCloudResultFile, None], False), None, ), # 3330 (3331, TType.STRING, 'manifestFile', 'UTF8', None, ), # 3331 - (3332, TType.I32, 'manifestFileFormat', None, None, ), # 3332 - (3333, TType.I64, 'cacheLookupLatency', None, None, ), # 3333 - (3334, TType.STRING, 'remoteCacheMissReason', 'UTF8', None, ), # 3334 - (3335, TType.I32, 'fetchDisposition', None, None, ), # 3335 - (3336, TType.BOOL, 'remoteResultCacheEnabled', None, None, ), # 3336 - (3337, TType.BOOL, 'isServerless', None, None, ), # 3337 - None, # 3338 - None, # 3339 - None, # 3340 - None, # 3341 - None, # 3342 - None, # 3343 - (3344, TType.STRUCT, 'resultDataFormat', [TDBSqlResultFormat, None], None, ), # 3344 - (3345, TType.BOOL, 'truncatedByThriftLimit', None, None, ), # 3345 - (3346, TType.I64, 'resultByteLimit', None, None, ), # 3346 + (3332, TType.STRING, 'manifestFileFormat', 'UTF8', None, ), # 3332 ) all_structs.append(TFetchResultsReq) TFetchResultsReq.thrift_spec = ( @@ -111771,5 +105713,50 @@ def __ne__(self, other): (5, TType.STRING, 'footerSummary', 'UTF8', None, ), # 5 (6, TType.I64, 'startTime', None, None, ), # 6 ) +all_structs.append(TDBSqlClusterMetrics) +TDBSqlClusterMetrics.thrift_spec = ( + None, # 0 + (1, TType.I32, 'clusterCapacity', None, None, ), # 1 + (2, TType.I32, 'numRunningTasks', None, None, ), # 2 + (3, TType.I32, 'numPendingTasks', None, None, ), # 3 + (4, TType.DOUBLE, 'rejectionThreshold', None, None, ), # 4 + (5, TType.DOUBLE, 'tasksCompletedPerMinute', None, None, ), # 5 +) +all_structs.append(TDBSqlQueryLaneMetrics) +TDBSqlQueryLaneMetrics.thrift_spec = ( + None, # 0 + (1, TType.I32, 'fastLaneReservation', None, None, ), # 1 + (2, TType.I32, 'numFastLaneRunningTasks', None, None, ), # 2 + (3, TType.I32, 'numFastLanePendingTasks', None, None, ), # 3 + (4, TType.I32, 'slowLaneReservation', None, None, ), # 4 + (5, TType.I32, 'numSlowLaneRunningTasks', None, None, ), # 5 + (6, TType.I32, 'numSlowLanePendingTasks', None, None, ), # 6 +) +all_structs.append(TDBSqlQueryMetrics) +TDBSqlQueryMetrics.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 2 + (3, TType.I32, 'idempotencyType', None, None, ), # 3 + (4, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 4 + (5, TType.I64, 'operationStarted', None, None, ), # 5 + (6, TType.DOUBLE, 'queryCost', None, None, ), # 6 + (7, TType.I32, 'numRunningTasks', None, None, ), # 7 + (8, TType.I32, 'numPendingTasks', None, None, ), # 8 + (9, TType.I32, 'numCompletedTasks', None, None, ), # 9 +) +all_structs.append(TDBSqlGetLoadInformationReq) +TDBSqlGetLoadInformationReq.thrift_spec = ( + None, # 0 + (1, TType.BOOL, 'includeQueryMetrics', None, False, ), # 1 +) +all_structs.append(TDBSqlGetLoadInformationResp) +TDBSqlGetLoadInformationResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.STRUCT, 'clusterMetrics', [TDBSqlClusterMetrics, None], None, ), # 2 + (3, TType.STRUCT, 'queryLaneMetrics', [TDBSqlQueryLaneMetrics, None], None, ), # 3 + (4, TType.LIST, 'queryMetrics', (TType.STRUCT, [TDBSqlQueryMetrics, None], False), None, ), # 4 +) fix_spec(all_structs) del all_structs diff --git a/src/databricks/sql/thrift_backend.py b/src/databricks/sql/thrift_backend.py index 63d3a0f0..d54b618f 100644 --- a/src/databricks/sql/thrift_backend.py +++ b/src/databricks/sql/thrift_backend.py @@ -133,11 +133,7 @@ def __init__( # (defaults to 900) # _enable_v3_retries # Whether to use the DatabricksRetryPolicy implemented in urllib3 - # (defaults to True) - # _retry_max_redirects - # An integer representing the maximum number of redirects to follow for a request. - # This number must be <= _retry_stop_after_attempts_count. - # (defaults to None) + # (defaults to False) # max_download_threads # Number of threads for handling cloud fetch downloads. Defaults to 10 @@ -145,11 +141,9 @@ def __init__( if kwargs.get("_connection_uri"): uri = kwargs.get("_connection_uri") elif server_hostname and http_path: - uri = "{host}:{port}/{path}".format( - host=server_hostname.rstrip("/"), port=port, path=http_path.lstrip("/") + uri = "https://{host}:{port}/{path}".format( + host=server_hostname, port=port, path=http_path.lstrip("/") ) - if not uri.startswith("https://"): - uri = "https://" + uri else: raise ValueError("No valid connection settings.") @@ -186,26 +180,10 @@ def __init__( self._auth_provider = auth_provider # Connector version 3 retry approach - self.enable_v3_retries = kwargs.get("_enable_v3_retries", True) - - if not self.enable_v3_retries: - logger.warning( - "Legacy retry behavior is enabled for this connection." - " This behaviour is deprecated and will be removed in a future release." - ) + self.enable_v3_retries = kwargs.get("_enable_v3_retries", False) self.force_dangerous_codes = kwargs.get("_retry_dangerous_codes", []) additional_transport_args = {} - _max_redirects: Union[None, int] = kwargs.get("_retry_max_redirects") - - if _max_redirects: - if _max_redirects > self._retry_stop_after_attempts_count: - logger.warn( - "_retry_max_redirects > _retry_stop_after_attempts_count so it will have no affect!" - ) - urllib3_kwargs = {"redirect": _max_redirects} - else: - urllib3_kwargs = {} if self.enable_v3_retries: self.retry_policy = databricks.sql.auth.thrift_http_client.DatabricksRetryPolicy( delay_min=self._retry_delay_min, @@ -214,7 +192,6 @@ def __init__( stop_after_attempts_duration=self._retry_stop_after_attempts_duration, delay_default=self._retry_delay_default, force_dangerous_codes=self.force_dangerous_codes, - urllib3_kwargs=urllib3_kwargs, ) additional_transport_args["retry_policy"] = self.retry_policy @@ -226,11 +203,9 @@ def __init__( **additional_transport_args, # type: ignore ) - # HACK! timeout = THRIFT_SOCKET_TIMEOUT or kwargs.get("_socket_timeout", DEFAULT_SOCKET_TIMEOUT) logger.info(f"Setting timeout HACK! to {timeout}") - # setTimeout defaults to 15 minutes and is expected in ms self._transport.setTimeout(timeout and (float(timeout) * 1000.0)) @@ -251,7 +226,7 @@ def __init__( def _initialize_retry_args(self, kwargs): # Configure retries & timing: use user-settings or defaults, and bound # by policy. Log.warn when given param gets restricted. - for key, (type_, default, min, max) in _retry_policy.items(): + for (key, (type_, default, min, max)) in _retry_policy.items(): given_or_default = type_(kwargs.get(key, default)) bound = _bound(min, max, given_or_default) setattr(self, key, bound) @@ -389,6 +364,7 @@ def attempt_request(attempt): error, error_message, retry_delay = None, None, None try: + this_method_name = getattr(method, "__name__") logger.debug("Sending request: {}()".format(this_method_name)) @@ -402,6 +378,9 @@ def attempt_request(attempt): response = method(request) + # Calling `close()` here releases the active HTTP connection back to the pool + self._transport.close() + # We need to call type(response) here because thrift doesn't implement __name__ attributes for thrift responses logger.debug( "Received response: {}()".format(type(response).__name__) @@ -463,10 +442,6 @@ def attempt_request(attempt): error_message = ThriftBackend._extract_error_message_from_headers( getattr(self._transport, "headers", {}) ) - finally: - # Calling `close()` here releases the active HTTP connection back to the pool - self._transport.close() - return RequestErrorInfo( error=error, error_message=error_message, @@ -566,7 +541,7 @@ def open_session(self, session_configuration, catalog, schema): response = self.make_request(self._client.OpenSession, open_session_req) self._check_initial_namespace(catalog, schema, response) self._check_protocol_version(response) - return response + return response.sessionHandle except: self._transport.close() raise @@ -623,10 +598,7 @@ def _create_arrow_table(self, t_row_set, lz4_compressed, schema_bytes, descripti num_rows, ) = convert_column_based_set_to_arrow_table(t_row_set.columns, description) elif t_row_set.arrowBatches is not None: - ( - arrow_table, - num_rows, - ) = convert_arrow_based_set_to_arrow_table( + (arrow_table, num_rows,) = convert_arrow_based_set_to_arrow_table( t_row_set.arrowBatches, lz4_compressed, schema_bytes ) else: @@ -807,8 +779,7 @@ def execute_command( max_bytes, lz4_compression, cursor, - use_cloud_fetch=True, - parameters=[], + use_cloud_fetch=False, ): assert session_handle is not None @@ -833,7 +804,6 @@ def execute_command( "spark.thriftserver.arrowBasedRowSet.timestampAsString": "false" }, useArrowNativeTypes=spark_arrow_types, - parameters=parameters, ) resp = self.make_request(self._client.ExecuteStatement, req) return self._handle_execute_response(resp, cursor) diff --git a/src/databricks/sql/types.py b/src/databricks/sql/types.py index aa11b954..b44704cd 100644 --- a/src/databricks/sql/types.py +++ b/src/databricks/sql/types.py @@ -16,9 +16,7 @@ # # Row class was taken from Apache Spark pyspark. -from typing import Any, Dict, List, Optional, Tuple, Union, TypeVar -import datetime -import decimal +from typing import Any, Dict, List, Optional, Tuple, Union class Row(tuple): diff --git a/src/databricks/sql/utils.py b/src/databricks/sql/utils.py index 7c3a014b..0aefc7a1 100644 --- a/src/databricks/sql/utils.py +++ b/src/databricks/sql/utils.py @@ -1,34 +1,24 @@ -from __future__ import annotations - -import datetime -import decimal from abc import ABC, abstractmethod -from collections import OrderedDict, namedtuple +from collections import namedtuple, OrderedDict from collections.abc import Iterable from decimal import Decimal +import datetime +import decimal from enum import Enum -from typing import Any, Dict, List, Union -import re - import lz4.frame +from typing import Dict, List, Union, Any import pyarrow -from databricks.sql import OperationalError, exc +from databricks.sql import exc, OperationalError from databricks.sql.cloudfetch.download_manager import ResultFileDownloadManager from databricks.sql.thrift_api.TCLIService.ttypes import ( - TRowSet, TSparkArrowResultLink, TSparkRowSetType, + TRowSet, ) -from databricks.sql.parameters.native import ParameterStructure, TDbsqlParameter - BIT_MASKS = [1, 2, 4, 8, 16, 32, 64, 128] -import logging - -logger = logging.getLogger(__name__) - class ResultSetQueue(ABC): @abstractmethod @@ -386,95 +376,6 @@ def inject_parameters(operation: str, parameters: Dict[str, str]): return operation % parameters -def _dbsqlparameter_names(params: List[TDbsqlParameter]) -> list[str]: - return [p.name if p.name else "" for p in params] - - -def _generate_named_interpolation_values( - params: List[TDbsqlParameter], -) -> dict[str, str]: - """Returns a dictionary of the form {name: ":name"} for each parameter in params""" - - names = _dbsqlparameter_names(params) - - return {name: f":{name}" for name in names} - - -def _may_contain_inline_positional_markers(operation: str) -> bool: - """Check for the presence of `%s` in the operation string.""" - - interpolated = operation.replace("%s", "?") - return interpolated != operation - - -def _interpolate_named_markers( - operation: str, parameters: List[TDbsqlParameter] -) -> str: - """Replace all instances of `%(param)s` in `operation` with `:param`. - - If `operation` contains no instances of `%(param)s` then the input string is returned unchanged. - - ``` - "SELECT * FROM table WHERE field = %(field)s and other_field = %(other_field)s" - ``` - - Yields - - ``` - SELECT * FROM table WHERE field = :field and other_field = :other_field - ``` - """ - - _output_operation = operation - - PYFORMAT_PARAMSTYLE_REGEX = r"%\((\w+)\)s" - pat = re.compile(PYFORMAT_PARAMSTYLE_REGEX) - NAMED_PARAMSTYLE_FMT = ":{}" - PYFORMAT_PARAMSTYLE_FMT = "%({})s" - - pyformat_markers = pat.findall(operation) - for marker in pyformat_markers: - pyformat_marker = PYFORMAT_PARAMSTYLE_FMT.format(marker) - named_marker = NAMED_PARAMSTYLE_FMT.format(marker) - _output_operation = _output_operation.replace(pyformat_marker, named_marker) - - return _output_operation - - -def transform_paramstyle( - operation: str, - parameters: List[TDbsqlParameter], - param_structure: ParameterStructure, -) -> str: - """ - Performs a Python string interpolation such that any occurence of `%(param)s` will be replaced with `:param` - - This utility function is built to assist users in the transition between the default paramstyle in - this connector prior to version 3.0.0 (`pyformat`) and the new default paramstyle (`named`). - - Args: - operation: The operation or SQL text to transform. - parameters: The parameters to use for the transformation. - - Returns: - str - """ - output = operation - if ( - param_structure == ParameterStructure.POSITIONAL - and _may_contain_inline_positional_markers(operation) - ): - logger.warning( - "It looks like this query may contain un-named query markers like `%s`" - " This format is not supported when use_inline_params=False." - " Use `?` instead or set use_inline_params=True" - ) - elif param_structure == ParameterStructure.NAMED: - output = _interpolate_named_markers(operation, parameters) - - return output - - def create_arrow_table_from_arrow_file(file_bytes: bytes, description) -> pyarrow.Table: arrow_table = convert_arrow_based_file_to_arrow_table(file_bytes) return convert_decimals_in_arrow_table(arrow_table, description) @@ -503,7 +404,7 @@ def convert_arrow_based_set_to_arrow_table(arrow_batches, lz4_compressed, schema def convert_decimals_in_arrow_table(table, description) -> pyarrow.Table: - for i, col in enumerate(table.itercolumns()): + for (i, col) in enumerate(table.itercolumns()): if description[i][1] == "decimal": decimal_col = col.to_pandas().apply( lambda v: v if v is None else Decimal(v) diff --git a/src/databricks/sqlalchemy/README.sqlalchemy.md b/src/databricks/sqlalchemy/README.sqlalchemy.md deleted file mode 100644 index 976c3455..00000000 --- a/src/databricks/sqlalchemy/README.sqlalchemy.md +++ /dev/null @@ -1,204 +0,0 @@ -## Databricks dialect for SQLALchemy 2.0 - -The Databricks dialect for SQLAlchemy serves as bridge between [SQLAlchemy](https://www.sqlalchemy.org/) and the Databricks SQL Python driver. The dialect is included with `databricks-sql-connector==3.0.0` and above. A working example demonstrating usage can be found in `examples/sqlalchemy.py`. - -## Usage with SQLAlchemy <= 2.0 -A SQLAlchemy 1.4 compatible dialect was first released in connector [version 2.4](https://github.com/databricks/databricks-sql-python/releases/tag/v2.4.0). Support for SQLAlchemy 1.4 was dropped from the dialect as part of `databricks-sql-connector==3.0.0`. To continue using the dialect with SQLAlchemy 1.x, you can use `databricks-sql-connector^2.4.0`. - - -## Installation - -To install the dialect and its dependencies: - -```shell -pip install databricks-sql-connector[sqlalchemy] -``` - -If you also plan to use `alembic` you can alternatively run: - -```shell -pip install databricks-sql-connector[alembic] -``` - -## Connection String - -Every SQLAlchemy application that connects to a database needs to use an [Engine](https://docs.sqlalchemy.org/en/20/tutorial/engine.html#tutorial-engine), which you can create by passing a connection string to `create_engine`. The connection string must include these components: - -1. Host -2. HTTP Path for a compute resource -3. API access token -4. Initial catalog for the connection -5. Initial schema for the connection - -**Note: Our dialect is built and tested on workspaces with Unity Catalog enabled. Support for the `hive_metastore` catalog is untested.** - -For example: - -```python -import os -from sqlalchemy import create_engine - -host = os.getenv("DATABRICKS_SERVER_HOSTNAME") -http_path = os.getenv("DATABRICKS_HTTP_PATH") -access_token = os.getenv("DATABRICKS_TOKEN") -catalog = os.getenv("DATABRICKS_CATALOG") -schema = os.getenv("DATABRICKS_SCHEMA") - -engine = create_engine( - f"databricks://token:{access_token}@{host}?http_path={http_path}&catalog={catalog}&schema={schema}" - ) -``` - -## Types - -The [SQLAlchemy type hierarchy](https://docs.sqlalchemy.org/en/20/core/type_basics.html) contains backend-agnostic type implementations (represented in CamelCase) and backend-specific types (represented in UPPERCASE). The majority of SQLAlchemy's [CamelCase](https://docs.sqlalchemy.org/en/20/core/type_basics.html#the-camelcase-datatypes) types are supported. This means that a SQLAlchemy application using these types should "just work" with Databricks. - -|SQLAlchemy Type|Databricks SQL Type| -|-|-| -[`BigInteger`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.BigInteger)| [`BIGINT`](https://docs.databricks.com/en/sql/language-manual/data-types/bigint-type.html) -[`LargeBinary`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.LargeBinary)| (not supported)| -[`Boolean`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Boolean)| [`BOOLEAN`](https://docs.databricks.com/en/sql/language-manual/data-types/boolean-type.html) -[`Date`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Date)| [`DATE`](https://docs.databricks.com/en/sql/language-manual/data-types/date-type.html) -[`DateTime`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.DateTime)| [`TIMESTAMP_NTZ`](https://docs.databricks.com/en/sql/language-manual/data-types/timestamp-ntz-type.html)| -[`Double`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Double)| [`DOUBLE`](https://docs.databricks.com/en/sql/language-manual/data-types/double-type.html) -[`Enum`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Enum)| (not supported)| -[`Float`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Float)| [`FLOAT`](https://docs.databricks.com/en/sql/language-manual/data-types/float-type.html) -[`Integer`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Integer)| [`INT`](https://docs.databricks.com/en/sql/language-manual/data-types/int-type.html) -[`Numeric`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Numeric)| [`DECIMAL`](https://docs.databricks.com/en/sql/language-manual/data-types/decimal-type.html)| -[`PickleType`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.PickleType)| (not supported)| -[`SmallInteger`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.SmallInteger)| [`SMALLINT`](https://docs.databricks.com/en/sql/language-manual/data-types/smallint-type.html) -[`String`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.String)| [`STRING`](https://docs.databricks.com/en/sql/language-manual/data-types/string-type.html)| -[`Text`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Text)| [`STRING`](https://docs.databricks.com/en/sql/language-manual/data-types/string-type.html)| -[`Time`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Time)| [`STRING`](https://docs.databricks.com/en/sql/language-manual/data-types/string-type.html)| -[`Unicode`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Unicode)| [`STRING`](https://docs.databricks.com/en/sql/language-manual/data-types/string-type.html)| -[`UnicodeText`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.UnicodeText)| [`STRING`](https://docs.databricks.com/en/sql/language-manual/data-types/string-type.html)| -[`Uuid`](https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.Uuid)| [`STRING`](https://docs.databricks.com/en/sql/language-manual/data-types/string-type.html) - -In addition, the dialect exposes three UPPERCASE SQLAlchemy types which are specific to Databricks: - -- [`databricks.sqlalchemy.TINYINT`](https://docs.databricks.com/en/sql/language-manual/data-types/tinyint-type.html) -- [`databricks.sqlalchemy.TIMESTAMP`](https://docs.databricks.com/en/sql/language-manual/data-types/timestamp-type.html) -- [`databricks.sqlalchemy.TIMESTAMP_NTZ`](https://docs.databricks.com/en/sql/language-manual/data-types/timestamp-ntz-type.html) - - -### `LargeBinary()` and `PickleType()` - -Databricks Runtime doesn't currently support binding of binary values in SQL queries, which is a pre-requisite for this functionality in SQLAlchemy. - -## `Enum()` and `CHECK` constraints - -Support for `CHECK` constraints is not implemented in this dialect. Support is planned for a future release. - -SQLAlchemy's `Enum()` type depends on `CHECK` constraints and is therefore not yet supported. - -### `DateTime()`, `TIMESTAMP_NTZ()`, and `TIMESTAMP()` - -Databricks Runtime provides two datetime-like types: `TIMESTAMP` which is always timezone-aware and `TIMESTAMP_NTZ` which is timezone agnostic. Both types can be imported from `databricks.sqlalchemy` and used in your models. - -The SQLAlchemy documentation indicates that `DateTime()` is not timezone-aware by default. So our dialect maps this type to `TIMESTAMP_NTZ()`. In practice, you should never need to use `TIMESTAMP_NTZ()` directly. Just use `DateTime()`. - -If you need your field to be timezone-aware, you can import `TIMESTAMP()` and use it instead. - -_Note that SQLAlchemy documentation suggests that you can declare a `DateTime()` with `timezone=True` on supported backends. However, if you do this with the Databricks dialect, the `timezone` argument will be ignored._ - -```python -from sqlalchemy import DateTime -from databricks.sqlalchemy import TIMESTAMP - -class SomeModel(Base): - some_date_without_timezone = DateTime() - some_date_with_timezone = TIMESTAMP() -``` - -### `String()`, `Text()`, `Unicode()`, and `UnicodeText()` - -Databricks Runtime doesn't support length limitations for `STRING` fields. Therefore `String()` or `String(1)` or `String(255)` will all produce identical DDL. Since `Text()`, `Unicode()`, `UnicodeText()` all use the same underlying type in Databricks SQL, they will generate equivalent DDL. - -### `Time()` - -Databricks Runtime doesn't have a native time-like data type. To implement this type in SQLAlchemy, our dialect stores SQLAlchemy `Time()` values in a `STRING` field. Unlike `DateTime` above, this type can optionally support timezone awareness (since the dialect is in complete control of the strings that we write to the Delta table). - -```python -from sqlalchemy import Time - -class SomeModel(Base): - time_tz = Time(timezone=True) - time_ntz = Time() -``` - - -# Usage Notes - -## `Identity()` and `autoincrement` - -Identity and generated value support is currently limited in this dialect. - -When defining models, SQLAlchemy types can accept an [`autoincrement`](https://docs.sqlalchemy.org/en/20/core/metadata.html#sqlalchemy.schema.Column.params.autoincrement) argument. In our dialect, this argument is currently ignored. To create an auto-incrementing field in your model you can pass in an explicit [`Identity()`](https://docs.sqlalchemy.org/en/20/core/defaults.html#identity-ddl) instead. - -Furthermore, in Databricks Runtime, only `BIGINT` fields can be configured to auto-increment. So in SQLAlchemy, you must use the `BigInteger()` type. - -```python -from sqlalchemy import Identity, String - -class SomeModel(Base): - id = BigInteger(Identity()) - value = String() -``` - -When calling `Base.metadata.create_all()`, the executed DDL will include `GENERATED ALWAYS AS IDENTITY` for the `id` column. This is useful when using SQLAlchemy to generate tables. However, as of this writing, `Identity()` constructs are not captured when SQLAlchemy reflects a table's metadata (support for this is planned). - -## Parameters - -`databricks-sql-connector` supports two approaches to parameterizing SQL queries: native and inline. Our SQLAlchemy 2.0 dialect always uses the native approach and is therefore limited to DBR 14.2 and above. If you are writing parameterized queries to be executed by SQLAlchemy, you must use the "named" paramstyle (`:param`). Read more about parameterization in `docs/parameters.md`. - -## Usage with pandas - -Use [`pandas.DataFrame.to_sql`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html) and [`pandas.read_sql`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sql.html#pandas.read_sql) to write and read from Databricks SQL. These methods both accept a SQLAlchemy connection to interact with Databricks. - -### Read from Databricks SQL into pandas -```python -from sqlalchemy import create_engine -import pandas as pd - -engine = create_engine("databricks://token:dapi***@***.cloud.databricks.com?http_path=***&catalog=main&schema=test") -with engine.connect() as conn: - # This will read the contents of `main.test.some_table` - df = pd.read_sql("some_table", conn) -``` - -### Write to Databricks SQL from pandas - -```python -from sqlalchemy import create_engine -import pandas as pd - -engine = create_engine("databricks://token:dapi***@***.cloud.databricks.com?http_path=***&catalog=main&schema=test") -squares = [(i, i * i) for i in range(100)] -df = pd.DataFrame(data=squares,columns=['x','x_squared']) - -with engine.connect() as conn: - # This will write the contents of `df` to `main.test.squares` - df.to_sql('squares',conn) -``` - -## [`PrimaryKey()`](https://docs.sqlalchemy.org/en/20/core/constraints.html#sqlalchemy.schema.PrimaryKeyConstraint) and [`ForeignKey()`](https://docs.sqlalchemy.org/en/20/core/constraints.html#defining-foreign-keys) - -Unity Catalog workspaces in Databricks support PRIMARY KEY and FOREIGN KEY constraints. _Note that Databricks Runtime does not enforce the integrity of FOREIGN KEY constraints_. You can establish a primary key by setting `primary_key=True` when defining a column. - -When building `ForeignKey` or `ForeignKeyConstraint` objects, you must specify a `name` for the constraint. - -If your model definition requires a self-referential FOREIGN KEY constraint, you must include `use_alter=True` when defining the relationship. - -```python -from sqlalchemy import Table, Column, ForeignKey, BigInteger, String - -users = Table( - "users", - metadata_obj, - Column("id", BigInteger, primary_key=True), - Column("name", String(), nullable=False), - Column("email", String()), - Column("manager_id", ForeignKey("users.id", name="fk_users_manager_id_x_users_id", use_alter=True)) -) -``` - diff --git a/src/databricks/sqlalchemy/README.tests.md b/src/databricks/sqlalchemy/README.tests.md deleted file mode 100644 index d005daa3..00000000 --- a/src/databricks/sqlalchemy/README.tests.md +++ /dev/null @@ -1,44 +0,0 @@ -## SQLAlchemy Dialect Compliance Test Suite with Databricks - -The contents of the `test/` directory follow the SQLAlchemy developers' [guidance] for running the reusable dialect compliance test suite. Since not every test in the suite is applicable to every dialect, two options are provided to skip tests: - -- Any test can be skipped by subclassing its parent class, re-declaring the test-case and adding a `pytest.mark.skip` directive. -- Any test that is decorated with a `@requires` decorator can be skipped by marking the indicated requirement as `.closed()` in `requirements.py` - -We prefer to skip test cases directly with the first method wherever possible. We only mark requirements as `closed()` if there is no easier option to avoid a test failure. This principally occurs in test cases where the same test in the suite is parametrized, and some parameter combinations are conditionally skipped depending on `requirements.py`. If we skip the entire test method, then we skip _all_ permutations, not just the combinations we don't support. - -## Regression, Unsupported, and Future test cases - -We maintain three files of test cases that we import from the SQLAlchemy source code: - -* **`_regression.py`** contains all the tests cases with tests that we expect to pass for our dialect. Each one is marked with `pytest.mark.reiewed` to indicate that we've evaluated it for relevance. This file only contains base class declarations. -* **`_unsupported.py`** contains test cases that fail because of missing features in Databricks. We mark them as skipped with a `SkipReason` enumeration. If Databricks comes to support these features, those test or entire classes can be moved to `_regression.py`. -* **`_future.py`** contains test cases that fail because of missing features in the dialect itself, but which _are_ supported by Databricks generally. We mark them as skipped with a `FutureFeature` enumeration. These are features that have not been prioritised or that do not violate our acceptance criteria. All of these test cases will eventually move to either `_regression.py`. - -In some cases, only certain tests in class should be skipped with a `SkipReason` or `FutureFeature` justification. In those cases, we import the class into `_regression.py`, then import it from there into one or both of `_future.py` and `_unsupported.py`. If a class needs to be "touched" by regression, unsupported, and future, the class will be imported in that order. If an entire class should be skipped, then we do not import it into `_regression.py` at all. - -We maintain `_extra.py` with test cases that depend on SQLAlchemy's reusable dialect test fixtures but which are specific to Databricks (e.g TinyIntegerTest). - -## Running the reusable dialect tests - -``` -poetry shell -cd src/databricks/sqlalchemy/test -python -m pytest test_suite.py --dburi \ - "databricks://token:$access_token@$host?http_path=$http_path&catalog=$catalog&schema=$schema" -``` - -Whatever schema you pass in the `dburi` argument should be empty. Some tests also require the presence of an empty schema named `test_schema`. Note that we plan to implement our own `provision.py` which SQLAlchemy can automatically use to create an empty schema for testing. But for now this is a manual process. - -You can run only reviewed tests by appending `-m "reviewed"` to the test runner invocation. - -You can run only the unreviewed tests by appending `-m "not reviewed"` instead. - -Note that because these tests depend on SQLAlchemy's custom pytest plugin, they are not discoverable by IDE-based test runners like VSCode or PyCharm and must be invoked from a CLI. - -## Running local unit and e2e tests - -Apart from the SQLAlchemy reusable suite, we maintain our own unit and e2e tests under the `test_local/` directory. These can be invoked from a VSCode or Pycharm since they don't depend on a custom pytest plugin. Due to pytest's lookup order, the `pytest.ini` which is required for running the reusable dialect tests, also conflicts with VSCode and Pycharm's default pytest implementation and overrides the settings in `pyproject.toml`. So to run these tests, you can delete or rename `pytest.ini`. - - -[guidance]: "https://github.com/sqlalchemy/sqlalchemy/blob/rel_2_0_22/README.dialects.rst" \ No newline at end of file diff --git a/src/databricks/sqlalchemy/__init__.py b/src/databricks/sqlalchemy/__init__.py index 2a17ac3e..1df1e1d4 100644 --- a/src/databricks/sqlalchemy/__init__.py +++ b/src/databricks/sqlalchemy/__init__.py @@ -1,4 +1 @@ -from databricks.sqlalchemy.base import DatabricksDialect -from databricks.sqlalchemy._types import TINYINT, TIMESTAMP, TIMESTAMP_NTZ - -__all__ = ["TINYINT", "TIMESTAMP", "TIMESTAMP_NTZ"] +from databricks.sqlalchemy.dialect import DatabricksDialect diff --git a/src/databricks/sqlalchemy/_ddl.py b/src/databricks/sqlalchemy/_ddl.py deleted file mode 100644 index 667d46da..00000000 --- a/src/databricks/sqlalchemy/_ddl.py +++ /dev/null @@ -1,98 +0,0 @@ -import re -from sqlalchemy.sql import compiler, sqltypes -import logging - -logger = logging.getLogger(__name__) - - -class DatabricksIdentifierPreparer(compiler.IdentifierPreparer): - """https://docs.databricks.com/en/sql/language-manual/sql-ref-identifiers.html""" - - legal_characters = re.compile(r"^[A-Z0-9_]+$", re.I) - - def __init__(self, dialect): - super().__init__(dialect, initial_quote="`") - - -class DatabricksDDLCompiler(compiler.DDLCompiler): - def post_create_table(self, table): - post = " USING DELTA" - if table.comment: - comment = self.sql_compiler.render_literal_value( - table.comment, sqltypes.String() - ) - post += " COMMENT " + comment - return post - - def visit_unique_constraint(self, constraint, **kw): - logger.warning("Databricks does not support unique constraints") - pass - - def visit_check_constraint(self, constraint, **kw): - logger.warning("This dialect does not support check constraints") - pass - - def visit_identity_column(self, identity, **kw): - """When configuring an Identity() with Databricks, only the always option is supported. - All other options are ignored. - - Note: IDENTITY columns must always be defined as BIGINT. An exception will be raised if INT is used. - - https://www.databricks.com/blog/2022/08/08/identity-columns-to-generate-surrogate-keys-are-now-available-in-a-lakehouse-near-you.html - """ - text = "GENERATED %s AS IDENTITY" % ( - "ALWAYS" if identity.always else "BY DEFAULT", - ) - return text - - def visit_set_column_comment(self, create, **kw): - return "ALTER TABLE %s ALTER COLUMN %s COMMENT %s" % ( - self.preparer.format_table(create.element.table), - self.preparer.format_column(create.element), - self.sql_compiler.render_literal_value( - create.element.comment, sqltypes.String() - ), - ) - - def visit_drop_column_comment(self, create, **kw): - return "ALTER TABLE %s ALTER COLUMN %s COMMENT ''" % ( - self.preparer.format_table(create.element.table), - self.preparer.format_column(create.element), - ) - - def get_column_specification(self, column, **kwargs): - """ - Emit a log message if a user attempts to set autoincrement=True on a column. - See comments in test_suite.py. We may implement implicit IDENTITY using this - feature in the future, similar to the Microsoft SQL Server dialect. - """ - if column is column.table._autoincrement_column or column.autoincrement is True: - logger.warning( - "Databricks dialect ignores SQLAlchemy's autoincrement semantics. Use explicit Identity() instead." - ) - - colspec = super().get_column_specification(column, **kwargs) - if column.comment is not None: - literal = self.sql_compiler.render_literal_value( - column.comment, sqltypes.STRINGTYPE - ) - colspec += " COMMENT " + literal - - return colspec - - -class DatabricksStatementCompiler(compiler.SQLCompiler): - def limit_clause(self, select, **kw): - """Identical to the default implementation of SQLCompiler.limit_clause except it writes LIMIT ALL instead of LIMIT -1, - since Databricks SQL doesn't support the latter. - - https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-qry-select-limit.html - """ - text = "" - if select._limit_clause is not None: - text += "\n LIMIT " + self.process(select._limit_clause, **kw) - if select._offset_clause is not None: - if select._limit_clause is None: - text += "\n LIMIT ALL" - text += " OFFSET " + self.process(select._offset_clause, **kw) - return text diff --git a/src/databricks/sqlalchemy/_parse.py b/src/databricks/sqlalchemy/_parse.py deleted file mode 100644 index 6d38e1e6..00000000 --- a/src/databricks/sqlalchemy/_parse.py +++ /dev/null @@ -1,385 +0,0 @@ -from typing import List, Optional, Dict -import re - -import sqlalchemy -from sqlalchemy.engine import CursorResult -from sqlalchemy.engine.interfaces import ReflectedColumn - -from databricks.sqlalchemy import _types as type_overrides - -""" -This module contains helper functions that can parse the contents -of metadata and exceptions received from DBR. These are mostly just -wrappers around regexes. -""" - - -class DatabricksSqlAlchemyParseException(Exception): - pass - - -def _match_table_not_found_string(message: str) -> bool: - """Return True if the message contains a substring indicating that a table was not found""" - - DBR_LTE_12_NOT_FOUND_STRING = "Table or view not found" - DBR_GT_12_NOT_FOUND_STRING = "TABLE_OR_VIEW_NOT_FOUND" - return any( - [ - DBR_LTE_12_NOT_FOUND_STRING in message, - DBR_GT_12_NOT_FOUND_STRING in message, - ] - ) - - -def _describe_table_extended_result_to_dict_list( - result: CursorResult, -) -> List[Dict[str, str]]: - """Transform the CursorResult of DESCRIBE TABLE EXTENDED into a list of Dictionaries""" - - rows_to_return = [] - for row in result.all(): - this_row = {"col_name": row.col_name, "data_type": row.data_type} - rows_to_return.append(this_row) - - return rows_to_return - - -def extract_identifiers_from_string(input_str: str) -> List[str]: - """For a string input resembling (`a`, `b`, `c`) return a list of identifiers ['a', 'b', 'c']""" - - # This matches the valid character list contained in DatabricksIdentifierPreparer - pattern = re.compile(r"`([A-Za-z0-9_]+)`") - matches = pattern.findall(input_str) - return [i for i in matches] - - -def extract_identifier_groups_from_string(input_str: str) -> List[str]: - """For a string input resembling : - - FOREIGN KEY (`pname`, `pid`, `pattr`) REFERENCES `main`.`pysql_sqlalchemy`.`tb1` (`name`, `id`, `attr`) - - Return ['(`pname`, `pid`, `pattr`)', '(`name`, `id`, `attr`)'] - """ - pattern = re.compile(r"\([`A-Za-z0-9_,\s]*\)") - matches = pattern.findall(input_str) - return [i for i in matches] - - -def extract_three_level_identifier_from_constraint_string(input_str: str) -> dict: - """For a string input resembling : - FOREIGN KEY (`parent_user_id`) REFERENCES `main`.`pysql_dialect_compliance`.`users` (`user_id`) - - Return a dict like - { - "catalog": "main", - "schema": "pysql_dialect_compliance", - "table": "users" - } - - Raise a DatabricksSqlAlchemyParseException if a 3L namespace isn't found - """ - pat = re.compile(r"REFERENCES\s+(.*?)\s*\(") - matches = pat.findall(input_str) - - if not matches: - raise DatabricksSqlAlchemyParseException( - "3L namespace not found in constraint string" - ) - - first_match = matches[0] - parts = first_match.split(".") - - def strip_backticks(input: str): - return input.replace("`", "") - - try: - return { - "catalog": strip_backticks(parts[0]), - "schema": strip_backticks(parts[1]), - "table": strip_backticks(parts[2]), - } - except IndexError: - raise DatabricksSqlAlchemyParseException( - "Incomplete 3L namespace found in constraint string: " + ".".join(parts) - ) - - -def _parse_fk_from_constraint_string(constraint_str: str) -> dict: - """Build a dictionary of foreign key constraint information from a constraint string. - - For example: - - ``` - FOREIGN KEY (`pname`, `pid`, `pattr`) REFERENCES `main`.`pysql_dialect_compliance`.`tb1` (`name`, `id`, `attr`) - ``` - - Return a dictionary like: - - ``` - { - "constrained_columns": ["pname", "pid", "pattr"], - "referred_table": "tb1", - "referred_schema": "pysql_dialect_compliance", - "referred_columns": ["name", "id", "attr"] - } - ``` - - Note that the constraint name doesn't appear in the constraint string so it will not - be present in the output of this function. - """ - - referred_table_dict = extract_three_level_identifier_from_constraint_string( - constraint_str - ) - referred_table = referred_table_dict["table"] - referred_schema = referred_table_dict["schema"] - - # _extracted is a tuple of two lists of identifiers - # we assume the first immediately follows "FOREIGN KEY" and the second - # immediately follows REFERENCES $tableName - _extracted = extract_identifier_groups_from_string(constraint_str) - constrained_columns_str, referred_columns_str = ( - _extracted[0], - _extracted[1], - ) - - constrained_columns = extract_identifiers_from_string(constrained_columns_str) - referred_columns = extract_identifiers_from_string(referred_columns_str) - - return { - "constrained_columns": constrained_columns, - "referred_table": referred_table, - "referred_columns": referred_columns, - "referred_schema": referred_schema, - } - - -def build_fk_dict( - fk_name: str, fk_constraint_string: str, schema_name: Optional[str] -) -> dict: - """ - Given a foriegn key name and a foreign key constraint string, return a dictionary - with the following keys: - - name - the name of the foreign key constraint - constrained_columns - a list of column names that make up the foreign key - referred_table - the name of the table that the foreign key references - referred_columns - a list of column names that are referenced by the foreign key - referred_schema - the name of the schema that the foreign key references. - - referred schema will be None if the schema_name argument is None. - This is required by SQLAlchey's ComponentReflectionTest::test_get_foreign_keys - """ - - # The foreign key name is not contained in the constraint string so we - # need to add it manually - base_fk_dict = _parse_fk_from_constraint_string(fk_constraint_string) - - if not schema_name: - schema_override_dict = dict(referred_schema=None) - else: - schema_override_dict = {} - - # mypy doesn't like this method of conditionally adding a key to a dictionary - # while keeping everything immutable - complete_foreign_key_dict = { - "name": fk_name, - **base_fk_dict, - **schema_override_dict, # type: ignore - } - - return complete_foreign_key_dict - - -def _parse_pk_columns_from_constraint_string(constraint_str: str) -> List[str]: - """Build a list of constrained columns from a constraint string returned by DESCRIBE TABLE EXTENDED - - For example: - - PRIMARY KEY (`id`, `name`, `email_address`) - - Returns a list like - - ["id", "name", "email_address"] - """ - - _extracted = extract_identifiers_from_string(constraint_str) - - return _extracted - - -def build_pk_dict(pk_name: str, pk_constraint_string: str) -> dict: - """Given a primary key name and a primary key constraint string, return a dictionary - with the following keys: - - constrained_columns - A list of string column names that make up the primary key - - name - The name of the primary key constraint - """ - - constrained_columns = _parse_pk_columns_from_constraint_string(pk_constraint_string) - - return {"constrained_columns": constrained_columns, "name": pk_name} - - -def match_dte_rows_by_value(dte_output: List[Dict[str, str]], match: str) -> List[dict]: - """Return a list of dictionaries containing only the col_name:data_type pairs where the `data_type` - value contains the match argument. - - Today, DESCRIBE TABLE EXTENDED doesn't give a deterministic name to the fields - a constraint will be found in its output. So we cycle through its output looking - for a match. This is brittle. We could optionally make two roundtrips: the first - would query information_schema for the name of the constraint on this table, and - a second to DESCRIBE TABLE EXTENDED, at which point we would know the name of the - constraint. But for now we instead assume that Python list comprehension is faster - than a network roundtrip - """ - - output_rows = [] - - for row_dict in dte_output: - if match in row_dict["data_type"]: - output_rows.append(row_dict) - - return output_rows - - -def match_dte_rows_by_key(dte_output: List[Dict[str, str]], match: str) -> List[dict]: - """Return a list of dictionaries containing only the col_name:data_type pairs where the `col_name` - value contains the match argument. - """ - - output_rows = [] - - for row_dict in dte_output: - if match in row_dict["col_name"]: - output_rows.append(row_dict) - - return output_rows - - -def get_fk_strings_from_dte_output(dte_output: List[Dict[str, str]]) -> List[dict]: - """If the DESCRIBE TABLE EXTENDED output contains foreign key constraints, return a list of dictionaries, - one dictionary per defined constraint - """ - - output = match_dte_rows_by_value(dte_output, "FOREIGN KEY") - - return output - - -def get_pk_strings_from_dte_output( - dte_output: List[Dict[str, str]] -) -> Optional[List[dict]]: - """If the DESCRIBE TABLE EXTENDED output contains primary key constraints, return a list of dictionaries, - one dictionary per defined constraint. - - Returns None if no primary key constraints are found. - """ - - output = match_dte_rows_by_value(dte_output, "PRIMARY KEY") - - return output - - -def get_comment_from_dte_output(dte_output: List[Dict[str, str]]) -> Optional[str]: - """Returns the value of the first "Comment" col_name data in dte_output""" - output = match_dte_rows_by_key(dte_output, "Comment") - if not output: - return None - else: - return output[0]["data_type"] - - -# The keys of this dictionary are the values we expect to see in a -# TGetColumnsRequest's .TYPE_NAME attribute. -# These are enumerated in ttypes.py as class TTypeId. -# TODO: confirm that all types in TTypeId are included here. -GET_COLUMNS_TYPE_MAP = { - "boolean": sqlalchemy.types.Boolean, - "smallint": sqlalchemy.types.SmallInteger, - "tinyint": type_overrides.TINYINT, - "int": sqlalchemy.types.Integer, - "bigint": sqlalchemy.types.BigInteger, - "float": sqlalchemy.types.Float, - "double": sqlalchemy.types.Float, - "string": sqlalchemy.types.String, - "varchar": sqlalchemy.types.String, - "char": sqlalchemy.types.String, - "binary": sqlalchemy.types.String, - "array": sqlalchemy.types.String, - "map": sqlalchemy.types.String, - "struct": sqlalchemy.types.String, - "uniontype": sqlalchemy.types.String, - "decimal": sqlalchemy.types.Numeric, - "timestamp": type_overrides.TIMESTAMP, - "timestamp_ntz": type_overrides.TIMESTAMP_NTZ, - "date": sqlalchemy.types.Date, -} - - -def parse_numeric_type_precision_and_scale(type_name_str): - """Return an intantiated sqlalchemy Numeric() type that preserves the precision and scale indicated - in the output from TGetColumnsRequest. - - type_name_str - The value of TGetColumnsReq.TYPE_NAME. - - If type_name_str is "DECIMAL(18,5) returns sqlalchemy.types.Numeric(18,5) - """ - - pattern = re.compile(r"DECIMAL\((\d+,\d+)\)") - match = re.search(pattern, type_name_str) - precision_and_scale = match.group(1) - precision, scale = tuple(precision_and_scale.split(",")) - - return sqlalchemy.types.Numeric(int(precision), int(scale)) - - -def parse_column_info_from_tgetcolumnsresponse(thrift_resp_row) -> ReflectedColumn: - """Returns a dictionary of the ReflectedColumn schema parsed from - a single of the result of a TGetColumnsRequest thrift RPC - """ - - pat = re.compile(r"^\w+") - - # This method assumes a valid TYPE_NAME field in the response. - # TODO: add error handling in case TGetColumnsResponse format changes - - _raw_col_type = re.search(pat, thrift_resp_row.TYPE_NAME).group(0).lower() # type: ignore - _col_type = GET_COLUMNS_TYPE_MAP[_raw_col_type] - - if _raw_col_type == "decimal": - final_col_type = parse_numeric_type_precision_and_scale( - thrift_resp_row.TYPE_NAME - ) - else: - final_col_type = _col_type - - # See comments about autoincrement in test_suite.py - # Since Databricks SQL doesn't currently support inline AUTOINCREMENT declarations - # the autoincrement must be manually declared with an Identity() construct in SQLAlchemy - # Other dialects can perform this extra Identity() step automatically. But that is not - # implemented in the Databricks dialect right now. So autoincrement is currently always False. - # It's not clear what IS_AUTO_INCREMENT in the thrift response actually reflects or whether - # it ever returns a `YES`. - - # Per the guidance in SQLAlchemy's docstrings, we prefer to not even include an autoincrement - # key in this dictionary. - this_column = { - "name": thrift_resp_row.COLUMN_NAME, - "type": final_col_type, - "nullable": bool(thrift_resp_row.NULLABLE), - "default": thrift_resp_row.COLUMN_DEF, - "comment": thrift_resp_row.REMARKS or None, - } - - # TODO: figure out how to return sqlalchemy.interfaces in a way that mypy respects - return this_column # type: ignore diff --git a/src/databricks/sqlalchemy/_types.py b/src/databricks/sqlalchemy/_types.py deleted file mode 100644 index 5fc14a70..00000000 --- a/src/databricks/sqlalchemy/_types.py +++ /dev/null @@ -1,323 +0,0 @@ -from datetime import datetime, time, timezone -from itertools import product -from typing import Any, Union, Optional - -import sqlalchemy -from sqlalchemy.engine.interfaces import Dialect -from sqlalchemy.ext.compiler import compiles - -from databricks.sql.utils import ParamEscaper - - -def process_literal_param_hack(value: Any): - """This method is supposed to accept a Python type and return a string representation of that type. - But due to some weirdness in the way SQLAlchemy's literal rendering works, we have to return - the value itself because, by the time it reaches our custom type code, it's already been converted - into a string. - - TimeTest - DateTimeTest - DateTimeTZTest - - This dynamic only seems to affect the literal rendering of datetime and time objects. - - All fail without this hack in-place. I'm not sure why. But it works. - """ - return value - - -@compiles(sqlalchemy.types.Enum, "databricks") -@compiles(sqlalchemy.types.String, "databricks") -@compiles(sqlalchemy.types.Text, "databricks") -@compiles(sqlalchemy.types.Time, "databricks") -@compiles(sqlalchemy.types.Unicode, "databricks") -@compiles(sqlalchemy.types.UnicodeText, "databricks") -@compiles(sqlalchemy.types.Uuid, "databricks") -def compile_string_databricks(type_, compiler, **kw): - """ - We override the default compilation for Enum(), String(), Text(), and Time() because SQLAlchemy - defaults to incompatible / abnormal compiled names - - Enum -> VARCHAR - String -> VARCHAR[LENGTH] - Text -> VARCHAR[LENGTH] - Time -> TIME - Unicode -> VARCHAR[LENGTH] - UnicodeText -> TEXT - Uuid -> CHAR[32] - - But all of these types will be compiled to STRING in Databricks SQL - """ - return "STRING" - - -@compiles(sqlalchemy.types.Integer, "databricks") -def compile_integer_databricks(type_, compiler, **kw): - """ - We need to override the default Integer compilation rendering because Databricks uses "INT" instead of "INTEGER" - """ - return "INT" - - -@compiles(sqlalchemy.types.LargeBinary, "databricks") -def compile_binary_databricks(type_, compiler, **kw): - """ - We need to override the default LargeBinary compilation rendering because Databricks uses "BINARY" instead of "BLOB" - """ - return "BINARY" - - -@compiles(sqlalchemy.types.Numeric, "databricks") -def compile_numeric_databricks(type_, compiler, **kw): - """ - We need to override the default Numeric compilation rendering because Databricks uses "DECIMAL" instead of "NUMERIC" - - The built-in visit_DECIMAL behaviour captures the precision and scale. Here we're just mapping calls to compile Numeric - to the SQLAlchemy Decimal() implementation - """ - return compiler.visit_DECIMAL(type_, **kw) - - -@compiles(sqlalchemy.types.DateTime, "databricks") -def compile_datetime_databricks(type_, compiler, **kw): - """ - We need to override the default DateTime compilation rendering because Databricks uses "TIMESTAMP_NTZ" instead of "DATETIME" - """ - return "TIMESTAMP_NTZ" - - -@compiles(sqlalchemy.types.ARRAY, "databricks") -def compile_array_databricks(type_, compiler, **kw): - """ - SQLAlchemy's default ARRAY can't compile as it's only implemented for Postgresql. - The Postgres implementation works for Databricks SQL, so we duplicate that here. - - :type_: - This is an instance of sqlalchemy.types.ARRAY which always includes an item_type attribute - which is itself an instance of TypeEngine - - https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.ARRAY - """ - - inner = compiler.process(type_.item_type, **kw) - - return f"ARRAY<{inner}>" - - -class TIMESTAMP_NTZ(sqlalchemy.types.TypeDecorator): - """Represents values comprising values of fields year, month, day, hour, minute, and second. - All operations are performed without taking any time zone into account. - - Our dialect maps sqlalchemy.types.DateTime() to this type, which means that all DateTime() - objects are stored without tzinfo. To read and write timezone-aware datetimes use - databricks.sql.TIMESTAMP instead. - - https://docs.databricks.com/en/sql/language-manual/data-types/timestamp-ntz-type.html - """ - - impl = sqlalchemy.types.DateTime - - cache_ok = True - - def process_result_value(self, value: Union[None, datetime], dialect): - if value is None: - return None - return value.replace(tzinfo=None) - - -class TIMESTAMP(sqlalchemy.types.TypeDecorator): - """Represents values comprising values of fields year, month, day, hour, minute, and second, - with the session local time-zone. - - Our dialect maps sqlalchemy.types.DateTime() to TIMESTAMP_NTZ, which means that all DateTime() - objects are stored without tzinfo. To read and write timezone-aware datetimes use - this type instead. - - ```python - # This won't work - `Column(sqlalchemy.DateTime(timezone=True))` - - # But this does - `Column(TIMESTAMP)` - ```` - - https://docs.databricks.com/en/sql/language-manual/data-types/timestamp-type.html - """ - - impl = sqlalchemy.types.DateTime - - cache_ok = True - - def process_result_value(self, value: Union[None, datetime], dialect): - if value is None: - return None - - if not value.tzinfo: - return value.replace(tzinfo=timezone.utc) - return value - - def process_bind_param( - self, value: Union[datetime, None], dialect - ) -> Optional[datetime]: - """pysql can pass datetime.datetime() objects directly to DBR""" - return value - - def process_literal_param( - self, value: Union[datetime, None], dialect: Dialect - ) -> str: - """ """ - return process_literal_param_hack(value) - - -@compiles(TIMESTAMP, "databricks") -def compile_timestamp_databricks(type_, compiler, **kw): - """ - We need to override the default DateTime compilation rendering because Databricks uses "TIMESTAMP_NTZ" instead of "DATETIME" - """ - return "TIMESTAMP" - - -class DatabricksTimeType(sqlalchemy.types.TypeDecorator): - """Databricks has no native TIME type. So we store it as a string.""" - - impl = sqlalchemy.types.Time - cache_ok = True - - BASE_FMT = "%H:%M:%S" - MICROSEC_PART = ".%f" - TIMEZONE_PART = "%z" - - def _generate_fmt_string(self, ms: bool, tz: bool) -> str: - """Return a format string for datetime.strptime() that includes or excludes microseconds and timezone.""" - _ = lambda x, y: x if y else "" - return f"{self.BASE_FMT}{_(self.MICROSEC_PART,ms)}{_(self.TIMEZONE_PART,tz)}" - - @property - def allowed_fmt_strings(self): - """Time strings can be read with or without microseconds and with or without a timezone.""" - - if not hasattr(self, "_allowed_fmt_strings"): - ms_switch = tz_switch = [True, False] - self._allowed_fmt_strings = [ - self._generate_fmt_string(x, y) - for x, y in product(ms_switch, tz_switch) - ] - - return self._allowed_fmt_strings - - def _parse_result_string(self, value: str) -> time: - """Parse a string into a time object. Try all allowed formats until one works.""" - for fmt in self.allowed_fmt_strings: - try: - # We use timetz() here because we want to preserve the timezone information - # Calling .time() will strip the timezone information - return datetime.strptime(value, fmt).timetz() - except ValueError: - pass - - raise ValueError(f"Could not parse time string {value}") - - def _determine_fmt_string(self, value: time) -> str: - """Determine which format string to use to render a time object as a string.""" - ms_bool = value.microsecond > 0 - tz_bool = value.tzinfo is not None - return self._generate_fmt_string(ms_bool, tz_bool) - - def process_bind_param(self, value: Union[time, None], dialect) -> Union[None, str]: - """Values sent to the database are converted to %:H:%M:%S strings.""" - if value is None: - return None - fmt_string = self._determine_fmt_string(value) - return value.strftime(fmt_string) - - # mypy doesn't like this workaround because TypeEngine wants process_literal_param to return a string - def process_literal_param(self, value, dialect) -> time: # type: ignore - """ """ - return process_literal_param_hack(value) - - def process_result_value( - self, value: Union[None, str], dialect - ) -> Union[time, None]: - """Values received from the database are parsed into datetime.time() objects""" - if value is None: - return None - - return self._parse_result_string(value) - - -class DatabricksStringType(sqlalchemy.types.TypeDecorator): - """We have to implement our own String() type because SQLAlchemy's default implementation - wants to escape single-quotes with a doubled single-quote. Databricks uses a backslash for - escaping of literal strings. And SQLAlchemy's default escaping breaks Databricks SQL. - """ - - impl = sqlalchemy.types.String - cache_ok = True - pe = ParamEscaper() - - def process_literal_param(self, value, dialect) -> str: - """SQLAlchemy's default string escaping for backslashes doesn't work for databricks. The logic here - implements the same logic as our legacy inline escaping logic. - """ - - return self.pe.escape_string(value) - - def literal_processor(self, dialect): - """We manually override this method to prevent further processing of the string literal beyond - what happens in the process_literal_param() method. - - The SQLAlchemy docs _specifically_ say to not override this method. - - It appears that any processing that happens from TypeEngine.process_literal_param happens _before_ - and _in addition to_ whatever the class's impl.literal_processor() method does. The String.literal_processor() - method performs a string replacement that doubles any single-quote in the contained string. This raises a syntax - error in Databricks. And it's not necessary because ParamEscaper() already implements all the escaping we need. - - We should consider opening an issue on the SQLAlchemy project to see if I'm using it wrong. - - See type_api.py::TypeEngine.literal_processor: - - ```python - def process(value: Any) -> str: - return fixed_impl_processor( - fixed_process_literal_param(value, dialect) - ) - ``` - - That call to fixed_impl_processor wraps the result of fixed_process_literal_param (which is the - process_literal_param defined in our Databricks dialect) - - https://docs.sqlalchemy.org/en/20/core/custom_types.html#sqlalchemy.types.TypeDecorator.literal_processor - """ - - def process(value): - """This is a copy of the default String.literal_processor() method but stripping away - its double-escaping behaviour for single-quotes. - """ - - _step1 = self.process_literal_param(value, dialect="databricks") - if dialect.identifier_preparer._double_percents: - _step2 = _step1.replace("%", "%%") - else: - _step2 = _step1 - - return "%s" % _step2 - - return process - - -class TINYINT(sqlalchemy.types.TypeDecorator): - """Represents 1-byte signed integers - - Acts like a sqlalchemy SmallInteger() in Python but writes to a TINYINT field in Databricks - - https://docs.databricks.com/en/sql/language-manual/data-types/tinyint-type.html - """ - - impl = sqlalchemy.types.SmallInteger - cache_ok = True - - -@compiles(TINYINT, "databricks") -def compile_tinyint(type_, compiler, **kw): - return "TINYINT" diff --git a/src/databricks/sqlalchemy/base.py b/src/databricks/sqlalchemy/base.py deleted file mode 100644 index 40af61fe..00000000 --- a/src/databricks/sqlalchemy/base.py +++ /dev/null @@ -1,435 +0,0 @@ -from typing import Any, List, Optional, Dict, Union - -import databricks.sqlalchemy._ddl as dialect_ddl_impl -import databricks.sqlalchemy._types as dialect_type_impl -from databricks import sql -from databricks.sqlalchemy._parse import ( - _describe_table_extended_result_to_dict_list, - _match_table_not_found_string, - build_fk_dict, - build_pk_dict, - get_fk_strings_from_dte_output, - get_pk_strings_from_dte_output, - get_comment_from_dte_output, - parse_column_info_from_tgetcolumnsresponse, -) - -import sqlalchemy -from sqlalchemy import DDL, event -from sqlalchemy.engine import Connection, Engine, default, reflection -from sqlalchemy.engine.interfaces import ( - ReflectedForeignKeyConstraint, - ReflectedPrimaryKeyConstraint, - ReflectedColumn, - ReflectedTableComment, -) -from sqlalchemy.engine.reflection import ReflectionDefaults -from sqlalchemy.exc import DatabaseError, SQLAlchemyError - -try: - import alembic -except ImportError: - pass -else: - from alembic.ddl import DefaultImpl - - class DatabricksImpl(DefaultImpl): - __dialect__ = "databricks" - - -import logging - -logger = logging.getLogger(__name__) - - -class DatabricksDialect(default.DefaultDialect): - """This dialect implements only those methods required to pass our e2e tests""" - - # See sqlalchemy.engine.interfaces for descriptions of each of these properties - name: str = "databricks" - driver: str = "databricks" - default_schema_name: str = "default" - preparer = dialect_ddl_impl.DatabricksIdentifierPreparer # type: ignore - ddl_compiler = dialect_ddl_impl.DatabricksDDLCompiler - statement_compiler = dialect_ddl_impl.DatabricksStatementCompiler - supports_statement_cache: bool = True - supports_multivalues_insert: bool = True - supports_native_decimal: bool = True - supports_sane_rowcount: bool = False - non_native_boolean_check_constraint: bool = False - supports_identity_columns: bool = True - supports_schemas: bool = True - default_paramstyle: str = "named" - div_is_floordiv: bool = False - supports_default_values: bool = False - supports_server_side_cursors: bool = False - supports_sequences: bool = False - - colspecs = { - sqlalchemy.types.DateTime: dialect_type_impl.TIMESTAMP_NTZ, - sqlalchemy.types.Time: dialect_type_impl.DatabricksTimeType, - sqlalchemy.types.String: dialect_type_impl.DatabricksStringType, - } - - # SQLAlchemy requires that a table with no primary key - # constraint return a dictionary that looks like this. - EMPTY_PK: Dict[str, Any] = {"constrained_columns": [], "name": None} - - # SQLAlchemy requires that a table with no foreign keys - # defined return an empty list. Same for indexes. - EMPTY_FK: List - EMPTY_INDEX: List - EMPTY_FK = EMPTY_INDEX = [] - - @classmethod - def import_dbapi(cls): - return sql - - def _force_paramstyle_to_native_mode(self): - """This method can be removed after databricks-sql-connector wholly switches to NATIVE ParamApproach. - - This is a hack to trick SQLAlchemy into using a different paramstyle - than the one declared by this module in src/databricks/sql/__init__.py - - This method is called _after_ the dialect has been initialised, which is important because otherwise - our users would need to include a `paramstyle` argument in their SQLAlchemy connection string. - - This dialect is written to support NATIVE queries. Although the INLINE approach can technically work, - the same behaviour can be achieved within SQLAlchemy itself using its literal_processor methods. - """ - - self.paramstyle = self.default_paramstyle - - def create_connect_args(self, url): - # TODO: can schema be provided after HOST? - # Expected URI format is: databricks+thrift://token:dapi***@***.cloud.databricks.com?http_path=/sql/*** - - kwargs = { - "server_hostname": url.host, - "access_token": url.password, - "http_path": url.query.get("http_path"), - "catalog": url.query.get("catalog"), - "schema": url.query.get("schema"), - "use_inline_params": False, - } - - self.schema = kwargs["schema"] - self.catalog = kwargs["catalog"] - - self._force_paramstyle_to_native_mode() - - return [], kwargs - - def get_columns( - self, connection, table_name, schema=None, **kwargs - ) -> List[ReflectedColumn]: - """Return information about columns in `table_name`.""" - - with self.get_connection_cursor(connection) as cur: - resp = cur.columns( - catalog_name=self.catalog, - schema_name=schema or self.schema, - table_name=table_name, - ).fetchall() - - if not resp: - # TGetColumnsRequest will not raise an exception if passed a table that doesn't exist - # But Databricks supports tables with no columns. So if the result is an empty list, - # we need to check if the table exists (and raise an exception if not) or simply return - # an empty list. - self._describe_table_extended( - connection, - table_name, - self.catalog, - schema or self.schema, - expect_result=False, - ) - return resp - columns = [] - for col in resp: - row_dict = parse_column_info_from_tgetcolumnsresponse(col) - columns.append(row_dict) - - return columns - - def _describe_table_extended( - self, - connection: Connection, - table_name: str, - catalog_name: Optional[str] = None, - schema_name: Optional[str] = None, - expect_result=True, - ) -> Union[List[Dict[str, str]], None]: - """Run DESCRIBE TABLE EXTENDED on a table and return a list of dictionaries of the result. - - This method is the fastest way to check for the presence of a table in a schema. - - If expect_result is False, this method returns None as the output dict isn't required. - - Raises NoSuchTableError if the table is not present in the schema. - """ - - _target_catalog = catalog_name or self.catalog - _target_schema = schema_name or self.schema - _target = f"`{_target_catalog}`.`{_target_schema}`.`{table_name}`" - - # sql injection risk? - # DESCRIBE TABLE EXTENDED in DBR doesn't support parameterised inputs :( - stmt = DDL(f"DESCRIBE TABLE EXTENDED {_target}") - - try: - result = connection.execute(stmt) - except DatabaseError as e: - if _match_table_not_found_string(str(e)): - raise sqlalchemy.exc.NoSuchTableError( - f"No such table {table_name}" - ) from e - raise e - - if not expect_result: - return None - - fmt_result = _describe_table_extended_result_to_dict_list(result) - return fmt_result - - @reflection.cache - def get_pk_constraint( - self, - connection, - table_name: str, - schema: Optional[str] = None, - **kw: Any, - ) -> ReflectedPrimaryKeyConstraint: - """Fetch information about the primary key constraint on table_name. - - Returns a dictionary with these keys: - constrained_columns - a list of column names that make up the primary key. Results is an empty list - if no PRIMARY KEY is defined. - - name - the name of the primary key constraint - """ - - result = self._describe_table_extended( - connection=connection, - table_name=table_name, - schema_name=schema, - ) - - # Type ignore is because mypy knows that self._describe_table_extended *can* - # return None (even though it never will since expect_result defaults to True) - raw_pk_constraints: List = get_pk_strings_from_dte_output(result) # type: ignore - if not any(raw_pk_constraints): - return self.EMPTY_PK # type: ignore - - if len(raw_pk_constraints) > 1: - logger.warning( - "Found more than one primary key constraint in DESCRIBE TABLE EXTENDED output. " - "This is unexpected. Please report this as a bug. " - "Only the first primary key constraint will be returned." - ) - - first_pk_constraint = raw_pk_constraints[0] - pk_name = first_pk_constraint.get("col_name") - pk_constraint_string = first_pk_constraint.get("data_type") - - # TODO: figure out how to return sqlalchemy.interfaces in a way that mypy respects - return build_pk_dict(pk_name, pk_constraint_string) # type: ignore - - def get_foreign_keys( - self, connection, table_name, schema=None, **kw - ) -> List[ReflectedForeignKeyConstraint]: - """Return information about foreign_keys in `table_name`.""" - - result = self._describe_table_extended( - connection=connection, - table_name=table_name, - schema_name=schema, - ) - - # Type ignore is because mypy knows that self._describe_table_extended *can* - # return None (even though it never will since expect_result defaults to True) - raw_fk_constraints: List = get_fk_strings_from_dte_output(result) # type: ignore - - if not any(raw_fk_constraints): - return self.EMPTY_FK - - fk_constraints = [] - for constraint_dict in raw_fk_constraints: - fk_name = constraint_dict.get("col_name") - fk_constraint_string = constraint_dict.get("data_type") - this_constraint_dict = build_fk_dict( - fk_name, fk_constraint_string, schema_name=schema - ) - fk_constraints.append(this_constraint_dict) - - # TODO: figure out how to return sqlalchemy.interfaces in a way that mypy respects - return fk_constraints # type: ignore - - def get_indexes(self, connection, table_name, schema=None, **kw): - """SQLAlchemy requires this method. Databricks doesn't support indexes.""" - return self.EMPTY_INDEX - - @reflection.cache - def get_table_names(self, connection: Connection, schema=None, **kwargs): - """Return a list of tables in the current schema.""" - - _target_catalog = self.catalog - _target_schema = schema or self.schema - _target = f"`{_target_catalog}`.`{_target_schema}`" - - stmt = DDL(f"SHOW TABLES FROM {_target}") - - tables_result = connection.execute(stmt).all() - views_result = self.get_view_names(connection=connection, schema=schema) - - # In Databricks, SHOW TABLES FROM returns both tables and views. - # Potential optimisation: rewrite this to instead query information_schema - tables_minus_views = [ - row.tableName for row in tables_result if row.tableName not in views_result - ] - - return tables_minus_views - - @reflection.cache - def get_view_names( - self, - connection, - schema=None, - only_materialized=False, - only_temp=False, - **kwargs, - ) -> List[str]: - """Returns a list of string view names contained in the schema, if any.""" - - _target_catalog = self.catalog - _target_schema = schema or self.schema - _target = f"`{_target_catalog}`.`{_target_schema}`" - - stmt = DDL(f"SHOW VIEWS FROM {_target}") - result = connection.execute(stmt).all() - - return [ - row.viewName - for row in result - if (not only_materialized or row.isMaterialized) - and (not only_temp or row.isTemporary) - ] - - @reflection.cache - def get_materialized_view_names( - self, connection: Connection, schema: Optional[str] = None, **kw: Any - ) -> List[str]: - """A wrapper around get_view_names that fetches only the names of materialized views""" - return self.get_view_names(connection, schema, only_materialized=True) - - @reflection.cache - def get_temp_view_names( - self, connection: Connection, schema: Optional[str] = None, **kw: Any - ) -> List[str]: - """A wrapper around get_view_names that fetches only the names of temporary views""" - return self.get_view_names(connection, schema, only_temp=True) - - def do_rollback(self, dbapi_connection): - # Databricks SQL Does not support transactions - pass - - @reflection.cache - def has_table( - self, connection, table_name, schema=None, catalog=None, **kwargs - ) -> bool: - """For internal dialect use, check the existence of a particular table - or view in the database. - """ - - try: - self._describe_table_extended( - connection=connection, - table_name=table_name, - catalog_name=catalog, - schema_name=schema, - ) - return True - except sqlalchemy.exc.NoSuchTableError as e: - return False - - def get_connection_cursor(self, connection): - """Added for backwards compatibility with 1.3.x""" - if hasattr(connection, "_dbapi_connection"): - return connection._dbapi_connection.dbapi_connection.cursor() - elif hasattr(connection, "raw_connection"): - return connection.raw_connection().cursor() - elif hasattr(connection, "connection"): - return connection.connection.cursor() - - raise SQLAlchemyError( - "Databricks dialect can't obtain a cursor context manager from the dbapi" - ) - - @reflection.cache - def get_schema_names(self, connection, **kw): - """Return a list of all schema names available in the database.""" - stmt = DDL("SHOW SCHEMAS") - result = connection.execute(stmt) - schema_list = [row[0] for row in result] - return schema_list - - @reflection.cache - def get_table_comment( - self, - connection: Connection, - table_name: str, - schema: Optional[str] = None, - **kw: Any, - ) -> ReflectedTableComment: - result = self._describe_table_extended( - connection=connection, - table_name=table_name, - schema_name=schema, - ) - - if result is None: - return ReflectionDefaults.table_comment() - - comment = get_comment_from_dte_output(result) - - if comment: - return dict(text=comment) - else: - return ReflectionDefaults.table_comment() - - -@event.listens_for(Engine, "do_connect") -def receive_do_connect(dialect, conn_rec, cargs, cparams): - """Helpful for DS on traffic from clients using SQLAlchemy in particular""" - - # Ignore connect invocations that don't use our dialect - if not dialect.name == "databricks": - return - - ua = cparams.get("_user_agent_entry", "") - - def add_sqla_tag_if_not_present(val: str): - if not val: - output = "sqlalchemy" - - if val and "sqlalchemy" in val: - output = val - - else: - output = f"sqlalchemy + {val}" - - return output - - cparams["_user_agent_entry"] = add_sqla_tag_if_not_present(ua) - - if sqlalchemy.__version__.startswith("1.3"): - # SQLAlchemy 1.3.x fails to parse the http_path, catalog, and schema from our connection string - # These should be passed in as connect_args when building the Engine - - if "schema" in cparams: - dialect.schema = cparams["schema"] - - if "catalog" in cparams: - dialect.catalog = cparams["catalog"] diff --git a/src/databricks/sqlalchemy/dialect/__init__.py b/src/databricks/sqlalchemy/dialect/__init__.py new file mode 100644 index 00000000..a1020a74 --- /dev/null +++ b/src/databricks/sqlalchemy/dialect/__init__.py @@ -0,0 +1,340 @@ +"""This module's layout loosely follows example of SQLAlchemy's postgres dialect +""" + +import decimal, re, datetime +from dateutil.parser import parse + +import sqlalchemy +from sqlalchemy import types, event +from sqlalchemy.engine import default, Engine +from sqlalchemy.exc import DatabaseError, SQLAlchemyError +from sqlalchemy.engine import reflection + +from databricks import sql + + +from databricks.sqlalchemy.dialect.base import ( + DatabricksDDLCompiler, + DatabricksIdentifierPreparer, +) +from databricks.sqlalchemy.dialect.compiler import DatabricksTypeCompiler + +try: + import alembic +except ImportError: + pass +else: + from alembic.ddl import DefaultImpl + + class DatabricksImpl(DefaultImpl): + __dialect__ = "databricks" + + +class DatabricksDecimal(types.TypeDecorator): + """Translates strings to decimals""" + + impl = types.DECIMAL + + def process_result_value(self, value, dialect): + if value is not None: + return decimal.Decimal(value) + else: + return None + + +class DatabricksTimestamp(types.TypeDecorator): + """Translates timestamp strings to datetime objects""" + + impl = types.TIMESTAMP + + def process_result_value(self, value, dialect): + return value + + def adapt(self, impltype, **kwargs): + return self.impl + + +class DatabricksDate(types.TypeDecorator): + """Translates date strings to date objects""" + + impl = types.DATE + + def process_result_value(self, value, dialect): + return value + + def adapt(self, impltype, **kwargs): + return self.impl + + +class DatabricksDialect(default.DefaultDialect): + """This dialect implements only those methods required to pass our e2e tests""" + + # Possible attributes are defined here: https://docs.sqlalchemy.org/en/14/core/internals.html#sqlalchemy.engine.Dialect + name: str = "databricks" + driver: str = "databricks-sql-python" + default_schema_name: str = "default" + + preparer = DatabricksIdentifierPreparer # type: ignore + type_compiler = DatabricksTypeCompiler + ddl_compiler = DatabricksDDLCompiler + supports_statement_cache: bool = True + supports_multivalues_insert: bool = True + supports_native_decimal: bool = True + supports_sane_rowcount: bool = False + non_native_boolean_check_constraint: bool = False + + @classmethod + def dbapi(cls): + return sql + + def create_connect_args(self, url): + # TODO: can schema be provided after HOST? + # Expected URI format is: databricks+thrift://token:dapi***@***.cloud.databricks.com?http_path=/sql/*** + + kwargs = { + "server_hostname": url.host, + "access_token": url.password, + "http_path": url.query.get("http_path"), + "catalog": url.query.get("catalog"), + "schema": url.query.get("schema"), + } + + self.schema = kwargs["schema"] + self.catalog = kwargs["catalog"] + + return [], kwargs + + def get_columns(self, connection, table_name, schema=None, **kwargs): + """Return information about columns in `table_name`. + + Given a :class:`_engine.Connection`, a string + `table_name`, and an optional string `schema`, return column + information as a list of dictionaries with these keys: + + name + the column's name + + type + [sqlalchemy.types#TypeEngine] + + nullable + boolean + + default + the column's default value + + autoincrement + boolean + + sequence + a dictionary of the form + {'name' : str, 'start' :int, 'increment': int, 'minvalue': int, + 'maxvalue': int, 'nominvalue': bool, 'nomaxvalue': bool, + 'cycle': bool, 'cache': int, 'order': bool} + + Additional column attributes may be present. + """ + + _type_map = { + "boolean": types.Boolean, + "smallint": types.SmallInteger, + "int": types.Integer, + "bigint": types.BigInteger, + "float": types.Float, + "double": types.Float, + "string": types.String, + "varchar": types.String, + "char": types.String, + "binary": types.String, + "array": types.String, + "map": types.String, + "struct": types.String, + "uniontype": types.String, + "decimal": DatabricksDecimal, + "timestamp": DatabricksTimestamp, + "date": DatabricksDate, + } + + with self.get_connection_cursor(connection) as cur: + resp = cur.columns( + catalog_name=self.catalog, + schema_name=schema or self.schema, + table_name=table_name, + ).fetchall() + + columns = [] + + for col in resp: + + # Taken from PyHive. This removes added type info from decimals and maps + _col_type = re.search(r"^\w+", col.TYPE_NAME).group(0) + this_column = { + "name": col.COLUMN_NAME, + "type": _type_map[_col_type.lower()], + "nullable": bool(col.NULLABLE), + "default": col.COLUMN_DEF, + "autoincrement": False if col.IS_AUTO_INCREMENT == "NO" else True, + } + columns.append(this_column) + + return columns + + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + """Return information about the primary key constraint on + table_name`. + + Given a :class:`_engine.Connection`, a string + `table_name`, and an optional string `schema`, return primary + key information as a dictionary with these keys: + + constrained_columns + a list of column names that make up the primary key + + name + optional name of the primary key constraint. + + """ + # TODO: implement this behaviour + return {"constrained_columns": []} + + def get_foreign_keys(self, connection, table_name, schema=None, **kw): + """Return information about foreign_keys in `table_name`. + + Given a :class:`_engine.Connection`, a string + `table_name`, and an optional string `schema`, return foreign + key information as a list of dicts with these keys: + + name + the constraint's name + + constrained_columns + a list of column names that make up the foreign key + + referred_schema + the name of the referred schema + + referred_table + the name of the referred table + + referred_columns + a list of column names in the referred table that correspond to + constrained_columns + """ + # TODO: Implement this behaviour + return [] + + def get_indexes(self, connection, table_name, schema=None, **kw): + """Return information about indexes in `table_name`. + + Given a :class:`_engine.Connection`, a string + `table_name` and an optional string `schema`, return index + information as a list of dictionaries with these keys: + + name + the index's name + + column_names + list of column names in order + + unique + boolean + """ + # TODO: Implement this behaviour + return [] + + def get_table_names(self, connection, schema=None, **kwargs): + TABLE_NAME = 1 + with self.get_connection_cursor(connection) as cur: + sql_str = "SHOW TABLES FROM {}".format( + ".".join([self.catalog, schema or self.schema]) + ) + data = cur.execute(sql_str).fetchall() + _tables = [i[TABLE_NAME] for i in data] + + return _tables + + def get_view_names(self, connection, schema=None, **kwargs): + VIEW_NAME = 1 + with self.get_connection_cursor(connection) as cur: + sql_str = "SHOW VIEWS FROM {}".format( + ".".join([self.catalog, schema or self.schema]) + ) + data = cur.execute(sql_str).fetchall() + _tables = [i[VIEW_NAME] for i in data] + + return _tables + + def do_rollback(self, dbapi_connection): + # Databricks SQL Does not support transactions + pass + + def has_table( + self, connection, table_name, schema=None, catalog=None, **kwargs + ) -> bool: + """SQLAlchemy docstrings say dialect providers must implement this method""" + + _schema = schema or self.schema + _catalog = catalog or self.catalog + + # DBR >12.x uses underscores in error messages + DBR_LTE_12_NOT_FOUND_STRING = "Table or view not found" + DBR_GT_12_NOT_FOUND_STRING = "TABLE_OR_VIEW_NOT_FOUND" + + try: + res = connection.execute( + f"DESCRIBE TABLE {_catalog}.{_schema}.{table_name}" + ) + return True + except DatabaseError as e: + if DBR_GT_12_NOT_FOUND_STRING in str( + e + ) or DBR_LTE_12_NOT_FOUND_STRING in str(e): + return False + else: + raise e + + def get_connection_cursor(self, connection): + """Added for backwards compatibility with 1.3.x""" + if hasattr(connection, "_dbapi_connection"): + return connection._dbapi_connection.dbapi_connection.cursor() + elif hasattr(connection, "raw_connection"): + return connection.raw_connection().cursor() + elif hasattr(connection, "connection"): + return connection.connection.cursor() + + raise SQLAlchemyError( + "Databricks dialect can't obtain a cursor context manager from the dbapi" + ) + + @reflection.cache + def get_schema_names(self, connection, **kw): + # Equivalent to SHOW DATABASES + + # TODO: replace with call to cursor.schemas() once its performance matches raw SQL + return [row[0] for row in connection.execute("SHOW SCHEMAS")] + + +@event.listens_for(Engine, "do_connect") +def receive_do_connect(dialect, conn_rec, cargs, cparams): + """Helpful for DS on traffic from clients using SQLAlchemy in particular""" + + # Ignore connect invocations that don't use our dialect + if not dialect.name == "databricks": + return + + if "_user_agent_entry" in cparams: + new_user_agent = f"sqlalchemy + {cparams['_user_agent_entry']}" + else: + new_user_agent = "sqlalchemy" + + cparams["_user_agent_entry"] = new_user_agent + + if sqlalchemy.__version__.startswith("1.3"): + # SQLAlchemy 1.3.x fails to parse the http_path, catalog, and schema from our connection string + # These should be passed in as connect_args when building the Engine + + if "schema" in cparams: + dialect.schema = cparams["schema"] + + if "catalog" in cparams: + dialect.catalog = cparams["catalog"] diff --git a/src/databricks/sqlalchemy/dialect/base.py b/src/databricks/sqlalchemy/dialect/base.py new file mode 100644 index 00000000..080f0410 --- /dev/null +++ b/src/databricks/sqlalchemy/dialect/base.py @@ -0,0 +1,17 @@ +import re +from sqlalchemy.sql import compiler + + +class DatabricksIdentifierPreparer(compiler.IdentifierPreparer): + # SparkSQL identifier specification: + # ref: https://spark.apache.org/docs/latest/sql-ref-identifier.html + + legal_characters = re.compile(r"^[A-Z0-9_]+$", re.I) + + def __init__(self, dialect): + super().__init__(dialect, initial_quote="`") + + +class DatabricksDDLCompiler(compiler.DDLCompiler): + def post_create_table(self, table): + return " USING DELTA" diff --git a/src/databricks/sqlalchemy/dialect/compiler.py b/src/databricks/sqlalchemy/dialect/compiler.py new file mode 100644 index 00000000..f77807ed --- /dev/null +++ b/src/databricks/sqlalchemy/dialect/compiler.py @@ -0,0 +1,38 @@ +from sqlalchemy.sql import compiler + + +class DatabricksTypeCompiler(compiler.GenericTypeCompiler): + """Originally forked from pyhive""" + + def visit_INTEGER(self, type_): + return "INT" + + def visit_NUMERIC(self, type_): + return "DECIMAL" + + def visit_CHAR(self, type_): + return "STRING" + + def visit_VARCHAR(self, type_): + return "STRING" + + def visit_NCHAR(self, type_): + return "STRING" + + def visit_TEXT(self, type_): + return "STRING" + + def visit_CLOB(self, type_): + return "STRING" + + def visit_BLOB(self, type_): + return "BINARY" + + def visit_TIME(self, type_): + return "TIMESTAMP" + + def visit_DATE(self, type_): + return "DATE" + + def visit_DATETIME(self, type_): + return "TIMESTAMP" diff --git a/src/databricks/sqlalchemy/pytest.ini b/src/databricks/sqlalchemy/pytest.ini deleted file mode 100644 index affffd2f..00000000 --- a/src/databricks/sqlalchemy/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pytest] -markers = - reviewed: Test case has been reviewed by databricks \ No newline at end of file diff --git a/src/databricks/sqlalchemy/requirements.py b/src/databricks/sqlalchemy/requirements.py deleted file mode 100644 index 75227efb..00000000 --- a/src/databricks/sqlalchemy/requirements.py +++ /dev/null @@ -1,249 +0,0 @@ -""" -The complete list of requirements is provided by SQLAlchemy here: - -https://github.com/sqlalchemy/sqlalchemy/blob/main/lib/sqlalchemy/testing/requirements.py - -When SQLAlchemy skips a test because a requirement is closed() it gives a generic skip message. -To make these failures more actionable, we only define requirements in this file that we wish to -force to be open(). If a test should be skipped on Databricks, it will be specifically marked skip -in test_suite.py with a Databricks-specific reason. - -See the special note about the array_type exclusion below. -See special note about has_temp_table exclusion below. -""" - -import sqlalchemy.testing.requirements -import sqlalchemy.testing.exclusions - - -class Requirements(sqlalchemy.testing.requirements.SuiteRequirements): - @property - def date_historic(self): - """target dialect supports representation of Python - datetime.datetime() objects with historic (pre 1970) values.""" - - return sqlalchemy.testing.exclusions.open() - - @property - def datetime_historic(self): - """target dialect supports representation of Python - datetime.datetime() objects with historic (pre 1970) values.""" - - return sqlalchemy.testing.exclusions.open() - - @property - def datetime_literals(self): - """target dialect supports rendering of a date, time, or datetime as a - literal string, e.g. via the TypeEngine.literal_processor() method. - - """ - - return sqlalchemy.testing.exclusions.open() - - @property - def timestamp_microseconds(self): - """target dialect supports representation of Python - datetime.datetime() with microsecond objects but only - if TIMESTAMP is used.""" - - return sqlalchemy.testing.exclusions.open() - - @property - def time_microseconds(self): - """target dialect supports representation of Python - datetime.time() with microsecond objects. - - This requirement declaration isn't needed but I've included it here for completeness. - Since Databricks doesn't have a TIME type, SQLAlchemy will compile Time() columns - as STRING Databricks data types. And we use a custom time type to render those strings - between str() and time.time() representations. Therefore we can store _any_ precision - that SQLAlchemy needs. The time_microseconds requirement defaults to ON for all dialects - except mssql, mysql, mariadb, and oracle. - """ - - return sqlalchemy.testing.exclusions.open() - - @property - def infinity_floats(self): - """The Float type can persist and load float('inf'), float('-inf').""" - - return sqlalchemy.testing.exclusions.open() - - @property - def precision_numerics_retains_significant_digits(self): - """A precision numeric type will return empty significant digits, - i.e. a value such as 10.000 will come back in Decimal form with - the .000 maintained.""" - - return sqlalchemy.testing.exclusions.open() - - @property - def precision_numerics_many_significant_digits(self): - """target backend supports values with many digits on both sides, - such as 319438950232418390.273596, 87673.594069654243 - - """ - return sqlalchemy.testing.exclusions.open() - - @property - def array_type(self): - """While Databricks does support ARRAY types, pysql cannot bind them. So - we cannot use them with SQLAlchemy - - Due to a bug in SQLAlchemy, we _must_ define this exclusion as closed() here or else the - test runner will crash the pytest process due to an AttributeError - """ - - # TODO: Implement array type using inline? - return sqlalchemy.testing.exclusions.closed() - - @property - def table_ddl_if_exists(self): - """target platform supports IF NOT EXISTS / IF EXISTS for tables.""" - - return sqlalchemy.testing.exclusions.open() - - @property - def identity_columns(self): - """If a backend supports GENERATED { ALWAYS | BY DEFAULT } - AS IDENTITY""" - return sqlalchemy.testing.exclusions.open() - - @property - def identity_columns_standard(self): - """If a backend supports GENERATED { ALWAYS | BY DEFAULT } - AS IDENTITY with a standard syntax. - This is mainly to exclude MSSql. - """ - return sqlalchemy.testing.exclusions.open() - - @property - def has_temp_table(self): - """target dialect supports checking a single temp table name - - unfortunately this is not the same as temp_table_names - - SQLAlchemy's HasTableTest is not normalised in such a way that temp table tests - are separate from temp view and normal table tests. If those tests were split out, - we would just add detailed skip markers in test_suite.py. But since we'd like to - run the HasTableTest group for the features we support, we must set this exclusinon - to closed(). - - It would be ideal if there were a separate requirement for has_temp_view. Without it, - we're in a bind. - """ - return sqlalchemy.testing.exclusions.closed() - - @property - def temporary_views(self): - """target database supports temporary views""" - return sqlalchemy.testing.exclusions.open() - - @property - def views(self): - """Target database must support VIEWs.""" - - return sqlalchemy.testing.exclusions.open() - - @property - def temporary_tables(self): - """target database supports temporary tables - - ComponentReflection test is intricate and simply cannot function without this exclusion being defined here. - This happens because we cannot skip individual combinations used in ComponentReflection test. - """ - return sqlalchemy.testing.exclusions.closed() - - @property - def table_reflection(self): - """target database has general support for table reflection""" - return sqlalchemy.testing.exclusions.open() - - @property - def comment_reflection(self): - """Indicates if the database support table comment reflection""" - return sqlalchemy.testing.exclusions.open() - - @property - def comment_reflection_full_unicode(self): - """Indicates if the database support table comment reflection in the - full unicode range, including emoji etc. - """ - return sqlalchemy.testing.exclusions.open() - - @property - def temp_table_reflection(self): - """ComponentReflection test is intricate and simply cannot function without this exclusion being defined here. - This happens because we cannot skip individual combinations used in ComponentReflection test. - """ - return sqlalchemy.testing.exclusions.closed() - - @property - def index_reflection(self): - """ComponentReflection test is intricate and simply cannot function without this exclusion being defined here. - This happens because we cannot skip individual combinations used in ComponentReflection test. - """ - return sqlalchemy.testing.exclusions.closed() - - @property - def unique_constraint_reflection(self): - """ComponentReflection test is intricate and simply cannot function without this exclusion being defined here. - This happens because we cannot skip individual combinations used in ComponentReflection test. - - Databricks doesn't support UNIQUE constraints. - """ - return sqlalchemy.testing.exclusions.closed() - - @property - def reflects_pk_names(self): - """Target driver reflects the name of primary key constraints.""" - - return sqlalchemy.testing.exclusions.open() - - @property - def datetime_implicit_bound(self): - """target dialect when given a datetime object will bind it such - that the database server knows the object is a date, and not - a plain string. - """ - - return sqlalchemy.testing.exclusions.open() - - @property - def tuple_in(self): - return sqlalchemy.testing.exclusions.open() - - @property - def ctes(self): - return sqlalchemy.testing.exclusions.open() - - @property - def ctes_with_update_delete(self): - return sqlalchemy.testing.exclusions.open() - - @property - def delete_from(self): - """Target must support DELETE FROM..FROM or DELETE..USING syntax""" - return sqlalchemy.testing.exclusions.open() - - @property - def table_value_constructor(self): - return sqlalchemy.testing.exclusions.open() - - @property - def reflect_tables_no_columns(self): - return sqlalchemy.testing.exclusions.open() - - @property - def denormalized_names(self): - """Target database must have 'denormalized', i.e. - UPPERCASE as case insensitive names.""" - - return sqlalchemy.testing.exclusions.open() - - @property - def time_timezone(self): - """target dialect supports representation of Python - datetime.time() with tzinfo with Time(timezone=True).""" - - return sqlalchemy.testing.exclusions.open() diff --git a/src/databricks/sqlalchemy/setup.cfg b/src/databricks/sqlalchemy/setup.cfg deleted file mode 100644 index ab89d17d..00000000 --- a/src/databricks/sqlalchemy/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ - -[sqla_testing] -requirement_cls=databricks.sqlalchemy.requirements:Requirements -profile_file=profiles.txt diff --git a/src/databricks/sqlalchemy/test/_extra.py b/src/databricks/sqlalchemy/test/_extra.py deleted file mode 100644 index 2f3e7a7d..00000000 --- a/src/databricks/sqlalchemy/test/_extra.py +++ /dev/null @@ -1,70 +0,0 @@ -"""Additional tests authored by Databricks that use SQLAlchemy's test fixtures -""" - -import datetime - -from sqlalchemy.testing.suite.test_types import ( - _LiteralRoundTripFixture, - fixtures, - testing, - eq_, - select, - Table, - Column, - config, - _DateFixture, - literal, -) -from databricks.sqlalchemy import TINYINT, TIMESTAMP - - -class TinyIntegerTest(_LiteralRoundTripFixture, fixtures.TestBase): - __backend__ = True - - def test_literal(self, literal_round_trip): - literal_round_trip(TINYINT, [5], [5]) - - @testing.fixture - def integer_round_trip(self, metadata, connection): - def run(datatype, data): - int_table = Table( - "tiny_integer_table", - metadata, - Column( - "id", - TINYINT, - primary_key=True, - test_needs_autoincrement=False, - ), - Column("tiny_integer_data", datatype), - ) - - metadata.create_all(config.db) - - connection.execute(int_table.insert(), {"id": 1, "integer_data": data}) - - row = connection.execute(select(int_table.c.integer_data)).first() - - eq_(row, (data,)) - - assert isinstance(row[0], int) - - return run - - -class DateTimeTZTestCustom(_DateFixture, fixtures.TablesTest): - """This test confirms that when a user uses the TIMESTAMP - type to store a datetime object, it retains its timezone - """ - - __backend__ = True - datatype = TIMESTAMP - data = datetime.datetime(2012, 10, 15, 12, 57, 18, tzinfo=datetime.timezone.utc) - - @testing.requires.datetime_implicit_bound - def test_select_direct(self, connection): - - # We need to pass the TIMESTAMP type to the literal function - # so that the value is processed correctly. - result = connection.scalar(select(literal(self.data, TIMESTAMP))) - eq_(result, self.data) diff --git a/src/databricks/sqlalchemy/test/_future.py b/src/databricks/sqlalchemy/test/_future.py deleted file mode 100644 index 6e470f60..00000000 --- a/src/databricks/sqlalchemy/test/_future.py +++ /dev/null @@ -1,331 +0,0 @@ -# type: ignore - -from enum import Enum - -import pytest -from databricks.sqlalchemy.test._regression import ( - ExpandingBoundInTest, - IdentityAutoincrementTest, - LikeFunctionsTest, - NormalizedNameTest, -) -from databricks.sqlalchemy.test._unsupported import ( - ComponentReflectionTest, - ComponentReflectionTestExtra, - CTETest, - InsertBehaviorTest, -) -from sqlalchemy.testing.suite import ( - ArrayTest, - BinaryTest, - BizarroCharacterFKResolutionTest, - CollateTest, - ComputedColumnTest, - ComputedReflectionTest, - DifficultParametersTest, - FutureWeCanSetDefaultSchemaWEventsTest, - IdentityColumnTest, - IdentityReflectionTest, - JSONLegacyStringCastIndexTest, - JSONTest, - NativeUUIDTest, - QuotedNameArgumentTest, - RowCountTest, - SimpleUpdateDeleteTest, - WeCanSetDefaultSchemaWEventsTest, -) - - -class FutureFeature(Enum): - ARRAY = "ARRAY column type handling" - BINARY = "BINARY column type handling" - CHECK = "CHECK constraint handling" - COLLATE = "COLLATE DDL generation" - CTE_FEAT = "required CTE features" - EMPTY_INSERT = "empty INSERT support" - FK_OPTS = "foreign key option checking" - GENERATED_COLUMNS = "Delta computed / generated columns support" - IDENTITY = "identity reflection" - JSON = "JSON column type handling" - MULTI_PK = "get_multi_pk_constraint method" - PROVISION = "event-driven engine configuration" - REGEXP = "_visit_regexp" - SANE_ROWCOUNT = "sane_rowcount support" - TBL_OPTS = "get_table_options method" - TEST_DESIGN = "required test-fixture overrides" - TUPLE_LITERAL = "tuple-like IN markers completely" - UUID = "native Uuid() type" - VIEW_DEF = "get_view_definition method" - - -def render_future_feature(rsn: FutureFeature, extra=False) -> str: - postfix = " More detail in _future.py" if extra else "" - return f"[FUTURE][{rsn.name}]: This dialect doesn't implement {rsn.value}.{postfix}" - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.BINARY)) -class BinaryTest(BinaryTest): - """Databricks doesn't support binding of BINARY type values. When DBR supports this, we can implement - in this dialect. - """ - - pass - - -class ExpandingBoundInTest(ExpandingBoundInTest): - @pytest.mark.skip(render_future_feature(FutureFeature.TUPLE_LITERAL)) - def test_empty_heterogeneous_tuples_bindparam(self): - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.TUPLE_LITERAL)) - def test_empty_heterogeneous_tuples_direct(self): - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.TUPLE_LITERAL)) - def test_empty_homogeneous_tuples_bindparam(self): - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.TUPLE_LITERAL)) - def test_empty_homogeneous_tuples_direct(self): - pass - - -class NormalizedNameTest(NormalizedNameTest): - @pytest.mark.skip(render_future_feature(FutureFeature.TEST_DESIGN, True)) - def test_get_table_names(self): - """I'm not clear how this test can ever pass given that it's assertion looks like this: - - ```python - eq_(tablenames[0].upper(), tablenames[0].lower()) - eq_(tablenames[1].upper(), tablenames[1].lower()) - ``` - - It's forcibly calling .upper() and .lower() on the same string and expecting them to be equal. - """ - pass - - -class CTETest(CTETest): - @pytest.mark.skip(render_future_feature(FutureFeature.CTE_FEAT, True)) - def test_delete_from_round_trip(self): - """Databricks dialect doesn't implement multiple-table criteria within DELETE""" - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.TEST_DESIGN, True)) -class IdentityColumnTest(IdentityColumnTest): - """Identity works. Test needs rewrite for Databricks. See comments in test_suite.py - - The setup for these tests tries to create a table with a DELTA IDENTITY column but has two problems: - 1. It uses an Integer() type for the column. Whereas DELTA IDENTITY columns must be BIGINT. - 2. It tries to set the start == 42, which Databricks doesn't support - - I can get the tests to _run_ by patching the table fixture to use BigInteger(). But it asserts that the - identity of two rows are 42 and 43, which is not possible since they will be rows 1 and 2 instead. - - I'm satisified through manual testing that our implementation of visit_identity_column works but a better test is needed. - """ - - pass - - -class IdentityAutoincrementTest(IdentityAutoincrementTest): - @pytest.mark.skip(render_future_feature(FutureFeature.TEST_DESIGN, True)) - def test_autoincrement_with_identity(self): - """This test has the same issue as IdentityColumnTest.test_select_all in that it creates a table with identity - using an Integer() rather than a BigInteger(). If I override this behaviour to use a BigInteger() instead, the - test passes. - """ - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.TEST_DESIGN)) -class BizarroCharacterFKResolutionTest(BizarroCharacterFKResolutionTest): - """Some of the combinations in this test pass. Others fail. Given the esoteric nature of these failures, - we have opted to defer implementing fixes to a later time, guided by customer feedback. Passage of - these tests is not an acceptance criteria for our dialect. - """ - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.TEST_DESIGN)) -class DifficultParametersTest(DifficultParametersTest): - """Some of the combinations in this test pass. Others fail. Given the esoteric nature of these failures, - we have opted to defer implementing fixes to a later time, guided by customer feedback. Passage of - these tests is not an acceptance criteria for our dialect. - """ - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.IDENTITY, True)) -class IdentityReflectionTest(IdentityReflectionTest): - """It's not clear _how_ to implement this for SQLAlchemy. Columns created with GENERATED ALWAYS AS IDENTITY - are not specially demarked in the output of TGetColumnsResponse or DESCRIBE TABLE EXTENDED. - - We could theoretically parse this from the contents of `SHOW CREATE TABLE` but that feels like a hack. - """ - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.JSON)) -class JSONTest(JSONTest): - """Databricks supports JSON path expressions in queries it's just not implemented in this dialect.""" - - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.JSON)) -class JSONLegacyStringCastIndexTest(JSONLegacyStringCastIndexTest): - """Same comment applies as JSONTest""" - - pass - - -class LikeFunctionsTest(LikeFunctionsTest): - @pytest.mark.skip(render_future_feature(FutureFeature.REGEXP)) - def test_not_regexp_match(self): - """The defaul dialect doesn't implement _visit_regexp methods so we don't get them automatically.""" - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.REGEXP)) - def test_regexp_match(self): - """The defaul dialect doesn't implement _visit_regexp methods so we don't get them automatically.""" - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.COLLATE)) -class CollateTest(CollateTest): - """This is supported in Databricks. Not implemented here.""" - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.UUID, True)) -class NativeUUIDTest(NativeUUIDTest): - """Type implementation will be straightforward. Since Databricks doesn't have a native UUID type we can use - a STRING field, create a custom TypeDecorator for sqlalchemy.types.Uuid and add it to the dialect's colspecs. - - Then mark requirements.uuid_data_type as open() so this test can run. - """ - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.SANE_ROWCOUNT)) -class RowCountTest(RowCountTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.SANE_ROWCOUNT)) -class SimpleUpdateDeleteTest(SimpleUpdateDeleteTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.PROVISION, True)) -class WeCanSetDefaultSchemaWEventsTest(WeCanSetDefaultSchemaWEventsTest): - """provision.py allows us to define event listeners that emit DDL for things like setting up a test schema - or, in this case, changing the default schema for the connection after it's been built. This would override - the schema defined in the sqlalchemy connection string. This support is possible but is not implemented - in the dialect. Deferred for now. - """ - - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.PROVISION, True)) -class FutureWeCanSetDefaultSchemaWEventsTest(FutureWeCanSetDefaultSchemaWEventsTest): - """provision.py allows us to define event listeners that emit DDL for things like setting up a test schema - or, in this case, changing the default schema for the connection after it's been built. This would override - the schema defined in the sqlalchemy connection string. This support is possible but is not implemented - in the dialect. Deferred for now. - """ - - pass - - -class ComponentReflectionTest(ComponentReflectionTest): - @pytest.mark.skip(reason=render_future_feature(FutureFeature.TBL_OPTS, True)) - def test_multi_get_table_options_tables(self): - """It's not clear what the expected ouput from this method would even _be_. Requires research.""" - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.VIEW_DEF)) - def test_get_view_definition(self): - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.VIEW_DEF)) - def test_get_view_definition_does_not_exist(self): - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.MULTI_PK)) - def test_get_multi_pk_constraint(self): - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.CHECK)) - def test_get_multi_check_constraints(self): - pass - - -class ComponentReflectionTestExtra(ComponentReflectionTestExtra): - @pytest.mark.skip(render_future_feature(FutureFeature.CHECK)) - def test_get_check_constraints(self): - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.FK_OPTS)) - def test_get_foreign_key_options(self): - """It's not clear from the test code what the expected output is here. Further research required.""" - pass - - -class InsertBehaviorTest(InsertBehaviorTest): - @pytest.mark.skip(render_future_feature(FutureFeature.EMPTY_INSERT, True)) - def test_empty_insert(self): - """Empty inserts are possible using DEFAULT VALUES on Databricks. To implement it, we need - to hook into the SQLCompiler to render a no-op column list. With SQLAlchemy's default implementation - the request fails with a syntax error - """ - pass - - @pytest.mark.skip(render_future_feature(FutureFeature.EMPTY_INSERT, True)) - def test_empty_insert_multiple(self): - """Empty inserts are possible using DEFAULT VALUES on Databricks. To implement it, we need - to hook into the SQLCompiler to render a no-op column list. With SQLAlchemy's default implementation - the request fails with a syntax error - """ - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.ARRAY)) -class ArrayTest(ArrayTest): - """While Databricks supports ARRAY types, DBR cannot handle bound parameters of this type. - This makes them unusable to SQLAlchemy without some workaround. Potentially we could inline - the values of these parameters (which risks sql injection). - """ - - -@pytest.mark.reviewed -@pytest.mark.skip(render_future_feature(FutureFeature.TEST_DESIGN, True)) -class QuotedNameArgumentTest(QuotedNameArgumentTest): - """These tests are challenging. The whole test setup depends on a table with a name like `quote ' one` - which will never work on Databricks because table names can't contains spaces. But QuotedNamedArgumentTest - also checks the behaviour of DDL identifier preparation process. We need to override some of IdentifierPreparer - methods because these are the ultimate control for whether or not CHECK and UNIQUE constraints are emitted. - """ - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_future_feature(FutureFeature.GENERATED_COLUMNS)) -class ComputedColumnTest(ComputedColumnTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_future_feature(FutureFeature.GENERATED_COLUMNS)) -class ComputedReflectionTest(ComputedReflectionTest): - pass diff --git a/src/databricks/sqlalchemy/test/_regression.py b/src/databricks/sqlalchemy/test/_regression.py deleted file mode 100644 index 4dbc5ec2..00000000 --- a/src/databricks/sqlalchemy/test/_regression.py +++ /dev/null @@ -1,311 +0,0 @@ -# type: ignore - -import pytest -from sqlalchemy.testing.suite import ( - ArgSignatureTest, - BooleanTest, - CastTypeDecoratorTest, - ComponentReflectionTestExtra, - CompositeKeyReflectionTest, - CompoundSelectTest, - DateHistoricTest, - DateTest, - DateTimeCoercedToDateTimeTest, - DateTimeHistoricTest, - DateTimeMicrosecondsTest, - DateTimeTest, - DeprecatedCompoundSelectTest, - DistinctOnTest, - EscapingTest, - ExistsTest, - ExpandingBoundInTest, - FetchLimitOffsetTest, - FutureTableDDLTest, - HasTableTest, - IdentityAutoincrementTest, - InsertBehaviorTest, - IntegerTest, - IsOrIsNotDistinctFromTest, - JoinTest, - LikeFunctionsTest, - NormalizedNameTest, - NumericTest, - OrderByLabelTest, - PingTest, - PostCompileParamsTest, - ReturningGuardsTest, - RowFetchTest, - SameNamedSchemaTableTest, - StringTest, - TableDDLTest, - TableNoColumnsTest, - TextTest, - TimeMicrosecondsTest, - TimestampMicrosecondsTest, - TimeTest, - TimeTZTest, - TrueDivTest, - UnicodeTextTest, - UnicodeVarcharTest, - UuidTest, - ValuesExpressionTest, -) - -from databricks.sqlalchemy.test.overrides._ctetest import CTETest -from databricks.sqlalchemy.test.overrides._componentreflectiontest import ( - ComponentReflectionTest, -) - - -@pytest.mark.reviewed -class NumericTest(NumericTest): - pass - - -@pytest.mark.reviewed -class HasTableTest(HasTableTest): - pass - - -@pytest.mark.reviewed -class ComponentReflectionTestExtra(ComponentReflectionTestExtra): - pass - - -@pytest.mark.reviewed -class InsertBehaviorTest(InsertBehaviorTest): - pass - - -@pytest.mark.reviewed -class ComponentReflectionTest(ComponentReflectionTest): - """This test requires two schemas be present in the target Databricks workspace: - - The schema set in --dburi - - A second schema named "test_schema" - - Note that test_get_multi_foreign keys is flaky because DBR does not guarantee the order of data returned in DESCRIBE TABLE EXTENDED - - _Most_ of these tests pass if we manually override the bad test setup. - """ - - pass - - -@pytest.mark.reviewed -class TableDDLTest(TableDDLTest): - pass - - -@pytest.mark.reviewed -class FutureTableDDLTest(FutureTableDDLTest): - pass - - -@pytest.mark.reviewed -class FetchLimitOffsetTest(FetchLimitOffsetTest): - pass - - -@pytest.mark.reviewed -class UuidTest(UuidTest): - pass - - -@pytest.mark.reviewed -class ValuesExpressionTest(ValuesExpressionTest): - pass - - -@pytest.mark.reviewed -class BooleanTest(BooleanTest): - pass - - -@pytest.mark.reviewed -class PostCompileParamsTest(PostCompileParamsTest): - pass - - -@pytest.mark.reviewed -class TimeMicrosecondsTest(TimeMicrosecondsTest): - pass - - -@pytest.mark.reviewed -class TextTest(TextTest): - pass - - -@pytest.mark.reviewed -class StringTest(StringTest): - pass - - -@pytest.mark.reviewed -class DateTimeMicrosecondsTest(DateTimeMicrosecondsTest): - pass - - -@pytest.mark.reviewed -class TimestampMicrosecondsTest(TimestampMicrosecondsTest): - pass - - -@pytest.mark.reviewed -class DateTimeCoercedToDateTimeTest(DateTimeCoercedToDateTimeTest): - pass - - -@pytest.mark.reviewed -class TimeTest(TimeTest): - pass - - -@pytest.mark.reviewed -class DateTimeTest(DateTimeTest): - pass - - -@pytest.mark.reviewed -class DateTimeHistoricTest(DateTimeHistoricTest): - pass - - -@pytest.mark.reviewed -class DateTest(DateTest): - pass - - -@pytest.mark.reviewed -class DateHistoricTest(DateHistoricTest): - pass - - -@pytest.mark.reviewed -class RowFetchTest(RowFetchTest): - pass - - -@pytest.mark.reviewed -class CompositeKeyReflectionTest(CompositeKeyReflectionTest): - pass - - -@pytest.mark.reviewed -class TrueDivTest(TrueDivTest): - pass - - -@pytest.mark.reviewed -class ArgSignatureTest(ArgSignatureTest): - pass - - -@pytest.mark.reviewed -class CompoundSelectTest(CompoundSelectTest): - pass - - -@pytest.mark.reviewed -class DeprecatedCompoundSelectTest(DeprecatedCompoundSelectTest): - pass - - -@pytest.mark.reviewed -class CastTypeDecoratorTest(CastTypeDecoratorTest): - pass - - -@pytest.mark.reviewed -class DistinctOnTest(DistinctOnTest): - pass - - -@pytest.mark.reviewed -class EscapingTest(EscapingTest): - pass - - -@pytest.mark.reviewed -class ExistsTest(ExistsTest): - pass - - -@pytest.mark.reviewed -class IntegerTest(IntegerTest): - pass - - -@pytest.mark.reviewed -class IsOrIsNotDistinctFromTest(IsOrIsNotDistinctFromTest): - pass - - -@pytest.mark.reviewed -class JoinTest(JoinTest): - pass - - -@pytest.mark.reviewed -class OrderByLabelTest(OrderByLabelTest): - pass - - -@pytest.mark.reviewed -class PingTest(PingTest): - pass - - -@pytest.mark.reviewed -class ReturningGuardsTest(ReturningGuardsTest): - pass - - -@pytest.mark.reviewed -class SameNamedSchemaTableTest(SameNamedSchemaTableTest): - pass - - -@pytest.mark.reviewed -class UnicodeTextTest(UnicodeTextTest): - pass - - -@pytest.mark.reviewed -class UnicodeVarcharTest(UnicodeVarcharTest): - pass - - -@pytest.mark.reviewed -class TableNoColumnsTest(TableNoColumnsTest): - pass - - -@pytest.mark.reviewed -class ExpandingBoundInTest(ExpandingBoundInTest): - pass - - -@pytest.mark.reviewed -class CTETest(CTETest): - pass - - -@pytest.mark.reviewed -class NormalizedNameTest(NormalizedNameTest): - pass - - -@pytest.mark.reviewed -class IdentityAutoincrementTest(IdentityAutoincrementTest): - pass - - -@pytest.mark.reviewed -class LikeFunctionsTest(LikeFunctionsTest): - pass - - -@pytest.mark.reviewed -class TimeTZTest(TimeTZTest): - pass diff --git a/src/databricks/sqlalchemy/test/_unsupported.py b/src/databricks/sqlalchemy/test/_unsupported.py deleted file mode 100644 index c1f81205..00000000 --- a/src/databricks/sqlalchemy/test/_unsupported.py +++ /dev/null @@ -1,450 +0,0 @@ -# type: ignore - -from enum import Enum - -import pytest -from databricks.sqlalchemy.test._regression import ( - ComponentReflectionTest, - ComponentReflectionTestExtra, - CTETest, - FetchLimitOffsetTest, - FutureTableDDLTest, - HasTableTest, - InsertBehaviorTest, - NumericTest, - TableDDLTest, - UuidTest, -) - -# These are test suites that are fully skipped with a SkipReason -from sqlalchemy.testing.suite import ( - AutocommitIsolationTest, - DateTimeTZTest, - ExceptionTest, - HasIndexTest, - HasSequenceTest, - HasSequenceTestEmpty, - IsolationLevelTest, - LastrowidTest, - LongNameBlowoutTest, - PercentSchemaNamesTest, - ReturningTest, - SequenceCompilerTest, - SequenceTest, - ServerSideCursorsTest, - UnicodeSchemaTest, -) - - -class SkipReason(Enum): - AUTO_INC = "implicit AUTO_INCREMENT" - CTE_FEAT = "required CTE features" - CURSORS = "server-side cursors" - DECIMAL_FEAT = "required decimal features" - ENFORCE_KEYS = "enforcing primary or foreign key restraints" - FETCH = "fetch clauses" - IDENTIFIER_LENGTH = "identifiers > 255 characters" - IMPL_FLOAT_PREC = "required implicit float precision" - IMPLICIT_ORDER = "deterministic return order if ORDER BY is not present" - INDEXES = "SQL INDEXes" - RETURNING = "INSERT ... RETURNING syntax" - SEQUENCES = "SQL SEQUENCES" - STRING_FEAT = "required STRING type features" - SYMBOL_CHARSET = "symbols expected by test" - TEMP_TBL = "temporary tables" - TIMEZONE_OPT = "timezone-optional TIMESTAMP fields" - TRANSACTIONS = "transactions" - UNIQUE = "UNIQUE constraints" - - -def render_skip_reason(rsn: SkipReason, setup_error=False, extra=False) -> str: - prefix = "[BADSETUP]" if setup_error else "" - postfix = " More detail in _unsupported.py" if extra else "" - return f"[UNSUPPORTED]{prefix}[{rsn.name}]: Databricks does not support {rsn.value}.{postfix}" - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.ENFORCE_KEYS)) -class ExceptionTest(ExceptionTest): - """Per Databricks documentation, primary and foreign key constraints are informational only - and are not enforced. - - https://docs.databricks.com/api/workspace/tableconstraints - """ - - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.IDENTIFIER_LENGTH)) -class LongNameBlowoutTest(LongNameBlowoutTest): - """These tests all include assertions that the tested name > 255 characters""" - - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.SEQUENCES)) -class HasSequenceTest(HasSequenceTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.SEQUENCES)) -class HasSequenceTestEmpty(HasSequenceTestEmpty): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.INDEXES)) -class HasIndexTest(HasIndexTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.SYMBOL_CHARSET)) -class UnicodeSchemaTest(UnicodeSchemaTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.CURSORS)) -class ServerSideCursorsTest(ServerSideCursorsTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.SYMBOL_CHARSET)) -class PercentSchemaNamesTest(PercentSchemaNamesTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.TRANSACTIONS)) -class IsolationLevelTest(IsolationLevelTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.TRANSACTIONS)) -class AutocommitIsolationTest(AutocommitIsolationTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.RETURNING)) -class ReturningTest(ReturningTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.SEQUENCES)) -class SequenceTest(SequenceTest): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(reason=render_skip_reason(SkipReason.SEQUENCES)) -class SequenceCompilerTest(SequenceCompilerTest): - pass - - -class FetchLimitOffsetTest(FetchLimitOffsetTest): - @pytest.mark.flaky - @pytest.mark.skip(reason=render_skip_reason(SkipReason.IMPLICIT_ORDER, extra=True)) - def test_limit_render_multiple_times(self): - """This test depends on the order that records are inserted into the table. It's passing criteria requires that - a record inserted with id=1 is the first record returned when no ORDER BY clause is specified. But Databricks occasionally - INSERTS in a different order, which makes this test seem to fail. The test is flaky, but the underlying functionality - (can multiple LIMIT clauses be rendered) is not broken. - - Unclear if this is a bug in Databricks, Delta, or some race-condition in the test itself. - """ - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_bound_fetch_offset(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_fetch_offset_no_order(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_fetch_offset_nobinds(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_simple_fetch(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_simple_fetch_offset(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_simple_fetch_percent(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_simple_fetch_percent_ties(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_simple_fetch_ties(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_expr_fetch_offset(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_fetch_offset_percent(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_fetch_offset_percent_ties(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_fetch_offset_ties(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.FETCH)) - def test_fetch_offset_ties_exact_number(self): - pass - - -class UuidTest(UuidTest): - @pytest.mark.skip(reason=render_skip_reason(SkipReason.RETURNING)) - def test_uuid_returning(self): - pass - - -class FutureTableDDLTest(FutureTableDDLTest): - @pytest.mark.skip(render_skip_reason(SkipReason.INDEXES)) - def test_create_index_if_not_exists(self): - """We could use requirements.index_reflection and requirements.index_ddl_if_exists - here to disable this but prefer a more meaningful skip message - """ - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.INDEXES)) - def test_drop_index_if_exists(self): - """We could use requirements.index_reflection and requirements.index_ddl_if_exists - here to disable this but prefer a more meaningful skip message - """ - pass - - -class TableDDLTest(TableDDLTest): - @pytest.mark.skip(reason=render_skip_reason(SkipReason.INDEXES)) - def test_create_index_if_not_exists(self, connection): - """We could use requirements.index_reflection and requirements.index_ddl_if_exists - here to disable this but prefer a more meaningful skip message - """ - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.INDEXES)) - def test_drop_index_if_exists(self, connection): - """We could use requirements.index_reflection and requirements.index_ddl_if_exists - here to disable this but prefer a more meaningful skip message - """ - pass - - -class ComponentReflectionTest(ComponentReflectionTest): - """This test requires two schemas be present in the target Databricks workspace: - - The schema set in --dburi - - A second schema named "test_schema" - - Note that test_get_multi_foreign keys is flaky because DBR does not guarantee the order of data returned in DESCRIBE TABLE EXTENDED - """ - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.UNIQUE)) - def test_get_multi_unique_constraints(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.TEMP_TBL, True, True)) - def test_get_temp_view_names(self): - """While Databricks supports temporary views, this test creates a temp view aimed at a temp table. - Databricks doesn't support temp tables. So the test can never pass. - """ - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.TEMP_TBL)) - def test_get_temp_table_columns(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.TEMP_TBL)) - def test_get_temp_table_indexes(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.TEMP_TBL)) - def test_get_temp_table_names(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.TEMP_TBL)) - def test_get_temp_table_unique_constraints(self): - pass - - @pytest.mark.skip(reason=render_skip_reason(SkipReason.TEMP_TBL)) - def test_reflect_table_temp_table(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.INDEXES)) - def test_get_indexes(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.INDEXES)) - def test_multi_indexes(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.INDEXES)) - def get_noncol_index(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.UNIQUE)) - def test_get_unique_constraints(self): - pass - - -class NumericTest(NumericTest): - @pytest.mark.skip(render_skip_reason(SkipReason.DECIMAL_FEAT)) - def test_enotation_decimal(self): - """This test automatically runs if requirements.precision_numerics_enotation_large is open()""" - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.DECIMAL_FEAT)) - def test_enotation_decimal_large(self): - """This test automatically runs if requirements.precision_numerics_enotation_large is open()""" - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.IMPL_FLOAT_PREC, extra=True)) - def test_float_coerce_round_trip(self): - """ - This automatically runs if requirements.literal_float_coercion is open() - - Without additional work, Databricks returns 15.75629997253418 when you SELECT 15.7563. - This is a potential area where we could override the Float literal processor to add a CAST. - Will leave to a PM to decide if we should do so. - """ - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.IMPL_FLOAT_PREC, extra=True)) - def test_float_custom_scale(self): - """This test automatically runs if requirements.precision_generic_float_type is open()""" - pass - - -class HasTableTest(HasTableTest): - """Databricks does not support temporary tables.""" - - @pytest.mark.skip(render_skip_reason(SkipReason.TEMP_TBL)) - def test_has_table_temp_table(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.TEMP_TBL, True, True)) - def test_has_table_temp_view(self): - """Databricks supports temporary views but this test depends on requirements.has_temp_table, which we - explicitly close so that we can run other tests in this group. See the comment under has_temp_table in - requirements.py for details. - - From what I can see, there is no way to run this test since it will fail during setup if we mark has_temp_table - open(). It _might_ be possible to hijack this behaviour by implementing temp_table_keyword_args in our own - provision.py. Doing so would mean creating a real table during this class setup instead of a temp table. Then - we could just skip the temp table tests but run the temp view tests. But this test fixture doesn't cleanup its - temp tables and has no hook to do so. - - It would be ideal for SQLAlchemy to define a separate requirements.has_temp_views. - """ - pass - - -class ComponentReflectionTestExtra(ComponentReflectionTestExtra): - @pytest.mark.skip(render_skip_reason(SkipReason.INDEXES)) - def test_reflect_covering_index(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.INDEXES)) - def test_reflect_expression_based_indexes(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.STRING_FEAT, extra=True)) - def test_varchar_reflection(self): - """Databricks doesn't enforce string length limitations like STRING(255).""" - pass - - -class InsertBehaviorTest(InsertBehaviorTest): - @pytest.mark.skip(render_skip_reason(SkipReason.AUTO_INC, True, True)) - def test_autoclose_on_insert(self): - """The setup for this test creates a column with implicit autoincrement enabled. - This dialect does not implement implicit autoincrement - users must declare Identity() explicitly. - """ - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.AUTO_INC, True, True)) - def test_insert_from_select_autoinc(self): - """Implicit autoincrement is not implemented in this dialect.""" - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.AUTO_INC, True, True)) - def test_insert_from_select_autoinc_no_rows(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.RETURNING)) - def test_autoclose_on_insert_implicit_returning(self): - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_skip_reason(SkipReason.AUTO_INC, extra=True)) -class LastrowidTest(LastrowidTest): - """SQLAlchemy docs describe that a column without an explicit Identity() may implicitly create one if autoincrement=True. - That is what this method tests. Databricks supports auto-incrementing IDENTITY columns but they must be explicitly - declared. This limitation is present in our dialect as well. Which means that SQLAlchemy's autoincrement setting of a column - is ignored. We emit a logging.WARN message if you try it. - - In the future we could handle this autoincrement by implicitly calling the visit_identity_column() method of our DDLCompiler - when autoincrement=True. There is an example of this in the Microsoft SQL Server dialect: MSSDDLCompiler.get_column_specification - - For now, if you need to create a SQLAlchemy column with an auto-incrementing identity, you must set this explicitly in your column - definition by passing an Identity() to the column constructor. - """ - - pass - - -class CTETest(CTETest): - """During the teardown for this test block, it tries to drop a constraint that it never named which raises - a compilation error. This could point to poor constraint reflection but our other constraint reflection - tests pass. Requires investigation. - """ - - @pytest.mark.skip(render_skip_reason(SkipReason.CTE_FEAT, extra=True)) - def test_select_recursive_round_trip(self): - pass - - @pytest.mark.skip(render_skip_reason(SkipReason.CTE_FEAT, extra=True)) - def test_delete_scalar_subq_round_trip(self): - """Error received is [UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY.MUST_AGGREGATE_CORRELATED_SCALAR_SUBQUERY] - - This suggests a limitation of the platform. But a workaround may be possible if customers require it. - """ - pass - - -@pytest.mark.reviewed -@pytest.mark.skip(render_skip_reason(SkipReason.TIMEZONE_OPT, True)) -class DateTimeTZTest(DateTimeTZTest): - """Test whether the sqlalchemy.DateTime() type can _optionally_ include timezone info. - This dialect maps DateTime() → TIMESTAMP, which _always_ includes tzinfo. - - Users can use databricks.sqlalchemy.TIMESTAMP_NTZ for a tzinfo-less timestamp. The SQLA docs - acknowledge this is expected for some dialects. - - https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.DateTime - """ - - pass diff --git a/src/databricks/sqlalchemy/test/conftest.py b/src/databricks/sqlalchemy/test/conftest.py deleted file mode 100644 index ea43e8d3..00000000 --- a/src/databricks/sqlalchemy/test/conftest.py +++ /dev/null @@ -1,13 +0,0 @@ -from sqlalchemy.dialects import registry -import pytest - -registry.register("databricks", "databricks.sqlalchemy", "DatabricksDialect") -# sqlalchemy's dialect-testing machinery wants an entry like this. -# This seems to be based around dialects maybe having multiple drivers -# and wanting to test driver-specific URLs, but doesn't seem to make -# much sense for dialects with only one driver. -registry.register("databricks.databricks", "databricks.sqlalchemy", "DatabricksDialect") - -pytest.register_assert_rewrite("sqlalchemy.testing.assertions") - -from sqlalchemy.testing.plugin.pytestplugin import * diff --git a/src/databricks/sqlalchemy/test/overrides/_componentreflectiontest.py b/src/databricks/sqlalchemy/test/overrides/_componentreflectiontest.py deleted file mode 100644 index e06af2d0..00000000 --- a/src/databricks/sqlalchemy/test/overrides/_componentreflectiontest.py +++ /dev/null @@ -1,189 +0,0 @@ -"""The default test setup uses self-referential foreign keys and indexes for a test table. -We override to remove these assumptions. - -Note that test_multi_foreign_keys currently does not pass for all combinations due to -an ordering issue. The dialect returns the expected information. But this test makes assertions -on the order of the returned results. We can't guarantee that order at the moment. - -The test fixture actually tries to sort the outputs, but this sort isn't working. Will need -to follow-up on this later. -""" -import sqlalchemy as sa -from sqlalchemy.testing import config -from sqlalchemy.testing.schema import Column -from sqlalchemy.testing.schema import Table -from sqlalchemy import ForeignKey -from sqlalchemy import testing - -from sqlalchemy.testing.suite.test_reflection import ComponentReflectionTest - - -class ComponentReflectionTest(ComponentReflectionTest): # type: ignore - @classmethod - def define_reflected_tables(cls, metadata, schema): - if schema: - schema_prefix = schema + "." - else: - schema_prefix = "" - - if testing.requires.self_referential_foreign_keys.enabled: - parent_id_args = ( - ForeignKey( - "%susers.user_id" % schema_prefix, name="user_id_fk", use_alter=True - ), - ) - else: - parent_id_args = () - users = Table( - "users", - metadata, - Column("user_id", sa.INT, primary_key=True), - Column("test1", sa.CHAR(5), nullable=False), - Column("test2", sa.Float(), nullable=False), - Column("parent_user_id", sa.Integer, *parent_id_args), - sa.CheckConstraint( - "test2 > 0", - name="zz_test2_gt_zero", - comment="users check constraint", - ), - sa.CheckConstraint("test2 <= 1000"), - schema=schema, - test_needs_fk=True, - ) - - Table( - "dingalings", - metadata, - Column("dingaling_id", sa.Integer, primary_key=True), - Column( - "address_id", - sa.Integer, - ForeignKey( - "%semail_addresses.address_id" % schema_prefix, - name="zz_email_add_id_fg", - comment="di fk comment", - ), - ), - Column( - "id_user", - sa.Integer, - ForeignKey("%susers.user_id" % schema_prefix), - ), - Column("data", sa.String(30), unique=True), - sa.CheckConstraint( - "address_id > 0 AND address_id < 1000", - name="address_id_gt_zero", - ), - sa.UniqueConstraint( - "address_id", - "dingaling_id", - name="zz_dingalings_multiple", - comment="di unique comment", - ), - schema=schema, - test_needs_fk=True, - ) - Table( - "email_addresses", - metadata, - Column("address_id", sa.Integer), - Column("remote_user_id", sa.Integer, ForeignKey(users.c.user_id)), - Column("email_address", sa.String(20)), - sa.PrimaryKeyConstraint( - "address_id", name="email_ad_pk", comment="ea pk comment" - ), - schema=schema, - test_needs_fk=True, - ) - Table( - "comment_test", - metadata, - Column("id", sa.Integer, primary_key=True, comment="id comment"), - Column("data", sa.String(20), comment="data % comment"), - Column( - "d2", - sa.String(20), - comment=r"""Comment types type speedily ' " \ '' Fun!""", - ), - Column("d3", sa.String(42), comment="Comment\nwith\rescapes"), - schema=schema, - comment=r"""the test % ' " \ table comment""", - ) - Table( - "no_constraints", - metadata, - Column("data", sa.String(20)), - schema=schema, - comment="no\nconstraints\rhas\fescaped\vcomment", - ) - - if testing.requires.cross_schema_fk_reflection.enabled: - if schema is None: - Table( - "local_table", - metadata, - Column("id", sa.Integer, primary_key=True), - Column("data", sa.String(20)), - Column( - "remote_id", - ForeignKey("%s.remote_table_2.id" % testing.config.test_schema), - ), - test_needs_fk=True, - schema=config.db.dialect.default_schema_name, - ) - else: - Table( - "remote_table", - metadata, - Column("id", sa.Integer, primary_key=True), - Column( - "local_id", - ForeignKey( - "%s.local_table.id" % config.db.dialect.default_schema_name - ), - ), - Column("data", sa.String(20)), - schema=schema, - test_needs_fk=True, - ) - Table( - "remote_table_2", - metadata, - Column("id", sa.Integer, primary_key=True), - Column("data", sa.String(20)), - schema=schema, - test_needs_fk=True, - ) - - if testing.requires.index_reflection.enabled: - Index("users_t_idx", users.c.test1, users.c.test2, unique=True) - Index("users_all_idx", users.c.user_id, users.c.test2, users.c.test1) - - if not schema: - # test_needs_fk is at the moment to force MySQL InnoDB - noncol_idx_test_nopk = Table( - "noncol_idx_test_nopk", - metadata, - Column("q", sa.String(5)), - test_needs_fk=True, - ) - - noncol_idx_test_pk = Table( - "noncol_idx_test_pk", - metadata, - Column("id", sa.Integer, primary_key=True), - Column("q", sa.String(5)), - test_needs_fk=True, - ) - - if ( - testing.requires.indexes_with_ascdesc.enabled - and testing.requires.reflect_indexes_with_ascdesc.enabled - ): - Index("noncol_idx_nopk", noncol_idx_test_nopk.c.q.desc()) - Index("noncol_idx_pk", noncol_idx_test_pk.c.q.desc()) - - if testing.requires.view_column_reflection.enabled: - cls.define_views(metadata, schema) - if not schema and testing.requires.temp_table_reflection.enabled: - cls.define_temp_tables(metadata) diff --git a/src/databricks/sqlalchemy/test/overrides/_ctetest.py b/src/databricks/sqlalchemy/test/overrides/_ctetest.py deleted file mode 100644 index 3cdae036..00000000 --- a/src/databricks/sqlalchemy/test/overrides/_ctetest.py +++ /dev/null @@ -1,33 +0,0 @@ -"""The default test setup uses a self-referential foreign key. With our dialect this requires -`use_alter=True` and the fk constraint to be named. So we override this to make the test pass. -""" - -from sqlalchemy.testing.suite import CTETest - -from sqlalchemy.testing.schema import Column -from sqlalchemy.testing.schema import Table -from sqlalchemy import ForeignKey -from sqlalchemy import Integer -from sqlalchemy import String - - -class CTETest(CTETest): # type: ignore - @classmethod - def define_tables(cls, metadata): - Table( - "some_table", - metadata, - Column("id", Integer, primary_key=True), - Column("data", String(50)), - Column( - "parent_id", ForeignKey("some_table.id", name="fk_test", use_alter=True) - ), - ) - - Table( - "some_other_table", - metadata, - Column("id", Integer, primary_key=True), - Column("data", String(50)), - Column("parent_id", Integer), - ) diff --git a/src/databricks/sqlalchemy/test/test_suite.py b/src/databricks/sqlalchemy/test/test_suite.py deleted file mode 100644 index 2b40a432..00000000 --- a/src/databricks/sqlalchemy/test/test_suite.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -The order of these imports is important. Test cases are imported first from SQLAlchemy, -then are overridden by our local skip markers in _regression, _unsupported, and _future. -""" - - -# type: ignore -# fmt: off -from sqlalchemy.testing.suite import * -from databricks.sqlalchemy.test._regression import * -from databricks.sqlalchemy.test._unsupported import * -from databricks.sqlalchemy.test._future import * -from databricks.sqlalchemy.test._extra import TinyIntegerTest, DateTimeTZTestCustom diff --git a/src/databricks/sqlalchemy/test_local/__init__.py b/src/databricks/sqlalchemy/test_local/__init__.py deleted file mode 100644 index d6cebbfe..00000000 --- a/src/databricks/sqlalchemy/test_local/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -""" -This module contains tests entirely maintained by Databricks. - -These tests do not rely on SQLAlchemy's custom test runner. -""" diff --git a/src/databricks/sqlalchemy/test_local/test_ddl.py b/src/databricks/sqlalchemy/test_local/test_ddl.py deleted file mode 100644 index a83ff244..00000000 --- a/src/databricks/sqlalchemy/test_local/test_ddl.py +++ /dev/null @@ -1,95 +0,0 @@ -import pytest -from sqlalchemy import Column, MetaData, String, Table, create_engine -from sqlalchemy.schema import ( - CreateTable, - DropColumnComment, - DropTableComment, - SetColumnComment, - SetTableComment, -) - - -class DDLTestBase: - engine = create_engine( - "databricks://token:****@****?http_path=****&catalog=****&schema=****" - ) - - def compile(self, stmt): - return str(stmt.compile(bind=self.engine)) - - -class TestColumnCommentDDL(DDLTestBase): - @pytest.fixture - def metadata(self) -> MetaData: - """Assemble a metadata object with one table containing one column.""" - metadata = MetaData() - - column = Column("foo", String, comment="bar") - table = Table("foobar", metadata, column) - - return metadata - - @pytest.fixture - def table(self, metadata) -> Table: - return metadata.tables.get("foobar") - - @pytest.fixture - def column(self, table) -> Column: - return table.columns[0] - - def test_create_table_with_column_comment(self, table): - stmt = CreateTable(table) - output = self.compile(stmt) - - # output is a CREATE TABLE statement - assert "foo STRING COMMENT 'bar'" in output - - def test_alter_table_add_column_comment(self, column): - stmt = SetColumnComment(column) - output = self.compile(stmt) - assert output == "ALTER TABLE foobar ALTER COLUMN foo COMMENT 'bar'" - - def test_alter_table_drop_column_comment(self, column): - stmt = DropColumnComment(column) - output = self.compile(stmt) - assert output == "ALTER TABLE foobar ALTER COLUMN foo COMMENT ''" - - -class TestTableCommentDDL(DDLTestBase): - @pytest.fixture - def metadata(self) -> MetaData: - """Assemble a metadata object with one table containing one column.""" - metadata = MetaData() - - col1 = Column("foo", String) - col2 = Column("foo", String) - tbl_w_comment = Table("martin", metadata, col1, comment="foobar") - tbl_wo_comment = Table("prs", metadata, col2) - - return metadata - - @pytest.fixture - def table_with_comment(self, metadata) -> Table: - return metadata.tables.get("martin") - - @pytest.fixture - def table_without_comment(self, metadata) -> Table: - return metadata.tables.get("prs") - - def test_create_table_with_comment(self, table_with_comment): - stmt = CreateTable(table_with_comment) - output = self.compile(stmt) - assert "USING DELTA COMMENT 'foobar'" in output - - def test_alter_table_add_comment(self, table_without_comment: Table): - table_without_comment.comment = "wireless mechanical keyboard" - stmt = SetTableComment(table_without_comment) - output = self.compile(stmt) - - assert output == "COMMENT ON TABLE prs IS 'wireless mechanical keyboard'" - - def test_alter_table_drop_comment(self, table_with_comment): - """The syntax for COMMENT ON is here: https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-ddl-comment.html""" - stmt = DropTableComment(table_with_comment) - output = self.compile(stmt) - assert output == "COMMENT ON TABLE martin IS NULL" diff --git a/src/databricks/sqlalchemy/test_local/test_parsing.py b/src/databricks/sqlalchemy/test_local/test_parsing.py deleted file mode 100644 index 70e6337a..00000000 --- a/src/databricks/sqlalchemy/test_local/test_parsing.py +++ /dev/null @@ -1,160 +0,0 @@ -import pytest -from databricks.sqlalchemy._parse import ( - extract_identifiers_from_string, - extract_identifier_groups_from_string, - extract_three_level_identifier_from_constraint_string, - build_fk_dict, - build_pk_dict, - match_dte_rows_by_value, - get_comment_from_dte_output, - DatabricksSqlAlchemyParseException, -) - - -# These are outputs from DESCRIBE TABLE EXTENDED -@pytest.mark.parametrize( - "input, expected", - [ - ("PRIMARY KEY (`pk1`, `pk2`)", ["pk1", "pk2"]), - ("PRIMARY KEY (`a`, `b`, `c`)", ["a", "b", "c"]), - ("PRIMARY KEY (`name`, `id`, `attr`)", ["name", "id", "attr"]), - ], -) -def test_extract_identifiers(input, expected): - assert ( - extract_identifiers_from_string(input) == expected - ), "Failed to extract identifiers from string" - - -@pytest.mark.parametrize( - "input, expected", - [ - ( - "FOREIGN KEY (`pname`, `pid`, `pattr`) REFERENCES `main`.`pysql_sqlalchemy`.`tb1` (`name`, `id`, `attr`)", - [ - "(`pname`, `pid`, `pattr`)", - "(`name`, `id`, `attr`)", - ], - ) - ], -) -def test_extract_identifer_batches(input, expected): - assert ( - extract_identifier_groups_from_string(input) == expected - ), "Failed to extract identifier groups from string" - - -def test_extract_3l_namespace_from_constraint_string(): - input = "FOREIGN KEY (`parent_user_id`) REFERENCES `main`.`pysql_dialect_compliance`.`users` (`user_id`)" - expected = { - "catalog": "main", - "schema": "pysql_dialect_compliance", - "table": "users", - } - - assert ( - extract_three_level_identifier_from_constraint_string(input) == expected - ), "Failed to extract 3L namespace from constraint string" - - -def test_extract_3l_namespace_from_bad_constraint_string(): - input = "FOREIGN KEY (`parent_user_id`) REFERENCES `pysql_dialect_compliance`.`users` (`user_id`)" - - with pytest.raises(DatabricksSqlAlchemyParseException): - extract_three_level_identifier_from_constraint_string(input) - - -@pytest.mark.parametrize("schema", [None, "some_schema"]) -def test_build_fk_dict(schema): - fk_constraint_string = "FOREIGN KEY (`parent_user_id`) REFERENCES `main`.`some_schema`.`users` (`user_id`)" - - result = build_fk_dict("some_fk_name", fk_constraint_string, schema_name=schema) - - assert result == { - "name": "some_fk_name", - "constrained_columns": ["parent_user_id"], - "referred_schema": schema, - "referred_table": "users", - "referred_columns": ["user_id"], - } - - -def test_build_pk_dict(): - pk_constraint_string = "PRIMARY KEY (`id`, `name`, `email_address`)" - pk_name = "pk1" - - result = build_pk_dict(pk_name, pk_constraint_string) - - assert result == { - "constrained_columns": ["id", "name", "email_address"], - "name": "pk1", - } - - -# This is a real example of the output from DESCRIBE TABLE EXTENDED as of 15 October 2023 -RAW_SAMPLE_DTE_OUTPUT = [ - ["id", "int"], - ["name", "string"], - ["", ""], - ["# Detailed Table Information", ""], - ["Catalog", "main"], - ["Database", "pysql_sqlalchemy"], - ["Table", "exampleexampleexample"], - ["Created Time", "Sun Oct 15 21:12:54 UTC 2023"], - ["Last Access", "UNKNOWN"], - ["Created By", "Spark "], - ["Type", "MANAGED"], - ["Location", "s3://us-west-2-****-/19a85dee-****/tables/ccb7***"], - ["Provider", "delta"], - ["Comment", "some comment"], - ["Owner", "some.user@example.com"], - ["Is_managed_location", "true"], - ["Predictive Optimization", "ENABLE (inherited from CATALOG main)"], - [ - "Table Properties", - "[delta.checkpoint.writeStatsAsJson=false,delta.checkpoint.writeStatsAsStruct=true,delta.minReaderVersion=1,delta.minWriterVersion=2]", - ], - ["", ""], - ["# Constraints", ""], - ["exampleexampleexample_pk", "PRIMARY KEY (`id`)"], - [ - "exampleexampleexample_fk", - "FOREIGN KEY (`parent_user_id`) REFERENCES `main`.`pysql_dialect_compliance`.`users` (`user_id`)", - ], -] - -FMT_SAMPLE_DT_OUTPUT = [ - {"col_name": i[0], "data_type": i[1]} for i in RAW_SAMPLE_DTE_OUTPUT -] - - -@pytest.mark.parametrize( - "match, output", - [ - ( - "PRIMARY KEY", - [ - { - "col_name": "exampleexampleexample_pk", - "data_type": "PRIMARY KEY (`id`)", - } - ], - ), - ( - "FOREIGN KEY", - [ - { - "col_name": "exampleexampleexample_fk", - "data_type": "FOREIGN KEY (`parent_user_id`) REFERENCES `main`.`pysql_dialect_compliance`.`users` (`user_id`)", - } - ], - ), - ], -) -def test_filter_dict_by_value(match, output): - result = match_dte_rows_by_value(FMT_SAMPLE_DT_OUTPUT, match) - assert result == output - - -def test_get_comment_from_dte_output(): - assert get_comment_from_dte_output(FMT_SAMPLE_DT_OUTPUT) == "some comment" diff --git a/src/databricks/sqlalchemy/test_local/test_types.py b/src/databricks/sqlalchemy/test_local/test_types.py deleted file mode 100644 index b91217ed..00000000 --- a/src/databricks/sqlalchemy/test_local/test_types.py +++ /dev/null @@ -1,161 +0,0 @@ -import enum - -import pytest -import sqlalchemy - -from databricks.sqlalchemy.base import DatabricksDialect -from databricks.sqlalchemy._types import TINYINT, TIMESTAMP, TIMESTAMP_NTZ - - -class DatabricksDataType(enum.Enum): - """https://docs.databricks.com/en/sql/language-manual/sql-ref-datatypes.html""" - - BIGINT = enum.auto() - BINARY = enum.auto() - BOOLEAN = enum.auto() - DATE = enum.auto() - DECIMAL = enum.auto() - DOUBLE = enum.auto() - FLOAT = enum.auto() - INT = enum.auto() - INTERVAL = enum.auto() - VOID = enum.auto() - SMALLINT = enum.auto() - STRING = enum.auto() - TIMESTAMP = enum.auto() - TIMESTAMP_NTZ = enum.auto() - TINYINT = enum.auto() - ARRAY = enum.auto() - MAP = enum.auto() - STRUCT = enum.auto() - - -# Defines the way that SQLAlchemy CamelCase types are compiled into Databricks SQL types. -# Note: I wish I could define this within the TestCamelCaseTypesCompilation class, but pytest doesn't like that. -camel_case_type_map = { - sqlalchemy.types.BigInteger: DatabricksDataType.BIGINT, - sqlalchemy.types.LargeBinary: DatabricksDataType.BINARY, - sqlalchemy.types.Boolean: DatabricksDataType.BOOLEAN, - sqlalchemy.types.Date: DatabricksDataType.DATE, - sqlalchemy.types.DateTime: DatabricksDataType.TIMESTAMP_NTZ, - sqlalchemy.types.Double: DatabricksDataType.DOUBLE, - sqlalchemy.types.Enum: DatabricksDataType.STRING, - sqlalchemy.types.Float: DatabricksDataType.FLOAT, - sqlalchemy.types.Integer: DatabricksDataType.INT, - sqlalchemy.types.Interval: DatabricksDataType.TIMESTAMP_NTZ, - sqlalchemy.types.Numeric: DatabricksDataType.DECIMAL, - sqlalchemy.types.PickleType: DatabricksDataType.BINARY, - sqlalchemy.types.SmallInteger: DatabricksDataType.SMALLINT, - sqlalchemy.types.String: DatabricksDataType.STRING, - sqlalchemy.types.Text: DatabricksDataType.STRING, - sqlalchemy.types.Time: DatabricksDataType.STRING, - sqlalchemy.types.Unicode: DatabricksDataType.STRING, - sqlalchemy.types.UnicodeText: DatabricksDataType.STRING, - sqlalchemy.types.Uuid: DatabricksDataType.STRING, -} - - -def dict_as_tuple_list(d: dict): - """Return a list of [(key, value), ...] from a dictionary.""" - return [(key, value) for key, value in d.items()] - - -class CompilationTestBase: - dialect = DatabricksDialect() - - def _assert_compiled_value( - self, type_: sqlalchemy.types.TypeEngine, expected: DatabricksDataType - ): - """Assert that when type_ is compiled for the databricks dialect, it renders the DatabricksDataType name. - - This method initialises the type_ with no arguments. - """ - compiled_result = type_().compile(dialect=self.dialect) # type: ignore - assert compiled_result == expected.name - - def _assert_compiled_value_explicit( - self, type_: sqlalchemy.types.TypeEngine, expected: str - ): - """Assert that when type_ is compiled for the databricks dialect, it renders the expected string. - - This method expects an initialised type_ so that we can test how a TypeEngine created with arguments - is compiled. - """ - compiled_result = type_.compile(dialect=self.dialect) - assert compiled_result == expected - - -class TestCamelCaseTypesCompilation(CompilationTestBase): - """Per the sqlalchemy documentation[^1] here, the camel case members of sqlalchemy.types are - are expected to work across all dialects. These tests verify that the types compile into valid - Databricks SQL type strings. For example, the sqlalchemy.types.Integer() should compile as "INT". - - Truly custom types like STRUCT (notice the uppercase) are not expected to work across all dialects. - We test these separately. - - Note that these tests have to do with type **name** compiliation. Which is separate from actually - mapping values between Python and Databricks. - - Note: SchemaType and MatchType are not tested because it's not used in table definitions - - [1]: https://docs.sqlalchemy.org/en/20/core/type_basics.html#generic-camelcase-types - """ - - @pytest.mark.parametrize("type_, expected", dict_as_tuple_list(camel_case_type_map)) - def test_bare_camel_case_types_compile(self, type_, expected): - self._assert_compiled_value(type_, expected) - - def test_numeric_renders_as_decimal_with_precision(self): - self._assert_compiled_value_explicit( - sqlalchemy.types.Numeric(10), "DECIMAL(10)" - ) - - def test_numeric_renders_as_decimal_with_precision_and_scale(self): - self._assert_compiled_value_explicit( - sqlalchemy.types.Numeric(10, 2), "DECIMAL(10, 2)" - ) - - -uppercase_type_map = { - sqlalchemy.types.ARRAY: DatabricksDataType.ARRAY, - sqlalchemy.types.BIGINT: DatabricksDataType.BIGINT, - sqlalchemy.types.BINARY: DatabricksDataType.BINARY, - sqlalchemy.types.BOOLEAN: DatabricksDataType.BOOLEAN, - sqlalchemy.types.DATE: DatabricksDataType.DATE, - sqlalchemy.types.DECIMAL: DatabricksDataType.DECIMAL, - sqlalchemy.types.DOUBLE: DatabricksDataType.DOUBLE, - sqlalchemy.types.FLOAT: DatabricksDataType.FLOAT, - sqlalchemy.types.INT: DatabricksDataType.INT, - sqlalchemy.types.SMALLINT: DatabricksDataType.SMALLINT, - sqlalchemy.types.TIMESTAMP: DatabricksDataType.TIMESTAMP, - TINYINT: DatabricksDataType.TINYINT, - TIMESTAMP: DatabricksDataType.TIMESTAMP, - TIMESTAMP_NTZ: DatabricksDataType.TIMESTAMP_NTZ, -} - - -class TestUppercaseTypesCompilation(CompilationTestBase): - """Per the sqlalchemy documentation[^1], uppercase types are considered to be specific to some - database backends. These tests verify that the types compile into valid Databricks SQL type strings. - - [1]: https://docs.sqlalchemy.org/en/20/core/type_basics.html#backend-specific-uppercase-datatypes - """ - - @pytest.mark.parametrize("type_, expected", dict_as_tuple_list(uppercase_type_map)) - def test_bare_uppercase_types_compile(self, type_, expected): - if isinstance(type_, type(sqlalchemy.types.ARRAY)): - # ARRAY cannot be initialised without passing an item definition so we test separately - # I preserve it in the uppercase_type_map for clarity - assert True - else: - self._assert_compiled_value(type_, expected) - - def test_array_string_renders_as_array_of_string(self): - """SQLAlchemy's ARRAY type requires an item definition. And their docs indicate that they've only tested - it with Postgres since that's the only first-class dialect with support for ARRAY. - - https://docs.sqlalchemy.org/en/20/core/type_basics.html#sqlalchemy.types.ARRAY - """ - self._assert_compiled_value_explicit( - sqlalchemy.types.ARRAY(sqlalchemy.types.String), "ARRAY" - ) diff --git a/tests/e2e/common/retry_test_mixins.py b/tests/e2e/common/retry_test_mixins.py index 5305c124..44b7afbf 100644 --- a/tests/e2e/common/retry_test_mixins.py +++ b/tests/e2e/common/retry_test_mixins.py @@ -58,21 +58,17 @@ def _test_retry_disabled_with_message(self, error_msg_substring, exception_type) @contextmanager -def mocked_server_response( - status: int = 200, headers: dict = {}, redirect_location: str = None -): +def mocked_server_response(status: int = 200, headers: dict = {}): """Context manager for patching urllib3 responses""" # When mocking mocking a BaseHTTPResponse for urllib3 the mock must include # 1. A status code # 2. A headers dict - # 3. mock.get_redirect_location() return falsy by default + # 3. mock.get_redirect_location() return falsy # `msg` is included for testing when urllib3~=1.0.0 is installed mock_response = MagicMock(headers=headers, msg=headers, status=status) - mock_response.get_redirect_location.return_value = ( - False if redirect_location is None else redirect_location - ) + mock_response.get_redirect_location.return_value = False with patch("urllib3.connectionpool.HTTPSConnectionPool._get_conn") as getconn_mock: getconn_mock.return_value.getresponse.return_value = mock_response @@ -90,7 +86,6 @@ def mock_sequential_server_responses(responses: List[dict]): `responses` should be a list of dictionaries containing these members: - status: int - headers: dict - - redirect_location: str """ mock_responses = [] @@ -101,9 +96,7 @@ def mock_sequential_server_responses(responses: List[dict]): _mock = MagicMock( headers=resp["headers"], msg=resp["headers"], status=resp["status"] ) - _mock.get_redirect_location.return_value = ( - False if resp["redirect_location"] is None else resp["redirect_location"] - ) + _mock.get_redirect_location.return_value = False mock_responses.append(_mock) with patch("urllib3.connectionpool.HTTPSConnectionPool._get_conn") as getconn_mock: @@ -119,6 +112,7 @@ class PySQLRetryTestsMixin: # For testing purposes _retry_policy = { + "_enable_v3_retries": True, "_retry_delay_min": 0.1, "_retry_delay_max": 5, "_retry_stop_after_attempts_count": 5, @@ -226,7 +220,7 @@ def test_retry_dangerous_codes(self): with self.connection(extra_params={**self._retry_policy}) as conn: with conn.cursor() as cursor: for dangerous_code in DANGEROUS_CODES: - with mocked_server_response(status=dangerous_code): + with mocked_server_response(status=dangerous_code) as mock_obj: with self.assertRaises(RequestError) as cm: cursor.execute("Not a real query") assert isinstance(cm.exception.args[1], UnsafeToRetryError) @@ -237,7 +231,7 @@ def test_retry_dangerous_codes(self): ) as conn: with conn.cursor() as cursor: for dangerous_code in DANGEROUS_CODES: - with mocked_server_response(status=dangerous_code): + with mocked_server_response(status=dangerous_code) as mock_obj: with pytest.raises(MaxRetryError) as cm: cursor.execute("Not a real query") @@ -248,8 +242,8 @@ def test_retry_safe_execute_statement_retry_condition(self): """ responses = [ - {"status": 429, "headers": {"Retry-After": "1"}, "redirect_location": None}, - {"status": 503, "headers": {}, "redirect_location": None}, + {"status": 429, "headers": {"Retry-After": "1"}}, + {"status": 503, "headers": {}}, ] with self.connection( @@ -271,8 +265,8 @@ def test_retry_abort_close_session_on_404(self): # First response is a Bad Gateway -> Result is the command actually goes through # Second response is a 404 because the session is no longer found responses = [ - {"status": 502, "headers": {"Retry-After": "1"}, "redirect_location": None}, - {"status": 404, "headers": {}, "redirect_location": None}, + {"status": 502, "headers": {"Retry-After": "1"}}, + {"status": 404, "headers": {}}, ] with self.connection(extra_params={**self._retry_policy}) as conn: @@ -301,8 +295,8 @@ def test_retry_abort_close_operation_on_404(self): # First response is a Bad Gateway -> Result is the command actually goes through # Second response is a 404 because the session is no longer found responses = [ - {"status": 502, "headers": {"Retry-After": "1"}, "redirect_location": None}, - {"status": 404, "headers": {}, "redirect_location": None}, + {"status": 502, "headers": {"Retry-After": "1"}}, + {"status": 404, "headers": {}}, ] with self.connection(extra_params={**self._retry_policy}) as conn: @@ -329,113 +323,3 @@ def test_retry_abort_close_operation_on_404(self): self.assertTrue( expected_message_was_found, "Did not find expected log messages" ) - - def test_retry_max_redirects_raises_too_many_redirects_exception(self): - """GIVEN the connector is configured with a custom max_redirects - WHEN the DatabricksRetryPolicy is created - THEN the connector raises a MaxRedirectsError if that number is exceeded - """ - - max_redirects, expected_call_count = 1, 2 - - # Code 302 is a redirect - with mocked_server_response( - status=302, redirect_location="/foo.bar" - ) as mock_obj: - with self.assertRaises(MaxRetryError) as cm: - with self.connection( - extra_params={ - **self._retry_policy, - "_retry_max_redirects": max_redirects, - } - ): - pass - assert "too many redirects" == str(cm.exception.reason) - # Total call count should be 2 (original + 1 retry) - assert mock_obj.return_value.getresponse.call_count == expected_call_count - - def test_retry_max_redirects_unset_doesnt_redirect_forever(self): - """GIVEN the connector is configured without a custom max_redirects - WHEN the DatabricksRetryPolicy is used - THEN the connector raises a MaxRedirectsError if that number is exceeded - - This test effectively guarantees that regardless of _retry_max_redirects, - _stop_after_attempts_count is enforced. - """ - # Code 302 is a redirect - with mocked_server_response( - status=302, redirect_location="/foo.bar/" - ) as mock_obj: - with self.assertRaises(MaxRetryError) as cm: - with self.connection( - extra_params={ - **self._retry_policy, - } - ): - pass - - # Total call count should be 6 (original + _retry_stop_after_attempts_count) - assert mock_obj.return_value.getresponse.call_count == 6 - - def test_retry_max_redirects_is_bounded_by_stop_after_attempts_count(self): - # If I add another 503 or 302 here the test will fail with a MaxRetryError - responses = [ - {"status": 302, "headers": {}, "redirect_location": "/foo.bar"}, - {"status": 500, "headers": {}, "redirect_location": None}, - ] - - additional_settings = { - "_retry_max_redirects": 1, - "_retry_stop_after_attempts_count": 2, - } - - with pytest.raises(RequestError) as cm: - with mock_sequential_server_responses(responses): - with self.connection( - extra_params={**self._retry_policy, **additional_settings} - ): - pass - - # The error should be the result of the 500, not because of too many requests. - assert "too many redirects" not in str(cm.value.message) - assert "Error during request to server" in str(cm.value.message) - - def test_retry_max_redirects_exceeds_max_attempts_count_warns_user(self): - with self.assertLogs( - "databricks.sql", - level="WARN", - ) as cm: - with self.connection( - extra_params={ - **self._retry_policy, - **{ - "_retry_max_redirects": 100, - "_retry_stop_after_attempts_count": 1, - }, - } - ): - pass - expected_message_was_found = False - for log in cm.output: - if expected_message_was_found: - break - target = "it will have no affect!" - expected_message_was_found = target in log - - assert expected_message_was_found, "Did not find expected log messages" - - def test_retry_legacy_behavior_warns_user(self): - with self.assertLogs( - "databricks.sql", - level="WARN", - ) as cm: - with self.connection( - extra_params={**self._retry_policy, "_enable_v3_retries": False} - ): - expected_message_was_found = False - for log in cm.output: - if expected_message_was_found: - break - target = "Legacy retry behavior is enabled for this connection." - expected_message_was_found = target in log - assert expected_message_was_found, "Did not find expected log messages" diff --git a/tests/e2e/common/staging_ingestion_tests.py b/tests/e2e/common/staging_ingestion_tests.py index 3cdeaff7..19d5ba03 100644 --- a/tests/e2e/common/staging_ingestion_tests.py +++ b/tests/e2e/common/staging_ingestion_tests.py @@ -76,7 +76,7 @@ def test_staging_ingestion_life_cycle(self): # GET after REMOVE should fail - with pytest.raises(Error, match="Staging operation over HTTP was unsuccessful: 404"): + with pytest.raises(Error): cursor = conn.cursor() query = f"GET 'stage://tmp/{self.staging_ingestion_user}/tmp/11/15/file1.csv' TO '{new_temp_path}'" cursor.execute(query) @@ -97,7 +97,7 @@ def test_staging_ingestion_put_fails_without_staging_allowed_local_path(self): with open(fh, "wb") as fp: fp.write(original_text) - with pytest.raises(Error, match="You must provide at least one staging_allowed_local_path"): + with pytest.raises(Error): with self.connection() as conn: cursor = conn.cursor() query = f"PUT '{temp_path}' INTO 'stage://tmp/{self.staging_ingestion_user}/tmp/11/15/file1.csv' OVERWRITE" @@ -118,7 +118,7 @@ def test_staging_ingestion_put_fails_if_localFile_not_in_staging_allowed_local_p # Add junk to base_path base_path = os.path.join(base_path, "temp") - with pytest.raises(Error, match="Local file operations are restricted to paths within the configured staging_allowed_local_path"): + with pytest.raises(Error): with self.connection(extra_params={"staging_allowed_local_path": base_path}) as conn: cursor = conn.cursor() query = f"PUT '{temp_path}' INTO 'stage://tmp/{self.staging_ingestion_user}/tmp/11/15/file1.csv' OVERWRITE" @@ -221,7 +221,7 @@ def test_staging_ingestion_put_fails_if_absolute_localFile_not_in_staging_allowe staging_allowed_local_path = "/var/www/html" target_file = "/var/www/html/../html1/not_allowed.html" - with pytest.raises(Error, match="Local file operations are restricted to paths within the configured staging_allowed_local_path"): + with pytest.raises(Error): with self.connection(extra_params={"staging_allowed_local_path": staging_allowed_local_path}) as conn: cursor = conn.cursor() query = f"PUT '{target_file}' INTO 'stage://tmp/{self.staging_ingestion_user}/tmp/11/15/file1.csv' OVERWRITE" diff --git a/tests/e2e/common/uc_volume_tests.py b/tests/e2e/common/uc_volume_tests.py deleted file mode 100644 index 7493280e..00000000 --- a/tests/e2e/common/uc_volume_tests.py +++ /dev/null @@ -1,244 +0,0 @@ -import os -import tempfile - -import pytest -import databricks.sql as sql -from databricks.sql import Error - -@pytest.fixture(scope="module", autouse=True) -def check_catalog_and_schema(): - """This fixture verifies that a catalog and schema are present in the environment. - The fixture only evaluates when the test _isn't skipped_. - """ - - _catalog = os.getenv("catalog") - _schema = os.getenv("schema") - - if _catalog is None or _schema is None: - raise ValueError( - f"UC Volume tests require values for the `catalog` and `schema` environment variables. Found catalog {_catalog} schema {_schema}" - ) - -class PySQLUCVolumeTestSuiteMixin: - """Simple namespace for UC Volume tests. - - In addition to connection credentials (host, path, token) this suite requires env vars - named catalog and schema""" - - catalog, schema = os.getenv("catalog"), os.getenv("schema") - - - def test_uc_volume_life_cycle(self): - """PUT a file into the UC Volume - GET the file from the UC Volume - REMOVE the file from the UC Volume - Try to GET the file again expecting to raise an exception - """ - - # PUT should succeed - - fh, temp_path = tempfile.mkstemp() - - original_text = "hello world!".encode("utf-8") - - with open(fh, "wb") as fp: - fp.write(original_text) - - with self.connection(extra_params={"staging_allowed_local_path": temp_path}) as conn: - - cursor = conn.cursor() - query = f"PUT '{temp_path}' INTO '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv' OVERWRITE" - cursor.execute(query) - - # GET should succeed - - new_fh, new_temp_path = tempfile.mkstemp() - - with self.connection(extra_params={"staging_allowed_local_path": new_temp_path}) as conn: - cursor = conn.cursor() - query = f"GET '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv' TO '{new_temp_path}'" - cursor.execute(query) - - with open(new_fh, "rb") as fp: - fetched_text = fp.read() - - assert fetched_text == original_text - - # REMOVE should succeed - - remove_query = ( - f"REMOVE '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv'" - ) - - with self.connection(extra_params={"staging_allowed_local_path": "/"}) as conn: - cursor = conn.cursor() - cursor.execute(remove_query) - - # GET after REMOVE should fail - - with pytest.raises(Error, match="Staging operation over HTTP was unsuccessful: 404"): - cursor = conn.cursor() - query = f"GET '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv' TO '{new_temp_path}'" - cursor.execute(query) - - os.remove(temp_path) - os.remove(new_temp_path) - - - def test_uc_volume_put_fails_without_staging_allowed_local_path(self): - """PUT operations are not supported unless the connection was built with - a parameter called staging_allowed_local_path - """ - - fh, temp_path = tempfile.mkstemp() - - original_text = "hello world!".encode("utf-8") - - with open(fh, "wb") as fp: - fp.write(original_text) - - with pytest.raises(Error, match="You must provide at least one staging_allowed_local_path"): - with self.connection() as conn: - cursor = conn.cursor() - query = f"PUT '{temp_path}' INTO '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv' OVERWRITE" - cursor.execute(query) - - def test_uc_volume_put_fails_if_localFile_not_in_staging_allowed_local_path(self): - - - fh, temp_path = tempfile.mkstemp() - - original_text = "hello world!".encode("utf-8") - - with open(fh, "wb") as fp: - fp.write(original_text) - - base_path, filename = os.path.split(temp_path) - - # Add junk to base_path - base_path = os.path.join(base_path, "temp") - - with pytest.raises(Error, match="Local file operations are restricted to paths within the configured staging_allowed_local_path"): - with self.connection(extra_params={"staging_allowed_local_path": base_path}) as conn: - cursor = conn.cursor() - query = f"PUT '{temp_path}' INTO '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv' OVERWRITE" - cursor.execute(query) - - def test_uc_volume_put_fails_if_file_exists_and_overwrite_not_set(self): - """PUT a file into the staging location twice. First command should succeed. Second should fail. - """ - - - fh, temp_path = tempfile.mkstemp() - - original_text = "hello world!".encode("utf-8") - - with open(fh, "wb") as fp: - fp.write(original_text) - - def perform_put(): - with self.connection(extra_params={"staging_allowed_local_path": temp_path}) as conn: - cursor = conn.cursor() - query = f"PUT '{temp_path}' INTO '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv'" - cursor.execute(query) - - def perform_remove(): - remove_query = ( - f"REMOVE '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv'" - ) - - with self.connection(extra_params={"staging_allowed_local_path": "/"}) as conn: - cursor = conn.cursor() - cursor.execute(remove_query) - - - # Make sure file does not exist - perform_remove() - - # Put the file - perform_put() - - # Try to put it again - with pytest.raises(sql.exc.ServerOperationError, match="FILE_IN_STAGING_PATH_ALREADY_EXISTS"): - perform_put() - - # Clean up after ourselves - perform_remove() - - - def test_uc_volume_put_fails_if_absolute_localFile_not_in_staging_allowed_local_path(self): - """ - This test confirms that staging_allowed_local_path and target_file are resolved into absolute paths. - """ - - # If these two paths are not resolved absolutely, they appear to share a common path of /var/www/html - # after resolution their common path is only /var/www which should raise an exception - # Because the common path must always be equal to staging_allowed_local_path - staging_allowed_local_path = "/var/www/html" - target_file = "/var/www/html/../html1/not_allowed.html" - - with pytest.raises(Error, match="Local file operations are restricted to paths within the configured staging_allowed_local_path"): - with self.connection(extra_params={"staging_allowed_local_path": staging_allowed_local_path}) as conn: - cursor = conn.cursor() - query = f"PUT '{target_file}' INTO '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv' OVERWRITE" - cursor.execute(query) - - def test_uc_volume_empty_local_path_fails_to_parse_at_server(self): - staging_allowed_local_path = "/var/www/html" - target_file = "" - - with pytest.raises(Error, match="EMPTY_LOCAL_FILE_IN_STAGING_ACCESS_QUERY"): - with self.connection(extra_params={"staging_allowed_local_path": staging_allowed_local_path}) as conn: - cursor = conn.cursor() - query = f"PUT '{target_file}' INTO '/Volumes/{self.catalog}/{self.schema}/e2etests/file1.csv' OVERWRITE" - cursor.execute(query) - - def test_uc_volume_invalid_volume_path_fails_at_server(self): - staging_allowed_local_path = "/var/www/html" - target_file = "index.html" - - with pytest.raises(Error, match="NOT_FOUND: CATALOG"): - with self.connection(extra_params={"staging_allowed_local_path": staging_allowed_local_path}) as conn: - cursor = conn.cursor() - query = f"PUT '{target_file}' INTO '/Volumes/RANDOMSTRINGOFCHARACTERS/{self.catalog}/{self.schema}/e2etests/file1.csv' OVERWRITE" - cursor.execute(query) - - def test_uc_volume_supports_multiple_staging_allowed_local_path_values(self): - """staging_allowed_local_path may be either a path-like object or a list of path-like objects. - - This test confirms that two configured base paths: - 1 - doesn't raise an exception - 2 - allows uploads from both paths - 3 - doesn't allow uploads from a third path - """ - - def generate_file_and_path_and_queries(): - """ - 1. Makes a temp file with some contents. - 2. Write a query to PUT it into a staging location - 3. Write a query to REMOVE it from that location (for cleanup) - """ - fh, temp_path = tempfile.mkstemp() - with open(fh, "wb") as fp: - original_text = "hello world!".encode("utf-8") - fp.write(original_text) - put_query = f"PUT '{temp_path}' INTO '/Volumes/{self.catalog}/{self.schema}/e2etests/{id(temp_path)}.csv' OVERWRITE" - remove_query = f"REMOVE '/Volumes/{self.catalog}/{self.schema}/e2etests/{id(temp_path)}.csv'" - return fh, temp_path, put_query, remove_query - - fh1, temp_path1, put_query1, remove_query1 = generate_file_and_path_and_queries() - fh2, temp_path2, put_query2, remove_query2 = generate_file_and_path_and_queries() - fh3, temp_path3, put_query3, remove_query3 = generate_file_and_path_and_queries() - - with self.connection(extra_params={"staging_allowed_local_path": [temp_path1, temp_path2]}) as conn: - cursor = conn.cursor() - - cursor.execute(put_query1) - cursor.execute(put_query2) - - with pytest.raises(Error, match="Local file operations are restricted to paths within the configured staging_allowed_local_path"): - cursor.execute(put_query3) - - # Then clean up the files we made - cursor.execute(remove_query1) - cursor.execute(remove_query2) \ No newline at end of file diff --git a/src/databricks/sqlalchemy/test_local/e2e/test_basic.py b/tests/e2e/sqlalchemy/test_basic.py similarity index 56% rename from src/databricks/sqlalchemy/test_local/e2e/test_basic.py rename to tests/e2e/sqlalchemy/test_basic.py index ec54c282..f17828eb 100644 --- a/src/databricks/sqlalchemy/test_local/e2e/test_basic.py +++ b/tests/e2e/sqlalchemy/test_basic.py @@ -1,25 +1,12 @@ -import datetime -import decimal -import os -from typing import Tuple, Union, List -from unittest import skipIf - +import os, datetime, decimal import pytest -from sqlalchemy import ( - Column, - MetaData, - Table, - Text, - create_engine, - insert, - select, - text, -) +from unittest import skipIf +from sqlalchemy import create_engine, select, insert, Column, MetaData, Table +from sqlalchemy.orm import Session +from sqlalchemy.types import SMALLINT, Integer, BOOLEAN, String, DECIMAL, Date from sqlalchemy.engine import Engine -from sqlalchemy.engine.reflection import Inspector -from sqlalchemy.orm import DeclarativeBase, Mapped, Session, mapped_column -from sqlalchemy.schema import DropColumnComment, SetColumnComment -from sqlalchemy.types import BOOLEAN, DECIMAL, Date, DateTime, Integer, String + +from typing import Tuple try: from sqlalchemy.orm import declarative_base @@ -50,6 +37,7 @@ def version_agnostic_select(object_to_select, *args, **kwargs): def version_agnostic_connect_arguments(catalog=None, schema=None) -> Tuple[str, dict]: + HOST = os.environ.get("host") HTTP_PATH = os.environ.get("http_path") ACCESS_TOKEN = os.environ.get("access_token") @@ -82,17 +70,9 @@ def db_engine() -> Engine: return create_engine(conn_string, connect_args=connect_args) -def run_query(db_engine: Engine, query: Union[str, Text]): - if not isinstance(query, Text): - _query = text(query) # type: ignore - else: - _query = query # type: ignore - with db_engine.begin() as conn: - return conn.execute(_query).fetchall() - - @pytest.fixture def samples_engine() -> Engine: + conn_string, connect_args = version_agnostic_connect_arguments( catalog="samples", schema="nyctaxi" ) @@ -101,22 +81,22 @@ def samples_engine() -> Engine: @pytest.fixture() def base(db_engine): - return declarative_base() + return declarative_base(bind=db_engine) @pytest.fixture() def session(db_engine): - return Session(db_engine) + return Session(bind=db_engine) @pytest.fixture() def metadata_obj(db_engine): - return MetaData() + return MetaData(bind=db_engine) def test_can_connect(db_engine): simple_query = "SELECT 1" - result = run_query(db_engine, simple_query) + result = db_engine.execute(simple_query).fetchall() assert len(result) == 1 @@ -135,17 +115,13 @@ def test_connect_args(db_engine): @pytest.mark.skipif(sqlalchemy_1_3(), reason="Pandas requires SQLAlchemy >= 1.4") -@pytest.mark.skip( - reason="DBR is currently limited to 256 parameters per call to .execute(). Test cannot pass." -) def test_pandas_upload(db_engine, metadata_obj): + import pandas as pd SCHEMA = os.environ.get("schema") try: - df = pd.read_excel( - "src/databricks/sqlalchemy/test_local/e2e/demo_data/MOCK_DATA.xlsx" - ) + df = pd.read_excel("tests/sqlalchemy/demo_data/MOCK_DATA.xlsx") df.to_sql( "mock_data", db_engine, @@ -164,6 +140,7 @@ def test_pandas_upload(db_engine, metadata_obj): def test_create_table_not_null(db_engine, metadata_obj: MetaData): + table_name = "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")) SampleTable = Table( @@ -174,7 +151,7 @@ def test_create_table_not_null(db_engine, metadata_obj: MetaData): Column("some_bool", BOOLEAN, nullable=False), ) - metadata_obj.create_all(db_engine) + metadata_obj.create_all() columns = db_engine.dialect.get_columns( connection=db_engine.connect(), table_name=table_name @@ -186,49 +163,14 @@ def test_create_table_not_null(db_engine, metadata_obj: MetaData): assert name_column_description.get("nullable") is True assert some_bool_column_description.get("nullable") is False - metadata_obj.drop_all(db_engine) - - -def test_column_comment(db_engine, metadata_obj: MetaData): - table_name = "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")) - - column = Column("name", String(255), comment="some comment") - SampleTable = Table(table_name, metadata_obj, column) - - metadata_obj.create_all(db_engine) - connection = db_engine.connect() - - columns = db_engine.dialect.get_columns( - connection=connection, table_name=table_name - ) - - assert columns[0].get("comment") == "some comment" - - column.comment = "other comment" - connection.execute(SetColumnComment(column)) - - columns = db_engine.dialect.get_columns( - connection=connection, table_name=table_name - ) - - assert columns[0].get("comment") == "other comment" - - connection.execute(DropColumnComment(column)) - - columns = db_engine.dialect.get_columns( - connection=connection, table_name=table_name - ) - - assert columns[0].get("comment") == None - - metadata_obj.drop_all(db_engine) + metadata_obj.drop_all() def test_bulk_insert_with_core(db_engine, metadata_obj, session): + import random - # Maximum number of parameter is 256. 256/4 == 64 - num_to_insert = 64 + num_to_insert = random.choice(range(10_000, 20_000)) table_name = "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")) @@ -239,16 +181,14 @@ def test_bulk_insert_with_core(db_engine, metadata_obj, session): ) rows = [ - {"name": names[i % 3], "number": random.choice(range(64))} + {"name": names[i % 3], "number": random.choice(range(10000))} for i in range(num_to_insert) ] - metadata_obj.create_all(db_engine) - with db_engine.begin() as conn: - conn.execute(insert(SampleTable).values(rows)) + metadata_obj.create_all() + db_engine.execute(insert(SampleTable).values(rows)) - with db_engine.begin() as conn: - rows = conn.execute(version_agnostic_select(SampleTable)).fetchall() + rows = db_engine.execute(version_agnostic_select(SampleTable)).fetchall() assert len(rows) == num_to_insert @@ -265,7 +205,7 @@ def test_create_insert_drop_table_core(base, db_engine, metadata_obj: MetaData): Column("dollars", DECIMAL(10, 2)), ) - metadata_obj.create_all(db_engine) + metadata_obj.create_all() insert_stmt = insert(SampleTable).values( name="Bim Adewunmi", episodes=6, some_bool=True, dollars=decimal.Decimal(125) @@ -275,14 +215,13 @@ def test_create_insert_drop_table_core(base, db_engine, metadata_obj: MetaData): conn.execute(insert_stmt) select_stmt = version_agnostic_select(SampleTable) - with db_engine.begin() as conn: - resp = conn.execute(select_stmt) + resp = db_engine.execute(select_stmt) result = resp.fetchall() assert len(result) == 1 - metadata_obj.drop_all(db_engine) + metadata_obj.drop_all() # ORM tests are made following this tutorial @@ -290,30 +229,26 @@ def test_create_insert_drop_table_core(base, db_engine, metadata_obj: MetaData): @skipIf(False, "Unity catalog must be supported") -def test_create_insert_drop_table_orm(db_engine): +def test_create_insert_drop_table_orm(base, session: Session): """ORM classes built on the declarative base class must have a primary key. This is restricted to Unity Catalog. """ - class Base(DeclarativeBase): - pass + class SampleObject(base): - class SampleObject(Base): __tablename__ = "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")) - name: Mapped[str] = mapped_column(String(255), primary_key=True) - episodes: Mapped[int] = mapped_column(Integer) - some_bool: Mapped[bool] = mapped_column(BOOLEAN) + name = Column(String(255), primary_key=True) + episodes = Column(Integer) + some_bool = Column(BOOLEAN) - Base.metadata.create_all(db_engine) + base.metadata.create_all() sample_object_1 = SampleObject(name="Bim Adewunmi", episodes=6, some_bool=True) sample_object_2 = SampleObject(name="Miki Meek", episodes=12, some_bool=False) - - session = Session(db_engine) session.add(sample_object_1) session.add(sample_object_2) - session.flush() + session.commit() stmt = version_agnostic_select(SampleObject).where( SampleObject.name.in_(["Bim Adewunmi", "Miki Meek"]) @@ -326,15 +261,12 @@ class SampleObject(Base): assert len(output) == 2 - Base.metadata.drop_all(db_engine) + base.metadata.drop_all() -def test_dialect_type_mappings(db_engine, metadata_obj: MetaData): +def test_dialect_type_mappings(base, db_engine, metadata_obj: MetaData): """Confirms that we get back the same time we declared in a model and inserted using Core""" - class Base(DeclarativeBase): - pass - SampleTable = Table( "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")), metadata_obj, @@ -351,7 +283,7 @@ class Base(DeclarativeBase): decimal_example = decimal.Decimal(125) date_example = datetime.date(2013, 1, 1) - metadata_obj.create_all(db_engine) + metadata_obj.create_all() insert_stmt = insert(SampleTable).values( string_example=string_example, @@ -365,24 +297,25 @@ class Base(DeclarativeBase): conn.execute(insert_stmt) select_stmt = version_agnostic_select(SampleTable) - with db_engine.begin() as conn: - resp = conn.execute(select_stmt) + resp = db_engine.execute(select_stmt) result = resp.fetchall() this_row = result[0] - assert this_row.string_example == string_example - assert this_row.integer_example == integer_example - assert this_row.boolean_example == boolean_example - assert this_row.decimal_example == decimal_example - assert this_row.date_example == date_example + assert this_row["string_example"] == string_example + assert this_row["integer_example"] == integer_example + assert this_row["boolean_example"] == boolean_example + assert this_row["decimal_example"] == decimal_example + assert this_row["date_example"] == date_example - metadata_obj.drop_all(db_engine) + metadata_obj.drop_all() def test_inspector_smoke_test(samples_engine: Engine): """It does not appear that 3L namespace is supported here""" + from sqlalchemy.engine.reflection import Inspector + schema, table = "nyctaxi", "trips" try: @@ -402,21 +335,22 @@ def test_inspector_smoke_test(samples_engine: Engine): assert len(views) == 0, "Views could not be fetched" -@pytest.mark.skip(reason="engine.table_names has been removed in sqlalchemy verison 2") def test_get_table_names_smoke_test(samples_engine: Engine): + with samples_engine.connect() as conn: - _names = samples_engine.table_names(schema="nyctaxi", connection=conn) # type: ignore + _names = samples_engine.table_names(schema="nyctaxi", connection=conn) _names is not None, "get_table_names did not succeed" def test_has_table_across_schemas(db_engine: Engine, samples_engine: Engine): """For this test to pass these conditions must be met: - - Table samples.nyctaxi.trips must exist - - Table samples.tpch.customer must exist - - The `catalog` and `schema` environment variables must be set and valid + - Table samples.nyctaxi.trips must exist + - Table samples.tpch.customer must exist + - The `catalog` and `schema` environment variables must be set and valid """ with samples_engine.connect() as conn: + # 1) Check for table within schema declared at engine creation time assert samples_engine.dialect.has_table(connection=conn, table_name="trips") @@ -431,7 +365,7 @@ def test_has_table_across_schemas(db_engine: Engine, samples_engine: Engine): # Create a table in a different catalog with db_engine.connect() as conn: - conn.execute(text("CREATE TABLE test_has_table (numbers_are_cool INT);")) + conn.execute("CREATE TABLE test_has_table (numbers_are_cool INT);") try: # Verify that this table is not found in the samples catalog @@ -446,99 +380,4 @@ def test_has_table_across_schemas(db_engine: Engine, samples_engine: Engine): catalog=other_catalog, ) finally: - conn.execute(text("DROP TABLE test_has_table;")) - - -def test_user_agent_adjustment(db_engine): - # If .connect() is called multiple times on an engine, don't keep pre-pending the user agent - # https://github.com/databricks/databricks-sql-python/issues/192 - c1 = db_engine.connect() - c2 = db_engine.connect() - - def get_conn_user_agent(conn): - return conn.connection.dbapi_connection.thrift_backend._transport._headers.get( - "User-Agent" - ) - - ua1 = get_conn_user_agent(c1) - ua2 = get_conn_user_agent(c2) - same_ua = ua1 == ua2 - - c1.close() - c2.close() - - assert same_ua, f"User agents didn't match \n {ua1} \n {ua2}" - - -@pytest.fixture -def sample_table(metadata_obj: MetaData, db_engine: Engine): - """This fixture creates a sample table and cleans it up after the test is complete.""" - from databricks.sqlalchemy._parse import GET_COLUMNS_TYPE_MAP - - table_name = "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")) - - args: List[Column] = [ - Column(colname, coltype) for colname, coltype in GET_COLUMNS_TYPE_MAP.items() - ] - - SampleTable = Table(table_name, metadata_obj, *args) - - metadata_obj.create_all(db_engine) - - yield table_name - - metadata_obj.drop_all(db_engine) - - -def test_get_columns(db_engine, sample_table: str): - """Created after PECO-1297 and Github Issue #295 to verify that get_columsn behaves like it should for all known SQLAlchemy types""" - - inspector = Inspector.from_engine(db_engine) - - # this raises an exception if `parse_column_info_from_tgetcolumnsresponse` fails a lookup - columns = inspector.get_columns(sample_table) - - assert True - - -class TestCommentReflection: - @pytest.fixture(scope="class") - def engine(self): - HOST = os.environ.get("host") - HTTP_PATH = os.environ.get("http_path") - ACCESS_TOKEN = os.environ.get("access_token") - CATALOG = os.environ.get("catalog") - SCHEMA = os.environ.get("schema") - - connection_string = f"databricks://token:{ACCESS_TOKEN}@{HOST}?http_path={HTTP_PATH}&catalog={CATALOG}&schema={SCHEMA}" - connect_args = {"_user_agent_entry": USER_AGENT_TOKEN} - - engine = create_engine(connection_string, connect_args=connect_args) - return engine - - @pytest.fixture - def inspector(self, engine: Engine) -> Inspector: - return Inspector.from_engine(engine) - - @pytest.fixture(scope="class") - def table(self, engine): - md = MetaData() - tbl = Table( - "foo", - md, - Column("bar", String, comment="column comment"), - comment="table comment", - ) - md.create_all(bind=engine) - - yield tbl - - md.drop_all(bind=engine) - - def test_table_comment_reflection(self, inspector: Inspector, table: Table): - comment = inspector.get_table_comment(table.name) - assert comment == {"text": "table comment"} - - def test_column_comment(self, inspector: Inspector, table: Table): - result = inspector.get_columns(table.name)[0].get("comment") - assert result == "column comment" + conn.execute("DROP TABLE test_has_table;") diff --git a/tests/e2e/test_complex_types.py b/tests/e2e/test_complex_types.py deleted file mode 100644 index d27e8822..00000000 --- a/tests/e2e/test_complex_types.py +++ /dev/null @@ -1,63 +0,0 @@ - -import pytest -from numpy import ndarray - -from tests.e2e.test_driver import PySQLPytestTestCase - - -class TestComplexTypes(PySQLPytestTestCase): - @pytest.fixture(scope="class") - def table_fixture(self): - """A pytest fixture that creates a table with a complex type, inserts a record, yields, and then drops the table""" - - with self.cursor() as cursor: - # Create the table - cursor.execute( - """ - CREATE TABLE IF NOT EXISTS pysql_test_complex_types_table ( - array_col ARRAY, - map_col MAP, - struct_col STRUCT - ) - """ - ) - # Insert a record - cursor.execute( - """ - INSERT INTO pysql_test_complex_types_table - VALUES ( - ARRAY('a', 'b', 'c'), - MAP('a', 1, 'b', 2, 'c', 3), - NAMED_STRUCT('field1', 'a', 'field2', 1) - ) - """ - ) - yield - # Clean up the table after the test - cursor.execute("DROP TABLE IF EXISTS pysql_test_complex_types_table") - - @pytest.mark.parametrize( - "field,expected_type", - [("array_col", ndarray), ("map_col", list), ("struct_col", dict)], - ) - def test_read_complex_types_as_arrow(self, field, expected_type, table_fixture): - """Confirms the return types of a complex type field when reading as arrow""" - - with self.cursor() as cursor: - result = cursor.execute( - "SELECT * FROM pysql_test_complex_types_table LIMIT 1" - ).fetchone() - - assert isinstance(result[field], expected_type) - - @pytest.mark.parametrize("field", [("array_col"), ("map_col"), ("struct_col")]) - def test_read_complex_types_as_string(self, field, table_fixture): - """Confirms the return type of a complex type that is returned as a string""" - with self.cursor( - extra_params={"_use_arrow_native_complex_types": False} - ) as cursor: - result = cursor.execute( - "SELECT * FROM pysql_test_complex_types_table LIMIT 1" - ).fetchone() - - assert isinstance(result[field], str) diff --git a/tests/e2e/test_driver.py b/tests/e2e/test_driver.py index d823a12d..90bf5c3d 100644 --- a/tests/e2e/test_driver.py +++ b/tests/e2e/test_driver.py @@ -29,10 +29,6 @@ from tests.e2e.common.staging_ingestion_tests import PySQLStagingIngestionTestSuiteMixin from tests.e2e.common.retry_test_mixins import PySQLRetryTestsMixin -from tests.e2e.common.uc_volume_tests import PySQLUCVolumeTestSuiteMixin - -from databricks.sql.exc import SessionAlreadyClosedError - log = logging.getLogger(__name__) unsafe_logger = logging.getLogger("databricks.sql.unsafe") @@ -103,60 +99,6 @@ def assertEqualRowValues(self, actual, expected): for act, exp in zip(actual, expected): self.assertSequenceEqual(act, exp) -class PySQLPytestTestCase(): - """A mirror of PySQLTest case that doesn't inherit from unittest.TestCase - so that we can use pytest.mark.parameterize - """ - error_type = Error - conf_to_disable_rate_limit_retries = {"_retry_stop_after_attempts_count": 1} - conf_to_disable_temporarily_unavailable_retries = {"_retry_stop_after_attempts_count": 1} - arguments = os.environ if get_args_from_env else {} - arraysize = 1000 - buffer_size_bytes = 104857600 - - def connection_params(self, arguments): - params = { - "server_hostname": arguments["host"], - "http_path": arguments["http_path"], - **self.auth_params(arguments) - } - - return params - - def auth_params(self, arguments): - return { - "_username": arguments.get("rest_username"), - "_password": arguments.get("rest_password"), - "access_token": arguments.get("access_token") - } - - @contextmanager - def connection(self, extra_params=()): - connection_params = dict(self.connection_params(self.arguments), **dict(extra_params)) - - log.info("Connecting with args: {}".format(connection_params)) - conn = sql.connect(**connection_params) - - try: - yield conn - finally: - conn.close() - - @contextmanager - def cursor(self, extra_params=()): - with self.connection(extra_params) as conn: - cursor = conn.cursor(arraysize=self.arraysize, buffer_size_bytes=self.buffer_size_bytes) - try: - yield cursor - finally: - cursor.close() - - def assertEqualRowValues(self, actual, expected): - self.assertEqual(len(actual) if actual else 0, len(expected) if expected else 0) - for act, exp in zip(actual, expected): - self.assertSequenceEqual(act, exp) - - class PySQLLargeQueriesSuite(PySQLTestCase, LargeQueriesMixin): def get_some_rows(self, cursor, fetchmany_size): @@ -200,7 +142,7 @@ def test_cloud_fetch(self): # Exclude Retry tests because they require specific setups, and LargeQueries too slow for core # tests class PySQLCoreTestSuite(SmokeTestMixin, CoreTestMixin, DecimalTestsMixin, TimestampTestsMixin, - PySQLTestCase, PySQLStagingIngestionTestSuiteMixin, PySQLRetryTestsMixin, PySQLUCVolumeTestSuiteMixin): + PySQLTestCase, PySQLStagingIngestionTestSuiteMixin, PySQLRetryTestsMixin): validate_row_value_type = True validate_result = True @@ -701,9 +643,10 @@ def test_close_connection_closes_cursors(self): conn.close() # When connection closes, any cursor operations should no longer exist at the server - with self.assertRaises(SessionAlreadyClosedError) as cm: + with self.assertRaises(thrift.Thrift.TApplicationException) as cm: op_status_at_server = ars.thrift_backend._client.GetOperationStatus(status_request) - + if hasattr(cm, "exception"): + assert "RESOURCE_DOES_NOT_EXIST" in cm.exception.message def test_closing_a_closed_connection_doesnt_fail(self): @@ -756,7 +699,6 @@ def test_initial_namespace(self): self.assertEqual(cursor.fetchone()[0], table_name) - def main(cli_args): global get_args_from_env get_args_from_env = True @@ -766,4 +708,4 @@ def main(cli_args): if __name__ == "__main__": - main(sys.argv[1:]) + main(sys.argv[1:]) \ No newline at end of file diff --git a/tests/e2e/test_parameterized_queries.py b/tests/e2e/test_parameterized_queries.py deleted file mode 100644 index 97901e9c..00000000 --- a/tests/e2e/test_parameterized_queries.py +++ /dev/null @@ -1,450 +0,0 @@ -import datetime -from contextlib import contextmanager -from decimal import Decimal -from enum import Enum -from typing import Dict, List, Type, Union -from unittest.mock import patch - -import pytest -import pytz - -from databricks.sql.parameters.native import ( - BigIntegerParameter, - BooleanParameter, - DateParameter, - DbsqlParameterBase, - DecimalParameter, - DoubleParameter, - FloatParameter, - IntegerParameter, - ParameterApproach, - ParameterStructure, - SmallIntParameter, - StringParameter, - TDbsqlParameter, - TimestampNTZParameter, - TimestampParameter, - TinyIntParameter, - VoidParameter, -) -from tests.e2e.test_driver import PySQLPytestTestCase - - -class ParamStyle(Enum): - NAMED = 1 - PYFORMAT = 2 - NONE = 3 - - -class Primitive(Enum): - """These are the inferrable types. This Enum is used for parametrized tests.""" - - NONE = None - BOOL = True - INT = 50 - BIGINT = 2147483648 - STRING = "Hello" - DECIMAL = Decimal("1234.56") - DATE = datetime.date(2023, 9, 6) - TIMESTAMP = datetime.datetime(2023, 9, 6, 3, 14, 27, 843, tzinfo=pytz.UTC) - DOUBLE = 3.14 - FLOAT = 3.15 - SMALLINT = 51 - -class PrimitiveExtra(Enum): - """These are not inferrable types. This Enum is used for parametrized tests.""" - TIMESTAMP_NTZ = datetime.datetime(2023, 9, 6, 3, 14, 27, 843) - TINYINT = 20 - - -# We don't test inline approach with named paramstyle because it's never supported -# We don't test inline approach with positional parameters because it's never supported -# Paramstyle doesn't apply when ParameterStructure.POSITIONAL because question marks are used. -approach_paramstyle_combinations = [ - (ParameterApproach.INLINE, ParamStyle.PYFORMAT, ParameterStructure.NAMED), - (ParameterApproach.NATIVE, ParamStyle.NONE, ParameterStructure.POSITIONAL), - (ParameterApproach.NATIVE, ParamStyle.PYFORMAT, ParameterStructure.NAMED), - (ParameterApproach.NATIVE, ParamStyle.NONE, ParameterStructure.POSITIONAL), - (ParameterApproach.NATIVE, ParamStyle.NAMED, ParameterStructure.NAMED), -] - - -class TestParameterizedQueries(PySQLPytestTestCase): - """Namespace for tests of this connector's parameterisation behaviour. - - databricks-sql-connector can approach parameterisation in two ways: - - NATIVE: the connector will use server-side bound parameters implemented by DBR 14.1 and above. - INLINE: the connector will render parameter values as strings and interpolate them into the query. - - Prior to connector version 3.0.0, the connector would always use the INLINE approach. This approach - is still the default but this will be changed in a subsequent release. - - The INLINE and NATIVE approaches use different query syntax, which these tests verify. - - There is not 1-to-1 feature parity between these approaches. Where possible, we run the same test - for @both_approaches. - """ - - NAMED_PARAMSTYLE_QUERY = "SELECT :p AS col" - PYFORMAT_PARAMSTYLE_QUERY = "SELECT %(p)s AS col" - POSITIONAL_PARAMSTYLE_QUERY = "SELECT ? AS col" - - inline_type_map = { - Primitive.INT: "int_col", - Primitive.BIGINT: "bigint_col", - Primitive.SMALLINT: "small_int_col", - Primitive.FLOAT: "float_col", - Primitive.DOUBLE: "double_col", - Primitive.DECIMAL: "decimal_col", - Primitive.STRING: "string_col", - Primitive.BOOL: "boolean_col", - Primitive.DATE: "date_col", - Primitive.TIMESTAMP: "timestamp_col", - Primitive.NONE: "null_col", - } - - def _get_inline_table_column(self, value): - return self.inline_type_map[Primitive(value)] - - @pytest.fixture(scope="class") - def inline_table(self): - """This table is necessary to verify that a parameter sent with INLINE - approach can actually write to its analogous data type. - - For example, a Python Decimal(), when rendered inline, should be able - to read/write into a DECIMAL column in Databricks - - Note that this fixture doesn't clean itself up. So the table will remain - in the schema for use by subsequent test runs. - """ - - query = """ - CREATE TABLE IF NOT EXISTS pysql_e2e_inline_param_test_table ( - null_col INT, - int_col INT, - bigint_col BIGINT, - small_int_col SMALLINT, - float_col FLOAT, - double_col DOUBLE, - decimal_col DECIMAL(10, 2), - string_col STRING, - boolean_col BOOLEAN, - date_col DATE, - timestamp_col TIMESTAMP - ) USING DELTA - """ - - with self.connection() as conn: - with conn.cursor() as cursor: - cursor.execute(query) - - @contextmanager - def patch_server_supports_native_params(self, supports_native_params: bool = True): - """Applies a patch so we can test the connector's behaviour under different SPARK_CLI_SERVICE_PROTOCOL_VERSION conditions.""" - - with patch( - "databricks.sql.client.Connection.server_parameterized_queries_enabled", - return_value=supports_native_params, - ) as mock_parameterized_queries_enabled: - try: - yield mock_parameterized_queries_enabled - finally: - pass - - def _inline_roundtrip(self, params: dict, paramstyle: ParamStyle): - """This INSERT, SELECT, DELETE dance is necessary because simply selecting - ``` - "SELECT %(param)s" - ``` - in INLINE mode would always return a str and the nature of the test is to - confirm that types are maintained. - - :paramstyle: - This is a no-op but is included to make the test-code easier to read. - """ - target_column = self._get_inline_table_column(params.get("p")) - INSERT_QUERY = f"INSERT INTO pysql_e2e_inline_param_test_table (`{target_column}`) VALUES (%(p)s)" - SELECT_QUERY = f"SELECT {target_column} `col` FROM pysql_e2e_inline_param_test_table LIMIT 1" - DELETE_QUERY = "DELETE FROM pysql_e2e_inline_param_test_table" - - with self.connection(extra_params={"use_inline_params": True}) as conn: - with conn.cursor() as cursor: - cursor.execute(INSERT_QUERY, parameters=params) - with conn.cursor() as cursor: - to_return = cursor.execute(SELECT_QUERY).fetchone() - with conn.cursor() as cursor: - cursor.execute(DELETE_QUERY) - - return to_return - - def _native_roundtrip( - self, - parameters: Union[Dict, List[Dict]], - paramstyle: ParamStyle, - parameter_structure: ParameterStructure, - ): - if parameter_structure == ParameterStructure.POSITIONAL: - _query = self.POSITIONAL_PARAMSTYLE_QUERY - elif paramstyle == ParamStyle.NAMED: - _query = self.NAMED_PARAMSTYLE_QUERY - elif paramstyle == ParamStyle.PYFORMAT: - _query = self.PYFORMAT_PARAMSTYLE_QUERY - with self.connection(extra_params={"use_inline_params": False}) as conn: - with conn.cursor() as cursor: - cursor.execute(_query, parameters=parameters) - return cursor.fetchone() - - def _get_one_result( - self, - params, - approach: ParameterApproach = ParameterApproach.NONE, - paramstyle: ParamStyle = ParamStyle.NONE, - parameter_structure: ParameterStructure = ParameterStructure.NONE, - ): - """When approach is INLINE then we use %(param)s paramstyle and a connection with use_inline_params=True - When approach is NATIVE then we use :param paramstyle and a connection with use_inline_params=False - """ - - if approach == ParameterApproach.INLINE: - # inline mode always uses ParamStyle.PYFORMAT - # inline mode doesn't support positional parameters - return self._inline_roundtrip(params, paramstyle=ParamStyle.PYFORMAT) - elif approach == ParameterApproach.NATIVE: - # native mode can use either ParamStyle.NAMED or ParamStyle.PYFORMAT - # native mode can use either ParameterStructure.NAMED or ParameterStructure.POSITIONAL - return self._native_roundtrip( - params, paramstyle=paramstyle, parameter_structure=parameter_structure - ) - - def _quantize(self, input: Union[float, int], place_value=2) -> Decimal: - return Decimal(str(input)).quantize(Decimal("0." + "0" * place_value)) - - def _eq(self, actual, expected: Primitive): - """This is a helper function to make the test code more readable. - - If primitive is Primitive.DOUBLE than an extra quantize step is performed before - making the assertion. - """ - if expected in (Primitive.DOUBLE, Primitive.FLOAT): - return self._quantize(actual) == self._quantize(expected.value) - - return actual == expected.value - - @pytest.mark.parametrize("primitive", Primitive) - @pytest.mark.parametrize( - "approach,paramstyle,parameter_structure", approach_paramstyle_combinations - ) - def test_primitive_single( - self, - approach, - paramstyle, - parameter_structure, - primitive: Primitive, - inline_table, - ): - """When ParameterApproach.INLINE is passed, inferrence will not be used. - When ParameterApproach.NATIVE is passed, primitive inputs will be inferred. - """ - - if parameter_structure == ParameterStructure.NAMED: - params = {"p": primitive.value} - elif parameter_structure == ParameterStructure.POSITIONAL: - params = [primitive.value] - - result = self._get_one_result(params, approach, paramstyle, parameter_structure) - - assert self._eq(result.col, primitive) - - @pytest.mark.parametrize( - "parameter_structure", (ParameterStructure.NAMED, ParameterStructure.POSITIONAL) - ) - @pytest.mark.parametrize( - "primitive,dbsql_parameter_cls", - [ - (Primitive.NONE, VoidParameter), - (Primitive.BOOL, BooleanParameter), - (Primitive.INT, IntegerParameter), - (Primitive.BIGINT, BigIntegerParameter), - (Primitive.STRING, StringParameter), - (Primitive.DECIMAL, DecimalParameter), - (Primitive.DATE, DateParameter), - (Primitive.TIMESTAMP, TimestampParameter), - (Primitive.DOUBLE, DoubleParameter), - (Primitive.FLOAT, FloatParameter), - (Primitive.SMALLINT, SmallIntParameter), - (PrimitiveExtra.TIMESTAMP_NTZ, TimestampNTZParameter), - (PrimitiveExtra.TINYINT, TinyIntParameter) - ], - ) - def test_dbsqlparameter_single( - self, - primitive: Primitive, - dbsql_parameter_cls: Type[TDbsqlParameter], - parameter_structure: ParameterStructure, - ): - dbsql_param = dbsql_parameter_cls( - value=primitive.value, # type: ignore - name="p" if parameter_structure == ParameterStructure.NAMED else None, - ) - - params = [dbsql_param] - result = self._get_one_result( - params, ParameterApproach.NATIVE, ParamStyle.NAMED, parameter_structure - ) - assert self._eq(result.col, primitive) - - @pytest.mark.parametrize("use_inline_params", (True, False, "silent")) - def test_use_inline_off_by_default_with_warning(self, use_inline_params, caplog): - """ - use_inline_params should be False by default. - If a user explicitly sets use_inline_params, don't warn them about it. - """ - - extra_args = ( - {"use_inline_params": use_inline_params} if use_inline_params else {} - ) - - with self.connection(extra_params=extra_args) as conn: - with conn.cursor() as cursor: - with self.patch_server_supports_native_params( - supports_native_params=True - ): - cursor.execute("SELECT %(p)s", parameters={"p": 1}) - if use_inline_params is True: - assert ( - "Consider using native parameters." in caplog.text - ), "Log message should be suppressed" - elif use_inline_params == "silent": - assert ( - "Consider using native parameters." not in caplog.text - ), "Log message should not be supressed" - - def test_positional_native_params_with_defaults(self): - query = "SELECT ? col" - with self.cursor() as cursor: - result = cursor.execute(query, parameters=[1]).fetchone() - - assert result.col == 1 - - @pytest.mark.parametrize( - "params", - ( - [ - StringParameter(value="foo"), - StringParameter(value="bar"), - StringParameter(value="baz"), - ], - ["foo", "bar", "baz"], - ), - ) - def test_positional_native_multiple(self, params): - query = "SELECT ? `foo`, ? `bar`, ? `baz`" - - with self.cursor(extra_params={"use_inline_params": False}) as cursor: - result = cursor.execute(query, params).fetchone() - - expected = [i.value if isinstance(i, DbsqlParameterBase) else i for i in params] - outcome = [result.foo, result.bar, result.baz] - - assert set(outcome) == set(expected) - - def test_readme_example(self): - with self.cursor() as cursor: - result = cursor.execute('SELECT :param `p`, * FROM RANGE(10)', {"param": "foo"}).fetchall() - - assert len(result) == 10 - assert result[0].p == "foo" - - -class TestInlineParameterSyntax(PySQLPytestTestCase): - """The inline parameter approach uses pyformat markers""" - - def test_params_as_dict(self): - query = "SELECT %(foo)s foo, %(bar)s bar, %(baz)s baz" - params = {"foo": 1, "bar": 2, "baz": 3} - - with self.connection(extra_params={"use_inline_params": True}) as conn: - with conn.cursor() as cursor: - result = cursor.execute(query, parameters=params).fetchone() - - assert result.foo == 1 - assert result.bar == 2 - assert result.baz == 3 - - def test_params_as_sequence(self): - """One side-effect of ParamEscaper using Python string interpolation to inline the values - is that it can work with "ordinal" parameters, but only if a user writes parameter markers - that are not defined with PEP-249. This test exists to prove that it works in the ideal case. - """ - - # `%s` is not a valid paramstyle per PEP-249 - query = "SELECT %s foo, %s bar, %s baz" - params = (1, 2, 3) - - with self.connection(extra_params={"use_inline_params": True}) as conn: - with conn.cursor() as cursor: - result = cursor.execute(query, parameters=params).fetchone() - assert result.foo == 1 - assert result.bar == 2 - assert result.baz == 3 - - def test_inline_ordinals_can_break_sql(self): - """With inline mode, ordinal parameters can break the SQL syntax - because `%` symbols are used to wildcard match within LIKE statements. This test - just proves that's the case. - """ - query = "SELECT 'samsonite', %s WHERE 'samsonite' LIKE '%sonite'" - params = ["luggage"] - with self.cursor(extra_params={"use_inline_params": True}) as cursor: - with pytest.raises( - TypeError, match="not enough arguments for format string" - ): - cursor.execute(query, parameters=params) - - def test_inline_named_dont_break_sql(self): - """With inline mode, ordinal parameters can break the SQL syntax - because `%` symbols are used to wildcard match within LIKE statements. This test - just proves that's the case. - """ - query = """ - with base as (SELECT 'x(one)sonite' as `col_1`) - SELECT col_1 FROM base WHERE col_1 LIKE CONCAT(%(one)s, 'onite') - """ - params = {"one": "%(one)s"} - with self.cursor(extra_params={"use_inline_params": True}) as cursor: - result = cursor.execute(query, parameters=params).fetchone() - print("hello") - - def test_native_ordinals_dont_break_sql(self): - """This test accompanies test_inline_ordinals_can_break_sql to prove that ordinal - parameters work in native mode for the exact same query, if we use the right marker `?` - """ - query = "SELECT 'samsonite', ? WHERE 'samsonite' LIKE '%sonite'" - params = ["luggage"] - with self.cursor(extra_params={"use_inline_params": False}) as cursor: - result = cursor.execute(query, parameters=params).fetchone() - - assert result.samsonite == "samsonite" - assert result.luggage == "luggage" - - def test_inline_like_wildcard_breaks(self): - """One flaw with the ParameterEscaper is that it fails if a query contains - a SQL LIKE wildcard %. This test proves that's the case. - """ - query = "SELECT 1 `col` WHERE 'foo' LIKE '%'" - params ={"param": 'bar'} - with self.cursor(extra_params={"use_inline_params": True}) as cursor: - with pytest.raises(ValueError, match="unsupported format character"): - result = cursor.execute(query, parameters=params).fetchone() - - def test_native_like_wildcard_works(self): - """This is a mirror of test_inline_like_wildcard_breaks that proves that LIKE - wildcards work under the native approach. - """ - query = "SELECT 1 `col` WHERE 'foo' LIKE '%'" - params ={"param": 'bar'} - with self.cursor(extra_params={"use_inline_params": False}) as cursor: - result = cursor.execute(query, parameters=params).fetchone() - - assert result.col == 1 diff --git a/src/databricks/sqlalchemy/test_local/e2e/MOCK_DATA.xlsx b/tests/sqlalchemy/demo_data/MOCK_DATA.xlsx similarity index 100% rename from src/databricks/sqlalchemy/test_local/e2e/MOCK_DATA.xlsx rename to tests/sqlalchemy/demo_data/MOCK_DATA.xlsx diff --git a/tests/unit/test_init_file.py b/tests/unit/test_init_file.py deleted file mode 100644 index 75b15ac1..00000000 --- a/tests/unit/test_init_file.py +++ /dev/null @@ -1,19 +0,0 @@ -import hashlib - - -class TestInitFile: - """ - Micro test to confirm the contents of `databricks/__init__.py` does not change. - - Also see https://github.com/databricks/databricks-sdk-py/issues/343#issuecomment-1866029118. - """ - - def test_init_file_contents(self): - with open("src/databricks/__init__.py") as f: - init_file_contents = f.read() - - # This hash is the expected hash of the contents of `src/databricks/__init__.py`. - # It must not change, or else parallel package installation may lead to clobbered and invalid files. - expected_sha1 = "2772edbf52e517542acf8c039479c4b57b6ca2cd" - actual_sha1 = hashlib.sha1(init_file_contents.encode("utf-8")).hexdigest() - assert expected_sha1 == actual_sha1 diff --git a/tests/unit/test_param_escaper.py b/tests/unit/test_param_escaper.py index 5e695ae9..6c1f1770 100644 --- a/tests/unit/test_param_escaper.py +++ b/tests/unit/test_param_escaper.py @@ -1,130 +1,104 @@ from datetime import date, datetime import unittest, pytest, decimal -from typing import Any, Dict -from databricks.sql.parameters.native import dbsql_parameter_from_primitive -from databricks.sql.utils import ParamEscaper, inject_parameters, transform_paramstyle, ParameterStructure +from databricks.sql.utils import ParamEscaper, inject_parameters pe = ParamEscaper() - class TestIndividualFormatters(object): + # Test individual type escapers def test_escape_number_integer(self): - """This behaviour falls back to Python's default string formatting of numbers""" + """This behaviour falls back to Python's default string formatting of numbers + """ assert pe.escape_number(100) == 100 def test_escape_number_float(self): - """This behaviour falls back to Python's default string formatting of numbers""" + """This behaviour falls back to Python's default string formatting of numbers + """ assert pe.escape_number(100.1234) == 100.1234 def test_escape_number_decimal(self): - """This behaviour uses the string representation of a decimal""" + """This behaviour uses the string representation of a decimal + """ assert pe.escape_decimal(decimal.Decimal("124.32")) == "124.32" def test_escape_string_normal(self): - """ """ + """ + """ assert pe.escape_string("golly bob howdy") == "'golly bob howdy'" def test_escape_string_that_includes_special_characters(self): - """Tests for how special characters are treated. + """Tests for how special characters are treated. - When passed a string, the `escape_string` method wraps it in single quotes - and escapes any special characters with a back stroke (\) + When passed a string, the `escape_string` method wraps it in single quotes + and escapes any special characters with a back stroke (\) - Example: + Example: - IN : his name was 'robert palmer' - OUT: 'his name was \'robert palmer\'' - """ + IN : his name was 'robert palmer' + OUT: 'his name was \'robert palmer\'' + """ + + # Testing for the presence of these characters: '"/\😂 + + assert pe.escape_string("his name was 'robert palmer'") == r"'his name was \'robert palmer\''" + + # These tests represent the same user input in the several ways it can be written in Python + # Each argument to `escape_string` evaluates to the same bytes. But Python lets us write it differently. + assert pe.escape_string("his name was \"robert palmer\"") == "'his name was \"robert palmer\"'" + assert pe.escape_string('his name was "robert palmer"') == "'his name was \"robert palmer\"'" + assert pe.escape_string('his name was {}'.format('"robert palmer"')) == "'his name was \"robert palmer\"'" + + assert pe.escape_string("his name was robert / palmer") == r"'his name was robert / palmer'" - # Testing for the presence of these characters: '"/\😂 - - assert ( - pe.escape_string("his name was 'robert palmer'") - == r"'his name was \'robert palmer\''" - ) - - # These tests represent the same user input in the several ways it can be written in Python - # Each argument to `escape_string` evaluates to the same bytes. But Python lets us write it differently. - assert ( - pe.escape_string('his name was "robert palmer"') - == "'his name was \"robert palmer\"'" - ) - assert ( - pe.escape_string('his name was "robert palmer"') - == "'his name was \"robert palmer\"'" - ) - assert ( - pe.escape_string("his name was {}".format('"robert palmer"')) - == "'his name was \"robert palmer\"'" - ) - - assert ( - pe.escape_string("his name was robert / palmer") - == r"'his name was robert / palmer'" - ) - - # If you need to include a single backslash, use an r-string to prevent Python from raising a - # DeprecationWarning for an invalid escape sequence - assert ( - pe.escape_string("his name was robert \\/ palmer") - == r"'his name was robert \\/ palmer'" - ) - assert ( - pe.escape_string("his name was robert \\ palmer") - == r"'his name was robert \\ palmer'" - ) - assert ( - pe.escape_string("his name was robert \\\\ palmer") - == r"'his name was robert \\\\ palmer'" - ) - - assert ( - pe.escape_string("his name was robert palmer 😂") - == r"'his name was robert palmer 😂'" - ) - - # Adding the test from PR #56 to prove escape behaviour - - assert pe.escape_string("you're") == r"'you\'re'" - - # Adding this test from #51 to prove escape behaviour when the target string involves repeated SQL escape chars - assert pe.escape_string("cat\\'s meow") == r"'cat\\\'s meow'" - - # Tests from the docs: https://docs.databricks.com/sql/language-manual/data-types/string-type.html - - assert pe.escape_string("Spark") == "'Spark'" - assert pe.escape_string("O'Connell") == r"'O\'Connell'" - assert pe.escape_string("Some\\nText") == r"'Some\\nText'" - assert pe.escape_string("Some\\\\nText") == r"'Some\\\\nText'" - assert pe.escape_string("서울시") == "'서울시'" - assert pe.escape_string("\\\\") == r"'\\\\'" + # If you need to include a single backslash, use an r-string to prevent Python from raising a + # DeprecationWarning for an invalid escape sequence + assert pe.escape_string("his name was robert \\/ palmer") == r"'his name was robert \\/ palmer'" + assert pe.escape_string("his name was robert \\ palmer") == r"'his name was robert \\ palmer'" + assert pe.escape_string("his name was robert \\\\ palmer") == r"'his name was robert \\\\ palmer'" + + assert pe.escape_string("his name was robert palmer 😂") == r"'his name was robert palmer 😂'" + + # Adding the test from PR #56 to prove escape behaviour + + assert pe.escape_string("you're") == r"'you\'re'" + + # Adding this test from #51 to prove escape behaviour when the target string involves repeated SQL escape chars + assert pe.escape_string("cat\\'s meow") == r"'cat\\\'s meow'" + + # Tests from the docs: https://docs.databricks.com/sql/language-manual/data-types/string-type.html + + assert pe.escape_string('Spark') == "'Spark'" + assert pe.escape_string("O'Connell") == r"'O\'Connell'" + assert pe.escape_string("Some\\nText") == r"'Some\\nText'" + assert pe.escape_string("Some\\\\nText") == r"'Some\\\\nText'" + assert pe.escape_string("서울시") == "'서울시'" + assert pe.escape_string("\\\\") == r"'\\\\'" def test_escape_date_time(self): - INPUT = datetime(1991, 8, 3, 21, 55) + INPUT = datetime(1991,8,3,21,55) FORMAT = "%Y-%m-%d %H:%M:%S" OUTPUT = "'1991-08-03 21:55:00'" assert pe.escape_datetime(INPUT, FORMAT) == OUTPUT def test_escape_date(self): - INPUT = date(1991, 8, 3) + INPUT = date(1991,8,3) FORMAT = "%Y-%m-%d" OUTPUT = "'1991-08-03'" assert pe.escape_datetime(INPUT, FORMAT) == OUTPUT def test_escape_sequence_integer(self): - assert pe.escape_sequence([1, 2, 3, 4]) == "(1,2,3,4)" + assert pe.escape_sequence([1,2,3,4]) == "(1,2,3,4)" def test_escape_sequence_float(self): - assert pe.escape_sequence([1.1, 2.2, 3.3, 4.4]) == "(1.1,2.2,3.3,4.4)" + assert pe.escape_sequence([1.1,2.2,3.3,4.4]) == "(1.1,2.2,3.3,4.4)" def test_escape_sequence_string(self): - assert ( - pe.escape_sequence(["his", "name", "was", "robert", "palmer"]) - == "('his','name','was','robert','palmer')" - ) + assert pe.escape_sequence( + ["his", "name", "was", "robert", "palmer"]) == \ + "('his','name','was','robert','palmer')" def test_escape_sequence_sequence_of_strings(self): # This is not valid SQL. @@ -135,7 +109,9 @@ def test_escape_sequence_sequence_of_strings(self): class TestFullQueryEscaping(object): + def test_simple(self): + INPUT = """ SELECT field1, @@ -164,6 +140,7 @@ def test_simple(self): @unittest.skipUnless(False, "Thrift server supports native parameter binding.") def test_only_bind_in_where_clause(self): + INPUT = """ SELECT %(field)s, @@ -176,50 +153,3 @@ def test_only_bind_in_where_clause(self): with pytest.raises(Exception): inject_parameters(INPUT, pe.escape_args(args)) - - -class TestInlineToNativeTransformer(object): - @pytest.mark.parametrize( - ("label", "query", "params", "expected"), - ( - ("no effect", "SELECT 1", {}, "SELECT 1"), - ("one marker", "%(param)s", {"param": ""}, ":param"), - ( - "multiple markers", - "%(foo)s %(bar)s %(baz)s", - {"foo": None, "bar": None, "baz": None}, - ":foo :bar :baz", - ), - ( - "sql query", - "SELECT * FROM table WHERE field = %(param)s AND other_field IN (%(list)s)", - {"param": None, "list": None}, - "SELECT * FROM table WHERE field = :param AND other_field IN (:list)", - ), - ( - "query with like wildcard", - 'select * from table where field like "%"', - {}, - 'select * from table where field like "%"' - ), - ( - "query with named param and like wildcard", - 'select :param from table where field like "%"', - {"param": None}, - 'select :param from table where field like "%"' - ), - ( - "query with doubled wildcards", - 'select 1 where '' like "%%"', - {"param": None}, - 'select 1 where '' like "%%"', - ) - ), - ) - def test_transformer( - self, label: str, query: str, params: Dict[str, Any], expected: str - ): - - _params = [dbsql_parameter_from_primitive(value=value, name=name) for name, value in params.items()] - output = transform_paramstyle(query, _params, param_structure=ParameterStructure.NAMED) - assert output == expected diff --git a/tests/unit/test_parameters.py b/tests/unit/test_parameters.py deleted file mode 100644 index eec921e4..00000000 --- a/tests/unit/test_parameters.py +++ /dev/null @@ -1,204 +0,0 @@ -import datetime -from decimal import Decimal -from enum import Enum -from typing import Type - -import pytest -import pytz - -from databricks.sql.client import Connection -from databricks.sql.parameters import ( - BigIntegerParameter, - BooleanParameter, - DateParameter, - DecimalParameter, - DoubleParameter, - FloatParameter, - IntegerParameter, - SmallIntParameter, - StringParameter, - TimestampNTZParameter, - TimestampParameter, - TinyIntParameter, - VoidParameter, -) -from databricks.sql.parameters.native import ( - TDbsqlParameter, - TSparkParameterValue, - dbsql_parameter_from_primitive, -) -from databricks.sql.thrift_api.TCLIService import ttypes -from databricks.sql.thrift_api.TCLIService.ttypes import ( - TOpenSessionResp, - TSessionHandle, - TSparkParameterValue, -) - - -class TestSessionHandleChecks(object): - @pytest.mark.parametrize( - "test_input,expected", - [ - ( - TOpenSessionResp( - serverProtocolVersion=ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V7, - sessionHandle=TSessionHandle(1, None), - ), - ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V7, - ), - # Ensure that protocol version inside sessionhandle takes precedence. - ( - TOpenSessionResp( - serverProtocolVersion=ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V7, - sessionHandle=TSessionHandle( - 1, ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8 - ), - ), - ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8, - ), - ], - ) - def test_get_protocol_version_fallback_behavior(self, test_input, expected): - assert Connection.get_protocol_version(test_input) == expected - - @pytest.mark.parametrize( - "test_input,expected", - [ - ( - None, - False, - ), - ( - ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V7, - False, - ), - ( - ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8, - True, - ), - ], - ) - def test_parameters_enabled(self, test_input, expected): - assert Connection.server_parameterized_queries_enabled(test_input) == expected - - -@pytest.mark.parametrize( - "value,expected", - ( - (Decimal("10.00"), "DECIMAL(4,2)"), - (Decimal("123456789123456789.123456789123456789"), "DECIMAL(36,18)"), - (Decimal(".12345678912345678912345678912345678912"), "DECIMAL(38,38)"), - (Decimal("123456789.123456789"), "DECIMAL(18,9)"), - (Decimal("12345678912345678912345678912345678912"), "DECIMAL(38,0)"), - (Decimal("1234.56"), "DECIMAL(6,2)"), - ), -) -def test_calculate_decimal_cast_string(value, expected): - p = DecimalParameter(value) - assert p._cast_expr() == expected - - -class Primitive(Enum): - """These are the inferrable types. This Enum is used for parametrized tests.""" - - NONE = None - BOOL = True - INT = 50 - BIGINT = 2147483648 - STRING = "Hello" - DECIMAL = Decimal("1234.56") - DATE = datetime.date(2023, 9, 6) - TIMESTAMP = datetime.datetime(2023, 9, 6, 3, 14, 27, 843, tzinfo=pytz.UTC) - DOUBLE = 3.14 - FLOAT = 3.15 - SMALLINT = 51 - - -class TestDbsqlParameter: - @pytest.mark.parametrize( - "_type, prim, expect_cast_expr", - ( - (DecimalParameter, Primitive.DECIMAL, "DECIMAL(6,2)"), - (IntegerParameter, Primitive.INT, "INT"), - (StringParameter, Primitive.STRING, "STRING"), - (BigIntegerParameter, Primitive.BIGINT, "BIGINT"), - (BooleanParameter, Primitive.BOOL, "BOOLEAN"), - (DateParameter, Primitive.DATE, "DATE"), - (DoubleParameter, Primitive.DOUBLE, "DOUBLE"), - (FloatParameter, Primitive.FLOAT, "FLOAT"), - (VoidParameter, Primitive.NONE, "VOID"), - (SmallIntParameter, Primitive.INT, "SMALLINT"), - (TimestampParameter, Primitive.TIMESTAMP, "TIMESTAMP"), - (TimestampNTZParameter, Primitive.TIMESTAMP, "TIMESTAMP_NTZ"), - (TinyIntParameter, Primitive.INT, "TINYINT"), - ), - ) - def test_cast_expression( - self, _type: TDbsqlParameter, prim: Primitive, expect_cast_expr: str - ): - p = _type(prim.value) - assert p._cast_expr() == expect_cast_expr - - @pytest.mark.parametrize( - "t, prim", - ( - (DecimalParameter, Primitive.DECIMAL), - (IntegerParameter, Primitive.INT), - (StringParameter, Primitive.STRING), - (BigIntegerParameter, Primitive.BIGINT), - (BooleanParameter, Primitive.BOOL), - (DateParameter, Primitive.DATE), - (DoubleParameter, Primitive.DOUBLE), - (FloatParameter, Primitive.FLOAT), - (VoidParameter, Primitive.NONE), - (SmallIntParameter, Primitive.INT), - (TimestampParameter, Primitive.TIMESTAMP), - (TimestampNTZParameter, Primitive.TIMESTAMP), - (TinyIntParameter, Primitive.INT), - ), - ) - def test_tspark_param_value(self, t: TDbsqlParameter, prim): - p: TDbsqlParameter = t(prim.value) - output = p._tspark_param_value() - - if prim == Primitive.NONE: - assert output == None - else: - assert output == TSparkParameterValue(stringValue=str(prim.value)) - - def test_tspark_param_named(self): - p = dbsql_parameter_from_primitive(Primitive.INT.value, name="p") - tsp = p.as_tspark_param(named=True) - - assert tsp.name == "p" - assert tsp.ordinal is False - - def test_tspark_param_ordinal(self): - p = dbsql_parameter_from_primitive(Primitive.INT.value, name="p") - tsp = p.as_tspark_param(named=False) - - assert tsp.name is None - assert tsp.ordinal is True - - @pytest.mark.parametrize( - "_type, prim", - ( - (DecimalParameter, Primitive.DECIMAL), - (IntegerParameter, Primitive.INT), - (StringParameter, Primitive.STRING), - (BigIntegerParameter, Primitive.BIGINT), - (BooleanParameter, Primitive.BOOL), - (DateParameter, Primitive.DATE), - (FloatParameter, Primitive.FLOAT), - (VoidParameter, Primitive.NONE), - (TimestampParameter, Primitive.TIMESTAMP), - ), - ) - def test_inference(self, _type: TDbsqlParameter, prim: Primitive): - """This method only tests inferrable types. - - Not tested are TinyIntParameter, SmallIntParameter DoubleParameter and TimestampNTZParameter - """ - - inferred_type = dbsql_parameter_from_primitive(prim.value) - assert isinstance(inferred_type, _type) diff --git a/tests/unit/test_thrift_backend.py b/tests/unit/test_thrift_backend.py index 92c664a0..3668213c 100644 --- a/tests/unit/test_thrift_backend.py +++ b/tests/unit/test_thrift_backend.py @@ -66,7 +66,7 @@ def test_make_request_checks_thrift_status_code(self): thrift_backend.make_request(mock_method, Mock()) def _make_type_desc(self, type): - return ttypes.TTypeDesc(types=[ttypes.TTypeEntry(ttypes.TTAllowedParameterValueEntry(type=type))]) + return ttypes.TTypeDesc(types=[ttypes.TTypeEntry(ttypes.TPrimitiveTypeEntry(type=type))]) def _make_fake_thrift_backend(self): thrift_backend = ThriftBackend("foobar", 443, "path", [], auth_provider=AuthProvider()) @@ -212,18 +212,6 @@ def test_port_and_host_are_respected(self, t_http_client_class): self.assertEqual(t_http_client_class.call_args[1]["uri_or_host"], "https://hostname:123/path_value") - @patch("databricks.sql.auth.thrift_http_client.THttpClient") - def test_host_with_https_does_not_duplicate(self, t_http_client_class): - ThriftBackend("https://hostname", 123, "path_value", [], auth_provider=AuthProvider()) - self.assertEqual(t_http_client_class.call_args[1]["uri_or_host"], - "https://hostname:123/path_value") - - @patch("databricks.sql.auth.thrift_http_client.THttpClient") - def test_host_with_trailing_backslash_does_not_duplicate(self, t_http_client_class): - ThriftBackend("https://hostname/", 123, "path_value", [], auth_provider=AuthProvider()) - self.assertEqual(t_http_client_class.call_args[1]["uri_or_host"], - "https://hostname:123/path_value") - @patch("databricks.sql.auth.thrift_http_client.THttpClient") def test_socket_timeout_is_propagated(self, t_http_client_class): ThriftBackend("hostname", 123, "path_value", [], auth_provider=AuthProvider(), _socket_timeout=129) @@ -282,7 +270,7 @@ def test_hive_schema_to_description_preserves_scale_and_precision(self): columnName="column 1", typeDesc=ttypes.TTypeDesc(types=[ ttypes.TTypeEntry( - ttypes.TTAllowedParameterValueEntry( + ttypes.TPrimitiveTypeEntry( type=ttypes.TTypeId.DECIMAL_TYPE, typeQualifiers=ttypes.TTypeQualifiers( qualifiers={ diff --git a/tests/unit/test_client.py b/tests/unit/tests.py similarity index 83% rename from tests/unit/test_client.py rename to tests/unit/tests.py index 9e1a66c7..74274373 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/tests.py @@ -2,17 +2,11 @@ import re import sys import unittest -from unittest.mock import patch, MagicMock, Mock, PropertyMock +from unittest.mock import patch, MagicMock, Mock import itertools from decimal import Decimal from datetime import datetime, date -from databricks.sql.thrift_api.TCLIService.ttypes import ( - TOpenSessionResp, - TExecuteStatementResp, -) -from databricks.sql.thrift_backend import ThriftBackend - import databricks.sql import databricks.sql.client as client from databricks.sql import InterfaceError, DatabaseError, Error, NotSupportedError @@ -22,51 +16,6 @@ from tests.unit.test_thrift_backend import ThriftBackendTestSuite from tests.unit.test_arrow_queue import ArrowQueueSuite -class ThriftBackendMockFactory: - - @classmethod - def new(cls): - ThriftBackendMock = Mock(spec=ThriftBackend) - ThriftBackendMock.return_value = ThriftBackendMock - - cls.apply_property_to_mock(ThriftBackendMock, staging_allowed_local_path=None) - MockTExecuteStatementResp = MagicMock(spec=TExecuteStatementResp()) - - cls.apply_property_to_mock( - MockTExecuteStatementResp, - description=None, - arrow_queue=None, - is_staging_operation=False, - command_handle=b"\x22", - has_been_closed_server_side=True, - has_more_rows=True, - lz4_compressed=True, - arrow_schema_bytes=b"schema", - ) - - ThriftBackendMock.execute_command.return_value = MockTExecuteStatementResp - - return ThriftBackendMock - - @classmethod - def apply_property_to_mock(self, mock_obj, **kwargs): - """ - Apply a property to a mock object. - """ - - for key, value in kwargs.items(): - if value is not None: - kwargs = {"return_value": value} - else: - kwargs = {} - - prop = PropertyMock(**kwargs) - setattr(type(mock_obj), key, prop) - - - - - class ClientTestSuite(unittest.TestCase): """ @@ -83,16 +32,13 @@ class ClientTestSuite(unittest.TestCase): @patch("%s.client.ThriftBackend" % PACKAGE_NAME) def test_close_uses_the_correct_session_id(self, mock_client_class): instance = mock_client_class.return_value - - mock_open_session_resp = MagicMock(spec=TOpenSessionResp)() - mock_open_session_resp.sessionHandle.sessionId = b'\x22' - instance.open_session.return_value = mock_open_session_resp + instance.open_session.return_value = b'\x22' connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) connection.close() # Check the close session request has an id of x22 - close_session_id = instance.close_session.call_args[0][0].sessionId + close_session_id = instance.close_session.call_args[0][0] self.assertEqual(close_session_id, b'\x22') @patch("%s.client.ThriftBackend" % PACKAGE_NAME) @@ -125,7 +71,7 @@ def test_auth_args(self, mock_client_class): for args in connection_args: connection = databricks.sql.connect(**args) - host, port, http_path, *_ = mock_client_class.call_args[0] + host, port, http_path, _ = mock_client_class.call_args[0] self.assertEqual(args["server_hostname"], host) self.assertEqual(args["http_path"], http_path) connection.close() @@ -138,6 +84,14 @@ def test_http_header_passthrough(self, mock_client_class): call_args = mock_client_class.call_args[0][3] self.assertIn(("foo", "bar"), call_args) + @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + def test_authtoken_passthrough(self, mock_client_class): + databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) + + headers = mock_client_class.call_args[0][3] + + self.assertIn(("Authorization", "Bearer tok"), headers) + @patch("%s.client.ThriftBackend" % PACKAGE_NAME) def test_tls_arg_passthrough(self, mock_client_class): databricks.sql.connect( @@ -169,9 +123,9 @@ def test_useragent_header(self, mock_client_class): http_headers = mock_client_class.call_args[0][3] self.assertIn(user_agent_header_with_entry, http_headers) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME, ThriftBackendMockFactory.new()) + @patch("%s.client.ThriftBackend" % PACKAGE_NAME) @patch("%s.client.ResultSet" % PACKAGE_NAME) - def test_closing_connection_closes_commands(self, mock_result_set_class): + def test_closing_connection_closes_commands(self, mock_result_set_class, mock_client_class): # Test once with has_been_closed_server side, once without for closed in (True, False): with self.subTest(closed=closed): @@ -231,11 +185,10 @@ def test_closing_result_set_hard_closes_commands(self): @patch("%s.client.ResultSet" % PACKAGE_NAME) def test_executing_multiple_commands_uses_the_most_recent_command(self, mock_result_set_class): - mock_result_sets = [Mock(), Mock()] mock_result_set_class.side_effect = mock_result_sets - cursor = client.Cursor(connection=Mock(), thrift_backend=ThriftBackendMockFactory.new()) + cursor = client.Cursor(Mock(), Mock()) cursor.execute("SELECT 1;") cursor.execute("SELECT 1;") @@ -274,16 +227,13 @@ def test_context_manager_closes_cursor(self): @patch("%s.client.ThriftBackend" % PACKAGE_NAME) def test_context_manager_closes_connection(self, mock_client_class): instance = mock_client_class.return_value - - mock_open_session_resp = MagicMock(spec=TOpenSessionResp)() - mock_open_session_resp.sessionHandle.sessionId = b'\x22' - instance.open_session.return_value = mock_open_session_resp + instance.open_session.return_value = b'\x22' with databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) as connection: pass # Check the close session request has an id of x22 - close_session_id = instance.close_session.call_args[0][0].sessionId + close_session_id = instance.close_session.call_args[0][0] self.assertEqual(close_session_id, b'\x22') def dict_product(self, dicts): @@ -413,39 +363,39 @@ def test_initial_namespace_passthrough(self, mock_client_class): self.assertEqual(mock_client_class.return_value.open_session.call_args[0][2], mock_schem) def test_execute_parameter_passthrough(self): - mock_thrift_backend = ThriftBackendMockFactory.new() + mock_thrift_backend = Mock() cursor = client.Cursor(Mock(), mock_thrift_backend) - tests = [ - ("SELECT %(string_v)s", "SELECT 'foo_12345'", {"string_v": "foo_12345"}), - ("SELECT %(x)s", "SELECT NULL", {"x": None}), - ("SELECT %(int_value)d", "SELECT 48", {"int_value": 48}), - ("SELECT %(float_value).2f", "SELECT 48.20", {"float_value": 48.2}), - ("SELECT %(iter)s", "SELECT (1,2,3,4,5)", {"iter": [1, 2, 3, 4, 5]}), - ( - "SELECT %(datetime)s", - "SELECT '2022-02-01 10:23:00.000000'", - {"datetime": datetime(2022, 2, 1, 10, 23)}, - ), - ("SELECT %(date)s", "SELECT '2022-02-01'", {"date": date(2022, 2, 1)}), - ] + tests = [("SELECT %(string_v)s", "SELECT 'foo_12345'", { + "string_v": "foo_12345" + }), ("SELECT %(x)s", "SELECT NULL", { + "x": None + }), ("SELECT %(int_value)d", "SELECT 48", { + "int_value": 48 + }), ("SELECT %(float_value).2f", "SELECT 48.20", { + "float_value": 48.2 + }), ("SELECT %(iter)s", "SELECT (1,2,3,4,5)", { + "iter": [1, 2, 3, 4, 5] + }), + ("SELECT %(datetime)s", "SELECT '2022-02-01 10:23:00.000000'", { + "datetime": datetime(2022, 2, 1, 10, 23) + }), ("SELECT %(date)s", "SELECT '2022-02-01'", { + "date": date(2022, 2, 1) + })] for query, expected_query, params in tests: cursor.execute(query, parameters=params) - self.assertEqual( - mock_thrift_backend.execute_command.call_args[1]["operation"], - expected_query, - ) + self.assertEqual(mock_thrift_backend.execute_command.call_args[1]["operation"], + expected_query) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) @patch("%s.client.ResultSet" % PACKAGE_NAME) def test_executemany_parameter_passhthrough_and_uses_last_result_set( - self, mock_result_set_class, mock_thrift_backend): + self, mock_result_set_class): # Create a new mock result set each time the class is instantiated mock_result_set_instances = [Mock(), Mock(), Mock()] mock_result_set_class.side_effect = mock_result_set_instances - mock_thrift_backend = ThriftBackendMockFactory.new() - cursor = client.Cursor(Mock(), mock_thrift_backend()) + mock_thrift_backend = Mock() + cursor = client.Cursor(Mock(), mock_thrift_backend) params = [{"x": None}, {"x": "foo1"}, {"x": "bar2"}] expected_queries = ["SELECT NULL", "SELECT 'foo1'", "SELECT 'bar2'"] @@ -484,7 +434,6 @@ def test_rollback_not_supported(self, mock_thrift_backend_class): with self.assertRaises(NotSupportedError): c.rollback() - @unittest.skip("JDW: skipping winter 2024 as we're about to rewrite this interface") @patch("%s.client.ThriftBackend" % PACKAGE_NAME) def test_row_number_respected(self, mock_thrift_backend_class): def make_fake_row_slice(n_rows): @@ -509,7 +458,6 @@ def make_fake_row_slice(n_rows): cursor.fetchmany_arrow(6) self.assertEqual(cursor.rownumber, 29) - @unittest.skip("JDW: skipping winter 2024 as we're about to rewrite this interface") @patch("%s.client.ThriftBackend" % PACKAGE_NAME) def test_disable_pandas_respected(self, mock_thrift_backend_class): mock_thrift_backend = mock_thrift_backend_class.return_value @@ -561,10 +509,7 @@ def test_column_name_api(self): @patch("%s.client.ThriftBackend" % PACKAGE_NAME) def test_finalizer_closes_abandoned_connection(self, mock_client_class): instance = mock_client_class.return_value - - mock_open_session_resp = MagicMock(spec=TOpenSessionResp)() - mock_open_session_resp.sessionHandle.sessionId = b'\x22' - instance.open_session.return_value = mock_open_session_resp + instance.open_session.return_value = b'\x22' databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) @@ -572,16 +517,13 @@ def test_finalizer_closes_abandoned_connection(self, mock_client_class): gc.collect() # Check the close session request has an id of x22 - close_session_id = instance.close_session.call_args[0][0].sessionId + close_session_id = instance.close_session.call_args[0][0] self.assertEqual(close_session_id, b'\x22') @patch("%s.client.ThriftBackend" % PACKAGE_NAME) def test_cursor_keeps_connection_alive(self, mock_client_class): instance = mock_client_class.return_value - - mock_open_session_resp = MagicMock(spec=TOpenSessionResp)() - mock_open_session_resp.sessionHandle.sessionId = b'\x22' - instance.open_session.return_value = mock_open_session_resp + instance.open_session.return_value = b'\x22' connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) cursor = connection.cursor() @@ -592,23 +534,20 @@ def test_cursor_keeps_connection_alive(self, mock_client_class): self.assertEqual(instance.close_session.call_count, 0) cursor.close() - @patch("%s.utils.ExecuteResponse" % PACKAGE_NAME, autospec=True) - @patch("%s.client.Cursor._handle_staging_operation" % PACKAGE_NAME) @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + @patch("%s.client.Cursor._handle_staging_operation" % PACKAGE_NAME) + @patch("%s.utils.ExecuteResponse" % PACKAGE_NAME) def test_staging_operation_response_is_handled(self, mock_client_class, mock_handle_staging_operation, mock_execute_response): # If server sets ExecuteResponse.is_staging_operation True then _handle_staging_operation should be called - - ThriftBackendMockFactory.apply_property_to_mock(mock_execute_response, is_staging_operation=True) - mock_client_class.execute_command.return_value = mock_execute_response - mock_client_class.return_value = mock_client_class + mock_execute_response.is_staging_operation = True connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) cursor = connection.cursor() cursor.execute("Text of some staging operation command;") connection.close() - mock_handle_staging_operation.call_count == 1 + mock_handle_staging_operation.assert_called_once_with() if __name__ == '__main__':