diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 961a7638d..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,5 +0,0 @@ -# These owners will be the default owners for everything in -# the repo. Unless a later match takes precedence, these -# users will be requested for review when someone opens a -# pull request. -* @rcypher-databricks @yunbodeng-db @andrefurlan-db @jackyhu-db @benc-db @kravets-levko diff --git a/.github/.github/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from .github/.github/pull_request_template.md rename to .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/actions/setup-jfrog/action.yml b/.github/actions/setup-jfrog/action.yml new file mode 100644 index 000000000..97ae146ba --- /dev/null +++ b/.github/actions/setup-jfrog/action.yml @@ -0,0 +1,32 @@ +name: Setup JFrog OIDC +description: Obtain a JFrog access token via GitHub OIDC and configure pip to use JFrog PyPI proxy + +runs: + using: composite + steps: + - name: Get JFrog OIDC token + shell: bash + run: | + set -euo pipefail + ID_TOKEN=$(curl -sLS \ + -H "User-Agent: actions/oidc-client" \ + -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \ + "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=jfrog-github" | jq .value | tr -d '"') + echo "::add-mask::${ID_TOKEN}" + ACCESS_TOKEN=$(curl -sLS -XPOST -H "Content-Type: application/json" \ + "https://databricks.jfrog.io/access/api/v1/oidc/token" \ + -d "{\"grant_type\": \"urn:ietf:params:oauth:grant-type:token-exchange\", \"subject_token_type\":\"urn:ietf:params:oauth:token-type:id_token\", \"subject_token\": \"${ID_TOKEN}\", \"provider_name\": \"github-actions\"}" | jq .access_token | tr -d '"') + echo "::add-mask::${ACCESS_TOKEN}" + if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "null" ]; then + echo "FAIL: Could not extract JFrog access token" + exit 1 + fi + echo "JFROG_ACCESS_TOKEN=${ACCESS_TOKEN}" >> "$GITHUB_ENV" + echo "JFrog OIDC token obtained successfully" + + - name: Configure pip + shell: bash + run: | + set -euo pipefail + echo "PIP_INDEX_URL=https://gha-service-account:${JFROG_ACCESS_TOKEN}@databricks.jfrog.io/artifactory/api/pypi/db-pypi/simple" >> "$GITHUB_ENV" + echo "pip configured to use JFrog registry" diff --git a/.github/actions/setup-poetry/action.yml b/.github/actions/setup-poetry/action.yml new file mode 100644 index 000000000..f7e15b1c0 --- /dev/null +++ b/.github/actions/setup-poetry/action.yml @@ -0,0 +1,63 @@ +name: Setup Poetry with JFrog +description: Install Poetry, configure JFrog as primary PyPI source, and install project dependencies + +inputs: + python-version: + description: Python version to set up + required: true + install-args: + description: Extra arguments for poetry install (e.g. --all-extras) + required: false + default: "" + cache-path: + description: Path to the virtualenv for caching (e.g. .venv or .venv-pyarrow) + required: false + default: ".venv" + cache-suffix: + description: Extra suffix for the cache key to avoid collisions across job variants + required: false + default: "" + +runs: + using: composite + steps: + - name: Setup JFrog + uses: ./.github/actions/setup-jfrog + + - name: Set up python ${{ inputs.python-version }} + id: setup-python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: ${{ inputs.python-version }} + + - name: Install Poetry + shell: bash + run: | + pip install poetry==2.2.1 + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + poetry config installer.parallel true + + - name: Configure Poetry JFrog source + shell: bash + run: | + poetry config repositories.jfrog https://databricks.jfrog.io/artifactory/api/pypi/db-pypi/simple + poetry config http-basic.jfrog gha-service-account "${JFROG_ACCESS_TOKEN}" + poetry source add --priority=primary jfrog https://databricks.jfrog.io/artifactory/api/pypi/db-pypi/simple + poetry lock + + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: ${{ inputs.cache-path }} + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ inputs.cache-suffix }}${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} + + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + shell: bash + run: poetry install --no-interaction --no-root + + - name: Install library + shell: bash + run: poetry install --no-interaction ${{ inputs.install-args }} diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml new file mode 100644 index 000000000..9f578ec9f --- /dev/null +++ b/.github/workflows/code-coverage.yml @@ -0,0 +1,98 @@ +name: E2E Tests and Code Coverage + +permissions: + contents: read + id-token: write + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +jobs: + test-with-coverage: + runs-on: + group: databricks-protected-runner-group + labels: linux-ubuntu-latest + environment: azure-prod + env: + DATABRICKS_SERVER_HOSTNAME: ${{ secrets.DATABRICKS_HOST }} + DATABRICKS_HTTP_PATH: ${{ secrets.TEST_PECO_WAREHOUSE_HTTP_PATH }} + DATABRICKS_TOKEN: ${{ secrets.DATABRICKS_TOKEN }} + DATABRICKS_CATALOG: peco + DATABRICKS_USER: ${{ secrets.TEST_PECO_SP_ID }} + steps: + - name: Check out repository + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev + - name: Setup Poetry + uses: ./.github/actions/setup-poetry + with: + python-version: "3.10" + install-args: "--all-extras" + - name: Run all tests with coverage + continue-on-error: false + run: | + poetry run pytest tests/unit tests/e2e \ + -n 4 \ + --dist=loadgroup \ + --cov=src \ + --cov-report=xml \ + --cov-report=term \ + -v + - name: Check for coverage override + id: override + env: + PR_BODY: ${{ github.event.pull_request.body }} + run: | + OVERRIDE_COMMENT=$(echo "$PR_BODY" | grep -E "SKIP_COVERAGE_CHECK\s*=" || echo "") + if [ -n "$OVERRIDE_COMMENT" ]; then + echo "override=true" >> $GITHUB_OUTPUT + REASON=$(echo "$OVERRIDE_COMMENT" | sed -E 's/.*SKIP_COVERAGE_CHECK\s*=\s*(.+)/\1/') + echo "reason=$REASON" >> $GITHUB_OUTPUT + echo "Coverage override found in PR description: $REASON" + else + echo "override=false" >> $GITHUB_OUTPUT + echo "No coverage override found" + fi + - name: Check coverage percentage + if: steps.override.outputs.override == 'false' + run: | + COVERAGE_FILE="coverage.xml" + if [ ! -f "$COVERAGE_FILE" ]; then + echo "ERROR: Coverage file not found at $COVERAGE_FILE" + exit 1 + fi + if ! command -v xmllint &> /dev/null; then + sudo apt-get update && sudo apt-get install -y libxml2-utils + fi + COVERED=$(xmllint --xpath "string(//coverage/@lines-covered)" "$COVERAGE_FILE") + TOTAL=$(xmllint --xpath "string(//coverage/@lines-valid)" "$COVERAGE_FILE") + PERCENTAGE=$(python3 -c "covered=${COVERED}; total=${TOTAL}; print(round((covered/total)*100, 2))") + echo "Branch Coverage: $PERCENTAGE%" + echo "Required Coverage: 85%" + python3 -c "import sys; sys.exit(0 if float('$PERCENTAGE') >= 85 else 1)" + if [ $? -eq 1 ]; then + echo "ERROR: Coverage is $PERCENTAGE%, which is less than the required 85%" + exit 1 + else + echo "SUCCESS: Coverage is $PERCENTAGE%, which meets the required 85%" + fi + - name: Coverage enforcement summary + env: + OVERRIDE: ${{ steps.override.outputs.override }} + REASON: ${{ steps.override.outputs.reason }} + run: | + if [ "$OVERRIDE" == "true" ]; then + echo "Coverage checks bypassed: $REASON" + echo "Please ensure this override is justified and temporary" + else + echo "Coverage checks enforced - minimum 85% required" + fi diff --git a/.github/workflows/code-quality-checks.yml b/.github/workflows/code-quality-checks.yml index 80ac94a7c..4071a6e51 100644 --- a/.github/workflows/code-quality-checks.yml +++ b/.github/workflows/code-quality-checks.yml @@ -1,165 +1,135 @@ name: Code Quality Checks -on: - push: - branches: - - main - pull_request: - branches: - - main + +on: [pull_request] + +permissions: + contents: read + id-token: write + jobs: run-unit-tests: - runs-on: ubuntu-latest + runs-on: + group: databricks-protected-runner-group + labels: linux-ubuntu-latest strategy: matrix: - python-version: [3.8, 3.9, "3.10", "3.11"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + dependency-version: ["default", "min"] + exclude: + - python-version: "3.12" + dependency-version: "min" + - python-version: "3.13" + dependency-version: "min" + + name: "Unit Tests (Python ${{ matrix.python-version }}, ${{ matrix.dependency-version }} deps)" + steps: - #---------------------------------------------- - # check-out repo and set-up python - #---------------------------------------------- - name: Check out repository - uses: actions/checkout@v2 - - name: Set up python ${{ matrix.python-version }} - id: setup-python - uses: actions/setup-python@v2 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - name: Setup Poetry + uses: ./.github/actions/setup-poetry with: python-version: ${{ matrix.python-version }} - #---------------------------------------------- - # ----- install & configure poetry ----- - #---------------------------------------------- - - name: Install Poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true - installer-parallel: true + cache-suffix: "${{ matrix.dependency-version }}-" + - name: Install Python tools for custom versions + if: matrix.dependency-version != 'default' + run: poetry run pip install toml packaging + - name: Generate requirements file + if: matrix.dependency-version != 'default' + run: | + poetry run python scripts/dependency_manager.py ${{ matrix.dependency-version }} --output requirements-${{ matrix.dependency-version }}.txt + echo "Generated requirements for ${{ matrix.dependency-version }} versions:" + cat requirements-${{ matrix.dependency-version }}.txt + - name: Override with custom dependency versions + if: matrix.dependency-version != 'default' + run: poetry run pip install -r requirements-${{ matrix.dependency-version }}.txt + - name: Show installed versions + run: | + echo "=== Dependency Version: ${{ matrix.dependency-version }} ===" + poetry run pip list + - name: Run tests + run: poetry run python -m pytest tests/unit + + run-unit-tests-with-arrow: + runs-on: + group: databricks-protected-runner-group + labels: linux-ubuntu-latest + strategy: + matrix: + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + dependency-version: ["default", "min"] + exclude: + - python-version: "3.12" + dependency-version: "min" + - python-version: "3.13" + dependency-version: "min" + + name: "Unit Tests + PyArrow (Python ${{ matrix.python-version }}, ${{ matrix.dependency-version }} deps)" - #---------------------------------------------- - # load cached venv if cache exists - #---------------------------------------------- - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v2 + steps: + - name: Check out repository + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - name: Install Kerberos system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev + - name: Setup Poetry + uses: ./.github/actions/setup-poetry with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} - #---------------------------------------------- - # install dependencies if cache does not exist - #---------------------------------------------- - - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root - #---------------------------------------------- - # install your root project, if required - #---------------------------------------------- - - name: Install library - run: poetry install --no-interaction - #---------------------------------------------- - # run test suite - #---------------------------------------------- + python-version: ${{ matrix.python-version }} + install-args: "--all-extras" + cache-suffix: "pyarrow-${{ matrix.dependency-version }}-" + - name: Install Python tools for custom versions + if: matrix.dependency-version != 'default' + run: poetry run pip install toml packaging + - name: Generate requirements file with pyarrow + if: matrix.dependency-version != 'default' + run: | + poetry run python scripts/dependency_manager.py ${{ matrix.dependency-version }} --output requirements-${{ matrix.dependency-version }}-arrow.txt + echo "Generated requirements for ${{ matrix.dependency-version }} versions with PyArrow:" + cat requirements-${{ matrix.dependency-version }}-arrow.txt + - name: Override with custom dependency versions + if: matrix.dependency-version != 'default' + run: poetry run pip install -r requirements-${{ matrix.dependency-version }}-arrow.txt + - name: Show installed versions + run: | + echo "=== Dependency Version: ${{ matrix.dependency-version }} with PyArrow ===" + poetry run pip list - name: Run tests run: poetry run python -m pytest tests/unit + check-linting: - runs-on: ubuntu-latest + runs-on: + group: databricks-protected-runner-group + labels: linux-ubuntu-latest strategy: matrix: - python-version: [3.8, 3.9, "3.10"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - #---------------------------------------------- - # check-out repo and set-up python - #---------------------------------------------- - name: Check out repository - uses: actions/checkout@v2 - - name: Set up python ${{ matrix.python-version }} - id: setup-python - uses: actions/setup-python@v2 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - name: Setup Poetry + uses: ./.github/actions/setup-poetry with: python-version: ${{ matrix.python-version }} - #---------------------------------------------- - # ----- install & configure poetry ----- - #---------------------------------------------- - - name: Install Poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true - installer-parallel: true - - #---------------------------------------------- - # load cached venv if cache exists - #---------------------------------------------- - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v2 - with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} - #---------------------------------------------- - # install dependencies if cache does not exist - #---------------------------------------------- - - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root - #---------------------------------------------- - # install your root project, if required - #---------------------------------------------- - - name: Install library - run: poetry install --no-interaction - #---------------------------------------------- - # black the code - #---------------------------------------------- - name: Black run: poetry run black --check src check-types: - runs-on: ubuntu-latest + runs-on: + group: databricks-protected-runner-group + labels: linux-ubuntu-latest strategy: matrix: - python-version: [3.8, 3.9, "3.10"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - #---------------------------------------------- - # check-out repo and set-up python - #---------------------------------------------- - name: Check out repository - uses: actions/checkout@v2 - - name: Set up python ${{ matrix.python-version }} - id: setup-python - uses: actions/setup-python@v2 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - name: Setup Poetry + uses: ./.github/actions/setup-poetry with: python-version: ${{ matrix.python-version }} - #---------------------------------------------- - # ----- install & configure poetry ----- - #---------------------------------------------- - - name: Install Poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true - installer-parallel: true - - #---------------------------------------------- - # load cached venv if cache exists - #---------------------------------------------- - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v2 - with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} - #---------------------------------------------- - # install dependencies if cache does not exist - #---------------------------------------------- - - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root - #---------------------------------------------- - # install your root project, if required - #---------------------------------------------- - - name: Install library - run: poetry install --no-interaction - #---------------------------------------------- - # mypy the code - #---------------------------------------------- - name: Mypy run: | - mkdir .mypy_cache # Workaround for bad error message "error: --install-types failed (no mypy cache directory)"; see https://github.com/python/mypy/issues/10768#issuecomment-2178450153 + mkdir .mypy_cache poetry run mypy --install-types --non-interactive src diff --git a/.github/workflows/dco-check.yml b/.github/workflows/dco-check.yml index 5a5c60607..fdcf1b3bb 100644 --- a/.github/workflows/dco-check.yml +++ b/.github/workflows/dco-check.yml @@ -1,25 +1,74 @@ name: DCO Check -on: [pull_request] +on: + pull_request: + types: [opened, synchronize, reopened] + branches: [main] + +permissions: + contents: read jobs: - check: - runs-on: ubuntu-latest + dco-check: + runs-on: + group: databricks-protected-runner-group + labels: linux-ubuntu-latest + name: Check DCO Sign-off steps: - - name: Check for DCO - id: dco-check - uses: tisonkun/actions-dco@v1.1 - - name: Comment about DCO status - uses: actions/github-script@v6 - if: ${{ failure() }} + - name: Checkout + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 with: - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: `Thanks for your contribution! To satisfy the DCO policy in our \ - [contributing guide](https://github.com/databricks/databricks-sql-python/blob/main/CONTRIBUTING.md) \ - every commit message must include a sign-off message. One or more of your commits is missing this message. \ - You can reword previous commit messages with an interactive rebase (\`git rebase -i main\`).` - }) + fetch-depth: 0 + + - name: Check DCO Sign-off + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + #!/bin/bash + set -e + + echo "Checking commits from $BASE_SHA to $HEAD_SHA" + + COMMITS=$(git rev-list --no-merges "$BASE_SHA..$HEAD_SHA") + + if [ -z "$COMMITS" ]; then + echo "No commits found in this PR" + exit 0 + fi + + FAILED_COMMITS=() + + for commit in $COMMITS; do + echo "Checking commit: $commit" + COMMIT_MSG=$(git log --format=%B -n 1 "$commit") + if echo "$COMMIT_MSG" | grep -q "^Signed-off-by: "; then + echo " Commit $commit has DCO sign-off" + else + echo " Commit $commit is missing DCO sign-off" + FAILED_COMMITS+=("$commit") + fi + done + + if [ ${#FAILED_COMMITS[@]} -ne 0 ]; then + echo "" + echo "DCO Check Failed!" + echo "The following commits are missing the required 'Signed-off-by' line:" + for commit in "${FAILED_COMMITS[@]}"; do + echo " - $commit: $(git log --format=%s -n 1 "$commit")" + done + echo "" + echo "To fix this, you need to sign off your commits. You can:" + echo "1. Add sign-off to new commits: git commit -s -m 'Your commit message'" + echo "2. Amend existing commits: git commit --amend --signoff" + echo "3. For multiple commits, use: git rebase --signoff HEAD~N (where N is the number of commits)" + echo "" + echo "The sign-off should be in the format:" + echo "Signed-off-by: Your Name " + echo "" + echo "For more details, see CONTRIBUTING.md" + exit 1 + else + echo "" + echo "All commits have proper DCO sign-off!" + fi diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml deleted file mode 100644 index f28c22a85..000000000 --- a/.github/workflows/integration.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Integration Tests -on: - push: - paths-ignore: - - "**.MD" - - "**.md" - -jobs: - run-e2e-tests: - runs-on: ubuntu-latest - environment: azure-prod - env: - DATABRICKS_SERVER_HOSTNAME: ${{ secrets.DATABRICKS_HOST }} - DATABRICKS_HTTP_PATH: ${{ secrets.TEST_PECO_WAREHOUSE_HTTP_PATH }} - DATABRICKS_TOKEN: ${{ secrets.DATABRICKS_TOKEN }} - DATABRICKS_CATALOG: peco - DATABRICKS_USER: ${{ secrets.TEST_PECO_SP_ID }} - steps: - #---------------------------------------------- - # check-out repo and set-up python - #---------------------------------------------- - - name: Check out repository - uses: actions/checkout@v3 - - name: Set up python - id: setup-python - uses: actions/setup-python@v4 - with: - python-version: "3.10" - #---------------------------------------------- - # ----- install & configure poetry ----- - #---------------------------------------------- - - name: Install Poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true - installer-parallel: true - - #---------------------------------------------- - # load cached venv if cache exists - #---------------------------------------------- - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v2 - with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} - #---------------------------------------------- - # install dependencies if cache does not exist - #---------------------------------------------- - - name: Install dependencies - run: poetry install --no-interaction --all-extras - #---------------------------------------------- - # run test suite - #---------------------------------------------- - - name: Run e2e tests - run: poetry run python -m pytest tests/e2e - - name: Run SQL Alchemy tests - run: poetry run python -m pytest src/databricks/sqlalchemy/test_local diff --git a/.github/workflows/publish-test.yml b/.github/workflows/publish-test.yml deleted file mode 100644 index d95e2e3c6..000000000 --- a/.github/workflows/publish-test.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Publish to PyPI [Test] -on: [push] -jobs: - test-pypi: - name: Create patch version number and push to test-pypi - runs-on: ubuntu-latest - steps: - #---------------------------------------------- - # check-out repo and set-up python - #---------------------------------------------- - - name: Check out repository - uses: actions/checkout@v2 - - name: Set up python - id: setup-python - uses: actions/setup-python@v2 - with: - python-version: 3.9 - #---------------------------------------------- - # ----- install & configure poetry ----- - #---------------------------------------------- - - name: Install Poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true - installer-parallel: true - #---------------------------------------------- - # load cached venv if cache exists - #---------------------------------------------- - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v2 - with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} - #---------------------------------------------- - # install dependencies if cache does not exist - #---------------------------------------------- - - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root - #---------------------------------------------- - # Get the current version and increment it (test-pypi requires a unique version number) - #---------------------------------------------- - - name: Get next version - uses: reecetech/version-increment@2022.2.4 - id: version - with: - scheme: semver - increment: patch - #---------------------------------------------- - # Tell poetry to update the version number - #---------------------------------------------- - - name: Update pyproject.toml - run: poetry version ${{ steps.version.outputs.major-version }}.${{ steps.version.outputs.minor-version }}.dev$(date +%s) - #---------------------------------------------- - # Attempt push to test-pypi - #---------------------------------------------- - - name: Build and publish to pypi - uses: JRubics/poetry-publish@v1.10 - with: - pypi_token: ${{ secrets.TEST_PYPI_TOKEN }} - repository_name: "testpypi" - repository_url: "https://test.pypi.org/legacy/" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index 324575ff8..000000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Publish to PyPI [Production] -on: - release: - types: [published] -jobs: - publish: - name: Publish - runs-on: ubuntu-latest - steps: - #---------------------------------------------- - # check-out repo and set-up python - #---------------------------------------------- - - name: Check out repository - uses: actions/checkout@v2 - - name: Set up python - id: setup-python - uses: actions/setup-python@v2 - with: - python-version: 3.9 - #---------------------------------------------- - # ----- install & configure poetry ----- - #---------------------------------------------- - - name: Install Poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: true - virtualenvs-in-project: true - installer-parallel: true - #---------------------------------------------- - # load cached venv if cache exists - #---------------------------------------------- - - name: Load cached venv - id: cached-poetry-dependencies - uses: actions/cache@v2 - with: - path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} - #---------------------------------------------- - # install dependencies if cache does not exist - #---------------------------------------------- - - name: Install dependencies - if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --no-interaction --no-root - #------------------------------------------------------------------------------------------------ - # Here we use version-increment to fetch the latest tagged version (we won't increment it though) - #------------------------------------------------------------------------------------------------ - - name: Get next version - uses: reecetech/version-increment@2022.2.4 - id: version - with: - scheme: semver - increment: patch - #----------------------------------------------------------------------------- - # Tell poetry to use the `current-version` that was found by the previous step - #----------------------------------------------------------------------------- - - name: Update pyproject.toml - run: poetry version ${{ steps.version.outputs.current-version }} - #---------------------------------------------- - # Attempt push to test-pypi - #---------------------------------------------- - - name: Build and publish to pypi - uses: JRubics/poetry-publish@v1.10 - with: - pypi_token: ${{ secrets.PROD_PYPI_TOKEN }} diff --git a/.gitignore b/.gitignore index a1fe5bbd4..2ae38dbc6 100644 --- a/.gitignore +++ b/.gitignore @@ -195,7 +195,7 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ # End of https://www.toptal.com/developers/gitignore/api/python,macos diff --git a/CHANGELOG.md b/CHANGELOG.md index d426b97e0..fc89750d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,132 @@ # Release History +# 4.2.6 (2026-04-22) +- Add SPOG routing support for account-level vanity URLs (databricks/databricks-sql-python#767 by @msrathore-db) +- Fix dependency_manager: handle PEP 440 ~= compatible release syntax (databricks/databricks-sql-python#776 by @vikrantpuppala) +- Bump thrift to fix deprecation warning (databricks/databricks-sql-python#733 by @Korijn) +- Add AI coding agent detection to User-Agent header (databricks/databricks-sql-python#740 by @vikrantpuppala) +- Add statement-level query_tags support for SEA backend (databricks/databricks-sql-python#754 by @sreekanth-db) +- Update PyArrow concatenation of tables to use promote_options as default (databricks/databricks-sql-python#751 by @jprakash-db) +- Fix float inference to use DoubleParameter (64-bit) instead of FloatParameter (databricks/databricks-sql-python#742 by @Shubhambhusate) +- Allow specifying query_tags as a dict upon connection creation (databricks/databricks-sql-python#749 by @jiabin-hu) +- Add query_tags parameter support for execute methods (databricks/databricks-sql-python#736 by @jiabin-hu) + +# 4.2.5 (2026-02-09) +- Fix feature-flag endpoint retries in gov region (databricks/databricks-sql-python#735 by @samikshya-db) +- Improve telemetry lifecycle management (databricks/databricks-sql-python#734 by @msrathore-db) + +# 4.2.4 (2026-01-07) +- Fixed the exception handler close() on _TelemetryClientHolder (databricks/databricks-sql-python#723 by @msrathore-db) +- Created util method to normalise http protocol in http path (databricks/databricks-sql-python#724 by @nikhilsuri-db) + +# 4.2.3 (2025-12-18) +- added pandas < 2.4.0 support and tests for py 3.14 (databricks/databricks-sql-python#720 by @sreekanth-db) +- pandas 2.3.3 support for py < 3.14 (databricks/databricks-sql-python#721 by @sreekanth-db) + +# 4.2.2 (2025-12-01) +- Change default use_hybrid_disposition to False (databricks/databricks-sql-python#714 by @samikshya-db) +- Circuit breaker changes using pybreaker (databricks/databricks-sql-python#705 by @nikhilsuri-db) +- perf: Optimize telemetry latency logging to reduce overhead (databricks/databricks-sql-python#715 by @samikshya-db) +- basic e2e test for force telemetry verification (databricks/databricks-sql-python#708 by @nikhilsuri-db) +- Telemetry is ON by default to track connection stats. (Note : This strictly excludes PII, query text, and results) (databricks/databricks-sql-python#717 by @samikshya-db) + +# 4.2.1 (2025-11-20) +- Ignore transactions by default (databricks/databricks-sql-python#711 by @jayantsing-db) + +# 4.2.0 (2025-11-14) +- Add multi-statement transaction support (databricks/databricks-sql-python#704 by @jayantsing-db) +- Add a workflow to parallelise the E2E tests (databricks/databricks-sql-python#697 by @msrathore-db) +- Bring Python telemetry event model consistent with JDBC (databricks/databricks-sql-python#701 by @nikhilsuri-db) + +# 4.1.4 (2025-10-15) +- Add support for Token Federation (databricks/databricks-sql-python#691 by @madhav-db) +- Add metric view support (databricks/databricks-sql-python#688 by @shivam2680) +- Increased time limit for long running queries (databricks/databricks-sql-python#686 by @jprakash-db) + +# 4.1.3 (2025-09-17) +- Query tags integration (databricks/databricks-sql-python#663 by @sreekanth-db) +- Add variant support (databricks/databricks-sql-python#560 by @shivam2680) + +# 4.1.2 (2025-08-22) +- Streaming ingestion support for PUT operation (databricks/databricks-sql-python#643 by @sreekanth-db) +- Removed use_threads argument on concat_tables for compatibility with pyarrow<14 (databricks/databricks-sql-python#684 by @jprakash-db) + +# 4.1.1 (2025-08-21) +- Add documentation for proxy support (databricks/databricks-sql-python#680 by @vikrantpuppala) +- Fix compatibility with urllib3<2 and add CI actions to improve dependency checks (databricks/databricks-sql-python#678 by @vikrantpuppala) + +# 4.1.0 (2025-08-18) +- Removed Codeowners (databricks/databricks-sql-python#623 by @jprakash-db) +- Azure Service Principal Credential Provider (databricks/databricks-sql-python#621 by @jprakash-db) +- Add optional telemetry support to the python connector (databricks/databricks-sql-python#628 by @saishreeeee) +- Fix potential resource leak in `CloudFetchQueue` (databricks/databricks-sql-python#624 by @varun-edachali-dbx) +- Generalise Backend Layer (databricks/databricks-sql-python#604 by @varun-edachali-dbx) +- Arrow performance optimizations (databricks/databricks-sql-python#638 by @jprakash-db) +- Connection errors to unauthenticated telemetry endpoint (databricks/databricks-sql-python#619 by @saishreeeee) +- SEA: Execution Phase (databricks/databricks-sql-python#645 by @varun-edachali-dbx) +- Add retry mechanism to telemetry requests (databricks/databricks-sql-python#617 by @saishreeeee) +- SEA: Fetch Phase (databricks/databricks-sql-python#650 by @varun-edachali-dbx) +- added logs for cloud fetch speed (databricks/databricks-sql-python#654 by @shivam2680) +- Make telemetry batch size configurable and add time-based flush (databricks/databricks-sql-python#622 by @saishreeeee) +- Normalise type code (databricks/databricks-sql-python#652 by @varun-edachali-dbx) +- Testing for telemetry (databricks/databricks-sql-python#616 by @saishreeeee) +- Bug fixes in telemetry (databricks/databricks-sql-python#659 by @saishreeeee) +- Telemetry server-side flag integration (databricks/databricks-sql-python#646 by @saishreeeee) +- Enhance SEA HTTP Client (databricks/databricks-sql-python#618 by @varun-edachali-dbx) +- SEA: Allow large metadata responses (databricks/databricks-sql-python#653 by @varun-edachali-dbx) +- Added code coverage workflow to test the code coverage from unit and e2e tests (databricks/databricks-sql-python#657 by @msrathore-db) +- Concat tables to be backward compatible (databricks/databricks-sql-python#647 by @jprakash-db) +- Refactor codebase to use a unified http client (databricks/databricks-sql-python#673 by @vikrantpuppala) +- Add kerberos support for proxy auth (databricks/databricks-sql-python#675 by @vikrantpuppala) + +# 4.0.5 (2025-06-24) +- Fix: Reverted change in cursor close handling which led to errors impacting users (databricks/databricks-sql-python#613 by @madhav-db) + +# 4.0.4 (2025-06-16) + +- Update thrift client library after cleaning up unused fields and structs (databricks/databricks-sql-python#553 by @vikrantpuppala) +- Refactor decimal conversion in PyArrow tables to use direct casting (databricks/databricks-sql-python#544 by @jayantsing-db) +- Fix: `fetchall_arrow` to always return results in `arrow` format (databricks/databricks-sql-python#551 by @shivam2680) +- Enhance cursor close handling and context manager exception management to prevent server side resource leaks (databricks/databricks-sql-python#554 by @madhav-db) +- Added additional logging to enhance debugging (databricks/databricks-sql-python#556 by @saishreeeee) +- Feature: Added support for complex data types such as Arrays and Map [Private Preview] (databricks/databricks-sql-python#559 by @jprakash-db) + +# 4.0.3 (2025-04-22) + +- Fix: Removed `packaging` dependency in favour of default libraries, for `urllib3` version checks (databricks/databricks-sql-python#547 by @jprakash-db) +- +# 4.0.2 (2025-04-01) + +- Fix: Relaxed the pin for `python-dateutil` to be `^2.8.0` (databricks/databricks-sql-python#538 by @jprakash-db) + +# 4.0.1 (2025-03-19) + +**Note: this release was yanked from Pypi on 19 March 2025 due to compatibility issues with `dbt-databricks<1.5.3`** + +- Support for multiple timestamp formats parsing (databricks/databricks-sql-python#533 by @jprakash-db) +- Rename `_user_agent_entry` in connect call to `user_agent_entry` to expose it as a public parameter. (databricks/databricks-sql-python#530 by @shivam2680) +- Fix: compatibility with urllib3 versions less than 2.x. (databricks/databricks-sql-python#526 by @shivam2680) +- Support for Python 3.13 and updated dependencies (databricks/databricks-sql-python#510 by @dhirschfeld and @dbaxa) + +# 4.0.0 (2025-01-19) + +- Split the connector into two separate packages: `databricks-sql-connector` and `databricks-sqlalchemy`. The `databricks-sql-connector` package contains the core functionality of the connector, while the `databricks-sqlalchemy` package contains the SQLAlchemy dialect for the connector. +- Pyarrow dependency is now optional in `databricks-sql-connector`. Users needing arrow are supposed to explicitly install pyarrow + +# 3.7.3 (2025-03-28) + +- Fix: Unable to poll small results in execute_async function (databricks/databricks-sql-python#515 by @jprakash-db) +- Updated log messages to show the status code and error messages of requests (databricks/databricks-sql-python#511 by @jprakash-db) +- Fix: Incorrect metadata was fetched in case of queries with the same alias (databricks/databricks-sql-python#505 by @jprakash-db) + +# 3.7.2 (2025-01-31) + +- Updated the retry_dela_max and retry_timeout (databricks/databricks-sql-python#497 by @jprakash-db) + +# 3.7.1 (2025-01-07) + +- Relaxed the number of Http retry attempts (databricks/databricks-sql-python#486 by @jprakash-db) + # 3.7.0 (2024-12-23) - Fix: Incorrect number of rows fetched in inline results when fetching results with FETCH_NEXT orientation (databricks/databricks-sql-python#479 by @jprakash-db) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ce0968d4e..0cb258769 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -144,9 +144,6 @@ The `PySQLStagingIngestionTestSuite` namespace requires a cluster running DBR ve 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 diff --git a/README.md b/README.md index 54d4b1781..047515ba4 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,17 @@ [![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/). -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. +This connector uses Arrow as the data-exchange format, and supports APIs (e.g. `fetchmany_arrow`) 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. [PyArrow](https://arrow.apache.org/docs/python/index.html) is required to enable this and use these APIs, you can install it via `pip install pyarrow` or `pip install databricks-sql-connector[pyarrow]`. + +The connector includes built-in support for HTTP/HTTPS proxy servers with multiple authentication methods including basic authentication and Kerberos/Negotiate authentication. See `docs/proxy.md` and `examples/proxy_authentication.py` for details. You are welcome to file an issue here for general use cases. You can also contact Databricks Support [here](help.databricks.com). ## Requirements -Python 3.8 or above is required. +Python 3.9 or above is required. ## Documentation @@ -22,7 +24,12 @@ For the latest documentation, see ## Quickstart -Install the library with `pip install databricks-sql-connector` +### Installing the core library +Install using `pip install databricks-sql-connector` + +### Installing the core library with PyArrow +Install using `pip install databricks-sql-connector[pyarrow]` + ```bash export DATABRICKS_HOST=********.databricks.com @@ -60,6 +67,24 @@ or to a Databricks Runtime interactive cluster (e.g. /sql/protocolv1/o/123456789 > to authenticate the target Databricks user account and needs to open the browser for authentication. So it > can only run on the user's machine. +## Transaction Support + +The connector supports multi-statement transactions with manual commit/rollback control. Set `connection.autocommit = False` to disable autocommit mode, then use `connection.commit()` and `connection.rollback()` to control transactions. + +For detailed documentation, examples, and best practices, see **[TRANSACTIONS.md](TRANSACTIONS.md)**. + +## SQLAlchemy +Starting from `databricks-sql-connector` version 4.0.0 SQLAlchemy support has been extracted to a new library `databricks-sqlalchemy`. + +- Github repository [databricks-sqlalchemy github](https://github.com/databricks/databricks-sqlalchemy) +- PyPI [databricks-sqlalchemy pypi](https://pypi.org/project/databricks-sqlalchemy/) + +### Quick SQLAlchemy guide +Users can now choose between using the SQLAlchemy v1 or SQLAlchemy v2 dialects with the connector core + +- Install the latest SQLAlchemy v1 using `pip install databricks-sqlalchemy~=1.0` +- Install SQLAlchemy v2 using `pip install databricks-sqlalchemy` + ## Contributing diff --git a/TRANSACTIONS.md b/TRANSACTIONS.md new file mode 100644 index 000000000..590c298c0 --- /dev/null +++ b/TRANSACTIONS.md @@ -0,0 +1,387 @@ +# Transaction Support + +The Databricks SQL Connector for Python supports multi-statement transactions (MST). This allows you to group multiple SQL statements into atomic units that either succeed completely or fail completely. + +## Autocommit Behavior + +By default, every SQL statement executes in its own transaction and commits immediately (autocommit mode). This is the standard behavior for most database connectors. + +```python +from databricks import sql + +connection = sql.connect( + server_hostname="your-workspace.cloud.databricks.com", + http_path="/sql/1.0/warehouses/abc123" +) + +# Default: autocommit is True +print(connection.autocommit) # True + +# Each statement commits immediately +cursor = connection.cursor() +cursor.execute("INSERT INTO my_table VALUES (1, 'data')") +# Already committed - data is visible to other connections +``` + +To use explicit transactions, disable autocommit: + +```python +connection.autocommit = False + +# Now statements are grouped into a transaction +cursor = connection.cursor() +cursor.execute("INSERT INTO my_table VALUES (1, 'data')") +# Not committed yet - must call connection.commit() + +connection.commit() # Now it's visible +``` + +## Basic Transaction Operations + +### Committing Changes + +When autocommit is disabled, you must explicitly commit your changes: + +```python +connection.autocommit = False +cursor = connection.cursor() + +try: + cursor.execute("INSERT INTO orders VALUES (1, 100.00)") + cursor.execute("INSERT INTO order_items VALUES (1, 'Widget', 2)") + connection.commit() # Both inserts succeed together +except Exception as e: + connection.rollback() # Neither insert is saved + raise +finally: + connection.autocommit = True # Restore default state +``` + +### Rolling Back Changes + +Use `rollback()` to discard all changes made in the current transaction: + +```python +connection.autocommit = False +cursor = connection.cursor() + +cursor.execute("INSERT INTO accounts VALUES (1, 1000)") +cursor.execute("UPDATE accounts SET balance = balance - 500 WHERE id = 1") + +# Changed your mind? +connection.rollback() # All changes discarded +``` + +Note: Calling `rollback()` when autocommit is enabled is safe (it's a no-op), but calling `commit()` will raise a `TransactionError`. + +### Sequential Transactions + +After a commit or rollback, a new transaction starts automatically: + +```python +connection.autocommit = False + +# First transaction +cursor.execute("INSERT INTO logs VALUES (1, 'event1')") +connection.commit() + +# Second transaction starts automatically +cursor.execute("INSERT INTO logs VALUES (2, 'event2')") +connection.rollback() # Only the second insert is discarded +``` + +## Multi-Table Transactions + +Transactions span multiple tables atomically. Either all changes are committed, or all are rolled back: + +```python +connection.autocommit = False +cursor = connection.cursor() + +try: + # Insert into multiple tables + cursor.execute("INSERT INTO customers VALUES (1, 'Alice')") + cursor.execute("INSERT INTO orders VALUES (1, 1, 100.00)") + cursor.execute("INSERT INTO shipments VALUES (1, 1, 'pending')") + + connection.commit() # All three inserts succeed atomically +except Exception as e: + connection.rollback() # All three inserts are discarded + raise +finally: + connection.autocommit = True # Restore default state +``` + +This is particularly useful for maintaining data consistency across related tables. + +## Transaction Isolation + +Databricks uses **Snapshot Isolation** (mapped to `REPEATABLE_READ` in standard SQL terminology). This means: + +- **Repeatable reads**: Once you read data in a transaction, subsequent reads will see the same data (even if other transactions modify it) +- **Atomic commits**: Changes are visible to other connections only after commit +- **Write serializability within a single table**: Concurrent writes to the same table will cause conflicts +- **Snapshot isolation across tables**: Concurrent writes to different tables can succeed + +### Getting the Isolation Level + +```python +level = connection.get_transaction_isolation() +print(level) # Output: REPEATABLE_READ +``` + +### Setting the Isolation Level + +Currently, only `REPEATABLE_READ` is supported: + +```python +from databricks import sql + +# Using the constant +connection.set_transaction_isolation(sql.TRANSACTION_ISOLATION_LEVEL_REPEATABLE_READ) + +# Or using a string +connection.set_transaction_isolation("REPEATABLE_READ") + +# Other levels will raise NotSupportedError +connection.set_transaction_isolation("READ_COMMITTED") # Raises NotSupportedError +``` + +### What Repeatable Read Means in Practice + +Within a transaction, you'll always see a consistent snapshot of the data: + +```python +connection.autocommit = False +cursor = connection.cursor() + +# First read +cursor.execute("SELECT balance FROM accounts WHERE id = 1") +balance1 = cursor.fetchone()[0] # Returns 1000 + +# Another connection updates the balance +# (In a separate connection: UPDATE accounts SET balance = 500 WHERE id = 1) + +# Second read in the same transaction +cursor.execute("SELECT balance FROM accounts WHERE id = 1") +balance2 = cursor.fetchone()[0] # Still returns 1000 (repeatable read!) + +connection.commit() + +# After commit, new transactions will see the updated value (500) +``` + +## Error Handling + +### Setting Autocommit During a Transaction + +You cannot change autocommit mode while a transaction is active: + +```python +connection.autocommit = False +cursor = connection.cursor() + +try: + cursor.execute("INSERT INTO logs VALUES (1, 'data')") + + # This will raise TransactionError + connection.autocommit = True # Error: transaction is active + +except sql.TransactionError as e: + print(f"Cannot change autocommit: {e}") + connection.rollback() # Clean up the transaction +finally: + connection.autocommit = True # Now it's safe to restore +``` + +### Committing Without an Active Transaction + +If autocommit is enabled, there's no active transaction, so calling `commit()` will fail: + +```python +connection.autocommit = True # Default + +try: + connection.commit() # Raises TransactionError +except sql.TransactionError as e: + print(f"No active transaction: {e}") +``` + +However, `rollback()` is safe in this case (it's a no-op). + +### Recovering from Query Failures + +If a statement fails during a transaction, roll back and start a new transaction: + +```python +connection.autocommit = False +cursor = connection.cursor() + +try: + cursor.execute("INSERT INTO valid_table VALUES (1, 'data')") + cursor.execute("INSERT INTO nonexistent_table VALUES (2, 'data')") # Fails + connection.commit() +except Exception as e: + connection.rollback() # Discard the partial transaction + + # Log the error (with autocommit still disabled) + try: + cursor.execute("INSERT INTO error_log VALUES (1, 'Query failed')") + connection.commit() + except Exception: + connection.rollback() +finally: + connection.autocommit = True # Restore default state +``` + +## Querying Server State + +By default, the `autocommit` property returns a cached value for performance. If you need to query the server each time (for instance, when strong consistency is required): + +```python +connection = sql.connect( + server_hostname="your-workspace.cloud.databricks.com", + http_path="/sql/1.0/warehouses/abc123", + fetch_autocommit_from_server=True +) + +# Each access queries the server +state = connection.autocommit # Executes "SET AUTOCOMMIT" query +``` + +This is generally not needed for normal usage. + +## Write Conflicts + +### Within a Single Table + +Databricks enforces **write serializability** within a single table. If two transactions try to modify the same table concurrently, one will fail: + +```python +# Connection 1 +conn1.autocommit = False +cursor1 = conn1.cursor() +cursor1.execute("INSERT INTO accounts VALUES (1, 100)") + +# Connection 2 (concurrent) +conn2.autocommit = False +cursor2 = conn2.cursor() +cursor2.execute("INSERT INTO accounts VALUES (2, 200)") + +# First commit succeeds +conn1.commit() # OK + +# Second commit fails with concurrent write conflict +try: + conn2.commit() # Raises error about concurrent writes +except Exception as e: + conn2.rollback() + print(f"Concurrent write detected: {e}") +``` + +This happens even when the rows being modified are different. The conflict detection is at the table level. + +### Across Multiple Tables + +Concurrent writes to *different* tables can succeed. Each table tracks its own write conflicts independently: + +```python +# Connection 1: writes to table_a +conn1.autocommit = False +cursor1 = conn1.cursor() +cursor1.execute("INSERT INTO table_a VALUES (1, 'data')") + +# Connection 2: writes to table_b (different table) +conn2.autocommit = False +cursor2 = conn2.cursor() +cursor2.execute("INSERT INTO table_b VALUES (1, 'data')") + +# Both commits succeed (different tables) +conn1.commit() # OK +conn2.commit() # Also OK +``` + +## Best Practices + +1. **Keep transactions short**: Long-running transactions can cause conflicts with other connections. Commit as soon as your atomic unit of work is complete. + +2. **Always handle exceptions**: Wrap transaction code in try/except/finally and call `rollback()` on errors. + +```python +connection.autocommit = False +cursor = connection.cursor() + +try: + cursor.execute("INSERT INTO table1 VALUES (1, 'data')") + cursor.execute("UPDATE table2 SET status = 'updated'") + connection.commit() +except Exception as e: + connection.rollback() + logger.error(f"Transaction failed: {e}") + raise +finally: + connection.autocommit = True # Restore default state +``` + +3. **Use context managers**: If you're writing helper functions, consider using a context manager pattern: + +```python +from contextlib import contextmanager + +@contextmanager +def transaction(connection): + connection.autocommit = False + try: + yield connection + connection.commit() + except Exception: + connection.rollback() + raise + finally: + connection.autocommit = True + +# Usage +with transaction(connection): + cursor = connection.cursor() + cursor.execute("INSERT INTO logs VALUES (1, 'message')") + # Auto-commits on success, auto-rolls back on exception +``` + +4. **Reset autocommit when done**: Use a `finally` block to restore autocommit to `True`. This is especially important if the connection is reused or part of a connection pool: + +```python +connection.autocommit = False +try: + # ... transaction code ... + connection.commit() +except Exception: + connection.rollback() + raise +finally: + connection.autocommit = True # Restore to default state +``` + +5. **Be aware of isolation semantics**: Remember that repeatable read means you see a snapshot from the start of your transaction. If you need to see recent changes from other transactions, commit your current transaction and start a new one. + +## Requirements + +To use transactions, you need: +- A Databricks SQL warehouse that supports Multi-Statement Transactions (MST) +- Tables created with the `delta.feature.catalogOwned-preview` table property: + +```sql +CREATE TABLE my_table (id INT, value STRING) +USING DELTA +TBLPROPERTIES ('delta.feature.catalogOwned-preview' = 'supported') +``` + +## Related APIs + +- `connection.autocommit` - Get or set autocommit mode (boolean) +- `connection.commit()` - Commit the current transaction +- `connection.rollback()` - Roll back the current transaction +- `connection.get_transaction_isolation()` - Get the isolation level (returns `"REPEATABLE_READ"`) +- `connection.set_transaction_isolation(level)` - Validate/set isolation level (only `"REPEATABLE_READ"` supported) +- `sql.TransactionError` - Exception raised for transaction-specific errors + +All of these are extensions to [PEP 249](https://www.python.org/dev/peps/pep-0249/) (Python Database API Specification v2.0). diff --git a/docs/proxy.md b/docs/proxy.md new file mode 100644 index 000000000..2e0bec292 --- /dev/null +++ b/docs/proxy.md @@ -0,0 +1,232 @@ +# Proxy Support + +The Databricks SQL Connector supports connecting through HTTP and HTTPS proxy servers with various authentication methods. This feature automatically detects system proxy configuration and handles proxy authentication transparently. + +## Quick Start + +The connector automatically uses your system's proxy configuration when available: + +```python +from databricks import sql + +# Basic connection - uses system proxy automatically +with sql.connect( + server_hostname="your-workspace.cloud.databricks.com", + http_path="/sql/1.0/endpoints/your-endpoint-id", + access_token="your-token" +) as connection: + # Your queries here... +``` + +For advanced proxy authentication (like Kerberos), specify the authentication method: + +```python +with sql.connect( + server_hostname="your-workspace.cloud.databricks.com", + http_path="/sql/1.0/endpoints/your-endpoint-id", + access_token="your-token", + _proxy_auth_method="negotiate" # Enable Kerberos proxy auth +) as connection: + # Your queries here... +``` + +## Proxy Configuration + +### Environment Variables + +The connector follows standard proxy environment variable conventions: + +| Variable | Description | Example | +|----------|-------------|---------| +| `HTTP_PROXY` | Proxy for HTTP requests | `http://proxy.company.com:8080` | +| `HTTPS_PROXY` | Proxy for HTTPS requests | `https://proxy.company.com:8080` | +| `NO_PROXY` | Hosts to bypass proxy | `localhost,127.0.0.1,.company.com` | + +**Note**: The connector also recognizes lowercase versions (`http_proxy`, `https_proxy`, `no_proxy`). + +### Proxy URL Formats + +Basic proxy (no authentication): +```bash +export HTTPS_PROXY="http://proxy.company.com:8080" +``` + +Proxy with basic authentication: +```bash +export HTTPS_PROXY="http://username:password@proxy.company.com:8080" +``` + +## Authentication Methods + +The connector supports multiple proxy authentication methods via the `_proxy_auth_method` parameter: + +### 1. Basic Authentication (`basic` or `None`) + +**Default behavior** when credentials are provided in the proxy URL or when `_proxy_auth_method="basic"` is specified. + +```python +# Method 1: Credentials in proxy URL (recommended) +# Set environment: HTTPS_PROXY="http://user:pass@proxy.company.com:8080" +with sql.connect( + server_hostname="your-workspace.com", + http_path="/sql/1.0/endpoints/abc123", + access_token="your-token" + # No _proxy_auth_method needed - detected automatically +) as conn: + pass + +# Method 2: Explicit basic authentication +with sql.connect( + server_hostname="your-workspace.com", + http_path="/sql/1.0/endpoints/abc123", + access_token="your-token", + _proxy_auth_method="basic" # Explicit basic auth +) as conn: + pass +``` + +### 2. Kerberos/Negotiate Authentication (`negotiate`) + +For corporate environments using Kerberos authentication with proxy servers. + +**Prerequisites:** +- Valid Kerberos tickets (run `kinit` first) +- Properly configured Kerberos environment + +```python +with sql.connect( + server_hostname="your-workspace.com", + http_path="/sql/1.0/endpoints/abc123", + access_token="your-token", + _proxy_auth_method="negotiate" # Enable Kerberos proxy auth +) as conn: + pass +``` + +**Kerberos Setup Example:** +```bash +# Obtain Kerberos tickets +kinit your-username@YOUR-DOMAIN.COM + +# Set proxy (no credentials in URL for Kerberos) +export HTTPS_PROXY="http://proxy.company.com:8080" + +# Run your Python script +python your_script.py +``` + +## Proxy Bypass + +The connector respects system proxy bypass rules. Requests to hosts listed in `NO_PROXY` or system bypass lists will connect directly, bypassing the proxy. + +```bash +# Bypass proxy for local and internal hosts +export NO_PROXY="localhost,127.0.0.1,*.internal.company.com,10.*" +``` + +## Advanced Configuration + +### Per-Request Proxy Decisions + +The connector automatically makes per-request decisions about proxy usage based on: + +1. **System proxy configuration** - Detected from environment variables +2. **Proxy bypass rules** - Honor `NO_PROXY` and system bypass settings +3. **Target host** - Check if the specific host should use proxy + +### Connection Pooling + +The connector maintains separate connection pools for direct and proxy connections, allowing efficient handling of mixed proxy/direct traffic. + +### SSL/TLS with Proxy + +HTTPS connections through HTTP proxies use the CONNECT method for SSL tunneling. The connector handles this automatically while preserving all SSL verification settings. + +## Troubleshooting + +### Common Issues + +**Problem**: Connection fails with proxy-related errors +``` +Solution: +1. Verify proxy environment variables are set correctly +2. Check if proxy requires authentication +3. Ensure proxy allows CONNECT method for HTTPS +4. Test proxy connectivity with curl: + curl -x $HTTPS_PROXY https://your-workspace.com +``` + +**Problem**: Kerberos authentication fails +``` +Solution: +1. Verify Kerberos tickets: klist +2. Renew tickets if expired: kinit +3. Check proxy supports negotiate authentication +4. Ensure time synchronization between client and KDC +``` + +**Problem**: Some requests bypass proxy unexpectedly +``` +Solution: +1. Check NO_PROXY environment variable +2. Review system proxy bypass settings +3. Verify the target hostname format +``` + +### Debug Logging + +Enable detailed logging to troubleshoot proxy issues: + +```python +import logging + +# Enable connector debug logging +logging.basicConfig(level=logging.DEBUG) +logging.getLogger("databricks.sql").setLevel(logging.DEBUG) + +# Enable urllib3 logging for HTTP details +logging.getLogger("urllib3").setLevel(logging.DEBUG) +``` + +### Testing Proxy Configuration + +Use the provided example script to test different proxy authentication methods: + +```bash +cd examples/ +python proxy_authentication.py +``` + +This script tests: +- Default proxy behavior +- Basic authentication +- Kerberos/Negotiate authentication + +## Examples + +See `examples/proxy_authentication.py` for a comprehensive demonstration of proxy authentication methods. + +## Implementation Details + +### How Proxy Detection Works + +1. **Environment Variables**: Check `HTTP_PROXY`/`HTTPS_PROXY` environment variables +2. **System Configuration**: Use Python's `urllib.request.getproxies()` to detect system settings +3. **Bypass Rules**: Honor `NO_PROXY` and `urllib.request.proxy_bypass()` rules +4. **Per-Request Logic**: Decide proxy usage for each request based on target host + +### Supported Proxy Types + +- **HTTP Proxies**: For both HTTP and HTTPS traffic (via CONNECT) +- **HTTPS Proxies**: Encrypted proxy connections +- **Authentication**: Basic, Negotiate/Kerberos +- **Bypass Rules**: Full support for NO_PROXY patterns + +### Connection Architecture + +The connector uses a unified HTTP client that maintains: +- **Direct Pool Manager**: For non-proxy connections +- **Proxy Pool Manager**: For proxy connections +- **Per-Request Routing**: Automatic selection based on target host + +This architecture ensures optimal performance and correct proxy handling across all connector operations. diff --git a/examples/README.md b/examples/README.md index 43d248dab..f52dede1d 100644 --- a/examples/README.md +++ b/examples/README.md @@ -31,6 +31,7 @@ To run all of these examples you can clone the entire repository to your disk. O - **`query_execute.py`** connects to the `samples` database of your default catalog, runs a small query, and prints the result to screen. - **`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. +- **`transactions.py`** demonstrates multi-statement transaction support with explicit commit/rollback control. Shows how to group multiple SQL statements into an atomic unit that either succeeds completely or fails completely. - **`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. @@ -42,3 +43,4 @@ this example the string `ExamplePartnerTag` will be added to the the user agent - **`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. +- **`proxy_authentication.py`** demonstrates how to connect through proxy servers using different authentication methods including basic authentication and Kerberos/Negotiate authentication. diff --git a/examples/experimental/sea_connector_test.py b/examples/experimental/sea_connector_test.py new file mode 100644 index 000000000..712f033c6 --- /dev/null +++ b/examples/experimental/sea_connector_test.py @@ -0,0 +1,121 @@ +""" +Main script to run all SEA connector tests. + +This script runs all the individual test modules and displays +a summary of test results with visual indicators. + +In order to run the script, the following environment variables need to be set: +- DATABRICKS_SERVER_HOSTNAME: The hostname of the Databricks server +- DATABRICKS_HTTP_PATH: The HTTP path of the Databricks server +- DATABRICKS_TOKEN: The token to use for authentication +""" + +import os +import sys +import logging +import subprocess +from typing import List, Tuple + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +TEST_MODULES = [ + "test_sea_session", + "test_sea_sync_query", + "test_sea_async_query", + "test_sea_metadata", +] + + +def run_test_module(module_name: str) -> bool: + """Run a test module and return success status.""" + module_path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "tests", f"{module_name}.py" + ) + + # Simply run the module as a script - each module handles its own test execution + result = subprocess.run( + [sys.executable, module_path], capture_output=True, text=True + ) + + # Log the output from the test module + if result.stdout: + for line in result.stdout.strip().split("\n"): + logger.info(line) + + if result.stderr: + for line in result.stderr.strip().split("\n"): + logger.error(line) + + return result.returncode == 0 + + +def run_tests() -> List[Tuple[str, bool]]: + """Run all tests and return results.""" + results = [] + + for module_name in TEST_MODULES: + try: + logger.info(f"\n{'=' * 50}") + logger.info(f"Running test: {module_name}") + logger.info(f"{'-' * 50}") + + success = run_test_module(module_name) + results.append((module_name, success)) + + status = "✅ PASSED" if success else "❌ FAILED" + logger.info(f"Test {module_name}: {status}") + + except Exception as e: + logger.error(f"Error loading or running test {module_name}: {str(e)}") + import traceback + + logger.error(traceback.format_exc()) + results.append((module_name, False)) + + return results + + +def print_summary(results: List[Tuple[str, bool]]) -> None: + """Print a summary of test results.""" + logger.info(f"\n{'=' * 50}") + logger.info("TEST SUMMARY") + logger.info(f"{'-' * 50}") + + passed = sum(1 for _, success in results if success) + total = len(results) + + for module_name, success in results: + status = "✅ PASSED" if success else "❌ FAILED" + logger.info(f"{status} - {module_name}") + + logger.info(f"{'-' * 50}") + logger.info(f"Total: {total} | Passed: {passed} | Failed: {total - passed}") + logger.info(f"{'=' * 50}") + + +if __name__ == "__main__": + # Check if required environment variables are set + required_vars = [ + "DATABRICKS_SERVER_HOSTNAME", + "DATABRICKS_HTTP_PATH", + "DATABRICKS_TOKEN", + ] + missing_vars = [var for var in required_vars if not os.environ.get(var)] + + if missing_vars: + logger.error( + f"Missing required environment variables: {', '.join(missing_vars)}" + ) + logger.error("Please set these variables before running the tests.") + sys.exit(1) + + # Run all tests + results = run_tests() + + # Print summary + print_summary(results) + + # Exit with appropriate status code + all_passed = all(success for _, success in results) + sys.exit(0 if all_passed else 1) diff --git a/src/databricks/sqlalchemy/py.typed b/examples/experimental/tests/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from src/databricks/sqlalchemy/py.typed rename to examples/experimental/tests/__init__.py diff --git a/examples/experimental/tests/test_sea_async_query.py b/examples/experimental/tests/test_sea_async_query.py new file mode 100644 index 000000000..5bc6c6793 --- /dev/null +++ b/examples/experimental/tests/test_sea_async_query.py @@ -0,0 +1,241 @@ +""" +Test for SEA asynchronous query execution functionality. +""" +import os +import sys +import logging +import time +from databricks.sql.client import Connection +from databricks.sql.backend.types import CommandState + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def test_sea_async_query_with_cloud_fetch(): + """ + Test executing a query asynchronously using the SEA backend with cloud fetch enabled. + + This function connects to a Databricks SQL endpoint using the SEA backend, + executes a simple query asynchronously with cloud fetch enabled, and verifies that execution completes successfully. + """ + server_hostname = os.environ.get("DATABRICKS_SERVER_HOSTNAME") + http_path = os.environ.get("DATABRICKS_HTTP_PATH") + access_token = os.environ.get("DATABRICKS_TOKEN") + catalog = os.environ.get("DATABRICKS_CATALOG") + + if not all([server_hostname, http_path, access_token]): + logger.error("Missing required environment variables.") + logger.error( + "Please set DATABRICKS_SERVER_HOSTNAME, DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN." + ) + return False + + try: + # Create connection with cloud fetch enabled + logger.info( + "Creating connection for asynchronous query execution with cloud fetch enabled" + ) + connection = Connection( + server_hostname=server_hostname, + http_path=http_path, + access_token=access_token, + catalog=catalog, + schema="default", + use_sea=True, + user_agent_entry="SEA-Test-Client", + use_cloud_fetch=True, + enable_query_result_lz4_compression=False, + ) + + logger.info( + f"Successfully opened SEA session with ID: {connection.get_session_id_hex()}" + ) + + # Execute a query that generates large rows to force multiple chunks + requested_row_count = 5000 + cursor = connection.cursor() + query = f""" + SELECT + id, + concat('value_', repeat('a', 10000)) as test_value + FROM range(1, {requested_row_count} + 1) AS t(id) + """ + + logger.info( + f"Executing asynchronous query with cloud fetch to generate {requested_row_count} rows" + ) + cursor.execute_async(query) + logger.info( + "Asynchronous query submitted successfully with cloud fetch enabled" + ) + + # Check query state + logger.info("Checking query state...") + while cursor.is_query_pending(): + logger.info("Query is still pending, waiting...") + time.sleep(1) + + logger.info("Query is no longer pending, getting results...") + cursor.get_async_execution_result() + + results = [cursor.fetchone()] + results.extend(cursor.fetchmany(10)) + results.extend(cursor.fetchall()) + actual_row_count = len(results) + + logger.info( + f"Requested {requested_row_count} rows, received {actual_row_count} rows" + ) + + # Verify total row count + if actual_row_count != requested_row_count: + logger.error( + f"FAIL: Row count mismatch. Expected {requested_row_count}, got {actual_row_count}" + ) + return False + + logger.info( + "PASS: Received correct number of rows with cloud fetch and all fetch methods work correctly" + ) + + # Close resources + cursor.close() + connection.close() + logger.info("Successfully closed SEA session") + + return True + + except Exception as e: + logger.error( + f"Error during SEA asynchronous query execution test with cloud fetch: {str(e)}" + ) + import traceback + + logger.error(traceback.format_exc()) + return False + + +def test_sea_async_query_without_cloud_fetch(): + """ + Test executing a query asynchronously using the SEA backend with cloud fetch disabled. + + This function connects to a Databricks SQL endpoint using the SEA backend, + executes a simple query asynchronously with cloud fetch disabled, and verifies that execution completes successfully. + """ + server_hostname = os.environ.get("DATABRICKS_SERVER_HOSTNAME") + http_path = os.environ.get("DATABRICKS_HTTP_PATH") + access_token = os.environ.get("DATABRICKS_TOKEN") + catalog = os.environ.get("DATABRICKS_CATALOG") + + if not all([server_hostname, http_path, access_token]): + logger.error("Missing required environment variables.") + logger.error( + "Please set DATABRICKS_SERVER_HOSTNAME, DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN." + ) + return False + + try: + # Create connection with cloud fetch disabled + logger.info( + "Creating connection for asynchronous query execution with cloud fetch disabled" + ) + connection = Connection( + server_hostname=server_hostname, + http_path=http_path, + access_token=access_token, + catalog=catalog, + schema="default", + use_sea=True, + user_agent_entry="SEA-Test-Client", + use_cloud_fetch=False, + enable_query_result_lz4_compression=False, + ) + + logger.info( + f"Successfully opened SEA session with ID: {connection.get_session_id_hex()}" + ) + + # For non-cloud fetch, use a smaller row count to avoid exceeding inline limits + requested_row_count = 100 + cursor = connection.cursor() + query = f""" + SELECT + id, + concat('value_', repeat('a', 100)) as test_value + FROM range(1, {requested_row_count} + 1) AS t(id) + """ + + logger.info( + f"Executing asynchronous query without cloud fetch to generate {requested_row_count} rows" + ) + cursor.execute_async(query) + logger.info( + "Asynchronous query submitted successfully with cloud fetch disabled" + ) + + # Check query state + logger.info("Checking query state...") + while cursor.is_query_pending(): + logger.info("Query is still pending, waiting...") + time.sleep(1) + + logger.info("Query is no longer pending, getting results...") + cursor.get_async_execution_result() + results = [cursor.fetchone()] + results.extend(cursor.fetchmany(10)) + results.extend(cursor.fetchall()) + actual_row_count = len(results) + + logger.info( + f"Requested {requested_row_count} rows, received {actual_row_count} rows" + ) + + # Verify total row count + if actual_row_count != requested_row_count: + logger.error( + f"FAIL: Row count mismatch. Expected {requested_row_count}, got {actual_row_count}" + ) + return False + + logger.info( + "PASS: Received correct number of rows without cloud fetch and all fetch methods work correctly" + ) + + # Close resources + cursor.close() + connection.close() + logger.info("Successfully closed SEA session") + + return True + + except Exception as e: + logger.error( + f"Error during SEA asynchronous query execution test without cloud fetch: {str(e)}" + ) + import traceback + + logger.error(traceback.format_exc()) + return False + + +def test_sea_async_query_exec(): + """ + Run both asynchronous query tests and return overall success. + """ + with_cloud_fetch_success = test_sea_async_query_with_cloud_fetch() + logger.info( + f"Asynchronous query with cloud fetch: {'✅ PASSED' if with_cloud_fetch_success else '❌ FAILED'}" + ) + + without_cloud_fetch_success = test_sea_async_query_without_cloud_fetch() + logger.info( + f"Asynchronous query without cloud fetch: {'✅ PASSED' if without_cloud_fetch_success else '❌ FAILED'}" + ) + + return with_cloud_fetch_success and without_cloud_fetch_success + + +if __name__ == "__main__": + success = test_sea_async_query_exec() + sys.exit(0 if success else 1) diff --git a/examples/experimental/tests/test_sea_metadata.py b/examples/experimental/tests/test_sea_metadata.py new file mode 100644 index 000000000..a200d97d3 --- /dev/null +++ b/examples/experimental/tests/test_sea_metadata.py @@ -0,0 +1,98 @@ +""" +Test for SEA metadata functionality. +""" +import os +import sys +import logging +from databricks.sql.client import Connection + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def test_sea_metadata(): + """ + Test metadata operations using the SEA backend. + + This function connects to a Databricks SQL endpoint using the SEA backend, + and executes metadata operations like catalogs(), schemas(), tables(), and columns(). + """ + server_hostname = os.environ.get("DATABRICKS_SERVER_HOSTNAME") + http_path = os.environ.get("DATABRICKS_HTTP_PATH") + access_token = os.environ.get("DATABRICKS_TOKEN") + catalog = os.environ.get("DATABRICKS_CATALOG") + + if not all([server_hostname, http_path, access_token]): + logger.error("Missing required environment variables.") + logger.error( + "Please set DATABRICKS_SERVER_HOSTNAME, DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN." + ) + return False + + if not catalog: + logger.error( + "DATABRICKS_CATALOG environment variable is required for metadata tests." + ) + return False + + try: + # Create connection + logger.info("Creating connection for metadata operations") + connection = Connection( + server_hostname=server_hostname, + http_path=http_path, + access_token=access_token, + catalog=catalog, + schema="default", + use_sea=True, + user_agent_entry="SEA-Test-Client", + ) + + logger.info( + f"Successfully opened SEA session with ID: {connection.get_session_id_hex()}" + ) + + # Test catalogs + cursor = connection.cursor() + logger.info("Fetching catalogs...") + cursor.catalogs() + logger.info("Successfully fetched catalogs") + + # Test schemas + logger.info(f"Fetching schemas for catalog '{catalog}'...") + cursor.schemas(catalog_name=catalog) + logger.info("Successfully fetched schemas") + + # Test tables + logger.info(f"Fetching tables for catalog '{catalog}', schema 'default'...") + cursor.tables(catalog_name=catalog, schema_name="default") + logger.info("Successfully fetched tables") + + # Test columns for a specific table + # Using a common table that should exist in most environments + logger.info( + f"Fetching columns for catalog '{catalog}', schema 'default', table 'customer'..." + ) + cursor.columns( + catalog_name=catalog, schema_name="default", table_name="customer" + ) + logger.info("Successfully fetched columns") + + # Close resources + cursor.close() + connection.close() + logger.info("Successfully closed SEA session") + + return True + + except Exception as e: + logger.error(f"Error during SEA metadata test: {str(e)}") + import traceback + + logger.error(traceback.format_exc()) + return False + + +if __name__ == "__main__": + success = test_sea_metadata() + sys.exit(0 if success else 1) diff --git a/examples/experimental/tests/test_sea_session.py b/examples/experimental/tests/test_sea_session.py new file mode 100644 index 000000000..516c1bbb8 --- /dev/null +++ b/examples/experimental/tests/test_sea_session.py @@ -0,0 +1,71 @@ +""" +Test for SEA session management functionality. +""" +import os +import sys +import logging +from databricks.sql.client import Connection + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def test_sea_session(): + """ + Test opening and closing a SEA session using the connector. + + This function connects to a Databricks SQL endpoint using the SEA backend, + opens a session, and then closes it. + + Required environment variables: + - DATABRICKS_SERVER_HOSTNAME: Databricks server hostname + - DATABRICKS_HTTP_PATH: HTTP path for the SQL endpoint + - DATABRICKS_TOKEN: Personal access token for authentication + """ + server_hostname = os.environ.get("DATABRICKS_SERVER_HOSTNAME") + http_path = os.environ.get("DATABRICKS_HTTP_PATH") + access_token = os.environ.get("DATABRICKS_TOKEN") + catalog = os.environ.get("DATABRICKS_CATALOG") + + if not all([server_hostname, http_path, access_token]): + logger.error("Missing required environment variables.") + logger.error( + "Please set DATABRICKS_SERVER_HOSTNAME, DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN." + ) + return False + + try: + logger.info("Creating connection with SEA backend...") + connection = Connection( + server_hostname=server_hostname, + http_path=http_path, + access_token=access_token, + catalog=catalog, + schema="default", + use_sea=True, + user_agent_entry="SEA-Test-Client", + ) + + logger.info( + f"Successfully opened SEA session with ID: {connection.get_session_id_hex()}" + ) + logger.info(f"Backend type: {type(connection.session.backend)}") + + # Close the connection + logger.info("Closing the SEA session...") + connection.close() + logger.info("Successfully closed SEA session") + + return True + + except Exception as e: + logger.error(f"Error testing SEA session: {str(e)}") + import traceback + + logger.error(traceback.format_exc()) + return False + + +if __name__ == "__main__": + success = test_sea_session() + sys.exit(0 if success else 1) diff --git a/examples/experimental/tests/test_sea_sync_query.py b/examples/experimental/tests/test_sea_sync_query.py new file mode 100644 index 000000000..4e12d5aa4 --- /dev/null +++ b/examples/experimental/tests/test_sea_sync_query.py @@ -0,0 +1,200 @@ +""" +Test for SEA synchronous query execution functionality. +""" +import os +import sys +import logging +from databricks.sql.client import Connection + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def test_sea_sync_query_with_cloud_fetch(): + """ + Test executing a query synchronously using the SEA backend with cloud fetch enabled. + + This function connects to a Databricks SQL endpoint using the SEA backend, + executes a simple query with cloud fetch enabled, and verifies that execution completes successfully. + """ + server_hostname = os.environ.get("DATABRICKS_SERVER_HOSTNAME") + http_path = os.environ.get("DATABRICKS_HTTP_PATH") + access_token = os.environ.get("DATABRICKS_TOKEN") + catalog = os.environ.get("DATABRICKS_CATALOG") + + if not all([server_hostname, http_path, access_token]): + logger.error("Missing required environment variables.") + logger.error( + "Please set DATABRICKS_SERVER_HOSTNAME, DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN." + ) + return False + + try: + # Create connection with cloud fetch enabled + logger.info( + "Creating connection for synchronous query execution with cloud fetch enabled" + ) + connection = Connection( + server_hostname=server_hostname, + http_path=http_path, + access_token=access_token, + catalog=catalog, + schema="default", + use_sea=True, + user_agent_entry="SEA-Test-Client", + use_cloud_fetch=True, + enable_query_result_lz4_compression=False, + ) + + logger.info( + f"Successfully opened SEA session with ID: {connection.get_session_id_hex()}" + ) + + # Execute a query that generates large rows to force multiple chunks + requested_row_count = 10000 + cursor = connection.cursor() + query = f""" + SELECT + id, + concat('value_', repeat('a', 10000)) as test_value + FROM range(1, {requested_row_count} + 1) AS t(id) + """ + + logger.info( + f"Executing synchronous query with cloud fetch to generate {requested_row_count} rows" + ) + cursor.execute(query) + results = [cursor.fetchone()] + results.extend(cursor.fetchmany(10)) + results.extend(cursor.fetchall()) + actual_row_count = len(results) + logger.info( + f"{actual_row_count} rows retrieved against {requested_row_count} requested" + ) + + # Verify total row count + if actual_row_count != requested_row_count: + logger.error( + f"FAIL: Row count mismatch. Expected {requested_row_count}, got {actual_row_count}" + ) + return False + + # Close resources + cursor.close() + connection.close() + logger.info("Successfully closed SEA session") + + return True + + except Exception as e: + logger.error( + f"Error during SEA synchronous query execution test with cloud fetch: {str(e)}" + ) + import traceback + + logger.error(traceback.format_exc()) + return False + + +def test_sea_sync_query_without_cloud_fetch(): + """ + Test executing a query synchronously using the SEA backend with cloud fetch disabled. + + This function connects to a Databricks SQL endpoint using the SEA backend, + executes a simple query with cloud fetch disabled, and verifies that execution completes successfully. + """ + server_hostname = os.environ.get("DATABRICKS_SERVER_HOSTNAME") + http_path = os.environ.get("DATABRICKS_HTTP_PATH") + access_token = os.environ.get("DATABRICKS_TOKEN") + catalog = os.environ.get("DATABRICKS_CATALOG") + + if not all([server_hostname, http_path, access_token]): + logger.error("Missing required environment variables.") + logger.error( + "Please set DATABRICKS_SERVER_HOSTNAME, DATABRICKS_HTTP_PATH, and DATABRICKS_TOKEN." + ) + return False + + try: + # Create connection with cloud fetch disabled + logger.info( + "Creating connection for synchronous query execution with cloud fetch disabled" + ) + connection = Connection( + server_hostname=server_hostname, + http_path=http_path, + access_token=access_token, + catalog=catalog, + schema="default", + use_sea=True, + user_agent_entry="SEA-Test-Client", + use_cloud_fetch=False, + enable_query_result_lz4_compression=False, + ) + + logger.info( + f"Successfully opened SEA session with ID: {connection.get_session_id_hex()}" + ) + + # For non-cloud fetch, use a smaller row count to avoid exceeding inline limits + requested_row_count = 100 + cursor = connection.cursor() + logger.info( + f"Executing synchronous query without cloud fetch: SELECT {requested_row_count} rows" + ) + cursor.execute( + "SELECT id, 'test_value_' || CAST(id as STRING) as test_value FROM range(1, 101)" + ) + + results = [cursor.fetchone()] + results.extend(cursor.fetchmany(10)) + results.extend(cursor.fetchall()) + actual_row_count = len(results) + logger.info( + f"{actual_row_count} rows retrieved against {requested_row_count} requested" + ) + + # Verify total row count + if actual_row_count != requested_row_count: + logger.error( + f"FAIL: Row count mismatch. Expected {requested_row_count}, got {actual_row_count}" + ) + return False + + # Close resources + cursor.close() + connection.close() + logger.info("Successfully closed SEA session") + + return True + + except Exception as e: + logger.error( + f"Error during SEA synchronous query execution test without cloud fetch: {str(e)}" + ) + import traceback + + logger.error(traceback.format_exc()) + return False + + +def test_sea_sync_query_exec(): + """ + Run both synchronous query tests and return overall success. + """ + with_cloud_fetch_success = test_sea_sync_query_with_cloud_fetch() + logger.info( + f"Synchronous query with cloud fetch: {'✅ PASSED' if with_cloud_fetch_success else '❌ FAILED'}" + ) + + without_cloud_fetch_success = test_sea_sync_query_without_cloud_fetch() + logger.info( + f"Synchronous query without cloud fetch: {'✅ PASSED' if without_cloud_fetch_success else '❌ FAILED'}" + ) + + return with_cloud_fetch_success and without_cloud_fetch_success + + +if __name__ == "__main__": + success = test_sea_sync_query_exec() + sys.exit(0 if success else 1) diff --git a/examples/proxy_authentication.py b/examples/proxy_authentication.py new file mode 100644 index 000000000..8547336b3 --- /dev/null +++ b/examples/proxy_authentication.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 +""" +Example: Databricks SQL Connector with Proxy Authentication + +This example demonstrates how to connect to Databricks through a proxy server +using different authentication methods: +1. Basic authentication (username/password in proxy URL) +2. Kerberos/Negotiate authentication +3. Default system proxy behavior + +Prerequisites: +- Configure your system proxy settings (HTTP_PROXY/HTTPS_PROXY environment variables) +- For Kerberos: Ensure you have valid Kerberos tickets (kinit) +- Set your Databricks credentials in environment variables +""" + +import os +from databricks import sql +import logging + +# Configure logging to see proxy activity +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) + +# Uncomment for detailed debugging (shows HTTP requests/responses) +# logging.getLogger("urllib3").setLevel(logging.DEBUG) +# logging.getLogger("urllib3.connectionpool").setLevel(logging.DEBUG) + +def check_proxy_environment(): + """Check if proxy environment variables are configured.""" + proxy_vars = ['HTTP_PROXY', 'HTTPS_PROXY', 'http_proxy', 'https_proxy'] + configured_proxies = {var: os.environ.get(var) for var in proxy_vars if os.environ.get(var)} + + if configured_proxies: + print("✓ Proxy environment variables found:") + for var, value in configured_proxies.items(): + # Hide credentials in output for security + safe_value = value.split('@')[-1] if '@' in value else value + print(f" {var}: {safe_value}") + return True + else: + print("⚠ No proxy environment variables found") + print(" Set HTTP_PROXY and/or HTTPS_PROXY if using a proxy") + return False + +def test_connection(connection_params, test_name): + """Test a database connection with given parameters.""" + print(f"\n--- Testing {test_name} ---") + + try: + with sql.connect(**connection_params) as connection: + print("✓ Successfully connected!") + + with connection.cursor() as cursor: + # Test basic query + cursor.execute("SELECT current_user() as user, current_database() as database") + result = cursor.fetchone() + print(f"✓ Connected as user: {result.user}") + print(f"✓ Default database: {result.database}") + + # Test a simple computation + cursor.execute("SELECT 1 + 1 as result") + result = cursor.fetchone() + print(f"✓ Query result: 1 + 1 = {result.result}") + + return True + + except Exception as e: + print(f"✗ Connection failed: {e}") + return False + +def main(): + print("Databricks SQL Connector - Proxy Authentication Examples") + print("=" * 60) + + # Check proxy configuration + has_proxy = check_proxy_environment() + + # Get Databricks connection parameters + server_hostname = os.environ.get('DATABRICKS_SERVER_HOSTNAME') + http_path = os.environ.get('DATABRICKS_HTTP_PATH') + access_token = os.environ.get('DATABRICKS_TOKEN') + + if not all([server_hostname, http_path, access_token]): + print("\n✗ Missing required environment variables:") + print(" DATABRICKS_SERVER_HOSTNAME") + print(" DATABRICKS_HTTP_PATH") + print(" DATABRICKS_TOKEN") + return 1 + + print(f"\nConnecting to: {server_hostname}") + + # Base connection parameters + base_params = { + 'server_hostname': server_hostname, + 'http_path': http_path, + 'access_token': access_token + } + + success_count = 0 + total_tests = 0 + + # Test 1: Default proxy behavior (no _proxy_auth_method specified) + # This uses basic auth if credentials are in proxy URL, otherwise no auth + print("\n" + "="*60) + print("Test 1: Default Proxy Behavior") + print("Uses basic authentication if credentials are in proxy URL") + total_tests += 1 + if test_connection(base_params, "Default Proxy Behavior"): + success_count += 1 + + # Test 2: Explicit basic authentication + print("\n" + "="*60) + print("Test 2: Explicit Basic Authentication") + print("Explicitly requests basic authentication (same as default)") + total_tests += 1 + basic_params = base_params.copy() + basic_params['_proxy_auth_method'] = 'basic' + if test_connection(basic_params, "Basic Proxy Authentication"): + success_count += 1 + + # Test 3: Kerberos/Negotiate authentication + print("\n" + "="*60) + print("Test 3: Kerberos/Negotiate Authentication") + print("Uses Kerberos tickets for proxy authentication") + print("Note: Requires valid Kerberos tickets (run 'kinit' first)") + total_tests += 1 + kerberos_params = base_params.copy() + kerberos_params['_proxy_auth_method'] = 'negotiate' + if test_connection(kerberos_params, "Kerberos Proxy Authentication"): + success_count += 1 + + # Summary + print(f"\n{'='*60}") + print(f"Summary: {success_count}/{total_tests} tests passed") + + if success_count == total_tests: + print("✓ All proxy authentication methods working!") + return 0 + elif success_count > 0: + print("⚠ Some proxy authentication methods failed") + print("This may be normal depending on your proxy configuration") + return 0 + else: + print("✗ All proxy authentication methods failed") + if not has_proxy: + print("Consider checking your proxy configuration") + return 1 + +if __name__ == "__main__": + exit(main()) diff --git a/examples/query_async_execute.py b/examples/query_async_execute.py new file mode 100644 index 000000000..de4712fe3 --- /dev/null +++ b/examples/query_async_execute.py @@ -0,0 +1,32 @@ +from databricks import sql +import os +import time + +with sql.connect( + server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"), + http_path=os.getenv("DATABRICKS_HTTP_PATH"), + access_token=os.getenv("DATABRICKS_TOKEN"), +) as connection: + + with connection.cursor() as cursor: + long_running_query = """ + SELECT COUNT(*) FROM RANGE(10000 * 16) x + JOIN RANGE(10000) y + ON FROM_UNIXTIME(x.id * y.id, 'yyyy-MM-dd') LIKE '%not%a%date%' + """ + + # Non-blocking call + cursor.execute_async(long_running_query) + + # Polling every 5 seconds until the query is no longer pending + while cursor.is_query_pending(): + print("POLLING") + time.sleep(5) + + # Blocking call: fetch results when execution completes + cursor.get_async_execution_result() + + result = cursor.fetchall() + + for res in result: + print(res) diff --git a/examples/query_tags_example.py b/examples/query_tags_example.py new file mode 100644 index 000000000..977dc6ad5 --- /dev/null +++ b/examples/query_tags_example.py @@ -0,0 +1,118 @@ +import os +import databricks.sql as sql + +""" +This example demonstrates how to use Query Tags. + +Query Tags are key-value pairs that can be attached to SQL executions and will appear +in the system.query.history table for analytical purposes. + +There are two ways to set query tags: +1. Connection-level: Pass query_tags parameter to sql.connect() (applies to all queries in the session) +2. Per-query level: Pass query_tags parameter to execute() or execute_async() (applies to specific query) + +Format: Dictionary with string keys and optional string values +Example: {"team": "engineering", "application": "etl", "priority": "high"} + +Special cases: +- If a value is None, only the key is included (no colon or value) +- Special characters (comma, colon and backslash) in values are automatically escaped +- Backslashes in keys are automatically escaped; other special characters in keys are not allowed +""" + +print("=== Query Tags Example ===\n") + +# Example 1: Connection-level query tags +print("Example 1: Connection-level query tags") +with sql.connect( + server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"), + http_path=os.getenv("DATABRICKS_HTTP_PATH"), + access_token=os.getenv("DATABRICKS_TOKEN"), + query_tags={"team": "engineering", "application": "etl"}, +) as connection: + + with connection.cursor() as cursor: + cursor.execute("SELECT 1") + result = cursor.fetchone() + print(f" Result: {result[0]}") + +print() + +# Example 2: Per-query query tags +print("Example 2: Per-query query tags") +with sql.connect( + server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"), + http_path=os.getenv("DATABRICKS_HTTP_PATH"), + access_token=os.getenv("DATABRICKS_TOKEN"), +) as connection: + + with connection.cursor() as cursor: + # Query 1: Tags for a critical ETL job + cursor.execute( + "SELECT 1", + query_tags={"team": "data-eng", "application": "etl", "priority": "high"} + ) + result = cursor.fetchone() + print(f" ETL Query Result: {result[0]}") + + # Query 2: Tags with None value (key-only tag) + cursor.execute( + "SELECT 2", + query_tags={"team": "analytics", "experimental": None} + ) + result = cursor.fetchone() + print(f" Experimental Query Result: {result[0]}") + + # Query 3: Tags with special characters (automatically escaped) + cursor.execute( + "SELECT 3", + query_tags={"description": "test:with:colons,and,commas"} + ) + result = cursor.fetchone() + print(f" Special Chars Query Result: {result[0]}") + + # Query 4: No tags (demonstrates tags don't persist from previous queries) + cursor.execute("SELECT 4") + result = cursor.fetchone() + print(f" No Tags Query Result: {result[0]}") + +print() + +# Example 3: Async execution with query tags +print("Example 3: Async execution with query tags") +with sql.connect( + server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"), + http_path=os.getenv("DATABRICKS_HTTP_PATH"), + access_token=os.getenv("DATABRICKS_TOKEN"), +) as connection: + + with connection.cursor() as cursor: + cursor.execute_async( + "SELECT 5", + query_tags={"team": "data-eng", "mode": "async"} + ) + cursor.get_async_execution_result() + result = cursor.fetchone() + print(f" Async Query Result: {result[0]}") + +print() + +# Example 4: executemany with query tags +print("Example 4: executemany with query tags") +with sql.connect( + server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"), + http_path=os.getenv("DATABRICKS_HTTP_PATH"), + access_token=os.getenv("DATABRICKS_TOKEN"), +) as connection: + + with connection.cursor() as cursor: + # Execute multiple queries with the same tags + cursor.executemany( + "SELECT ?", + [[6], [7], [8]], + query_tags={"team": "data-eng", "batch": "executemany"} + ) + result = cursor.fetchone() + print(f" Executemany Query Result (last): {result[0]}") + +print("\n=== Query Tags Example Complete ===") diff --git a/examples/set_user_agent.py b/examples/set_user_agent.py index 93eb2e0b3..093f03bd5 100644 --- a/examples/set_user_agent.py +++ b/examples/set_user_agent.py @@ -5,7 +5,7 @@ server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"), http_path=os.getenv("DATABRICKS_HTTP_PATH"), access_token=os.getenv("DATABRICKS_TOKEN"), - _user_agent_entry="ExamplePartnerTag", + user_agent_entry="ExamplePartnerTag", ) as connection: with connection.cursor() as cursor: diff --git a/examples/sqlalchemy.py b/examples/sqlalchemy.py deleted file mode 100644 index 7492dc5a3..000000000 --- a/examples/sqlalchemy.py +++ /dev/null @@ -1,174 +0,0 @@ -""" -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. -""" - -# 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 - -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") - - -# Extra arguments are passed untouched to databricks-sql-connector -# See src/databricks/sql/thrift_backend.py for complete list -extra_connect_args = { - "_tls_verify_hostname": True, - "_user_agent_entry": "PySQL Example Script", -} - - -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) - -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 diff --git a/examples/streaming_put.py b/examples/streaming_put.py new file mode 100644 index 000000000..4e7697099 --- /dev/null +++ b/examples/streaming_put.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +""" +Simple example of streaming PUT operations. + +This demonstrates the basic usage of streaming PUT with the __input_stream__ token. +""" + +import io +import os +from databricks import sql + +with sql.connect( + server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"), + http_path=os.getenv("DATABRICKS_HTTP_PATH"), + access_token=os.getenv("DATABRICKS_TOKEN"), +) as connection: + + with connection.cursor() as cursor: + # Create a simple data stream + data = b"Hello, streaming world!" + stream = io.BytesIO(data) + + # Get catalog, schema, and volume from environment variables + catalog = os.getenv("DATABRICKS_CATALOG") + schema = os.getenv("DATABRICKS_SCHEMA") + volume = os.getenv("DATABRICKS_VOLUME") + + # Upload to Unity Catalog volume + cursor.execute( + f"PUT '__input_stream__' INTO '/Volumes/{catalog}/{schema}/{volume}/hello.txt' OVERWRITE", + input_stream=stream + ) + + print("File uploaded successfully!") \ No newline at end of file diff --git a/examples/transactions.py b/examples/transactions.py new file mode 100644 index 000000000..6f58dbd2d --- /dev/null +++ b/examples/transactions.py @@ -0,0 +1,47 @@ +from databricks import sql +import os + +with sql.connect( + server_hostname=os.getenv("DATABRICKS_SERVER_HOSTNAME"), + http_path=os.getenv("DATABRICKS_HTTP_PATH"), + access_token=os.getenv("DATABRICKS_TOKEN"), +) as connection: + + # Disable autocommit to use explicit transactions + connection.autocommit = False + + with connection.cursor() as cursor: + try: + # Create tables for demonstration + cursor.execute("CREATE TABLE IF NOT EXISTS accounts (id int, balance int)") + cursor.execute( + "CREATE TABLE IF NOT EXISTS transfers (from_id int, to_id int, amount int)" + ) + connection.commit() + + # Start a new transaction - transfer money between accounts + cursor.execute("INSERT INTO accounts VALUES (1, 1000), (2, 500)") + cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1") + cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2") + cursor.execute("INSERT INTO transfers VALUES (1, 2, 100)") + + # Commit the transaction - all changes succeed together + connection.commit() + print("Transaction committed successfully") + + # Verify the results + cursor.execute("SELECT * FROM accounts ORDER BY id") + print("Accounts:", cursor.fetchall()) + + cursor.execute("SELECT * FROM transfers") + print("Transfers:", cursor.fetchall()) + + except Exception as e: + # Roll back on error - all changes are discarded + connection.rollback() + print(f"Transaction rolled back due to error: {e}") + raise + + finally: + # Restore autocommit to default state + connection.autocommit = True diff --git a/poetry.lock b/poetry.lock old mode 100755 new mode 100644 index 576adbd35..5644190f4 --- a/poetry.lock +++ b/poetry.lock @@ -1,35 +1,15 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. - -[[package]] -name = "alembic" -version = "1.13.2" -description = "A database migration tool for SQLAlchemy." -optional = true -python-versions = ">=3.8" -files = [ - {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, - {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, -] - -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} -Mako = "*" -SQLAlchemy = ">=1.3.0" -typing-extensions = ">=4" - -[package.extras] -tz = ["backports.zoneinfo"] +# This file is automatically @generated by Poetry 2.3.1 and should not be changed by hand. [[package]] name = "astroid" -version = "3.2.2" +version = "3.2.4" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ - {file = "astroid-3.2.2-py3-none-any.whl", hash = "sha256:e8a0083b4bb28fcffb6207a3bfc9e5d0a68be951dd7e336d5dcf639c682388c0"}, - {file = "astroid-3.2.2.tar.gz", hash = "sha256:8ead48e31b92b2e217b6c9733a21afafe479d52d6e164dd25fb1a770c7c3cf94"}, + {file = "astroid-3.2.4-py3-none-any.whl", hash = "sha256:413658a61eeca6202a59231abb473f932038fbcbf1666587f66d482083413a25"}, + {file = "astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a"}, ] [package.dependencies] @@ -41,6 +21,7 @@ version = "22.12.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, @@ -72,123 +53,209 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2024.6.2" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.1" 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"}, +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] 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.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -200,179 +267,455 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] -name = "dill" -version = "0.3.8" -description = "serialize all of Python" +name = "coverage" +version = "7.6.1" +description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version < \"3.10\"" files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + [package.extras] -graph = ["objgraph (>=1.7.2)"] -profile = ["gprof2dot (>=2022.7.29)"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] -name = "et-xmlfile" -version = "1.1.0" -description = "An implementation of lxml.xmlfile for the standard library" +name = "coverage" +version = "7.10.1" +description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version >= \"3.10\"" files = [ - {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, - {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, + {file = "coverage-7.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c86eb388bbd609d15560e7cc0eb936c102b6f43f31cf3e58b4fd9afe28e1372"}, + {file = "coverage-7.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b4ba0f488c1bdb6bd9ba81da50715a372119785458831c73428a8566253b86b"}, + {file = "coverage-7.10.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083442ecf97d434f0cb3b3e3676584443182653da08b42e965326ba12d6b5f2a"}, + {file = "coverage-7.10.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c1a40c486041006b135759f59189385da7c66d239bad897c994e18fd1d0c128f"}, + {file = "coverage-7.10.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3beb76e20b28046989300c4ea81bf690df84ee98ade4dc0bbbf774a28eb98440"}, + {file = "coverage-7.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bc265a7945e8d08da28999ad02b544963f813a00f3ed0a7a0ce4165fd77629f8"}, + {file = "coverage-7.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:47c91f32ba4ac46f1e224a7ebf3f98b4b24335bad16137737fe71a5961a0665c"}, + {file = "coverage-7.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1a108dd78ed185020f66f131c60078f3fae3f61646c28c8bb4edd3fa121fc7fc"}, + {file = "coverage-7.10.1-cp310-cp310-win32.whl", hash = "sha256:7092cc82382e634075cc0255b0b69cb7cada7c1f249070ace6a95cb0f13548ef"}, + {file = "coverage-7.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:ac0c5bba938879c2fc0bc6c1b47311b5ad1212a9dcb8b40fe2c8110239b7faed"}, + {file = "coverage-7.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45e2f9d5b0b5c1977cb4feb5f594be60eb121106f8900348e29331f553a726f"}, + {file = "coverage-7.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a7a4d74cb0f5e3334f9aa26af7016ddb94fb4bfa11b4a573d8e98ecba8c34f1"}, + {file = "coverage-7.10.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d4b0aab55ad60ead26159ff12b538c85fbab731a5e3411c642b46c3525863437"}, + {file = "coverage-7.10.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:dcc93488c9ebd229be6ee1f0d9aad90da97b33ad7e2912f5495804d78a3cd6b7"}, + {file = "coverage-7.10.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa309df995d020f3438407081b51ff527171cca6772b33cf8f85344b8b4b8770"}, + {file = "coverage-7.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cfb8b9d8855c8608f9747602a48ab525b1d320ecf0113994f6df23160af68262"}, + {file = "coverage-7.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:320d86da829b012982b414c7cdda65f5d358d63f764e0e4e54b33097646f39a3"}, + {file = "coverage-7.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dc60ddd483c556590da1d9482a4518292eec36dd0e1e8496966759a1f282bcd0"}, + {file = "coverage-7.10.1-cp311-cp311-win32.whl", hash = "sha256:4fcfe294f95b44e4754da5b58be750396f2b1caca8f9a0e78588e3ef85f8b8be"}, + {file = "coverage-7.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:efa23166da3fe2915f8ab452dde40319ac84dc357f635737174a08dbd912980c"}, + {file = "coverage-7.10.1-cp311-cp311-win_arm64.whl", hash = "sha256:d12b15a8c3759e2bb580ffa423ae54be4f184cf23beffcbd641f4fe6e1584293"}, + {file = "coverage-7.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6b7dc7f0a75a7eaa4584e5843c873c561b12602439d2351ee28c7478186c4da4"}, + {file = "coverage-7.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:607f82389f0ecafc565813aa201a5cade04f897603750028dd660fb01797265e"}, + {file = "coverage-7.10.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f7da31a1ba31f1c1d4d5044b7c5813878adae1f3af8f4052d679cc493c7328f4"}, + {file = "coverage-7.10.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51fe93f3fe4f5d8483d51072fddc65e717a175490804e1942c975a68e04bf97a"}, + {file = "coverage-7.10.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e59d00830da411a1feef6ac828b90bbf74c9b6a8e87b8ca37964925bba76dbe"}, + {file = "coverage-7.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:924563481c27941229cb4e16eefacc35da28563e80791b3ddc5597b062a5c386"}, + {file = "coverage-7.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ca79146ee421b259f8131f153102220b84d1a5e6fb9c8aed13b3badfd1796de6"}, + {file = "coverage-7.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b225a06d227f23f386fdc0eab471506d9e644be699424814acc7d114595495f"}, + {file = "coverage-7.10.1-cp312-cp312-win32.whl", hash = "sha256:5ba9a8770effec5baaaab1567be916c87d8eea0c9ad11253722d86874d885eca"}, + {file = "coverage-7.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:9eb245a8d8dd0ad73b4062135a251ec55086fbc2c42e0eb9725a9b553fba18a3"}, + {file = "coverage-7.10.1-cp312-cp312-win_arm64.whl", hash = "sha256:7718060dd4434cc719803a5e526838a5d66e4efa5dc46d2b25c21965a9c6fcc4"}, + {file = "coverage-7.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ebb08d0867c5a25dffa4823377292a0ffd7aaafb218b5d4e2e106378b1061e39"}, + {file = "coverage-7.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f32a95a83c2e17422f67af922a89422cd24c6fa94041f083dd0bb4f6057d0bc7"}, + {file = "coverage-7.10.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c4c746d11c8aba4b9f58ca8bfc6fbfd0da4efe7960ae5540d1a1b13655ee8892"}, + {file = "coverage-7.10.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7f39edd52c23e5c7ed94e0e4bf088928029edf86ef10b95413e5ea670c5e92d7"}, + {file = "coverage-7.10.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab6e19b684981d0cd968906e293d5628e89faacb27977c92f3600b201926b994"}, + {file = "coverage-7.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5121d8cf0eacb16133501455d216bb5f99899ae2f52d394fe45d59229e6611d0"}, + {file = "coverage-7.10.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:df1c742ca6f46a6f6cbcaef9ac694dc2cb1260d30a6a2f5c68c5f5bcfee1cfd7"}, + {file = "coverage-7.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:40f9a38676f9c073bf4b9194707aa1eb97dca0e22cc3766d83879d72500132c7"}, + {file = "coverage-7.10.1-cp313-cp313-win32.whl", hash = "sha256:2348631f049e884839553b9974f0821d39241c6ffb01a418efce434f7eba0fe7"}, + {file = "coverage-7.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:4072b31361b0d6d23f750c524f694e1a417c1220a30d3ef02741eed28520c48e"}, + {file = "coverage-7.10.1-cp313-cp313-win_arm64.whl", hash = "sha256:3e31dfb8271937cab9425f19259b1b1d1f556790e98eb266009e7a61d337b6d4"}, + {file = "coverage-7.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1c4f679c6b573a5257af6012f167a45be4c749c9925fd44d5178fd641ad8bf72"}, + {file = "coverage-7.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:871ebe8143da284bd77b84a9136200bd638be253618765d21a1fce71006d94af"}, + {file = "coverage-7.10.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:998c4751dabf7d29b30594af416e4bf5091f11f92a8d88eb1512c7ba136d1ed7"}, + {file = "coverage-7.10.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:780f750a25e7749d0af6b3631759c2c14f45de209f3faaa2398312d1c7a22759"}, + {file = "coverage-7.10.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:590bdba9445df4763bdbebc928d8182f094c1f3947a8dc0fc82ef014dbdd8324"}, + {file = "coverage-7.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b2df80cb6a2af86d300e70acb82e9b79dab2c1e6971e44b78dbfc1a1e736b53"}, + {file = "coverage-7.10.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d6a558c2725bfb6337bf57c1cd366c13798bfd3bfc9e3dd1f4a6f6fc95a4605f"}, + {file = "coverage-7.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e6150d167f32f2a54690e572e0a4c90296fb000a18e9b26ab81a6489e24e78dd"}, + {file = "coverage-7.10.1-cp313-cp313t-win32.whl", hash = "sha256:d946a0c067aa88be4a593aad1236493313bafaa27e2a2080bfe88db827972f3c"}, + {file = "coverage-7.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e37c72eaccdd5ed1130c67a92ad38f5b2af66eeff7b0abe29534225db2ef7b18"}, + {file = "coverage-7.10.1-cp313-cp313t-win_arm64.whl", hash = "sha256:89ec0ffc215c590c732918c95cd02b55c7d0f569d76b90bb1a5e78aa340618e4"}, + {file = "coverage-7.10.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:166d89c57e877e93d8827dac32cedae6b0277ca684c6511497311249f35a280c"}, + {file = "coverage-7.10.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bed4a2341b33cd1a7d9ffc47df4a78ee61d3416d43b4adc9e18b7d266650b83e"}, + {file = "coverage-7.10.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddca1e4f5f4c67980533df01430184c19b5359900e080248bbf4ed6789584d8b"}, + {file = "coverage-7.10.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:37b69226001d8b7de7126cad7366b0778d36777e4d788c66991455ba817c5b41"}, + {file = "coverage-7.10.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2f22102197bcb1722691296f9e589f02b616f874e54a209284dd7b9294b0b7f"}, + {file = "coverage-7.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1e0c768b0f9ac5839dac5cf88992a4bb459e488ee8a1f8489af4cb33b1af00f1"}, + {file = "coverage-7.10.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:991196702d5e0b120a8fef2664e1b9c333a81d36d5f6bcf6b225c0cf8b0451a2"}, + {file = "coverage-7.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae8e59e5f4fd85d6ad34c2bb9d74037b5b11be072b8b7e9986beb11f957573d4"}, + {file = "coverage-7.10.1-cp314-cp314-win32.whl", hash = "sha256:042125c89cf74a074984002e165d61fe0e31c7bd40ebb4bbebf07939b5924613"}, + {file = "coverage-7.10.1-cp314-cp314-win_amd64.whl", hash = "sha256:a22c3bfe09f7a530e2c94c87ff7af867259c91bef87ed2089cd69b783af7b84e"}, + {file = "coverage-7.10.1-cp314-cp314-win_arm64.whl", hash = "sha256:ee6be07af68d9c4fca4027c70cea0c31a0f1bc9cb464ff3c84a1f916bf82e652"}, + {file = "coverage-7.10.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d24fb3c0c8ff0d517c5ca5de7cf3994a4cd559cde0315201511dbfa7ab528894"}, + {file = "coverage-7.10.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1217a54cfd79be20512a67ca81c7da3f2163f51bbfd188aab91054df012154f5"}, + {file = "coverage-7.10.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:51f30da7a52c009667e02f125737229d7d8044ad84b79db454308033a7808ab2"}, + {file = "coverage-7.10.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ed3718c757c82d920f1c94089066225ca2ad7f00bb904cb72b1c39ebdd906ccb"}, + {file = "coverage-7.10.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc452481e124a819ced0c25412ea2e144269ef2f2534b862d9f6a9dae4bda17b"}, + {file = "coverage-7.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d6f494c307e5cb9b1e052ec1a471060f1dea092c8116e642e7a23e79d9388ea"}, + {file = "coverage-7.10.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fc0e46d86905ddd16b85991f1f4919028092b4e511689bbdaff0876bd8aab3dd"}, + {file = "coverage-7.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80b9ccd82e30038b61fc9a692a8dc4801504689651b281ed9109f10cc9fe8b4d"}, + {file = "coverage-7.10.1-cp314-cp314t-win32.whl", hash = "sha256:e58991a2b213417285ec866d3cd32db17a6a88061a985dbb7e8e8f13af429c47"}, + {file = "coverage-7.10.1-cp314-cp314t-win_amd64.whl", hash = "sha256:e88dd71e4ecbc49d9d57d064117462c43f40a21a1383507811cf834a4a620651"}, + {file = "coverage-7.10.1-cp314-cp314t-win_arm64.whl", hash = "sha256:1aadfb06a30c62c2eb82322171fe1f7c288c80ca4156d46af0ca039052814bab"}, + {file = "coverage-7.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:57b6e8789cbefdef0667e4a94f8ffa40f9402cee5fc3b8e4274c894737890145"}, + {file = "coverage-7.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:85b22a9cce00cb03156334da67eb86e29f22b5e93876d0dd6a98646bb8a74e53"}, + {file = "coverage-7.10.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:97b6983a2f9c76d345ca395e843a049390b39652984e4a3b45b2442fa733992d"}, + {file = "coverage-7.10.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ddf2a63b91399a1c2f88f40bc1705d5a7777e31c7e9eb27c602280f477b582ba"}, + {file = "coverage-7.10.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47ab6dbbc31a14c5486420c2c1077fcae692097f673cf5be9ddbec8cdaa4cdbc"}, + {file = "coverage-7.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21eb7d8b45d3700e7c2936a736f732794c47615a20f739f4133d5230a6512a88"}, + {file = "coverage-7.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:283005bb4d98ae33e45f2861cd2cde6a21878661c9ad49697f6951b358a0379b"}, + {file = "coverage-7.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fefe31d61d02a8b2c419700b1fade9784a43d726de26495f243b663cd9fe1513"}, + {file = "coverage-7.10.1-cp39-cp39-win32.whl", hash = "sha256:e8ab8e4c7ec7f8a55ac05b5b715a051d74eac62511c6d96d5bb79aaafa3b04cf"}, + {file = "coverage-7.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:c36baa0ecde742784aa76c2b816466d3ea888d5297fda0edbac1bf48fa94688a"}, + {file = "coverage-7.10.1-py3-none-any.whl", hash = "sha256:fa2a258aa6bf188eb9a8948f7102a83da7c430a0dce918dbd8b60ef8fcb772d7"}, + {file = "coverage-7.10.1.tar.gz", hash = "sha256:ae2b4856f29ddfe827106794f3589949a57da6f0d38ab01e24ec35107979ba57"}, ] +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + [[package]] -name = "exceptiongroup" -version = "1.2.1" -description = "Backport of PEP 654 (exception groups)" -optional = false +name = "cryptography" +version = "43.0.3" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.10\"" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + [package.extras] -test = ["pytest (>=6)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] [[package]] -name = "greenlet" -version = "3.0.3" -description = "Lightweight in-process concurrent programming" +name = "cryptography" +version = "45.0.6" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = true -python-versions = ">=3.7" +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["main"] +markers = "python_version >= \"3.10\"" 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 = "cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402"}, + {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42"}, + {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05"}, + {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453"}, + {file = "cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159"}, + {file = "cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec"}, + {file = "cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5"}, + {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016"}, + {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3"}, + {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9"}, + {file = "cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02"}, + {file = "cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db"}, + {file = "cryptography-45.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385"}, + {file = "cryptography-45.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043"}, + {file = "cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719"}, ] +[package.dependencies] +cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""} + [package.extras] -docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] +docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs ; python_full_version >= \"3.8.0\"", "sphinx-rtd-theme (>=3.0.0) ; python_full_version >= \"3.8.0\""] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_full_version >= \"3.8.0\""] +pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi (>=2024)", "cryptography-vectors (==45.0.6)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test-randomorder = ["pytest-randomly"] [[package]] -name = "idna" -version = "3.7" -description = "Internationalized Domain Names in Applications (IDNA)" +name = "decorator" +version = "5.2.1" +description = "Decorators for Humans" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform != \"win32\"" +files = [ + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, +] + +[[package]] +name = "dill" +version = "0.3.9" +description = "serialize all of Python" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + [[package]] -name = "importlib-metadata" -version = "8.0.0" -description = "Read metadata from Python packages" -optional = true +name = "et-xmlfile" +version = "2.0.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, + {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, ] -[package.dependencies] -zipp = ">=0.5" +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version <= \"3.10\"" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "execnet" +version = "2.1.1" +description = "execnet: rapid multi-Python deployment" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, +] [package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] -name = "importlib-resources" -version = "6.4.0" -description = "Read resources from Python packages" +name = "gssapi" +version = "1.9.0" +description = "Python GSSAPI Wrapper" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform != \"win32\"" files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, + {file = "gssapi-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:261e00ac426d840055ddb2199f4989db7e3ce70fa18b1538f53e392b4823e8f1"}, + {file = "gssapi-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:14a1ae12fdf1e4c8889206195ba1843de09fe82587fa113112887cd5894587c6"}, + {file = "gssapi-1.9.0-cp310-cp310-win32.whl", hash = "sha256:2a9c745255e3a810c3e8072e267b7b302de0705f8e9a0f2c5abc92fe12b9475e"}, + {file = "gssapi-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:dfc1b4c0bfe9f539537601c9f187edc320daf488f694e50d02d0c1eb37416962"}, + {file = "gssapi-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:67d9be5e34403e47fb5749d5a1ad4e5a85b568e6a9add1695edb4a5b879f7560"}, + {file = "gssapi-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11e9b92cef11da547fc8c210fa720528fd854038504103c1b15ae2a89dce5fcd"}, + {file = "gssapi-1.9.0-cp311-cp311-win32.whl", hash = "sha256:6c5f8a549abd187687440ec0b72e5b679d043d620442b3637d31aa2766b27cbe"}, + {file = "gssapi-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:59e1a1a9a6c5dc430dc6edfcf497f5ca00cf417015f781c9fac2e85652cd738f"}, + {file = "gssapi-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b66a98827fbd2864bf8993677a039d7ba4a127ca0d2d9ed73e0ef4f1baa7fd7f"}, + {file = "gssapi-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2bddd1cc0c9859c5e0fd96d4d88eb67bd498fdbba45b14cdccfe10bfd329479f"}, + {file = "gssapi-1.9.0-cp312-cp312-win32.whl", hash = "sha256:10134db0cf01bd7d162acb445762dbcc58b5c772a613e17c46cf8ad956c4dfec"}, + {file = "gssapi-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:e28c7d45da68b7e36ed3fb3326744bfe39649f16e8eecd7b003b082206039c76"}, + {file = "gssapi-1.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cea344246935b5337e6f8a69bb6cc45619ab3a8d74a29fcb0a39fd1e5843c89c"}, + {file = "gssapi-1.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a5786bd9fcf435bd0c87dc95ae99ad68cefcc2bcc80c71fef4cb0ccdfb40f1e"}, + {file = "gssapi-1.9.0-cp313-cp313-win32.whl", hash = "sha256:c99959a9dd62358e370482f1691e936cb09adf9a69e3e10d4f6a097240e9fd28"}, + {file = "gssapi-1.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:a2e43f50450e81fe855888c53df70cdd385ada979db79463b38031710a12acd9"}, + {file = "gssapi-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c0e378d62b2fc352ca0046030cda5911d808a965200f612fdd1d74501b83e98f"}, + {file = "gssapi-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b74031c70864d04864b7406c818f41be0c1637906fb9654b06823bcc79f151dc"}, + {file = "gssapi-1.9.0-cp38-cp38-win32.whl", hash = "sha256:f2f3a46784d8127cc7ef10d3367dedcbe82899ea296710378ccc9b7cefe96f4c"}, + {file = "gssapi-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:a81f30cde21031e7b1f8194a3eea7285e39e551265e7744edafd06eadc1c95bc"}, + {file = "gssapi-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbc93fdadd5aab9bae594538b2128044b8c5cdd1424fe015a465d8a8a587411a"}, + {file = "gssapi-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b2a3c0a9beb895942d4b8e31f515e52c17026e55aeaa81ee0df9bbfdac76098"}, + {file = "gssapi-1.9.0-cp39-cp39-win32.whl", hash = "sha256:060b58b455d29ab8aca74770e667dca746264bee660ac5b6a7a17476edc2c0b8"}, + {file = "gssapi-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:11c9fe066edb0fa0785697eb0cecf2719c7ad1d9f2bf27be57b647a617bcfaa5"}, + {file = "gssapi-1.9.0.tar.gz", hash = "sha256:f468fac8f3f5fca8f4d1ca19e3cd4d2e10bd91074e7285464b22715d13548afe"}, ] [package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} +decorator = "*" + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] [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 = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] [[package]] @@ -381,6 +724,7 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -389,12 +733,38 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] +[[package]] +name = "krb5" +version = "0.7.1" +description = "Kerberos API bindings for Python" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform != \"win32\"" +files = [ + {file = "krb5-0.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbdcd2c4514af5ca32d189bc31f30fee2ab297dcbff74a53bd82f92ad1f6e0ef"}, + {file = "krb5-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:40ad837d563865946cffd65a588f24876da2809aa5ce4412de49442d7cf11d50"}, + {file = "krb5-0.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f503ec4b44dedb6bfe49b636d5e4df89399b27a1d06218a876a37d5651c5ab3"}, + {file = "krb5-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af6eedfe51b759a8851c41e67f7ae404c382d510b14b626ec52cca564547a7f7"}, + {file = "krb5-0.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a075da3721b188070d801814c58652d04d3f37ccbf399dee63251f5ff27d2987"}, + {file = "krb5-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af1932778cd462852e2a25596737cf0ae4e361f69e892b6c3ef3a29c960de3a0"}, + {file = "krb5-0.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3c4c2c5b48f7685a281ae88aabbc7719e35e8af454ea812cf3c38759369c7aac"}, + {file = "krb5-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7590317af8c9633e420f90d112163687dbdd8fc9c3cee6a232d6537bcb5a65c3"}, + {file = "krb5-0.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:87a592359cc545d061de703c164be4eabb977e3e8cae1ef0d969fadc644f9df6"}, + {file = "krb5-0.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9c8c1d5967a910562dbffae74bdbe8a364d78a6cecce0a429ec17776d4729e74"}, + {file = "krb5-0.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44045e1f8a26927229eedbf262d3e8a5f0451acb1f77c3bd23cad1dc6244e8ad"}, + {file = "krb5-0.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9b71148b8974fc032268df23643a4089677dc3d53b65167e26e1e72eaf43204"}, + {file = "krb5-0.7.1.tar.gz", hash = "sha256:ed5f13d5031489b10d8655c0ada28a81c2391b3ecb8a08c6d739e1e5835bc450"}, +] + [[package]] name = "lz4" version = "4.3.3" description = "LZ4 Bindings for Python" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.10\"" 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"}, @@ -440,92 +810,77 @@ flake8 = ["flake8"] tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] [[package]] -name = "mako" -version = "1.3.5" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -optional = true -python-versions = ">=3.8" +name = "lz4" +version = "4.4.5" +description = "LZ4 Bindings for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\"" files = [ - {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, - {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, + {file = "lz4-4.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d221fa421b389ab2345640a508db57da36947a437dfe31aeddb8d5c7b646c22d"}, + {file = "lz4-4.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dc1e1e2dbd872f8fae529acd5e4839efd0b141eaa8ae7ce835a9fe80fbad89f"}, + {file = "lz4-4.4.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e928ec2d84dc8d13285b4a9288fd6246c5cde4f5f935b479f50d986911f085e3"}, + {file = "lz4-4.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daffa4807ef54b927451208f5f85750c545a4abbff03d740835fc444cd97f758"}, + {file = "lz4-4.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a2b7504d2dffed3fd19d4085fe1cc30cf221263fd01030819bdd8d2bb101cf1"}, + {file = "lz4-4.4.5-cp310-cp310-win32.whl", hash = "sha256:0846e6e78f374156ccf21c631de80967e03cc3c01c373c665789dc0c5431e7fc"}, + {file = "lz4-4.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:7c4e7c44b6a31de77d4dc9772b7d2561937c9588a734681f70ec547cfbc51ecd"}, + {file = "lz4-4.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:15551280f5656d2206b9b43262799c89b25a25460416ec554075a8dc568e4397"}, + {file = "lz4-4.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6da84a26b3aa5da13a62e4b89ab36a396e9327de8cd48b436a3467077f8ccd4"}, + {file = "lz4-4.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61d0ee03e6c616f4a8b69987d03d514e8896c8b1b7cc7598ad029e5c6aedfd43"}, + {file = "lz4-4.4.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:33dd86cea8375d8e5dd001e41f321d0a4b1eb7985f39be1b6a4f466cd480b8a7"}, + {file = "lz4-4.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:609a69c68e7cfcfa9d894dc06be13f2e00761485b62df4e2472f1b66f7b405fb"}, + {file = "lz4-4.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75419bb1a559af00250b8f1360d508444e80ed4b26d9d40ec5b09fe7875cb989"}, + {file = "lz4-4.4.5-cp311-cp311-win32.whl", hash = "sha256:12233624f1bc2cebc414f9efb3113a03e89acce3ab6f72035577bc61b270d24d"}, + {file = "lz4-4.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:8a842ead8ca7c0ee2f396ca5d878c4c40439a527ebad2b996b0444f0074ed004"}, + {file = "lz4-4.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:83bc23ef65b6ae44f3287c38cbf82c269e2e96a26e560aa551735883388dcc4b"}, + {file = "lz4-4.4.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:df5aa4cead2044bab83e0ebae56e0944cc7fcc1505c7787e9e1057d6d549897e"}, + {file = "lz4-4.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d0bf51e7745484d2092b3a51ae6eb58c3bd3ce0300cf2b2c14f76c536d5697a"}, + {file = "lz4-4.4.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7b62f94b523c251cf32aa4ab555f14d39bd1a9df385b72443fd76d7c7fb051f5"}, + {file = "lz4-4.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c3ea562c3af274264444819ae9b14dbbf1ab070aff214a05e97db6896c7597e"}, + {file = "lz4-4.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24092635f47538b392c4eaeff14c7270d2c8e806bf4be2a6446a378591c5e69e"}, + {file = "lz4-4.4.5-cp312-cp312-win32.whl", hash = "sha256:214e37cfe270948ea7eb777229e211c601a3e0875541c1035ab408fbceaddf50"}, + {file = "lz4-4.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:713a777de88a73425cf08eb11f742cd2c98628e79a8673d6a52e3c5f0c116f33"}, + {file = "lz4-4.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:a88cbb729cc333334ccfb52f070463c21560fca63afcf636a9f160a55fac3301"}, + {file = "lz4-4.4.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6bb05416444fafea170b07181bc70640975ecc2a8c92b3b658c554119519716c"}, + {file = "lz4-4.4.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b424df1076e40d4e884cfcc4c77d815368b7fb9ebcd7e634f937725cd9a8a72a"}, + {file = "lz4-4.4.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:216ca0c6c90719731c64f41cfbd6f27a736d7e50a10b70fad2a9c9b262ec923d"}, + {file = "lz4-4.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:533298d208b58b651662dd972f52d807d48915176e5b032fb4f8c3b6f5fe535c"}, + {file = "lz4-4.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:451039b609b9a88a934800b5fc6ee401c89ad9c175abf2f4d9f8b2e4ef1afc64"}, + {file = "lz4-4.4.5-cp313-cp313-win32.whl", hash = "sha256:a5f197ffa6fc0e93207b0af71b302e0a2f6f29982e5de0fbda61606dd3a55832"}, + {file = "lz4-4.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:da68497f78953017deb20edff0dba95641cc86e7423dfadf7c0264e1ac60dc22"}, + {file = "lz4-4.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:c1cfa663468a189dab510ab231aad030970593f997746d7a324d40104db0d0a9"}, + {file = "lz4-4.4.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:67531da3b62f49c939e09d56492baf397175ff39926d0bd5bd2d191ac2bff95f"}, + {file = "lz4-4.4.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a1acbbba9edbcbb982bc2cac5e7108f0f553aebac1040fbec67a011a45afa1ba"}, + {file = "lz4-4.4.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a482eecc0b7829c89b498fda883dbd50e98153a116de612ee7c111c8bcf82d1d"}, + {file = "lz4-4.4.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e099ddfaa88f59dd8d36c8a3c66bd982b4984edf127eb18e30bb49bdba68ce67"}, + {file = "lz4-4.4.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2af2897333b421360fdcce895c6f6281dc3fab018d19d341cf64d043fc8d90d"}, + {file = "lz4-4.4.5-cp313-cp313t-win32.whl", hash = "sha256:66c5de72bf4988e1b284ebdd6524c4bead2c507a2d7f172201572bac6f593901"}, + {file = "lz4-4.4.5-cp313-cp313t-win_amd64.whl", hash = "sha256:cdd4bdcbaf35056086d910d219106f6a04e1ab0daa40ec0eeef1626c27d0fddb"}, + {file = "lz4-4.4.5-cp313-cp313t-win_arm64.whl", hash = "sha256:28ccaeb7c5222454cd5f60fcd152564205bcb801bd80e125949d2dfbadc76bbd"}, + {file = "lz4-4.4.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c216b6d5275fc060c6280936bb3bb0e0be6126afb08abccde27eed23dead135f"}, + {file = "lz4-4.4.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c8e71b14938082ebaf78144f3b3917ac715f72d14c076f384a4c062df96f9df6"}, + {file = "lz4-4.4.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b5e6abca8df9f9bdc5c3085f33ff32cdc86ed04c65e0355506d46a5ac19b6e9"}, + {file = "lz4-4.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b84a42da86e8ad8537aabef062e7f661f4a877d1c74d65606c49d835d36d668"}, + {file = "lz4-4.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bba042ec5a61fa77c7e380351a61cb768277801240249841defd2ff0a10742f"}, + {file = "lz4-4.4.5-cp314-cp314-win32.whl", hash = "sha256:bd85d118316b53ed73956435bee1997bd06cc66dd2fa74073e3b1322bd520a67"}, + {file = "lz4-4.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:92159782a4502858a21e0079d77cdcaade23e8a5d252ddf46b0652604300d7be"}, + {file = "lz4-4.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:d994b87abaa7a88ceb7a37c90f547b8284ff9da694e6afcfaa8568d739faf3f7"}, + {file = "lz4-4.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6538aaaedd091d6e5abdaa19b99e6e82697d67518f114721b5248709b639fad"}, + {file = "lz4-4.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13254bd78fef50105872989a2dc3418ff09aefc7d0765528adc21646a7288294"}, + {file = "lz4-4.4.5-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e64e61f29cf95afb43549063d8433b46352baf0c8a70aa45e2585618fcf59d86"}, + {file = "lz4-4.4.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff1b50aeeec64df5603f17984e4b5be6166058dcf8f1e26a3da40d7a0f6ab547"}, + {file = "lz4-4.4.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1dd4d91d25937c2441b9fc0f4af01704a2d09f30a38c5798bc1d1b5a15ec9581"}, + {file = "lz4-4.4.5-cp39-cp39-win32.whl", hash = "sha256:d64141085864918392c3159cdad15b102a620a67975c786777874e1e90ef15ce"}, + {file = "lz4-4.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:f32b9e65d70f3684532358255dc053f143835c5f5991e28a5ac4c93ce94b9ea7"}, + {file = "lz4-4.4.5-cp39-cp39-win_arm64.whl", hash = "sha256:f9b8bde9909a010c75b3aea58ec3910393b758f3c219beed67063693df854db0"}, + {file = "lz4-4.4.5.tar.gz", hash = "sha256:5f0b9e53c1e82e88c10d7c180069363980136b9d7a8306c4dca4f760d60c39f0"}, ] -[package.dependencies] -MarkupSafe = ">=0.9.2" - [package.extras] -babel = ["Babel"] -lingua = ["lingua"] -testing = ["pytest"] - -[[package]] -name = "markupsafe" -version = "2.1.5" -description = "Safely add untrusted strings to HTML/XML markup." -optional = true -python-versions = ">=3.7" -files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, -] +docs = ["sphinx (>=1.6.0)", "sphinx_bootstrap_theme"] +flake8 = ["flake8"] +tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] [[package]] name = "mccabe" @@ -533,6 +888,7 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -540,47 +896,60 @@ files = [ [[package]] name = "mypy" -version = "1.10.1" +version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, - {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, - {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, - {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, - {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, - {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, - {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, - {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, - {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, - {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, - {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, - {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, - {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, - {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, - {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, - {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, - {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, - {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, - {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] reports = ["lxml"] @@ -591,6 +960,7 @@ version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["dev"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, @@ -602,6 +972,8 @@ version = "1.24.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] +markers = "python_version < \"3.10\"" 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"}, @@ -635,47 +1007,68 @@ files = [ [[package]] name = "numpy" -version = "1.26.4" +version = "2.2.4" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" +groups = ["main", "dev"] +markers = "python_version >= \"3.10\"" files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"}, + {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"}, + {file = "numpy-2.2.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775"}, + {file = "numpy-2.2.4-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9"}, + {file = "numpy-2.2.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2"}, + {file = "numpy-2.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020"}, + {file = "numpy-2.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3"}, + {file = "numpy-2.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017"}, + {file = "numpy-2.2.4-cp310-cp310-win32.whl", hash = "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a"}, + {file = "numpy-2.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542"}, + {file = "numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4"}, + {file = "numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4"}, + {file = "numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f"}, + {file = "numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880"}, + {file = "numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1"}, + {file = "numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5"}, + {file = "numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687"}, + {file = "numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6"}, + {file = "numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09"}, + {file = "numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91"}, + {file = "numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4"}, + {file = "numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854"}, + {file = "numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24"}, + {file = "numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee"}, + {file = "numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba"}, + {file = "numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592"}, + {file = "numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb"}, + {file = "numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f"}, + {file = "numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00"}, + {file = "numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146"}, + {file = "numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7"}, + {file = "numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0"}, + {file = "numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392"}, + {file = "numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc"}, + {file = "numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298"}, + {file = "numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7"}, + {file = "numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6"}, + {file = "numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd"}, + {file = "numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c"}, + {file = "numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3"}, + {file = "numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8"}, + {file = "numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39"}, + {file = "numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd"}, + {file = "numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0"}, + {file = "numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960"}, + {file = "numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8"}, + {file = "numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc"}, + {file = "numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff"}, + {file = "numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286"}, + {file = "numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d"}, + {file = "numpy-2.2.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8"}, + {file = "numpy-2.2.4-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c"}, + {file = "numpy-2.2.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d"}, + {file = "numpy-2.2.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d"}, + {file = "numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f"}, ] [[package]] @@ -684,6 +1077,7 @@ version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, @@ -700,6 +1094,7 @@ version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, @@ -710,13 +1105,14 @@ et-xmlfile = "*" [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -725,6 +1121,8 @@ version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.10\"" files = [ {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, @@ -754,25 +1152,21 @@ files = [ ] [package.dependencies] -numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, -] +numpy = {version = ">=1.20.3", markers = "python_version < \"3.10\""} python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.1" [package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.7.0)", "gcsfs (>=2021.7.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.8.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.8.0)"] clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +fss = ["fsspec (>=2021.7.0)"] +gcp = ["gcsfs (>=2021.7.0)", "pandas-gbq (>=0.15.0)"] hdf5 = ["tables (>=3.6.1)"] html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] @@ -786,12 +1180,101 @@ sql-other = ["SQLAlchemy (>=1.4.16)"] test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.6.3)"] +[[package]] +name = "pandas" +version = "2.2.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + [[package]] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -799,19 +1282,20 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -819,6 +1303,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -830,70 +1315,220 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pyarrow" -version = "16.1.0" +version = "17.0.0" description = "Python library for Apache Arrow" -optional = false +optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.10\" and extra == \"pyarrow\"" files = [ - {file = "pyarrow-16.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9"}, - {file = "pyarrow-16.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a"}, - {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef"}, - {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848"}, - {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c"}, - {file = "pyarrow-16.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd"}, - {file = "pyarrow-16.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff"}, - {file = "pyarrow-16.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c"}, - {file = "pyarrow-16.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c"}, - {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6"}, - {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147"}, - {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e"}, - {file = "pyarrow-16.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b"}, - {file = "pyarrow-16.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b"}, - {file = "pyarrow-16.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f"}, - {file = "pyarrow-16.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a"}, - {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c"}, - {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2"}, - {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628"}, - {file = "pyarrow-16.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7"}, - {file = "pyarrow-16.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444"}, - {file = "pyarrow-16.1.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f"}, - {file = "pyarrow-16.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f"}, - {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2"}, - {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83"}, - {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15"}, - {file = "pyarrow-16.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed"}, - {file = "pyarrow-16.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710"}, - {file = "pyarrow-16.1.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55"}, - {file = "pyarrow-16.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e"}, - {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4"}, - {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5"}, - {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa"}, - {file = "pyarrow-16.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3"}, - {file = "pyarrow-16.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a"}, - {file = "pyarrow-16.1.0.tar.gz", hash = "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315"}, + {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"}, + {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047"}, + {file = "pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, + {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"}, + {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, + {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, + {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, + {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, ] [package.dependencies] numpy = ">=1.16.6" +[package.extras] +test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] + +[[package]] +name = "pyarrow" +version = "22.0.0" +description = "Python library for Apache Arrow" +optional = true +python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.10\" and extra == \"pyarrow\"" +files = [ + {file = "pyarrow-22.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:77718810bd3066158db1e95a63c160ad7ce08c6b0710bc656055033e39cdad88"}, + {file = "pyarrow-22.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:44d2d26cda26d18f7af7db71453b7b783788322d756e81730acb98f24eb90ace"}, + {file = "pyarrow-22.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b9d71701ce97c95480fecb0039ec5bb889e75f110da72005743451339262f4ce"}, + {file = "pyarrow-22.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:710624ab925dc2b05a6229d47f6f0dac1c1155e6ed559be7109f684eba048a48"}, + {file = "pyarrow-22.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340"}, + {file = "pyarrow-22.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd0d42297ace400d8febe55f13fdf46e86754842b860c978dfec16f081e5c653"}, + {file = "pyarrow-22.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:00626d9dc0f5ef3a75fe63fd68b9c7c8302d2b5bbc7f74ecaedba83447a24f84"}, + {file = "pyarrow-22.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:3e294c5eadfb93d78b0763e859a0c16d4051fc1c5231ae8956d61cb0b5666f5a"}, + {file = "pyarrow-22.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:69763ab2445f632d90b504a815a2a033f74332997052b721002298ed6de40f2e"}, + {file = "pyarrow-22.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:b41f37cabfe2463232684de44bad753d6be08a7a072f6a83447eeaf0e4d2a215"}, + {file = "pyarrow-22.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:35ad0f0378c9359b3f297299c3309778bb03b8612f987399a0333a560b43862d"}, + {file = "pyarrow-22.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8382ad21458075c2e66a82a29d650f963ce51c7708c7c0ff313a8c206c4fd5e8"}, + {file = "pyarrow-22.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1a812a5b727bc09c3d7ea072c4eebf657c2f7066155506ba31ebf4792f88f016"}, + {file = "pyarrow-22.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ec5d40dd494882704fb876c16fa7261a69791e784ae34e6b5992e977bd2e238c"}, + {file = "pyarrow-22.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bea79263d55c24a32b0d79c00a1c58bb2ee5f0757ed95656b01c0fb310c5af3d"}, + {file = "pyarrow-22.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:12fe549c9b10ac98c91cf791d2945e878875d95508e1a5d14091a7aaa66d9cf8"}, + {file = "pyarrow-22.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:334f900ff08ce0423407af97e6c26ad5d4e3b0763645559ece6fbf3747d6a8f5"}, + {file = "pyarrow-22.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c6c791b09c57ed76a18b03f2631753a4960eefbbca80f846da8baefc6491fcfe"}, + {file = "pyarrow-22.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c3200cb41cdbc65156e5f8c908d739b0dfed57e890329413da2748d1a2cd1a4e"}, + {file = "pyarrow-22.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ac93252226cf288753d8b46280f4edf3433bf9508b6977f8dd8526b521a1bbb9"}, + {file = "pyarrow-22.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:44729980b6c50a5f2bfcc2668d36c569ce17f8b17bccaf470c4313dcbbf13c9d"}, + {file = "pyarrow-22.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a"}, + {file = "pyarrow-22.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:001ea83a58024818826a9e3f89bf9310a114f7e26dfe404a4c32686f97bd7901"}, + {file = "pyarrow-22.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691"}, + {file = "pyarrow-22.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a"}, + {file = "pyarrow-22.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cedb9dd9358e4ea1d9bce3665ce0797f6adf97ff142c8e25b46ba9cdd508e9b6"}, + {file = "pyarrow-22.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:252be4a05f9d9185bb8c18e83764ebcfea7185076c07a7a662253af3a8c07941"}, + {file = "pyarrow-22.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145"}, + {file = "pyarrow-22.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1"}, + {file = "pyarrow-22.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ba95112d15fd4f1105fb2402c4eab9068f0554435e9b7085924bcfaac2cc306f"}, + {file = "pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c064e28361c05d72eed8e744c9605cbd6d2bb7481a511c74071fd9b24bc65d7d"}, + {file = "pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6f9762274496c244d951c819348afbcf212714902742225f649cf02823a6a10f"}, + {file = "pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a9d9ffdc2ab696f6b15b4d1f7cec6658e1d788124418cb30030afbae31c64746"}, + {file = "pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ec1a15968a9d80da01e1d30349b2b0d7cc91e96588ee324ce1b5228175043e95"}, + {file = "pyarrow-22.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bba208d9c7decf9961998edf5c65e3ea4355d5818dd6cd0f6809bec1afb951cc"}, + {file = "pyarrow-22.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:9bddc2cade6561f6820d4cd73f99a0243532ad506bc510a75a5a65a522b2d74d"}, + {file = "pyarrow-22.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e70ff90c64419709d38c8932ea9fe1cc98415c4f87ea8da81719e43f02534bc9"}, + {file = "pyarrow-22.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:92843c305330aa94a36e706c16209cd4df274693e777ca47112617db7d0ef3d7"}, + {file = "pyarrow-22.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:6dda1ddac033d27421c20d7a7943eec60be44e0db4e079f33cc5af3b8280ccde"}, + {file = "pyarrow-22.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:84378110dd9a6c06323b41b56e129c504d157d1a983ce8f5443761eb5256bafc"}, + {file = "pyarrow-22.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:854794239111d2b88b40b6ef92aa478024d1e5074f364033e73e21e3f76b25e0"}, + {file = "pyarrow-22.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:b883fe6fd85adad7932b3271c38ac289c65b7337c2c132e9569f9d3940620730"}, + {file = "pyarrow-22.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7a820d8ae11facf32585507c11f04e3f38343c1e784c9b5a8b1da5c930547fe2"}, + {file = "pyarrow-22.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:c6ec3675d98915bf1ec8b3c7986422682f7232ea76cad276f4c8abd5b7319b70"}, + {file = "pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3e739edd001b04f654b166204fc7a9de896cf6007eaff33409ee9e50ceaff754"}, + {file = "pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7388ac685cab5b279a41dfe0a6ccd99e4dbf322edfb63e02fc0443bf24134e91"}, + {file = "pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f633074f36dbc33d5c05b5dc75371e5660f1dbf9c8b1d95669def05e5425989c"}, + {file = "pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4c19236ae2402a8663a2c8f21f1870a03cc57f0bef7e4b6eb3238cc82944de80"}, + {file = "pyarrow-22.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae"}, + {file = "pyarrow-22.0.0.tar.gz", hash = "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9"}, +] + +[[package]] +name = "pybreaker" +version = "1.2.0" +description = "Python implementation of the Circuit Breaker pattern" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.10\"" +files = [ + {file = "pybreaker-1.2.0-py3-none-any.whl", hash = "sha256:c3e7683e29ecb3d4421265aaea55504f1186a2fdc1f17b6b091d80d1e1eb5ede"}, + {file = "pybreaker-1.2.0.tar.gz", hash = "sha256:18707776316f93a30c1be0e4fec1f8aa5ed19d7e395a218eb2f050c8524fb2dc"}, +] + +[package.extras] +test = ["fakeredis", "mock", "pytest", "redis", "tornado", "types-mock", "types-redis"] + +[[package]] +name = "pybreaker" +version = "1.4.1" +description = "Python implementation of the Circuit Breaker pattern" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "pybreaker-1.4.1-py3-none-any.whl", hash = "sha256:b4dab4a05195b7f2a64a6c1a6c4ba7a96534ef56ea7210e6bcb59f28897160e0"}, + {file = "pybreaker-1.4.1.tar.gz", hash = "sha256:8df2d245c73ba40c8242c56ffb4f12138fbadc23e296224740c2028ea9dc1178"}, +] + +[package.extras] +test = ["fakeredis", "mock", "pytest", "redis", "tornado", "types-mock", "types-redis"] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pyjwt" +version = "2.9.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.10\"" +files = [ + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pyjwt" +version = "2.10.1" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + [[package]] name = "pylint" -version = "3.2.5" +version = "3.2.7" description = "python code static checker" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ - {file = "pylint-3.2.5-py3-none-any.whl", hash = "sha256:32cd6c042b5004b8e857d727708720c54a676d1e22917cf1a2df9b4d4868abd6"}, - {file = "pylint-3.2.5.tar.gz", hash = "sha256:e9b7171e242dcc6ebd0aaa7540481d1a72860748a0a7816b8fe6cf6c80a6fe7e"}, + {file = "pylint-3.2.7-py3-none-any.whl", hash = "sha256:02f4aedeac91be69fb3b4bea997ce580a4ac68ce58b89eaefeaf06749df73f4b"}, + {file = "pylint-3.2.7.tar.gz", hash = "sha256:1b7a721b575eaeaa7d39db076b6e7743c993ea44f57979127c517c6c572c803e"}, ] [package.dependencies] -astroid = ">=3.2.2,<=3.3.0-dev0" +astroid = ">=3.2.4,<=3.3.0.dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=0.3.6", markers = "python_version == \"3.11\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" @@ -906,12 +1541,35 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] +[[package]] +name = "pyspnego" +version = "0.11.2" +description = "Windows Negotiate Authentication Client and Server" +optional = true +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyspnego-0.11.2-py3-none-any.whl", hash = "sha256:74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4"}, + {file = "pyspnego-0.11.2.tar.gz", hash = "sha256:994388d308fb06e4498365ce78d222bf4f3570b6df4ec95738431f61510c971b"}, +] + +[package.dependencies] +cryptography = "*" +gssapi = {version = ">=1.6.0", optional = true, markers = "sys_platform != \"win32\" and extra == \"kerberos\""} +krb5 = {version = ">=0.3.0", optional = true, markers = "sys_platform != \"win32\" and extra == \"kerberos\""} +sspilib = {version = ">=0.1.0", markers = "sys_platform == \"win32\""} + +[package.extras] +kerberos = ["gssapi (>=1.6.0) ; sys_platform != \"win32\"", "krb5 (>=0.3.0) ; sys_platform != \"win32\""] +yaml = ["ruamel.yaml"] + [[package]] name = "pytest" version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -928,12 +1586,32 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + [[package]] name = "pytest-dotenv" version = "0.5.2" description = "A py.test plugin that parses environment files before running tests" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pytest-dotenv-0.5.2.tar.gz", hash = "sha256:2dc6c3ac6d8764c71c6d2804e902d0ff810fa19692e95fe138aefc9b1aa73732"}, {file = "pytest_dotenv-0.5.2-py3-none-any.whl", hash = "sha256:40a2cece120a213898afaa5407673f6bd924b1fa7eafce6bda0e8abffe2f710f"}, @@ -943,12 +1621,57 @@ files = [ pytest = ">=5.0.0" python-dotenv = ">=0.9.1" +[[package]] +name = "pytest-xdist" +version = "3.6.1" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version < \"3.10\"" +files = [ + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, +] + +[package.dependencies] +execnet = ">=2.1" +pytest = ">=7.0.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + +[[package]] +name = "pytest-xdist" +version = "3.8.0" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version >= \"3.10\"" +files = [ + {file = "pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88"}, + {file = "pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1"}, +] + +[package.dependencies] +execnet = ">=2.1" +pytest = ">=7.0.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -963,6 +1686,7 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["dev"] 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"}, @@ -973,13 +1697,14 @@ cli = ["click (>=5.0)"] [[package]] name = "pytz" -version = "2024.1" +version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, ] [[package]] @@ -988,6 +1713,7 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -1003,117 +1729,135 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-kerberos" +version = "0.15.0" +description = "A Kerberos authentication handler for python-requests" +optional = true +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "requests_kerberos-0.15.0-py2.py3-none-any.whl", hash = "sha256:ba9b0980b8489c93bfb13854fd118834e576d6700bfea3745cb2e62278cd16a6"}, + {file = "requests_kerberos-0.15.0.tar.gz", hash = "sha256:437512e424413d8113181d696e56694ffa4259eb9a5fc4e803926963864eaf4e"}, +] + +[package.dependencies] +cryptography = ">=1.3" +pyspnego = {version = "*", extras = ["kerberos"]} +requests = ">=1.1.0" + [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] -name = "sqlalchemy" -version = "2.0.31" -description = "Database Abstraction Library" +name = "sspilib" +version = "0.2.0" +description = "SSPI API bindings for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.10\" and sys_platform == \"win32\"" files = [ - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, - {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, - {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, + {file = "sspilib-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:34f566ba8b332c91594e21a71200de2d4ce55ca5a205541d4128ed23e3c98777"}, + {file = "sspilib-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b11e4f030de5c5de0f29bcf41a6e87c9fd90cb3b0f64e446a6e1d1aef4d08f5"}, + {file = "sspilib-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e82f87d77a9da62ce1eac22f752511a99495840177714c772a9d27b75220f78"}, + {file = "sspilib-0.2.0-cp310-cp310-win32.whl", hash = "sha256:e436fa09bcf353a364a74b3ef6910d936fa8cd1493f136e517a9a7e11b319c57"}, + {file = "sspilib-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:850a17c98d2b8579b183ce37a8df97d050bc5b31ab13f5a6d9e39c9692fe3754"}, + {file = "sspilib-0.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:a4d788a53b8db6d1caafba36887d5ac2087e6b6be6f01eb48f8afea6b646dbb5"}, + {file = "sspilib-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e0943204c8ba732966fdc5b69e33cf61d8dc6b24e6ed875f32055d9d7e2f76cd"}, + {file = "sspilib-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1cdfc5ec2f151f26e21aa50ccc7f9848c969d6f78264ae4f38347609f6722df"}, + {file = "sspilib-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a6c33495a3de1552120c4a99219ebdd70e3849717867b8cae3a6a2f98fef405"}, + {file = "sspilib-0.2.0-cp311-cp311-win32.whl", hash = "sha256:400d5922c2c2261009921157c4b43d868e84640ad86e4dc84c95b07e5cc38ac6"}, + {file = "sspilib-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3e7d19c16ba9189ef8687b591503db06cfb9c5eb32ab1ca3bb9ebc1a8a5f35c"}, + {file = "sspilib-0.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:f65c52ead8ce95eb78a79306fe4269ee572ef3e4dcc108d250d5933da2455ecc"}, + {file = "sspilib-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:abac93a90335590b49ef1fc162b538576249c7f58aec0c7bcfb4b860513979b4"}, + {file = "sspilib-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1208720d8e431af674c5645cec365224d035f241444d5faa15dc74023ece1277"}, + {file = "sspilib-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48dceb871ecf9cf83abdd0e6db5326e885e574f1897f6ae87d736ff558f4bfa"}, + {file = "sspilib-0.2.0-cp312-cp312-win32.whl", hash = "sha256:bdf9a4f424add02951e1f01f47441d2e69a9910471e99c2c88660bd8e184d7f8"}, + {file = "sspilib-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:40a97ca83e503a175d1dc9461836994e47e8b9bcf56cab81a2c22e27f1993079"}, + {file = "sspilib-0.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:8ffc09819a37005c66a580ff44f544775f9745d5ed1ceeb37df4e5ff128adf36"}, + {file = "sspilib-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:40ff410b64198cf1d704718754fc5fe7b9609e0c49bf85c970f64c6fc2786db4"}, + {file = "sspilib-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:02d8e0b6033de8ccf509ba44fdcda7e196cdedc0f8cf19eb22c5e4117187c82f"}, + {file = "sspilib-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7943fe14f8f6d72623ab6401991aa39a2b597bdb25e531741b37932402480f"}, + {file = "sspilib-0.2.0-cp313-cp313-win32.whl", hash = "sha256:b9044d6020aa88d512e7557694fe734a243801f9a6874e1c214451eebe493d92"}, + {file = "sspilib-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:c39a698491f43618efca8776a40fb7201d08c415c507f899f0df5ada15abefaa"}, + {file = "sspilib-0.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:863b7b214517b09367511c0ef931370f0386ed2c7c5613092bf9b106114c4a0e"}, + {file = "sspilib-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a0ede7afba32f2b681196c0b8520617d99dc5d0691d04884d59b476e31b41286"}, + {file = "sspilib-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bd95df50efb6586054963950c8fa91ef994fb73c5c022c6f85b16f702c5314da"}, + {file = "sspilib-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9460258d3dc3f71cc4dcfd6ac078e2fe26f272faea907384b7dd52cb91d9ddcc"}, + {file = "sspilib-0.2.0-cp38-cp38-win32.whl", hash = "sha256:6fa9d97671348b97567020d82fe36c4211a2cacf02abbccbd8995afbf3a40bfc"}, + {file = "sspilib-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:32422ad7406adece12d7c385019b34e3e35ff88a7c8f3d7c062da421772e7bfa"}, + {file = "sspilib-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6944a0d7fe64f88c9bde3498591acdb25b178902287919b962c398ed145f71b9"}, + {file = "sspilib-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0216344629b0f39c2193adb74d7e1bed67f1bbd619e426040674b7629407eba9"}, + {file = "sspilib-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c5f84b9f614447fc451620c5c44001ed48fead3084c7c9f2b9cefe1f4c5c3d0"}, + {file = "sspilib-0.2.0-cp39-cp39-win32.whl", hash = "sha256:b290eb90bf8b8136b0a61b189629442052e1a664bd78db82928ec1e81b681fb5"}, + {file = "sspilib-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:404c16e698476e500a7fe67be5457fadd52d8bdc9aeb6c554782c8f366cc4fc9"}, + {file = "sspilib-0.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:8697e5dd9229cd3367bca49fba74e02f867759d1d416a717e26c3088041b9814"}, + {file = "sspilib-0.2.0.tar.gz", hash = "sha256:4d6cd4290ca82f40705efeb5e9107f7abcd5e647cb201a3d04371305938615b8"}, ] -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} -typing-extensions = ">=4.6.0" - -[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)"] -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)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=8)"] -oracle-oracledb = ["oracledb (>=1.0.1)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.29.1)"] -postgresql-psycopg = ["psycopg (>=3.0.7)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] -pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3_binary"] +[[package]] +name = "sspilib" +version = "0.3.1" +description = "SSPI API bindings for Python" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.10\" and sys_platform == \"win32\"" +files = [ + {file = "sspilib-0.3.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c45860bdc4793af572d365434020ff5a1ef78c42a2fc2c7a7d8e44eacaf475b6"}, + {file = "sspilib-0.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:62cc4de547503dec13b81a6af82b398e9ef53ea82c3535418d7d069c7a05d5cd"}, + {file = "sspilib-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f782214ae2876fe4e54d1dd54638a2e0877c32d03493926f7f3adf5253cf0e3f"}, + {file = "sspilib-0.3.1-cp310-cp310-win32.whl", hash = "sha256:d8e54aee722faed9efde96128bc56a5895889b5ed96011ad3c8e87efe8391d40"}, + {file = "sspilib-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdaa7bd965951cc6d032555ed87a575edba959338431a6cae3fcbfc174bb6de0"}, + {file = "sspilib-0.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:08674256a42be6ab0481cb781f4079a46afd6b3ee73ad2569badbc88e556aa4d"}, + {file = "sspilib-0.3.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a31991a34d1ac96e6f33981e1d368f56b6cf7863609c8ba681b9e1307721168"}, + {file = "sspilib-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1c7fb3e40a281cdd0cfa701265fb78981f88d4c55c5e267caa63649aa490fc1"}, + {file = "sspilib-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f57e4384203e96ead5038fc327a695c8c268701a22c870e109ea67fbdcfd2ac0"}, + {file = "sspilib-0.3.1-cp311-cp311-win32.whl", hash = "sha256:c4745eb177773661211d5bf1dd3ef780a1fe7fbafe1392d3fdd8a5f520ec0fec"}, + {file = "sspilib-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:dfdd841bcd88af16c4f3d9f81f170b696e8ecfa18a4d16a571f755b5e0e8e43e"}, + {file = "sspilib-0.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:a1d41eb2daf9db3d60414e87f86962db4bb4e0c517794879b0d47f1a17cc58ba"}, + {file = "sspilib-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e3e5163656bd14f0cac2c0dd2c777a272af00cecdba0e98ed5ef28c7185328b0"}, + {file = "sspilib-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86aef2f824db862fb25066df286d2d0d35cf7da85474893eb573870a731b6691"}, + {file = "sspilib-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c6d11fd6e47ba964881c8980476354259bf0b570fa32b986697f7681b1fc5be"}, + {file = "sspilib-0.3.1-cp312-cp312-win32.whl", hash = "sha256:429ecda4c8ee587f734bdfc1fefaa196165bbd1f1c7980e0e49c89b60a6c956e"}, + {file = "sspilib-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:3355cfc5f3d5c257dbab2396d83493330ca952f9c28f3fe964193ababcc8c293"}, + {file = "sspilib-0.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:2edc804f769dcaf0bdfcde06e0abc47763b58c79f1b7be40f805d33c7fc057fd"}, + {file = "sspilib-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:89b107704bd1ab84aff76b0b36538790cdfef233d4857b8cfebf53bd43ccf49c"}, + {file = "sspilib-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6c86e12b95bbe01ac89c0bd1083d01286fe3b0b4ecd63d4c03d4b39d7564a11f"}, + {file = "sspilib-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dea04c7da5fef0bf2e94c9e7e0ffdf52588b706c4df63c733c60c70731f334ba"}, + {file = "sspilib-0.3.1-cp313-cp313-win32.whl", hash = "sha256:89ccacb390b15e2e807e20b8ae7e96f4724ff1fa2f48b1ba0f7d18ccc9b0d581"}, + {file = "sspilib-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:21a26264df883ff6d367af60fdeb42476c7efb1dbfc5818970ac39edec3912e2"}, + {file = "sspilib-0.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:44b89f866e0d14c8393dbc5a49c59296dd7b83a7ca97a0f9d6bd49cc46a04498"}, + {file = "sspilib-0.3.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c8914db71560cac25476a9f7c17412ccaecc441e798ad018492d2a488a1289c"}, + {file = "sspilib-0.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:656a15406eacde8cf933ec7282094bbfa0d489db3ebfef492308f3036c843f30"}, + {file = "sspilib-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bb8d4504f2c98053ac924a5e1675d21955fcb309bd7247719fd09ce22ac37db"}, + {file = "sspilib-0.3.1-cp39-cp39-win32.whl", hash = "sha256:35168f39c6c1db9205eb02457d01175b7de32af543c7a51d657d1c12515fe422"}, + {file = "sspilib-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6fa91c59af0b4e0b4e9f90908289977fe0240be63eee8b40a934abd424e9c3ba"}, + {file = "sspilib-0.3.1-cp39-cp39-win_arm64.whl", hash = "sha256:2812930555f693d4cffa0961c5088a4094889d1863d998c59162aa867dfc6be0"}, + {file = "sspilib-0.3.1.tar.gz", hash = "sha256:6df074ee54e3bd9c1bccc84233b1ceb846367ba1397dc52b5fae2846f373b154"}, +] [[package]] name = "thrift" -version = "0.20.0" +version = "0.22.0" description = "Python bindings for the Apache Thrift RPC system" optional = false python-versions = "*" +groups = ["main"] files = [ - {file = "thrift-0.20.0.tar.gz", hash = "sha256:4dd662eadf6b8aebe8a41729527bd69adf6ceaa2a8681cbef64d1273b3e8feba"}, + {file = "thrift-0.22.0.tar.gz", hash = "sha256:42e8276afbd5f54fe1d364858b6877bc5e5a4a5ed69f6a005b94ca4918fe1466"}, ] -[package.dependencies] -six = ">=1.7.2" - [package.extras] all = ["tornado (>=4.0)", "twisted"] tornado = ["tornado (>=4.0)"] @@ -1121,85 +1865,105 @@ twisted = ["twisted"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version <= \"3.10\"" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "tomlkit" -version = "0.12.5" +version = "0.13.2" description = "Style preserving TOML library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, - {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] name = "typing-extensions" -version = "4.12.2" +version = "4.13.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, + {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"}, + {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"}, ] [[package]] name = "tzdata" -version = "2024.1" +version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, ] [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] -[[package]] -name = "zipp" -version = "3.19.2" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = true -python-versions = ">=3.8" -files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, -] - -[package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - [extras] -alembic = ["alembic", "sqlalchemy"] -sqlalchemy = ["sqlalchemy"] +pyarrow = ["pyarrow", "pyarrow", "pyarrow"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.8.0" -content-hash = "9d8a91369fc79f9ca9f7502e2ed284b66531c954ae59a723e465a76073966998" +content-hash = "d1739e84dcbd6e7ac311eb6fbb9cf87ad110491f7d954f07fdfc32b704b4413f" diff --git a/pyproject.toml b/pyproject.toml index dc13f283a..5e9f7f0ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "databricks-sql-connector" -version = "3.7.0" +version = "4.2.6" description = "Databricks SQL Connector for Python" authors = ["Databricks "] license = "Apache-2.0" @@ -10,42 +10,50 @@ include = ["CHANGELOG.md"] [tool.poetry.dependencies] python = "^3.8.0" -thrift = ">=0.16.0,<0.21.0" +thrift = "~=0.22.0" pandas = [ - { version = ">=1.2.5,<2.3.0", python = ">=3.8" } + { version = ">=1.2.5,<2.4.0", python = ">=3.8,<3.13" }, + { version = ">=2.2.3,<2.4.0", python = ">=3.13" } +] +lz4 = [ + { version = "^4.0.2", python = ">=3.8,<3.14" }, + { version = "^4.4.5", python = ">=3.14" } ] -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.23.4", python = ">=3.11" }, -] -sqlalchemy = { version = ">=2.0.21", optional = true } openpyxl = "^3.0.10" -alembic = { version = "^1.0.11", optional = true } urllib3 = ">=1.26" +python-dateutil = "^2.8.0" +pyarrow = [ + { version = ">=14.0.1", python = ">=3.8,<3.13", optional=true }, + { version = ">=18.0.0", python = ">=3.13,<3.14", optional=true }, + { version = ">=22.0.0", python = ">=3.14", optional=true } +] +pyjwt = "^2.0.0" +pybreaker = "^1.0.0" +requests-kerberos = {version = "^0.15.0", optional = true} + [tool.poetry.extras] -sqlalchemy = ["sqlalchemy"] -alembic = ["sqlalchemy", "alembic"] +pyarrow = ["pyarrow"] -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "^7.1.2" mypy = "^1.10.1" pylint = ">=2.12.0" black = "^22.3.0" pytest-dotenv = "^0.5.2" +pytest-cov = "^4.0.0" +pytest-xdist = "^3.0.0" +numpy = [ + { version = ">=1.16.6", python = ">=3.8,<3.11" }, + { version = ">=1.23.4", python = ">=3.11" }, +] [tool.poetry.urls] "Homepage" = "https://github.com/databricks/databricks-sql-python" "Bug Tracker" = "https://github.com/databricks/databricks-sql-python/issues" -[tool.poetry.plugins."sqlalchemy.dialects"] -"databricks" = "databricks.sqlalchemy:DatabricksDialect" - [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" @@ -58,9 +66,30 @@ exclude = ['ttypes\.py$', 'TCLIService\.py$'] exclude = '/(\.eggs|\.git|\.hg|\.mypy_cache|\.nox|\.tox|\.venv|\.svn|_build|buck-out|build|dist|thrift_api)/' [tool.pytest.ini_options] -markers = {"reviewed" = "Test case has been reviewed by Databricks"} +markers = [ + "reviewed: Test case has been reviewed by Databricks", + "serial: Tests that must run serially (not parallelized)" +] minversion = "6.0" log_cli = "false" log_cli_level = "INFO" -testpaths = ["tests", "src/databricks/sqlalchemy/test_local"] +testpaths = ["tests"] env_files = ["test.env"] + +[tool.coverage.run] +source = ["src"] +branch = true +omit = [ + "*/tests/*", + "*/test_*", + "*/__pycache__/*", + "*/thrift_api/*", +] + +[tool.coverage.report] +precision = 2 +show_missing = true +skip_covered = false + +[tool.coverage.xml] +output = "coverage.xml" diff --git a/scripts/dependency_manager.py b/scripts/dependency_manager.py new file mode 100644 index 000000000..29c5fe828 --- /dev/null +++ b/scripts/dependency_manager.py @@ -0,0 +1,256 @@ +""" +Dependency version management for testing. +Generates requirements files for min and default dependency versions. +For min versions, creates flexible constraints (e.g., >=1.2.5,<1.3.0) to allow +compatible patch updates instead of pinning exact versions. +""" + +import toml +import sys +import argparse +from packaging.specifiers import SpecifierSet +from packaging.requirements import Requirement +from pathlib import Path + +class DependencyManager: + def __init__(self, pyproject_path="pyproject.toml"): + self.pyproject_path = Path(pyproject_path) + self.dependencies = self._load_dependencies() + + # Map of packages that need specific transitive dependency constraints when downgraded + self.transitive_dependencies = { + 'pandas': { + # When pandas is downgraded to 1.x, ensure numpy compatibility + 'numpy': { + 'min_constraint': '>=1.16.5,<2.0.0', # pandas 1.x works with numpy 1.x + 'applies_when': lambda version: version.startswith('1.') + } + } + } + + def _load_dependencies(self): + """Load dependencies from pyproject.toml""" + with open(self.pyproject_path, 'r') as f: + pyproject = toml.load(f) + return pyproject['tool']['poetry']['dependencies'] + + def _parse_constraint(self, name, constraint): + """Parse a dependency constraint into version info""" + if isinstance(constraint, str): + return constraint, False # version_constraint, is_optional + elif isinstance(constraint, list): + # Handle complex constraints like pandas/pyarrow with Python version markers + current_python = sys.version_info + current_version = f"{current_python.major}.{current_python.minor}" + + # Find the constraint that matches the current Python version + for item in constraint: + if 'python' in item: + python_spec = item['python'] + # Parse the Python version specifier + spec_set = SpecifierSet(python_spec) + + # Check if current Python version matches this constraint + if current_version in spec_set: + version = item['version'] + is_optional = item.get('optional', False) + return version, is_optional + + # Fallback to first constraint if no Python version match + first_constraint = constraint[0] + version = first_constraint['version'] + is_optional = first_constraint.get('optional', False) + return version, is_optional + elif isinstance(constraint, dict): + if 'version' in constraint: + return constraint['version'], constraint.get('optional', False) + return None, False + + def _extract_versions_from_specifier(self, spec_set_str): + """Extract minimum version from a specifier set""" + try: + # Handle caret (^) and tilde (~, ~=) constraints that packaging doesn't + # support (Poetry ^, Poetry ~, and PEP 440 ~=). + if spec_set_str.startswith('^'): + # ^1.2.3 means >=1.2.3, <2.0.0 + min_version = spec_set_str[1:] # Remove ^ + return min_version, None + elif spec_set_str.startswith('~='): + # PEP 440 compatible release: ~=1.2.3 means >=1.2.3, <1.3.0 + min_version = spec_set_str[2:] # Remove ~= + return min_version, None + elif spec_set_str.startswith('~'): + # Poetry tilde: ~1.2.3 means >=1.2.3, <1.3.0 + min_version = spec_set_str[1:] # Remove ~ + return min_version, None + + spec_set = SpecifierSet(spec_set_str) + min_version = None + + for spec in spec_set: + if spec.operator in ('>=', '=='): + min_version = spec.version + break + + return min_version, None + except Exception as e: + print(f"Warning: Could not parse constraint '{spec_set_str}': {e}", file=sys.stderr) + return None, None + + def _create_flexible_minimum_constraint(self, package_name, min_version): + """Create a flexible minimum constraint that allows compatible updates""" + try: + # Split version into parts + version_parts = min_version.split('.') + + if len(version_parts) >= 2: + major = version_parts[0] + minor = version_parts[1] + + # Special handling for packages that commonly have conflicts + # For these packages, use wider constraints to allow more compatibility + if package_name in ['requests', 'urllib3', 'pandas']: + # Use wider constraint: >=min_version,=2.18.1,<3.0.0 + next_major = int(major) + 1 + upper_bound = f"{next_major}.0.0" + return f"{package_name}>={min_version},<{upper_bound}" + else: + # For other packages, use minor version constraint + # e.g., 1.2.5 becomes >=1.2.5,<1.3.0 + next_minor = int(minor) + 1 + upper_bound = f"{major}.{next_minor}.0" + return f"{package_name}>={min_version},<{upper_bound}" + else: + # If version doesn't have minor version, just use exact version + return f"{package_name}=={min_version}" + + except (ValueError, IndexError) as e: + print(f"Warning: Could not create flexible constraint for {package_name}=={min_version}: {e}", file=sys.stderr) + # Fallback to exact version + return f"{package_name}=={min_version}" + + def _get_transitive_dependencies(self, package_name, version, version_type): + """Get transitive dependencies that need specific constraints based on the main package version""" + transitive_reqs = [] + + if package_name in self.transitive_dependencies: + transitive_deps = self.transitive_dependencies[package_name] + + for dep_name, dep_config in transitive_deps.items(): + # Check if this transitive dependency applies for this version + if dep_config['applies_when'](version): + if version_type == "min": + # Use the predefined constraint for minimum versions + constraint = dep_config['min_constraint'] + transitive_reqs.append(f"{dep_name}{constraint}") + # For default version_type, we don't add transitive deps as Poetry handles them + + return transitive_reqs + + def generate_requirements(self, version_type="min", include_optional=False): + """ + Generate requirements for specified version type. + + Args: + version_type: "min" or "default" + include_optional: Whether to include optional dependencies + """ + requirements = [] + transitive_requirements = [] + + for name, constraint in self.dependencies.items(): + if name == 'python': + continue + + version_constraint, is_optional = self._parse_constraint(name, constraint) + if not version_constraint: + continue + + if is_optional and not include_optional: + continue + + if version_type == "default": + # For default, just use the constraint as-is (let poetry resolve) + requirements.append(f"{name}{version_constraint}") + elif version_type == "min": + min_version, _ = self._extract_versions_from_specifier(version_constraint) + if min_version: + # Create flexible constraint that allows patch updates for compatibility + flexible_constraint = self._create_flexible_minimum_constraint(name, min_version) + requirements.append(flexible_constraint) + + # Check if this package needs specific transitive dependencies + transitive_deps = self._get_transitive_dependencies(name, min_version, version_type) + transitive_requirements.extend(transitive_deps) + + # Combine main requirements with transitive requirements + all_requirements = requirements + transitive_requirements + + # Remove duplicates (prefer main requirements over transitive ones) + seen_packages = set() + final_requirements = [] + + # First add main requirements + for req in requirements: + package_name = Requirement(req).name + seen_packages.add(package_name) + final_requirements.append(req) + + # Then add transitive requirements that don't conflict + for req in transitive_requirements: + package_name = Requirement(req).name + if package_name not in seen_packages: + final_requirements.append(req) + + return final_requirements + + + def write_requirements_file(self, filename, version_type="min", include_optional=False): + """Write requirements to a file""" + requirements = self.generate_requirements(version_type, include_optional) + + with open(filename, 'w') as f: + if version_type == "min": + f.write(f"# Minimum compatible dependency versions generated from pyproject.toml\n") + f.write(f"# Uses flexible constraints to resolve compatibility conflicts:\n") + f.write(f"# - Common packages (requests, urllib3, pandas): >=min,=min, Optional[Dict]: + """ + Decode a JWT token without verification to extract claims. + + Args: + access_token: The JWT access token to decode + + Returns: + Decoded token claims or None if decoding fails + """ + try: + return jwt.decode(access_token, options={"verify_signature": False}) + except Exception as e: + logger.debug("Failed to decode JWT token: %s", e) + return None + + +def is_same_host(url1: str, url2: str) -> bool: + """ + Check if two URLs have the same host. + + Args: + url1: First URL + url2: Second URL + + Returns: + True if hosts are the same, False otherwise + """ + try: + host1 = urlparse(url1).netloc + host2 = urlparse(url2).netloc + # Handle port differences (e.g., example.com vs example.com:443) + host1_without_port = host1.split(":")[0] + host2_without_port = host2.split(":")[0] + return host1_without_port == host2_without_port + except Exception as e: + logger.debug("Failed to parse URLs: %s", e) + return False diff --git a/src/databricks/sql/auth/authenticators.py b/src/databricks/sql/auth/authenticators.py index 64eb91bb0..5bc78d6a1 100644 --- a/src/databricks/sql/auth/authenticators.py +++ b/src/databricks/sql/auth/authenticators.py @@ -1,10 +1,18 @@ import abc -import base64 import logging from typing import Callable, Dict, List - -from databricks.sql.auth.oauth import OAuthManager -from databricks.sql.auth.endpoint import get_oauth_endpoints, infer_cloud_from_host +from databricks.sql.common.http import HttpHeader +from databricks.sql.auth.oauth import ( + OAuthManager, + RefreshableTokenSource, + ClientCredentialsTokenSource, +) +from databricks.sql.auth.endpoint import get_oauth_endpoints +from databricks.sql.auth.common import ( + AuthType, + get_effective_azure_login_app_id, + get_azure_tenant_id_from_host, +) # Private API: this is an evolving interface and it will change in the future. # Please must not depend on it in your applications. @@ -55,6 +63,7 @@ def __init__( redirect_port_range: List[int], client_id: str, scopes: List[str], + http_client, auth_type: str = "databricks-oauth", ): try: @@ -71,6 +80,7 @@ def __init__( port_range=redirect_port_range, client_id=client_id, idp_endpoint=idp_endpoint, + http_client=http_client, ) self._hostname = hostname self._scopes_as_str = DatabricksOAuthProvider.SCOPE_DELIM.join(cloud_scopes) @@ -146,3 +156,85 @@ def add_headers(self, request_headers: Dict[str, str]): headers = self._header_factory() for k, v in headers.items(): request_headers[k] = v + + +class AzureServicePrincipalCredentialProvider(CredentialsProvider): + """ + A credential provider for Azure Service Principal authentication with Databricks. + + This class implements the CredentialsProvider protocol to authenticate requests + to Databricks REST APIs using Azure Active Directory (AAD) service principal + credentials. It handles OAuth 2.0 client credentials flow to obtain access tokens + from Azure AD and automatically refreshes them when they expire. + + Attributes: + hostname (str): The Databricks workspace hostname. + azure_client_id (str): The Azure service principal's client ID. + azure_client_secret (str): The Azure service principal's client secret. + azure_tenant_id (str): The Azure AD tenant ID. + azure_workspace_resource_id (str, optional): The Azure workspace resource ID. + """ + + AZURE_AAD_ENDPOINT = "https://login.microsoftonline.com" + AZURE_TOKEN_ENDPOINT = "oauth2/token" + + AZURE_MANAGED_RESOURCE = "https://management.core.windows.net/" + + DATABRICKS_AZURE_SP_TOKEN_HEADER = "X-Databricks-Azure-SP-Management-Token" + DATABRICKS_AZURE_WORKSPACE_RESOURCE_ID_HEADER = ( + "X-Databricks-Azure-Workspace-Resource-Id" + ) + + def __init__( + self, + hostname, + azure_client_id, + azure_client_secret, + http_client, + azure_tenant_id=None, + azure_workspace_resource_id=None, + ): + self.hostname = hostname + self.azure_client_id = azure_client_id + self.azure_client_secret = azure_client_secret + self.azure_workspace_resource_id = azure_workspace_resource_id + self.azure_tenant_id = azure_tenant_id or get_azure_tenant_id_from_host( + hostname, http_client + ) + self._http_client = http_client + + def auth_type(self) -> str: + return AuthType.AZURE_SP_M2M.value + + def get_token_source(self, resource: str) -> RefreshableTokenSource: + return ClientCredentialsTokenSource( + token_url=f"{self.AZURE_AAD_ENDPOINT}/{self.azure_tenant_id}/{self.AZURE_TOKEN_ENDPOINT}", + client_id=self.azure_client_id, + client_secret=self.azure_client_secret, + http_client=self._http_client, + extra_params={"resource": resource}, + ) + + def __call__(self, *args, **kwargs) -> HeaderFactory: + inner = self.get_token_source( + resource=get_effective_azure_login_app_id(self.hostname) + ) + cloud = self.get_token_source(resource=self.AZURE_MANAGED_RESOURCE) + + def header_factory() -> Dict[str, str]: + inner_token = inner.get_token() + cloud_token = cloud.get_token() + + headers = { + HttpHeader.AUTHORIZATION.value: f"{inner_token.token_type} {inner_token.access_token}", + self.DATABRICKS_AZURE_SP_TOKEN_HEADER: cloud_token.access_token, + } + + if self.azure_workspace_resource_id: + headers[ + self.DATABRICKS_AZURE_WORKSPACE_RESOURCE_ID_HEADER + ] = self.azure_workspace_resource_id + + return headers + + return header_factory diff --git a/src/databricks/sql/auth/common.py b/src/databricks/sql/auth/common.py new file mode 100644 index 000000000..0e3a01918 --- /dev/null +++ b/src/databricks/sql/auth/common.py @@ -0,0 +1,131 @@ +from enum import Enum +import logging +from typing import Optional, List +from urllib.parse import urlparse +from databricks.sql.auth.retry import DatabricksRetryPolicy +from databricks.sql.common.http import HttpMethod + +logger = logging.getLogger(__name__) + + +class AuthType(Enum): + DATABRICKS_OAUTH = "databricks-oauth" + AZURE_OAUTH = "azure-oauth" + AZURE_SP_M2M = "azure-sp-m2m" + + +class AzureAppId(Enum): + DEV = (".dev.azuredatabricks.net", "62a912ac-b58e-4c1d-89ea-b2dbfc7358fc") + STAGING = (".staging.azuredatabricks.net", "4a67d088-db5c-48f1-9ff2-0aace800ae68") + PROD = (".azuredatabricks.net", "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d") + + +class ClientContext: + def __init__( + self, + hostname: str, + access_token: Optional[str] = None, + auth_type: Optional[str] = None, + oauth_scopes: Optional[List[str]] = None, + oauth_client_id: Optional[str] = None, + azure_client_id: Optional[str] = None, + azure_client_secret: Optional[str] = None, + azure_tenant_id: Optional[str] = None, + azure_workspace_resource_id: Optional[str] = None, + oauth_redirect_port_range: Optional[List[int]] = None, + use_cert_as_auth: Optional[str] = None, + tls_client_cert_file: Optional[str] = None, + oauth_persistence=None, + credentials_provider=None, + identity_federation_client_id: Optional[str] = None, + # HTTP client configuration parameters + ssl_options=None, # SSLOptions type + socket_timeout: Optional[float] = None, + retry_stop_after_attempts_count: Optional[int] = None, + retry_delay_min: Optional[float] = None, + retry_delay_max: Optional[float] = None, + retry_stop_after_attempts_duration: Optional[float] = None, + retry_delay_default: Optional[float] = None, + retry_dangerous_codes: Optional[List[int]] = None, + proxy_auth_method: Optional[str] = None, + pool_connections: Optional[int] = None, + pool_maxsize: Optional[int] = None, + user_agent: Optional[str] = None, + telemetry_circuit_breaker_enabled: Optional[bool] = True, + ): + self.hostname = hostname + self.access_token = access_token + self.auth_type = auth_type + self.oauth_scopes = oauth_scopes + self.oauth_client_id = oauth_client_id + self.azure_client_id = azure_client_id + self.azure_client_secret = azure_client_secret + self.azure_tenant_id = azure_tenant_id + self.azure_workspace_resource_id = azure_workspace_resource_id + self.oauth_redirect_port_range = oauth_redirect_port_range + self.use_cert_as_auth = use_cert_as_auth + self.tls_client_cert_file = tls_client_cert_file + self.oauth_persistence = oauth_persistence + self.credentials_provider = credentials_provider + self.identity_federation_client_id = identity_federation_client_id + + # HTTP client configuration + self.ssl_options = ssl_options + self.socket_timeout = socket_timeout + self.retry_stop_after_attempts_count = retry_stop_after_attempts_count or 5 + self.retry_delay_min = retry_delay_min or 1.0 + self.retry_delay_max = retry_delay_max or 10.0 + self.retry_stop_after_attempts_duration = ( + retry_stop_after_attempts_duration or 300.0 + ) + self.retry_delay_default = retry_delay_default or 5.0 + self.retry_dangerous_codes = retry_dangerous_codes or [] + self.proxy_auth_method = proxy_auth_method + self.pool_connections = pool_connections or 10 + self.pool_maxsize = pool_maxsize or 20 + self.user_agent = user_agent + self.telemetry_circuit_breaker_enabled = bool(telemetry_circuit_breaker_enabled) + + +def get_effective_azure_login_app_id(hostname) -> str: + """ + Get the effective Azure login app ID for a given hostname. + This function determines the appropriate Azure login app ID based on the hostname. + If the hostname does not match any of these domains, it returns the default Databricks resource ID. + + """ + for azure_app_id in AzureAppId: + domain, app_id = azure_app_id.value + if domain in hostname: + return app_id + + # default databricks resource id + return AzureAppId.PROD.value[1] + + +def get_azure_tenant_id_from_host(host: str, http_client) -> str: + """ + Load the Azure tenant ID from the Azure Databricks login page. + + This function retrieves the Azure tenant ID by making a request to the Databricks + Azure Active Directory (AAD) authentication endpoint. The endpoint redirects to + the Azure login page, and the tenant ID is extracted from the redirect URL. + """ + + login_url = f"{host}/aad/auth" + logger.debug("Loading tenant ID from %s", login_url) + + with http_client.request_context(HttpMethod.GET, login_url) as resp: + entra_id_endpoint = resp.retries.history[-1].redirect_location + if entra_id_endpoint is None: + raise ValueError( + f"No Location header in response from {login_url}: {entra_id_endpoint}" + ) + + # The final redirect URL has the following form: https://login.microsoftonline.com//oauth2/authorize?... + # The domain may change depending on the Azure cloud (e.g. login.microsoftonline.us for US Government cloud). + url = urlparse(entra_id_endpoint) + path_segments = url.path.split("/") + if len(path_segments) < 2: + raise ValueError(f"Invalid path in Location header: {url.path}") + return path_segments[1] diff --git a/src/databricks/sql/auth/oauth.py b/src/databricks/sql/auth/oauth.py index 806df08fe..1fc5894c5 100644 --- a/src/databricks/sql/auth/oauth.py +++ b/src/databricks/sql/auth/oauth.py @@ -6,33 +6,59 @@ import webbrowser from datetime import datetime, timezone from http.server import HTTPServer -from typing import List +from typing import List, Optional import oauthlib.oauth2 -import requests from oauthlib.oauth2.rfc6749.errors import OAuth2Error -from requests.exceptions import RequestException - +from databricks.sql.common.http import HttpMethod, HttpHeader +from databricks.sql.common.http import OAuthResponse from databricks.sql.auth.oauth_http_handler import OAuthHttpSingleRequestHandler from databricks.sql.auth.endpoint import OAuthEndpointCollection +from abc import abstractmethod, ABC +from urllib.parse import urlencode +import jwt +import time logger = logging.getLogger(__name__) -class IgnoreNetrcAuth(requests.auth.AuthBase): - """This auth method is a no-op. +class Token: + """ + A class to represent a token. - We use it to force requestslib to not use .netrc to write auth headers - when making .post() requests to the oauth token endpoints, since these - don't require authentication. + Attributes: + access_token (str): The access token string. + token_type (str): The type of token (e.g., "Bearer"). + refresh_token (str): The refresh token string. + """ - In cases where .netrc is outdated or corrupt, these requests will fail. + def __init__(self, access_token: str, token_type: str, refresh_token: str): + self.access_token = access_token + self.token_type = token_type + self.refresh_token = refresh_token - See issue #121 - """ + def is_expired(self) -> bool: + try: + decoded_token = jwt.decode( + self.access_token, options={"verify_signature": False} + ) + exp_time = decoded_token.get("exp") + current_time = time.time() + buffer_time = 30 # 30 seconds buffer + return exp_time and (exp_time - buffer_time) <= current_time + except Exception as e: + logger.error("Failed to decode token: %s", e) + raise e - def __call__(self, r): - return r + +class RefreshableTokenSource(ABC): + @abstractmethod + def get_token(self) -> Token: + pass + + @abstractmethod + def refresh(self) -> Token: + pass class OAuthManager: @@ -41,11 +67,13 @@ def __init__( port_range: List[int], client_id: str, idp_endpoint: OAuthEndpointCollection, + http_client, ): self.port_range = port_range self.client_id = client_id self.redirect_port = None self.idp_endpoint = idp_endpoint + self.http_client = http_client @staticmethod def __token_urlsafe(nbytes=32): @@ -59,8 +87,11 @@ def __fetch_well_known_config(self, hostname: str): known_config_url = self.idp_endpoint.get_openid_config_url(hostname) try: - response = requests.get(url=known_config_url, auth=IgnoreNetrcAuth()) - except RequestException as e: + response = self.http_client.request(HttpMethod.GET, url=known_config_url) + # Convert urllib3 response to requests-like response for compatibility + response.status_code = response.status + response.json = lambda: json.loads(response.data.decode()) + except Exception as e: logger.error( f"Unable to fetch OAuth configuration from {known_config_url}.\n" "Verify it is a valid workspace URL and that OAuth is " @@ -78,7 +109,7 @@ def __fetch_well_known_config(self, hostname: str): raise RuntimeError(msg) try: return response.json() - except requests.exceptions.JSONDecodeError as e: + except Exception as e: logger.error( f"Unable to decode OAuth configuration from {known_config_url}.\n" "Verify it is a valid workspace URL and that OAuth is " @@ -159,16 +190,17 @@ def __send_auth_code_token_request( data = f"{token_request_body}&code_verifier={verifier}" return self.__send_token_request(token_request_url, data) - @staticmethod - def __send_token_request(token_request_url, data): + def __send_token_request(self, token_request_url, data): headers = { "Accept": "application/json", "Content-Type": "application/x-www-form-urlencoded", } - response = requests.post( - url=token_request_url, data=data, headers=headers, auth=IgnoreNetrcAuth() + # Use unified HTTP client + response = self.http_client.request( + HttpMethod.POST, url=token_request_url, body=data, headers=headers ) - return response.json() + # Convert urllib3 response to dict for compatibility + return json.loads(response.data.decode()) def __send_refresh_token_request(self, hostname, refresh_token): oauth_config = self.__fetch_well_known_config(hostname) @@ -177,7 +209,7 @@ def __send_refresh_token_request(self, hostname, refresh_token): token_request_body = client.prepare_refresh_body( refresh_token=refresh_token, client_id=client.client_id ) - return OAuthManager.__send_token_request(token_request_url, token_request_body) + return self.__send_token_request(token_request_url, token_request_body) @staticmethod def __get_tokens_from_response(oauth_response): @@ -258,3 +290,64 @@ def get_tokens(self, hostname: str, scope=None): client, token_request_url, redirect_url, code, verifier ) return self.__get_tokens_from_response(oauth_response) + + +class ClientCredentialsTokenSource(RefreshableTokenSource): + """ + A token source that uses client credentials to get a token from the token endpoint. + It will refresh the token if it is expired. + + Attributes: + token_url (str): The URL of the token endpoint. + client_id (str): The client ID. + client_secret (str): The client secret. + """ + + def __init__( + self, + token_url, + client_id, + client_secret, + http_client, + extra_params: dict = {}, + ): + self.client_id = client_id + self.client_secret = client_secret + self.token_url = token_url + self.extra_params = extra_params + self.token: Optional[Token] = None + self._http_client = http_client + + def get_token(self) -> Token: + if self.token is None or self.token.is_expired(): + self.token = self.refresh() + return self.token + + def refresh(self) -> Token: + logger.info("Refreshing OAuth token using client credentials flow") + headers = { + HttpHeader.CONTENT_TYPE.value: "application/x-www-form-urlencoded", + } + data = urlencode( + { + "grant_type": "client_credentials", + "client_id": self.client_id, + "client_secret": self.client_secret, + **self.extra_params, + } + ) + + response = self._http_client.request( + method=HttpMethod.POST, url=self.token_url, headers=headers, body=data + ) + if response.status == 200: + oauth_response = OAuthResponse(**json.loads(response.data.decode("utf-8"))) + return Token( + oauth_response.access_token, + oauth_response.token_type, + oauth_response.refresh_token, + ) + else: + raise Exception( + f"Failed to get token: {response.status} {response.data.decode('utf-8')}" + ) diff --git a/src/databricks/sql/auth/retry.py b/src/databricks/sql/auth/retry.py index 0243d0aa2..b0c2f497d 100755 --- a/src/databricks/sql/auth/retry.py +++ b/src/databricks/sql/auth/retry.py @@ -2,9 +2,12 @@ import random import time import typing +from importlib.metadata import version from enum import Enum from typing import List, Optional, Tuple, Union +import urllib3 + # We only use this import for type hinting try: # If urllib3~=2.0 is installed @@ -15,6 +18,7 @@ from urllib3 import Retry from urllib3.util.retry import RequestHistory + from databricks.sql.exc import ( CursorAlreadyClosedError, MaxRetryDurationError, @@ -123,7 +127,7 @@ def __init__( total=_attempts_remaining, respect_retry_after_header=True, backoff_factor=self.delay_min, - allowed_methods=["POST"], + allowed_methods=["POST", "GET", "DELETE"], status_forcelist=[429, 503, *self.force_dangerous_codes], ) @@ -290,8 +294,9 @@ def sleep_for_retry(self, response: BaseHTTPResponse) -> bool: else: proposed_wait = self.get_backoff_time() - proposed_wait = min(proposed_wait, self.delay_max) + proposed_wait = max(proposed_wait, self.delay_max) self.check_proposed_wait(proposed_wait) + logger.debug(f"Retrying after {proposed_wait} seconds") time.sleep(proposed_wait) return True @@ -307,8 +312,11 @@ def get_backoff_time(self) -> float: current_attempt = self.stop_after_attempts_count - int(self.total or 0) proposed_backoff = (2**current_attempt) * self.delay_min - if self.backoff_jitter != 0.0: - proposed_backoff += random.random() * self.backoff_jitter + + library_version = version("urllib3") + if int(library_version.split(".")[0]) >= 2: + if self.backoff_jitter != 0.0: + proposed_backoff += random.random() * self.backoff_jitter proposed_backoff = min(proposed_backoff, self.delay_max) self.check_proposed_wait(proposed_backoff) @@ -344,63 +352,51 @@ def should_retry(self, method: str, status_code: int) -> Tuple[bool, str]: if a retry would violate the configured policy. """ + logger.info(f"Received status code {status_code} for {method} request") + # Request succeeded. Don't retry. - if status_code == 200: - return False, "200 codes are not retried" + if status_code // 100 <= 3: + return False, "2xx/3xx codes are not retried" + + if status_code == 400: + return ( + False, + "Received 400 - BAD_REQUEST. Please check the request parameters.", + ) if status_code == 401: - raise NonRecoverableNetworkError( - "Received 401 - UNAUTHORIZED. Confirm your authentication credentials." + return ( + False, + "Received 401 - UNAUTHORIZED. Confirm your authentication credentials.", ) if status_code == 403: - raise NonRecoverableNetworkError( - "Received 403 - FORBIDDEN. Confirm your authentication credentials." + return False, "403 codes are not retried" + + # Request failed with 404. Don't retry for any command type. + if status_code == 404: + return ( + False, + "Received 404 - NOT_FOUND. The requested resource does not exist.", ) # Request failed and server said NotImplemented. This isn't recoverable. Don't retry. if status_code == 501: - raise NonRecoverableNetworkError("Received code 501 from server.") + return False, "Received code 501 from server." # Request failed and this method is not retryable. We only retry POST requests. if not self._is_method_retryable(method): 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 - and self.command_type == CommandType.CLOSE_SESSION - and len(self.history) > 0 - ): - raise SessionAlreadyClosedError( - "CloseSession received 404 code from Databricks. Session is already closed." - ) - - # Request failed with 404 because CloseOperation returns 404 if you repeat the request. - if ( - status_code == 404 - and self.command_type == CommandType.CLOSE_OPERATION - and len(self.history) > 0 - ): - raise CursorAlreadyClosedError( - "CloseOperation received 404 code from Databricks. Cursor is already closed." - ) - # Request failed, was an ExecuteStatement and the command may have reached the server if ( self.command_type == CommandType.EXECUTE_STATEMENT and status_code not in self.status_forcelist and status_code not in self.force_dangerous_codes ): - raise UnsafeToRetryError( - "ExecuteStatement command can only be retried for codes 429 and 503" + return ( + False, + "ExecuteStatement command can only be retried for codes 429 and 503", ) # Request failed with a dangerous code, was an ExecuteStatement, but user forced retries for this diff --git a/src/databricks/sql/auth/thrift_http_client.py b/src/databricks/sql/auth/thrift_http_client.py index 6273ab284..2becfb4fb 100644 --- a/src/databricks/sql/auth/thrift_http_client.py +++ b/src/databricks/sql/auth/thrift_http_client.py @@ -15,11 +15,19 @@ from urllib3.util import make_headers from databricks.sql.auth.retry import CommandType, DatabricksRetryPolicy from databricks.sql.types import SSLOptions +from databricks.sql.common.http_utils import ( + detect_and_parse_proxy, +) logger = logging.getLogger(__name__) class THttpClient(thrift.transport.THttpClient.THttpClient): + realhost: Optional[str] + realport: Optional[int] + proxy_uri: Optional[str] + proxy_auth: Optional[Dict[str, str]] + def __init__( self, auth_provider, @@ -29,6 +37,7 @@ def __init__( ssl_options: Optional[SSLOptions] = None, max_connections: int = 1, retry_policy: Union[DatabricksRetryPolicy, int] = 0, + **kwargs, ): self._ssl_options = ssl_options @@ -58,27 +67,25 @@ def __init__( self.path = parsed.path if parsed.query: self.path += "?%s" % parsed.query - try: - proxy = urllib.request.getproxies()[self.scheme] - except KeyError: - proxy = None - else: - if urllib.request.proxy_bypass(self.host): - proxy = None - if proxy: - parsed = urllib.parse.urlparse(proxy) + # Handle proxy settings using shared utility + proxy_auth_method = kwargs.get("_proxy_auth_method") + proxy_uri, proxy_auth = detect_and_parse_proxy( + self.scheme, self.host, proxy_auth_method=proxy_auth_method + ) + + if proxy_uri: + parsed_proxy = urllib.parse.urlparse(proxy_uri) # realhost and realport are the host and port of the actual request self.realhost = self.host self.realport = self.port - # this is passed to ProxyManager - self.proxy_uri: str = proxy - self.host = parsed.hostname - self.port = parsed.port - self.proxy_auth = self.basic_proxy_auth_headers(parsed) + self.proxy_uri = proxy_uri + self.host = parsed_proxy.hostname + self.port = parsed_proxy.port + self.proxy_auth = proxy_auth else: - self.realhost = self.realport = self.proxy_auth = None + self.realhost = self.realport = self.proxy_auth = self.proxy_uri = None self.max_connections = max_connections @@ -198,15 +205,15 @@ def flush(self): self.message = self.__resp.reason self.headers = self.__resp.headers - @staticmethod - def basic_proxy_auth_headers(proxy): - if proxy is None or not proxy.username: - return None - ap = "%s:%s" % ( - urllib.parse.unquote(proxy.username), - urllib.parse.unquote(proxy.password), + logger.info( + "HTTP Response with status code {}, message: {}".format( + self.code, self.message + ) ) - return make_headers(proxy_basic_auth=ap) + + def using_proxy(self) -> bool: + """Check if proxy is being used.""" + return self.realhost is not None def set_retry_command_type(self, value: CommandType): """Pass the provided CommandType to the retry policy""" diff --git a/src/databricks/sql/auth/token_federation.py b/src/databricks/sql/auth/token_federation.py new file mode 100644 index 000000000..f75b904fb --- /dev/null +++ b/src/databricks/sql/auth/token_federation.py @@ -0,0 +1,206 @@ +import logging +import json +from datetime import datetime, timedelta +from typing import Optional, Dict, Tuple +from urllib.parse import urlencode + +from databricks.sql.auth.authenticators import AuthProvider +from databricks.sql.auth.auth_utils import ( + decode_token, + is_same_host, +) +from databricks.sql.common.url_utils import normalize_host_with_protocol +from databricks.sql.common.http import HttpMethod + +logger = logging.getLogger(__name__) + + +class Token: + """ + Represents an OAuth token with expiration management. + """ + + def __init__(self, access_token: str, token_type: str = "Bearer"): + """ + Initialize a token. + + Args: + access_token: The access token string + token_type: The token type (default: Bearer) + """ + self.access_token = access_token + self.token_type = token_type + self.expiry_time = self._calculate_expiry() + + def _calculate_expiry(self) -> datetime: + """ + Calculate the token expiry time from JWT claims. + + Returns: + The token expiry datetime + """ + decoded = decode_token(self.access_token) + if decoded and "exp" in decoded: + # Use JWT exp claim with 1 minute buffer + return datetime.fromtimestamp(decoded["exp"]) - timedelta(minutes=1) + # Default to 1 hour if no expiry info + return datetime.now() + timedelta(hours=1) + + def is_expired(self) -> bool: + """ + Check if the token is expired. + + Returns: + True if token is expired, False otherwise + """ + return datetime.now() >= self.expiry_time + + def to_dict(self) -> Dict[str, str]: + """ + Convert token to dictionary format. + + Returns: + Dictionary with access_token and token_type + """ + return { + "access_token": self.access_token, + "token_type": self.token_type, + } + + +class TokenFederationProvider(AuthProvider): + """ + Implementation of Token Federation for Databricks SQL Python driver. + + This provider exchanges third-party access tokens for Databricks in-house tokens + when the token issuer is different from the Databricks host. + """ + + TOKEN_EXCHANGE_ENDPOINT = "/oidc/v1/token" + TOKEN_EXCHANGE_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:token-exchange" + TOKEN_EXCHANGE_SUBJECT_TYPE = "urn:ietf:params:oauth:token-type:jwt" + + def __init__( + self, + hostname: str, + external_provider: AuthProvider, + http_client, + identity_federation_client_id: Optional[str] = None, + ): + """ + Initialize the Token Federation Provider. + + Args: + hostname: The Databricks workspace hostname + external_provider: The external authentication provider + http_client: HTTP client for making requests (required) + identity_federation_client_id: Optional client ID for token federation + """ + if not http_client: + raise ValueError("http_client is required for TokenFederationProvider") + + self.hostname = normalize_host_with_protocol(hostname) + self.external_provider = external_provider + self.http_client = http_client + self.identity_federation_client_id = identity_federation_client_id + + self._cached_token: Optional[Token] = None + self._external_headers: Dict[str, str] = {} + + def add_headers(self, request_headers: Dict[str, str]): + """Add authentication headers to the request.""" + + if self._cached_token and not self._cached_token.is_expired(): + request_headers[ + "Authorization" + ] = f"{self._cached_token.token_type} {self._cached_token.access_token}" + return + + # Get the external headers first to check if we need token federation + self._external_headers = {} + self.external_provider.add_headers(self._external_headers) + + # If no Authorization header from external provider, pass through all headers + if "Authorization" not in self._external_headers: + request_headers.update(self._external_headers) + return + + token = self._get_token() + request_headers["Authorization"] = f"{token.token_type} {token.access_token}" + + def _get_token(self) -> Token: + """Get or refresh the authentication token.""" + # Check if cached token is still valid + if self._cached_token and not self._cached_token.is_expired(): + return self._cached_token + + # Extract token from already-fetched headers + auth_header = self._external_headers.get("Authorization", "") + token_type, access_token = self._extract_token_from_header(auth_header) + + # Check if token exchange is needed + if self._should_exchange_token(access_token): + try: + token = self._exchange_token(access_token) + self._cached_token = token + return token + except Exception as e: + logger.warning("Token exchange failed, using external token: %s", e) + + # Use external token directly + token = Token(access_token, token_type) + self._cached_token = token + return token + + def _should_exchange_token(self, access_token: str) -> bool: + """Check if the token should be exchanged based on issuer.""" + decoded = decode_token(access_token) + if not decoded: + return False + + issuer = decoded.get("iss", "") + # Check if issuer host is different from Databricks host + return not is_same_host(issuer, self.hostname) + + def _exchange_token(self, access_token: str) -> Token: + """Exchange the external token for a Databricks token.""" + token_url = f"{self.hostname}{self.TOKEN_EXCHANGE_ENDPOINT}" + + data = { + "grant_type": self.TOKEN_EXCHANGE_GRANT_TYPE, + "subject_token": access_token, + "subject_token_type": self.TOKEN_EXCHANGE_SUBJECT_TYPE, + "scope": "sql", + "return_original_token_if_authenticated": "true", + } + + if self.identity_federation_client_id: + data["client_id"] = self.identity_federation_client_id + + headers = { + "Content-Type": "application/x-www-form-urlencoded", + "Accept": "*/*", + } + + body = urlencode(data) + + response = self.http_client.request( + HttpMethod.POST, url=token_url, body=body, headers=headers + ) + + token_response = json.loads(response.data.decode()) + + return Token( + token_response["access_token"], token_response.get("token_type", "Bearer") + ) + + def _extract_token_from_header(self, auth_header: str) -> Tuple[str, str]: + """Extract token type and access token from Authorization header.""" + if not auth_header: + raise ValueError("Authorization header is missing") + + parts = auth_header.split(" ", 1) + if len(parts) != 2: + raise ValueError("Invalid Authorization header format") + + return parts[0], parts[1] diff --git a/src/databricks/sql/backend/databricks_client.py b/src/databricks/sql/backend/databricks_client.py new file mode 100644 index 000000000..b772e7ddd --- /dev/null +++ b/src/databricks/sql/backend/databricks_client.py @@ -0,0 +1,349 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import Dict, List, Optional, Any, Union, TYPE_CHECKING + +if TYPE_CHECKING: + from databricks.sql.client import Cursor + from databricks.sql.result_set import ResultSet + +from databricks.sql.thrift_api.TCLIService import ttypes +from databricks.sql.backend.types import SessionId, CommandId, CommandState + + +class DatabricksClient(ABC): + """ + Abstract client interface for interacting with Databricks SQL services. + + Implementations of this class are responsible for: + - Managing connections to Databricks SQL services + - Executing SQL queries and commands + - Retrieving query results + - Fetching metadata about catalogs, schemas, tables, and columns + """ + + # == Connection and Session Management == + @abstractmethod + def open_session( + self, + session_configuration: Optional[Dict[str, Any]], + catalog: Optional[str], + schema: Optional[str], + ) -> SessionId: + """ + Opens a new session with the Databricks SQL service. + + This method establishes a new session with the server and returns a session + identifier that can be used for subsequent operations. + + Args: + session_configuration: Optional dictionary of configuration parameters for the session + catalog: Optional catalog name to use as the initial catalog for the session + schema: Optional schema name to use as the initial schema for the session + + Returns: + SessionId: A session identifier object that can be used for subsequent operations + + Raises: + Error: If the session configuration is invalid + OperationalError: If there's an error establishing the session + InvalidServerResponseError: If the server response is invalid or unexpected + """ + pass + + @abstractmethod + def close_session(self, session_id: SessionId) -> None: + """ + Closes an existing session with the Databricks SQL service. + + This method terminates the session identified by the given session ID and + releases any resources associated with it. + + Args: + session_id: The session identifier returned by open_session() + + Raises: + ValueError: If the session ID is invalid + OperationalError: If there's an error closing the session + """ + pass + + # == Query Execution, Command Management == + @abstractmethod + def execute_command( + self, + operation: str, + session_id: SessionId, + max_rows: int, + max_bytes: int, + lz4_compression: bool, + cursor: Cursor, + use_cloud_fetch: bool, + parameters: List[ttypes.TSparkParameter], + async_op: bool, + enforce_embedded_schema_correctness: bool, + row_limit: Optional[int] = None, + query_tags: Optional[Dict[str, Optional[str]]] = None, + ) -> Union[ResultSet, None]: + """ + Executes a SQL command or query within the specified session. + + This method sends a SQL command to the server for execution and handles + the response. It can operate in both synchronous and asynchronous modes. + + Args: + operation: The SQL command or query to execute + session_id: The session identifier in which to execute the command + max_rows: Maximum number of rows to fetch in a single fetch batch + max_bytes: Maximum number of bytes to fetch in a single fetch batch + lz4_compression: Whether to use LZ4 compression for result data + cursor: The cursor object that will handle the results. The command id is set in this cursor. + use_cloud_fetch: Whether to use cloud fetch for retrieving large result sets + parameters: List of parameters to bind to the query + async_op: Whether to execute the command asynchronously + enforce_embedded_schema_correctness: Whether to enforce schema correctness + row_limit: Maximum number of rows in the response. + query_tags: Optional dictionary of query tags to apply for this query only. + + Returns: + If async_op is False, returns a ResultSet object containing the + query results and metadata. If async_op is True, returns None and the + results must be fetched later using get_execution_result(). + + Raises: + ValueError: If the session ID is invalid + OperationalError: If there's an error executing the command + ServerOperationError: If the server encounters an error during execution + """ + pass + + @abstractmethod + def cancel_command(self, command_id: CommandId) -> None: + """ + Cancels a running command or query. + + This method attempts to cancel a command that is currently being executed. + It can be called from a different thread than the one executing the command. + + Args: + command_id: The command identifier to cancel + + Raises: + ValueError: If the command ID is invalid + OperationalError: If there's an error canceling the command + """ + pass + + @abstractmethod + def close_command(self, command_id: CommandId) -> None: + """ + Closes a command and releases associated resources. + + This method informs the server that the client is done with the command + and any resources associated with it can be released. + + Args: + command_id: The command identifier to close + + Raises: + ValueError: If the command ID is invalid + OperationalError: If there's an error closing the command + """ + pass + + @abstractmethod + def get_query_state(self, command_id: CommandId) -> CommandState: + """ + Gets the current state of a query or command. + + This method retrieves the current execution state of a command from the server. + + Args: + command_id: The command identifier to check + + Returns: + CommandState: The current state of the command + + Raises: + ValueError: If the command ID is invalid + OperationalError: If there's an error retrieving the state + ServerOperationError: If the command is in an error state + DatabaseError: If the command has been closed unexpectedly + """ + pass + + @abstractmethod + def get_execution_result( + self, + command_id: CommandId, + cursor: Cursor, + ) -> ResultSet: + """ + Retrieves the results of a previously executed command. + + This method fetches the results of a command that was executed asynchronously + or retrieves additional results from a command that has more rows available. + + Args: + command_id: The command identifier for which to retrieve results + cursor: The cursor object that will handle the results + + Returns: + ResultSet: An object containing the query results and metadata + + Raises: + ValueError: If the command ID is invalid + OperationalError: If there's an error retrieving the results + """ + pass + + # == Metadata Operations == + @abstractmethod + def get_catalogs( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + ) -> ResultSet: + """ + Retrieves a list of available catalogs. + + This method fetches metadata about all catalogs available in the current + session's context. + + Args: + session_id: The session identifier + max_rows: Maximum number of rows to fetch in a single batch + max_bytes: Maximum number of bytes to fetch in a single batch + cursor: The cursor object that will handle the results + + Returns: + ResultSet: An object containing the catalog metadata + + Raises: + ValueError: If the session ID is invalid + OperationalError: If there's an error retrieving the catalogs + """ + pass + + @abstractmethod + def get_schemas( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + catalog_name: Optional[str] = None, + schema_name: Optional[str] = None, + ) -> ResultSet: + """ + Retrieves a list of schemas, optionally filtered by catalog and schema name patterns. + + This method fetches metadata about schemas available in the specified catalog + or all catalogs if no catalog is specified. + + Args: + session_id: The session identifier + max_rows: Maximum number of rows to fetch in a single batch + max_bytes: Maximum number of bytes to fetch in a single batch + cursor: The cursor object that will handle the results + catalog_name: Optional catalog name pattern to filter by + schema_name: Optional schema name pattern to filter by + + Returns: + ResultSet: An object containing the schema metadata + + Raises: + ValueError: If the session ID is invalid + OperationalError: If there's an error retrieving the schemas + """ + pass + + @abstractmethod + def get_tables( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + catalog_name: Optional[str] = None, + schema_name: Optional[str] = None, + table_name: Optional[str] = None, + table_types: Optional[List[str]] = None, + ) -> ResultSet: + """ + Retrieves a list of tables, optionally filtered by catalog, schema, table name, and table types. + + This method fetches metadata about tables available in the specified catalog + and schema, or all catalogs and schemas if not specified. + + Args: + session_id: The session identifier + max_rows: Maximum number of rows to fetch in a single batch + max_bytes: Maximum number of bytes to fetch in a single batch + cursor: The cursor object that will handle the results + catalog_name: Optional catalog name pattern to filter by + if catalog_name is None, we fetch across all catalogs + schema_name: Optional schema name pattern to filter by + if schema_name is None, we fetch across all schemas + table_name: Optional table name pattern to filter by + table_types: Optional list of table types to filter by (e.g., ['TABLE', 'VIEW']) + + Returns: + ResultSet: An object containing the table metadata + + Raises: + ValueError: If the session ID is invalid + OperationalError: If there's an error retrieving the tables + """ + pass + + @abstractmethod + def get_columns( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + catalog_name: Optional[str] = None, + schema_name: Optional[str] = None, + table_name: Optional[str] = None, + column_name: Optional[str] = None, + ) -> ResultSet: + """ + Retrieves a list of columns, optionally filtered by catalog, schema, table, and column name patterns. + + This method fetches metadata about columns available in the specified table, + or all tables if not specified. + + Args: + session_id: The session identifier + max_rows: Maximum number of rows to fetch in a single batch + max_bytes: Maximum number of bytes to fetch in a single batch + cursor: The cursor object that will handle the results + catalog_name: Optional catalog name pattern to filter by + schema_name: Optional schema name pattern to filter by + table_name: Optional table name pattern to filter by + if table_name is None, we fetch across all tables + column_name: Optional column name pattern to filter by + + Returns: + ResultSet: An object containing the column metadata + + Raises: + ValueError: If the session ID is invalid + OperationalError: If there's an error retrieving the columns + """ + pass + + @property + @abstractmethod + def max_download_threads(self) -> int: + """ + Gets the maximum number of download threads for cloud fetch operations. + + Returns: + int: The maximum number of download threads + """ + pass diff --git a/src/databricks/sql/backend/sea/backend.py b/src/databricks/sql/backend/sea/backend.py new file mode 100644 index 000000000..04c79a18b --- /dev/null +++ b/src/databricks/sql/backend/sea/backend.py @@ -0,0 +1,828 @@ +from __future__ import annotations + +import logging +import time +import re +from typing import Any, Dict, Tuple, List, Optional, Union, TYPE_CHECKING, Set + +from databricks.sql.backend.sea.models.base import ( + ExternalLink, + ResultManifest, + StatementStatus, +) +from databricks.sql.backend.sea.models.responses import GetChunksResponse +from databricks.sql.backend.sea.utils.constants import ( + ALLOWED_SESSION_CONF_TO_DEFAULT_VALUES_MAP, + ResultFormat, + ResultDisposition, + ResultCompression, + WaitTimeout, + MetadataCommands, +) +from databricks.sql.backend.sea.utils.normalize import normalize_sea_type_to_thrift +from databricks.sql.thrift_api.TCLIService import ttypes + +if TYPE_CHECKING: + from databricks.sql.client import Cursor + +from databricks.sql.backend.sea.result_set import SeaResultSet + +from databricks.sql.backend.databricks_client import DatabricksClient +from databricks.sql.backend.types import ( + SessionId, + CommandId, + CommandState, + BackendType, + ExecuteResponse, +) +from databricks.sql.exc import DatabaseError, ServerOperationError +from databricks.sql.backend.sea.utils.http_client import SeaHttpClient +from databricks.sql.types import SSLOptions + +from databricks.sql.backend.sea.models import ( + ExecuteStatementRequest, + GetStatementRequest, + CancelStatementRequest, + CloseStatementRequest, + CreateSessionRequest, + DeleteSessionRequest, + StatementParameter, + ExecuteStatementResponse, + GetStatementResponse, + CreateSessionResponse, +) + +logger = logging.getLogger(__name__) + + +def _filter_session_configuration( + session_configuration: Optional[Dict[str, Any]], +) -> Dict[str, str]: + """ + Filter and normalise the provided session configuration parameters. + + The Statement Execution API supports only a subset of SQL session + configuration options. This helper validates the supplied + ``session_configuration`` dictionary against the allow-list defined in + ``ALLOWED_SESSION_CONF_TO_DEFAULT_VALUES_MAP`` and returns a new + dictionary that contains **only** the supported parameters. + + Args: + session_configuration: Optional mapping of session configuration + names to their desired values. Key comparison is + case-insensitive. + + Returns: + Dict[str, str]: A dictionary containing only the supported + configuration parameters with lower-case keys and string values. If + *session_configuration* is ``None`` or empty, an empty dictionary is + returned. + """ + + if not session_configuration: + return {} + + filtered_session_configuration = {} + ignored_configs: Set[str] = set() + + for key, value in session_configuration.items(): + if key.upper() in ALLOWED_SESSION_CONF_TO_DEFAULT_VALUES_MAP: + filtered_session_configuration[key.lower()] = str(value) + else: + ignored_configs.add(key) + + if ignored_configs: + logger.warning( + "Some session configurations were ignored because they are not supported: %s", + ignored_configs, + ) + logger.warning( + "Supported session configurations are: %s", + list(ALLOWED_SESSION_CONF_TO_DEFAULT_VALUES_MAP.keys()), + ) + + return filtered_session_configuration + + +class SeaDatabricksClient(DatabricksClient): + """ + Statement Execution API (SEA) implementation of the DatabricksClient interface. + """ + + # SEA API paths + BASE_PATH = "/api/2.0/sql/" + SESSION_PATH = BASE_PATH + "sessions" + SESSION_PATH_WITH_ID = SESSION_PATH + "/{}" + STATEMENT_PATH = BASE_PATH + "statements" + STATEMENT_PATH_WITH_ID = STATEMENT_PATH + "/{}" + CANCEL_STATEMENT_PATH_WITH_ID = STATEMENT_PATH + "/{}/cancel" + CHUNK_PATH_WITH_ID_AND_INDEX = STATEMENT_PATH + "/{}/result/chunks/{}" + + # SEA constants + POLL_INTERVAL_SECONDS = 0.2 + + def __init__( + self, + server_hostname: str, + port: int, + http_path: str, + http_headers: List[Tuple[str, str]], + auth_provider, + ssl_options: SSLOptions, + **kwargs, + ): + """ + Initialize the SEA backend client. + + Args: + server_hostname: Hostname of the Databricks server + port: Port number for the connection + http_path: HTTP path for the connection + http_headers: List of HTTP headers to include in requests + auth_provider: Authentication provider + ssl_options: SSL configuration options + **kwargs: Additional keyword arguments + """ + + logger.debug( + "SeaDatabricksClient.__init__(server_hostname=%s, port=%s, http_path=%s)", + server_hostname, + port, + http_path, + ) + + self._max_download_threads = kwargs.get("max_download_threads", 10) + self._ssl_options = ssl_options + self._use_arrow_native_complex_types = kwargs.get( + "_use_arrow_native_complex_types", True + ) + + self.use_hybrid_disposition = kwargs.get("use_hybrid_disposition", False) + self.use_cloud_fetch = kwargs.get("use_cloud_fetch", True) + + # Extract warehouse ID from http_path + self.warehouse_id = self._extract_warehouse_id(http_path) + + # Initialize HTTP client + self._http_client = SeaHttpClient( + server_hostname=server_hostname, + port=port, + http_path=http_path, + http_headers=http_headers, + auth_provider=auth_provider, + ssl_options=ssl_options, + **kwargs, + ) + + def _extract_warehouse_id(self, http_path: str) -> str: + """ + Extract the warehouse ID from the HTTP path. + + Args: + http_path: The HTTP path from which to extract the warehouse ID + + Returns: + The extracted warehouse ID + + Raises: + ValueError: If the warehouse ID cannot be extracted from the path + """ + + # [^?&]+ stops at query params (e.g. ?o= for SPOG routing) + warehouse_pattern = re.compile(r".*/warehouses/([^?&]+)") + endpoint_pattern = re.compile(r".*/endpoints/([^?&]+)") + + for pattern in [warehouse_pattern, endpoint_pattern]: + match = pattern.match(http_path) + if not match: + continue + warehouse_id = match.group(1) + logger.debug( + f"Extracted warehouse ID: {warehouse_id} from path: {http_path}" + ) + return warehouse_id + + # If no match found, raise error + error_message = ( + f"Could not extract warehouse ID from http_path: {http_path}. " + f"Expected format: /path/to/warehouses/{{warehouse_id}} or " + f"/path/to/endpoints/{{warehouse_id}}." + f"Note: SEA only works for warehouses." + ) + logger.error(error_message) + raise ValueError(error_message) + + @property + def max_download_threads(self) -> int: + """Get the maximum number of download threads for cloud fetch operations.""" + return self._max_download_threads + + def open_session( + self, + session_configuration: Optional[Dict[str, Any]], + catalog: Optional[str], + schema: Optional[str], + ) -> SessionId: + """ + Opens a new session with the Databricks SQL service using SEA. + + Args: + session_configuration: Optional dictionary of configuration parameters for the session. + Only specific parameters are supported as documented at: + https://docs.databricks.com/aws/en/sql/language-manual/sql-ref-parameters + catalog: Optional catalog name to use as the initial catalog for the session + schema: Optional schema name to use as the initial schema for the session + + Returns: + SessionId: A session identifier object that can be used for subsequent operations + + Raises: + Error: If the session configuration is invalid + OperationalError: If there's an error establishing the session + """ + + logger.debug( + "SeaDatabricksClient.open_session(session_configuration=%s, catalog=%s, schema=%s)", + session_configuration, + catalog, + schema, + ) + + session_configuration = _filter_session_configuration(session_configuration) + + request_data = CreateSessionRequest( + warehouse_id=self.warehouse_id, + session_confs=session_configuration, + catalog=catalog, + schema=schema, + ) + + response = self._http_client._make_request( + method="POST", path=self.SESSION_PATH, data=request_data.to_dict() + ) + + session_response = CreateSessionResponse.from_dict(response) + session_id = session_response.session_id + if not session_id: + raise ServerOperationError( + "Failed to create session: No session ID returned", + { + "operation-id": None, + "diagnostic-info": None, + }, + ) + + return SessionId.from_sea_session_id(session_id) + + def close_session(self, session_id: SessionId) -> None: + """ + Closes an existing session with the Databricks SQL service. + + Args: + session_id: The session identifier returned by open_session() + + Raises: + ValueError: If the session ID is invalid + OperationalError: If there's an error closing the session + """ + + logger.debug("SeaDatabricksClient.close_session(session_id=%s)", session_id) + + if session_id.backend_type != BackendType.SEA: + raise ValueError("Not a valid SEA session ID") + sea_session_id = session_id.to_sea_session_id() + + request_data = DeleteSessionRequest( + warehouse_id=self.warehouse_id, + session_id=sea_session_id, + ) + + self._http_client._make_request( + method="DELETE", + path=self.SESSION_PATH_WITH_ID.format(sea_session_id), + data=request_data.to_dict(), + ) + + def _extract_description_from_manifest( + self, manifest: ResultManifest + ) -> List[Tuple]: + """ + Extract column description from a manifest object, in the format defined by + the spec: https://peps.python.org/pep-0249/#description + + Args: + manifest: The ResultManifest object containing schema information + + Returns: + Optional[List]: A list of column tuples or None if no columns are found + """ + + schema_data = manifest.schema + columns_data = schema_data.get("columns", []) + + columns = [] + for col_data in columns_data: + # Format: (name, type_code, display_size, internal_size, precision, scale, null_ok) + name = col_data.get("name", "") + type_name = col_data.get("type_name", "") + + # Normalize SEA type to Thrift conventions before any processing + type_name = normalize_sea_type_to_thrift(type_name, col_data) + + # Now strip _TYPE suffix and convert to lowercase + type_name = ( + type_name[:-5] if type_name.endswith("_TYPE") else type_name + ).lower() + precision = col_data.get("type_precision") + scale = col_data.get("type_scale") + + columns.append( + ( + name, # name + type_name, # type_code + None, # display_size (not provided by SEA) + None, # internal_size (not provided by SEA) + precision, # precision + scale, # scale + None, # null_ok + ) + ) + + return columns + + def _results_message_to_execute_response( + self, response: Union[ExecuteStatementResponse, GetStatementResponse] + ) -> ExecuteResponse: + """ + Convert a SEA response to an ExecuteResponse and extract result data. + + Args: + sea_response: The response from the SEA API + command_id: The command ID + + Returns: + ExecuteResponse: The normalized execute response + """ + + # Extract description from manifest schema + description = self._extract_description_from_manifest(response.manifest) + + # Check for compression + lz4_compressed = ( + response.manifest.result_compression == ResultCompression.LZ4_FRAME.value + ) + + execute_response = ExecuteResponse( + command_id=CommandId.from_sea_statement_id(response.statement_id), + status=response.status.state, + description=description, + has_been_closed_server_side=False, + lz4_compressed=lz4_compressed, + is_staging_operation=response.manifest.is_volume_operation, + arrow_schema_bytes=None, + result_format=response.manifest.format, + ) + + return execute_response + + def _response_to_result_set( + self, + response: Union[ExecuteStatementResponse, GetStatementResponse], + cursor: Cursor, + ) -> SeaResultSet: + """ + Convert a SEA response to a SeaResultSet. + """ + + execute_response = self._results_message_to_execute_response(response) + + return SeaResultSet( + connection=cursor.connection, + execute_response=execute_response, + sea_client=self, + result_data=response.result, + manifest=response.manifest, + buffer_size_bytes=cursor.buffer_size_bytes, + arraysize=cursor.arraysize, + ) + + def _check_command_not_in_failed_or_closed_state( + self, status: StatementStatus, command_id: CommandId + ) -> None: + state = status.state + if state == CommandState.CLOSED: + raise DatabaseError( + "Command {} unexpectedly closed server side".format(command_id), + { + "operation-id": command_id, + }, + ) + if state == CommandState.FAILED: + error = status.error + error_code = error.error_code if error else "UNKNOWN_ERROR_CODE" + error_message = error.message if error else "UNKNOWN_ERROR_MESSAGE" + raise ServerOperationError( + "Command failed: {} - {}".format(error_code, error_message), + { + "operation-id": command_id, + }, + ) + + def _wait_until_command_done( + self, response: ExecuteStatementResponse + ) -> Union[ExecuteStatementResponse, GetStatementResponse]: + """ + Wait until a command is done. + """ + + final_response: Union[ExecuteStatementResponse, GetStatementResponse] = response + command_id = CommandId.from_sea_statement_id(final_response.statement_id) + + while final_response.status.state in [ + CommandState.PENDING, + CommandState.RUNNING, + ]: + time.sleep(self.POLL_INTERVAL_SECONDS) + final_response = self._poll_query(command_id) + + self._check_command_not_in_failed_or_closed_state( + final_response.status, command_id + ) + + return final_response + + def execute_command( + self, + operation: str, + session_id: SessionId, + max_rows: int, + max_bytes: int, + lz4_compression: bool, + cursor: Cursor, + use_cloud_fetch: bool, + parameters: List[ttypes.TSparkParameter], + async_op: bool, + enforce_embedded_schema_correctness: bool, + row_limit: Optional[int] = None, + query_tags: Optional[Dict[str, Optional[str]]] = None, + ) -> Union[SeaResultSet, None]: + """ + Execute a SQL command using the SEA backend. + + Args: + operation: SQL command to execute + session_id: Session identifier + max_rows: Maximum number of rows to fetch + max_bytes: Maximum number of bytes to fetch + lz4_compression: Whether to use LZ4 compression + cursor: Cursor executing the command + use_cloud_fetch: Whether to use cloud fetch + parameters: SQL parameters + async_op: Whether to execute asynchronously + enforce_embedded_schema_correctness: Whether to enforce schema correctness + + Returns: + ResultSet: A SeaResultSet instance for the executed command + """ + + if session_id.backend_type != BackendType.SEA: + raise ValueError("Not a valid SEA session ID") + + sea_session_id = session_id.to_sea_session_id() + + # Convert parameters to StatementParameter objects + sea_parameters = [] + if parameters: + for param in parameters: + sea_parameters.append( + StatementParameter( + name=param.name, + value=( + param.value.stringValue if param.value is not None else None + ), + type=param.type, + ) + ) + + format = ( + ResultFormat.ARROW_STREAM if use_cloud_fetch else ResultFormat.JSON_ARRAY + ).value + disposition = ( + ( + ResultDisposition.HYBRID + if self.use_hybrid_disposition + else ResultDisposition.EXTERNAL_LINKS + ) + if use_cloud_fetch + else ResultDisposition.INLINE + ).value + result_compression = ( + ResultCompression.LZ4_FRAME if lz4_compression else ResultCompression.NONE + ).value + + request = ExecuteStatementRequest( + warehouse_id=self.warehouse_id, + session_id=sea_session_id, + statement=operation, + disposition=disposition, + format=format, + wait_timeout=(WaitTimeout.ASYNC if async_op else WaitTimeout.SYNC).value, + on_wait_timeout="CONTINUE", + row_limit=row_limit, + parameters=sea_parameters if sea_parameters else None, + result_compression=result_compression, + query_tags=query_tags, + ) + + response_data = self._http_client._make_request( + method="POST", path=self.STATEMENT_PATH, data=request.to_dict() + ) + response = ExecuteStatementResponse.from_dict(response_data) + statement_id = response.statement_id + + command_id = CommandId.from_sea_statement_id(statement_id) + + # Store the command ID in the cursor + cursor.active_command_id = command_id + + # If async operation, return and let the client poll for results + if async_op: + return None + + final_response: Union[ExecuteStatementResponse, GetStatementResponse] = response + if response.status.state != CommandState.SUCCEEDED: + final_response = self._wait_until_command_done(response) + + return self._response_to_result_set(final_response, cursor) + + def cancel_command(self, command_id: CommandId) -> None: + """ + Cancel a running command. + + Args: + command_id: Command identifier to cancel + + Raises: + ValueError: If the command ID is invalid + """ + + if command_id.backend_type != BackendType.SEA: + raise ValueError("Not a valid SEA command ID") + + sea_statement_id = command_id.to_sea_statement_id() + + request = CancelStatementRequest(statement_id=sea_statement_id) + self._http_client._make_request( + method="POST", + path=self.CANCEL_STATEMENT_PATH_WITH_ID.format(sea_statement_id), + data=request.to_dict(), + ) + + def close_command(self, command_id: CommandId) -> None: + """ + Close a command and release resources. + + Args: + command_id: Command identifier to close + + Raises: + ValueError: If the command ID is invalid + """ + + if command_id.backend_type != BackendType.SEA: + raise ValueError("Not a valid SEA command ID") + + sea_statement_id = command_id.to_sea_statement_id() + + request = CloseStatementRequest(statement_id=sea_statement_id) + self._http_client._make_request( + method="DELETE", + path=self.STATEMENT_PATH_WITH_ID.format(sea_statement_id), + data=request.to_dict(), + ) + + def _poll_query(self, command_id: CommandId) -> GetStatementResponse: + """ + Poll for the current command info. + """ + + if command_id.backend_type != BackendType.SEA: + raise ValueError("Not a valid SEA command ID") + + sea_statement_id = command_id.to_sea_statement_id() + + request = GetStatementRequest(statement_id=sea_statement_id) + response_data = self._http_client._make_request( + method="GET", + path=self.STATEMENT_PATH_WITH_ID.format(sea_statement_id), + data=request.to_dict(), + ) + response = GetStatementResponse.from_dict(response_data) + + return response + + def get_query_state(self, command_id: CommandId) -> CommandState: + """ + Get the state of a running query. + + Args: + command_id: Command identifier + + Returns: + CommandState: The current state of the command + + Raises: + ValueError: If the command ID is invalid + """ + + response = self._poll_query(command_id) + return response.status.state + + def get_execution_result( + self, + command_id: CommandId, + cursor: Cursor, + ) -> SeaResultSet: + """ + Get the result of a command execution. + + Args: + command_id: Command identifier + cursor: Cursor executing the command + + Returns: + SeaResultSet: A SeaResultSet instance with the execution results + + Raises: + ValueError: If the command ID is invalid + """ + + response = self._poll_query(command_id) + return self._response_to_result_set(response, cursor) + + def get_chunk_links( + self, statement_id: str, chunk_index: int + ) -> List[ExternalLink]: + """ + Get links for chunks starting from the specified index. + Args: + statement_id: The statement ID + chunk_index: The starting chunk index + Returns: + ExternalLink: External link for the chunk + """ + + response_data = self._http_client._make_request( + method="GET", + path=self.CHUNK_PATH_WITH_ID_AND_INDEX.format(statement_id, chunk_index), + ) + response = GetChunksResponse.from_dict(response_data) + + links = response.external_links or [] + return links + + # == Metadata Operations == + + def get_catalogs( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + ) -> SeaResultSet: + """Get available catalogs by executing 'SHOW CATALOGS'.""" + result = self.execute_command( + operation=MetadataCommands.SHOW_CATALOGS.value, + session_id=session_id, + max_rows=max_rows, + max_bytes=max_bytes, + lz4_compression=False, + cursor=cursor, + use_cloud_fetch=self.use_cloud_fetch, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert result is not None, "execute_command returned None in synchronous mode" + return result + + def get_schemas( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + catalog_name: Optional[str] = None, + schema_name: Optional[str] = None, + ) -> SeaResultSet: + """Get schemas by executing 'SHOW SCHEMAS IN catalog [LIKE pattern]'.""" + if not catalog_name: + raise DatabaseError("Catalog name is required for get_schemas") + + operation = MetadataCommands.SHOW_SCHEMAS.value.format(catalog_name) + + if schema_name: + operation += MetadataCommands.LIKE_PATTERN.value.format(schema_name) + + result = self.execute_command( + operation=operation, + session_id=session_id, + max_rows=max_rows, + max_bytes=max_bytes, + lz4_compression=False, + cursor=cursor, + use_cloud_fetch=self.use_cloud_fetch, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert result is not None, "execute_command returned None in synchronous mode" + return result + + def get_tables( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + catalog_name: Optional[str] = None, + schema_name: Optional[str] = None, + table_name: Optional[str] = None, + table_types: Optional[List[str]] = None, + ) -> SeaResultSet: + """Get tables by executing 'SHOW TABLES IN catalog [SCHEMA LIKE pattern] [LIKE pattern]'.""" + operation = ( + MetadataCommands.SHOW_TABLES_ALL_CATALOGS.value + if catalog_name in [None, "*", "%"] + else MetadataCommands.SHOW_TABLES.value.format( + MetadataCommands.CATALOG_SPECIFIC.value.format(catalog_name) + ) + ) + + if schema_name: + operation += MetadataCommands.SCHEMA_LIKE_PATTERN.value.format(schema_name) + + if table_name: + operation += MetadataCommands.LIKE_PATTERN.value.format(table_name) + + result = self.execute_command( + operation=operation, + session_id=session_id, + max_rows=max_rows, + max_bytes=max_bytes, + lz4_compression=False, + cursor=cursor, + use_cloud_fetch=self.use_cloud_fetch, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert result is not None, "execute_command returned None in synchronous mode" + + # Apply client-side filtering by table_types + from databricks.sql.backend.sea.utils.filters import ResultSetFilter + + result = ResultSetFilter.filter_tables_by_type(result, table_types) + + return result + + def get_columns( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + catalog_name: Optional[str] = None, + schema_name: Optional[str] = None, + table_name: Optional[str] = None, + column_name: Optional[str] = None, + ) -> SeaResultSet: + """Get columns by executing 'SHOW COLUMNS IN CATALOG catalog [SCHEMA LIKE pattern] [TABLE LIKE pattern] [LIKE pattern]'.""" + if not catalog_name: + raise DatabaseError("Catalog name is required for get_columns") + + operation = MetadataCommands.SHOW_COLUMNS.value.format(catalog_name) + + if schema_name: + operation += MetadataCommands.SCHEMA_LIKE_PATTERN.value.format(schema_name) + + if table_name: + operation += MetadataCommands.TABLE_LIKE_PATTERN.value.format(table_name) + + if column_name: + operation += MetadataCommands.LIKE_PATTERN.value.format(column_name) + + result = self.execute_command( + operation=operation, + session_id=session_id, + max_rows=max_rows, + max_bytes=max_bytes, + lz4_compression=False, + cursor=cursor, + use_cloud_fetch=self.use_cloud_fetch, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert result is not None, "execute_command returned None in synchronous mode" + return result diff --git a/src/databricks/sql/backend/sea/models/__init__.py b/src/databricks/sql/backend/sea/models/__init__.py new file mode 100644 index 000000000..8450ec85d --- /dev/null +++ b/src/databricks/sql/backend/sea/models/__init__.py @@ -0,0 +1,52 @@ +""" +Models for the SEA (Statement Execution API) backend. + +This package contains data models for SEA API requests and responses. +""" + +from databricks.sql.backend.sea.models.base import ( + ServiceError, + StatementStatus, + ExternalLink, + ResultData, + ResultManifest, +) + +from databricks.sql.backend.sea.models.requests import ( + StatementParameter, + ExecuteStatementRequest, + GetStatementRequest, + CancelStatementRequest, + CloseStatementRequest, + CreateSessionRequest, + DeleteSessionRequest, +) + +from databricks.sql.backend.sea.models.responses import ( + ExecuteStatementResponse, + GetStatementResponse, + CreateSessionResponse, + GetChunksResponse, +) + +__all__ = [ + # Base models + "ServiceError", + "StatementStatus", + "ExternalLink", + "ResultData", + "ResultManifest", + # Request models + "StatementParameter", + "ExecuteStatementRequest", + "GetStatementRequest", + "CancelStatementRequest", + "CloseStatementRequest", + "CreateSessionRequest", + "DeleteSessionRequest", + # Response models + "ExecuteStatementResponse", + "GetStatementResponse", + "CreateSessionResponse", + "GetChunksResponse", +] diff --git a/src/databricks/sql/backend/sea/models/base.py b/src/databricks/sql/backend/sea/models/base.py new file mode 100644 index 000000000..3eacc8887 --- /dev/null +++ b/src/databricks/sql/backend/sea/models/base.py @@ -0,0 +1,82 @@ +""" +Base models for the SEA (Statement Execution API) backend. + +These models define the common structures used in SEA API requests and responses. +""" + +from typing import Dict, List, Any, Optional, Union +from dataclasses import dataclass, field + +from databricks.sql.backend.types import CommandState + + +@dataclass +class ServiceError: + """Error information returned by the SEA API.""" + + message: str + error_code: Optional[str] = None + + +@dataclass +class StatementStatus: + """Status information for a statement execution.""" + + state: CommandState + error: Optional[ServiceError] = None + sql_state: Optional[str] = None + + +@dataclass +class ExternalLink: + """External link information for result data.""" + + external_link: str + expiration: str + chunk_index: int + byte_count: int = 0 + row_count: int = 0 + row_offset: int = 0 + next_chunk_index: Optional[int] = None + next_chunk_internal_link: Optional[str] = None + http_headers: Optional[Dict[str, str]] = None + + +@dataclass +class ChunkInfo: + """Information about a chunk in the result set.""" + + chunk_index: int + byte_count: int + row_offset: int + row_count: int + + +@dataclass +class ResultData: + """Result data from a statement execution.""" + + data: Optional[List[List[Any]]] = None + external_links: Optional[List[ExternalLink]] = None + byte_count: Optional[int] = None + chunk_index: Optional[int] = None + next_chunk_index: Optional[int] = None + next_chunk_internal_link: Optional[str] = None + row_count: Optional[int] = None + row_offset: Optional[int] = None + attachment: Optional[bytes] = None + + +@dataclass +class ResultManifest: + """Manifest information for a result set.""" + + format: str + schema: Dict[str, Any] + total_row_count: int + total_byte_count: int + total_chunk_count: int + truncated: bool = False + chunks: Optional[List[ChunkInfo]] = None + result_compression: Optional[str] = None + is_volume_operation: bool = False diff --git a/src/databricks/sql/backend/sea/models/requests.py b/src/databricks/sql/backend/sea/models/requests.py new file mode 100644 index 000000000..eb156fb1a --- /dev/null +++ b/src/databricks/sql/backend/sea/models/requests.py @@ -0,0 +1,141 @@ +""" +Request models for the SEA (Statement Execution API) backend. + +These models define the structures used in SEA API requests. +""" + +from typing import Dict, List, Any, Optional, Union +from dataclasses import dataclass, field + + +@dataclass +class StatementParameter: + """Representation of a parameter for a SQL statement.""" + + name: str + value: Optional[str] = None + type: Optional[str] = None + + +@dataclass +class ExecuteStatementRequest: + """Representation of a request to execute a SQL statement.""" + + session_id: str + statement: str + warehouse_id: str + disposition: str = "EXTERNAL_LINKS" + format: str = "JSON_ARRAY" + result_compression: Optional[str] = None + parameters: Optional[List[StatementParameter]] = None + wait_timeout: str = "10s" + on_wait_timeout: str = "CONTINUE" + row_limit: Optional[int] = None + query_tags: Optional[Dict[str, Optional[str]]] = None + + def to_dict(self) -> Dict[str, Any]: + """Convert the request to a dictionary for JSON serialization.""" + result: Dict[str, Any] = { + "warehouse_id": self.warehouse_id, + "session_id": self.session_id, + "statement": self.statement, + "disposition": self.disposition, + "format": self.format, + "wait_timeout": self.wait_timeout, + "on_wait_timeout": self.on_wait_timeout, + } + + if self.row_limit is not None and self.row_limit > 0: + result["row_limit"] = self.row_limit + + if self.result_compression: + result["result_compression"] = self.result_compression + + if self.parameters: + result["parameters"] = [ + { + "name": param.name, + "value": param.value, + "type": param.type, + } + for param in self.parameters + ] + + # SEA API expects query_tags as an array of {key, value} objects. + # None/empty values are left to the server to handle as key-only tags. + if self.query_tags: + result["query_tags"] = [ + {"key": k, "value": v} for k, v in self.query_tags.items() + ] + + return result + + +@dataclass +class GetStatementRequest: + """Representation of a request to get information about a statement.""" + + statement_id: str + + def to_dict(self) -> Dict[str, Any]: + """Convert the request to a dictionary for JSON serialization.""" + return {"statement_id": self.statement_id} + + +@dataclass +class CancelStatementRequest: + """Representation of a request to cancel a statement.""" + + statement_id: str + + def to_dict(self) -> Dict[str, Any]: + """Convert the request to a dictionary for JSON serialization.""" + return {"statement_id": self.statement_id} + + +@dataclass +class CloseStatementRequest: + """Representation of a request to close a statement.""" + + statement_id: str + + def to_dict(self) -> Dict[str, Any]: + """Convert the request to a dictionary for JSON serialization.""" + return {"statement_id": self.statement_id} + + +@dataclass +class CreateSessionRequest: + """Representation of a request to create a new session.""" + + warehouse_id: str + session_confs: Optional[Dict[str, str]] = None + catalog: Optional[str] = None + schema: Optional[str] = None + + def to_dict(self) -> Dict[str, Any]: + """Convert the request to a dictionary for JSON serialization.""" + result: Dict[str, Any] = {"warehouse_id": self.warehouse_id} + + if self.session_confs: + result["session_confs"] = self.session_confs + + if self.catalog: + result["catalog"] = self.catalog + + if self.schema: + result["schema"] = self.schema + + return result + + +@dataclass +class DeleteSessionRequest: + """Representation of a request to delete a session.""" + + warehouse_id: str + session_id: str + + def to_dict(self) -> Dict[str, str]: + """Convert the request to a dictionary for JSON serialization.""" + return {"warehouse_id": self.warehouse_id, "session_id": self.session_id} diff --git a/src/databricks/sql/backend/sea/models/responses.py b/src/databricks/sql/backend/sea/models/responses.py new file mode 100644 index 000000000..5a5580481 --- /dev/null +++ b/src/databricks/sql/backend/sea/models/responses.py @@ -0,0 +1,196 @@ +""" +Response models for the SEA (Statement Execution API) backend. + +These models define the structures used in SEA API responses. +""" + +import base64 +from typing import Dict, Any, List, Optional +from dataclasses import dataclass + +from databricks.sql.backend.types import CommandState +from databricks.sql.backend.sea.models.base import ( + StatementStatus, + ResultManifest, + ResultData, + ServiceError, + ExternalLink, + ChunkInfo, +) + + +def _parse_status(data: Dict[str, Any]) -> StatementStatus: + """Parse status from response data.""" + status_data = data.get("status", {}) + error = None + if "error" in status_data: + error_data = status_data["error"] + error = ServiceError( + message=error_data.get("message", ""), + error_code=error_data.get("error_code"), + ) + + state = CommandState.from_sea_state(status_data.get("state", "")) + if state is None: + raise ValueError(f"Invalid state: {status_data.get('state', '')}") + + return StatementStatus( + state=state, + error=error, + sql_state=status_data.get("sql_state"), + ) + + +def _parse_manifest(data: Dict[str, Any]) -> ResultManifest: + """Parse manifest from response data.""" + + manifest_data = data.get("manifest", {}) + chunks = None + if "chunks" in manifest_data: + chunks = [ + ChunkInfo( + chunk_index=chunk.get("chunk_index", 0), + byte_count=chunk.get("byte_count", 0), + row_offset=chunk.get("row_offset", 0), + row_count=chunk.get("row_count", 0), + ) + for chunk in manifest_data.get("chunks", []) + ] + + return ResultManifest( + format=manifest_data.get("format", ""), + schema=manifest_data.get("schema", {}), + total_row_count=manifest_data.get("total_row_count", 0), + total_byte_count=manifest_data.get("total_byte_count", 0), + total_chunk_count=manifest_data.get("total_chunk_count", 0), + truncated=manifest_data.get("truncated", False), + chunks=chunks, + result_compression=manifest_data.get("result_compression"), + is_volume_operation=manifest_data.get("is_volume_operation", False), + ) + + +def _parse_result(data: Dict[str, Any]) -> ResultData: + """Parse result data from response data.""" + result_data = data.get("result", {}) + external_links = None + + if "external_links" in result_data: + external_links = [] + for link_data in result_data["external_links"]: + external_links.append( + ExternalLink( + external_link=link_data.get("external_link", ""), + expiration=link_data.get("expiration", ""), + chunk_index=link_data.get("chunk_index", 0), + byte_count=link_data.get("byte_count", 0), + row_count=link_data.get("row_count", 0), + row_offset=link_data.get("row_offset", 0), + next_chunk_index=link_data.get("next_chunk_index"), + next_chunk_internal_link=link_data.get("next_chunk_internal_link"), + http_headers=link_data.get("http_headers"), + ) + ) + + # Handle attachment field - decode from base64 if present + attachment = result_data.get("attachment") + if attachment is not None: + attachment = base64.b64decode(attachment) + + return ResultData( + data=result_data.get("data_array"), + external_links=external_links, + byte_count=result_data.get("byte_count"), + chunk_index=result_data.get("chunk_index"), + next_chunk_index=result_data.get("next_chunk_index"), + next_chunk_internal_link=result_data.get("next_chunk_internal_link"), + row_count=result_data.get("row_count"), + row_offset=result_data.get("row_offset"), + attachment=attachment, + ) + + +@dataclass +class ExecuteStatementResponse: + """Representation of the response from executing a SQL statement.""" + + statement_id: str + status: StatementStatus + manifest: ResultManifest + result: ResultData + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "ExecuteStatementResponse": + """Create an ExecuteStatementResponse from a dictionary.""" + return cls( + statement_id=data.get("statement_id", ""), + status=_parse_status(data), + manifest=_parse_manifest(data), + result=_parse_result(data), + ) + + +@dataclass +class GetStatementResponse: + """Representation of the response from getting information about a statement.""" + + statement_id: str + status: StatementStatus + manifest: ResultManifest + result: ResultData + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "GetStatementResponse": + """Create a GetStatementResponse from a dictionary.""" + return cls( + statement_id=data.get("statement_id", ""), + status=_parse_status(data), + manifest=_parse_manifest(data), + result=_parse_result(data), + ) + + +@dataclass +class CreateSessionResponse: + """Representation of the response from creating a new session.""" + + session_id: str + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "CreateSessionResponse": + """Create a CreateSessionResponse from a dictionary.""" + return cls(session_id=data.get("session_id", "")) + + +@dataclass +class GetChunksResponse: + """ + Response from getting chunks for a statement. + + The response model can be found in the docs, here: + https://docs.databricks.com/api/workspace/statementexecution/getstatementresultchunkn + """ + + data: Optional[List[List[Any]]] = None + external_links: Optional[List[ExternalLink]] = None + byte_count: Optional[int] = None + chunk_index: Optional[int] = None + next_chunk_index: Optional[int] = None + next_chunk_internal_link: Optional[str] = None + row_count: Optional[int] = None + row_offset: Optional[int] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "GetChunksResponse": + """Create a GetChunksResponse from a dictionary.""" + result = _parse_result({"result": data}) + return cls( + data=result.data, + external_links=result.external_links, + byte_count=result.byte_count, + chunk_index=result.chunk_index, + next_chunk_index=result.next_chunk_index, + next_chunk_internal_link=result.next_chunk_internal_link, + row_count=result.row_count, + row_offset=result.row_offset, + ) diff --git a/src/databricks/sql/backend/sea/queue.py b/src/databricks/sql/backend/sea/queue.py new file mode 100644 index 000000000..4a319c442 --- /dev/null +++ b/src/databricks/sql/backend/sea/queue.py @@ -0,0 +1,391 @@ +from __future__ import annotations + +from abc import ABC +import threading +from typing import Dict, List, Optional, Tuple, Union, TYPE_CHECKING + +from databricks.sql.cloudfetch.download_manager import ResultFileDownloadManager +from databricks.sql.telemetry.models.enums import StatementType + +from databricks.sql.cloudfetch.downloader import ResultSetDownloadHandler + +try: + import pyarrow +except ImportError: + pyarrow = None + +import dateutil + +if TYPE_CHECKING: + from databricks.sql.backend.sea.backend import SeaDatabricksClient + from databricks.sql.backend.sea.models.base import ( + ExternalLink, + ResultData, + ResultManifest, + ) +from databricks.sql.backend.sea.utils.constants import ResultFormat +from databricks.sql.exc import ProgrammingError, ServerOperationError +from databricks.sql.thrift_api.TCLIService.ttypes import TSparkArrowResultLink +from databricks.sql.types import SSLOptions +from databricks.sql.utils import ( + ArrowQueue, + CloudFetchQueue, + ResultSetQueue, + create_arrow_table_from_arrow_file, +) + +import logging + +logger = logging.getLogger(__name__) + + +class SeaResultSetQueueFactory(ABC): + @staticmethod + def build_queue( + result_data: ResultData, + manifest: ResultManifest, + statement_id: str, + ssl_options: SSLOptions, + description: List[Tuple], + max_download_threads: int, + sea_client: SeaDatabricksClient, + lz4_compressed: bool, + http_client, + ) -> ResultSetQueue: + """ + Factory method to build a result set queue for SEA backend. + + Args: + result_data (ResultData): Result data from SEA response + manifest (ResultManifest): Manifest from SEA response + statement_id (str): Statement ID for the query + description (List[List[Any]]): Column descriptions + max_download_threads (int): Maximum number of download threads + sea_client (SeaDatabricksClient): SEA client for fetching additional links + lz4_compressed (bool): Whether the data is LZ4 compressed + + Returns: + ResultSetQueue: The appropriate queue for the result data + """ + + if manifest.format == ResultFormat.JSON_ARRAY.value: + # INLINE disposition with JSON_ARRAY format + return JsonQueue(result_data.data) + elif manifest.format == ResultFormat.ARROW_STREAM.value: + if result_data.attachment is not None: + # direct results from Hybrid disposition + arrow_file = ( + ResultSetDownloadHandler._decompress_data(result_data.attachment) + if lz4_compressed + else result_data.attachment + ) + arrow_table = create_arrow_table_from_arrow_file( + arrow_file, description + ) + logger.debug(f"Created arrow table with {arrow_table.num_rows} rows") + return ArrowQueue(arrow_table, manifest.total_row_count) + + # EXTERNAL_LINKS disposition + return SeaCloudFetchQueue( + result_data=result_data, + max_download_threads=max_download_threads, + ssl_options=ssl_options, + sea_client=sea_client, + statement_id=statement_id, + total_chunk_count=manifest.total_chunk_count, + lz4_compressed=lz4_compressed, + description=description, + http_client=http_client, + ) + raise ProgrammingError("Invalid result format") + + +class JsonQueue(ResultSetQueue): + """Queue implementation for JSON_ARRAY format data.""" + + def __init__(self, data_array: Optional[List[List[str]]]): + """Initialize with JSON array data.""" + self.data_array = data_array or [] + self.cur_row_index = 0 + self.num_rows = len(self.data_array) + + def next_n_rows(self, num_rows: int) -> List[List[str]]: + """Get the next n rows from the data array.""" + length = min(num_rows, self.num_rows - self.cur_row_index) + slice = self.data_array[self.cur_row_index : self.cur_row_index + length] + self.cur_row_index += length + return slice + + def remaining_rows(self) -> List[List[str]]: + """Get all remaining rows from the data array.""" + slice = self.data_array[self.cur_row_index :] + self.cur_row_index += len(slice) + return slice + + def close(self): + return + + +class LinkFetcher: + """ + Background helper that incrementally retrieves *external links* for a + result set produced by the SEA backend and feeds them to a + :class:`databricks.sql.cloudfetch.download_manager.ResultFileDownloadManager`. + + The SEA backend splits large result sets into *chunks*. Each chunk is + stored remotely (e.g., in object storage) and exposed via a signed URL + encapsulated by an :class:`ExternalLink`. Only the first batch of links is + returned with the initial query response. The remaining links must be + pulled on demand using the *next-chunk* token embedded in each + :pyattr:`ExternalLink.next_chunk_index`. + + LinkFetcher takes care of this choreography so callers (primarily + ``SeaCloudFetchQueue``) can simply ask for the link of a specific + ``chunk_index`` and block until it becomes available. + + Key responsibilities: + + • Maintain an in-memory mapping from ``chunk_index`` → ``ExternalLink``. + • Launch a background worker thread that continuously requests the next + batch of links from the backend until all chunks have been discovered or + an unrecoverable error occurs. + • Bridge SEA link objects to the Thrift representation expected by the + existing download manager. + • Provide a synchronous API (`get_chunk_link`) that blocks until the desired + link is present in the cache. + """ + + def __init__( + self, + download_manager: ResultFileDownloadManager, + backend: SeaDatabricksClient, + statement_id: str, + initial_links: List[ExternalLink], + total_chunk_count: int, + ): + self.download_manager = download_manager + self.backend = backend + self._statement_id = statement_id + + self._shutdown_event = threading.Event() + + self._link_data_update = threading.Condition() + self._error: Optional[Exception] = None + self.chunk_index_to_link: Dict[int, ExternalLink] = {} + + self._add_links(initial_links) + self.total_chunk_count = total_chunk_count + + # DEBUG: capture initial state for observability + logger.debug( + "LinkFetcher[%s]: initialized with %d initial link(s); expecting %d total chunk(s)", + statement_id, + len(initial_links), + total_chunk_count, + ) + + def _add_links(self, links: List[ExternalLink]): + """Cache *links* locally and enqueue them with the download manager.""" + logger.debug( + "LinkFetcher[%s]: caching %d link(s) – chunks %s", + self._statement_id, + len(links), + ", ".join(str(l.chunk_index) for l in links) if links else "", + ) + for link in links: + self.chunk_index_to_link[link.chunk_index] = link + self.download_manager.add_link(LinkFetcher._convert_to_thrift_link(link)) + + def _get_next_chunk_index(self) -> Optional[int]: + """Return the next *chunk_index* that should be requested from the backend, or ``None`` if we have them all.""" + with self._link_data_update: + max_chunk_index = max(self.chunk_index_to_link.keys(), default=None) + if max_chunk_index is None: + return 0 + max_link = self.chunk_index_to_link[max_chunk_index] + return max_link.next_chunk_index + + def _trigger_next_batch_download(self) -> bool: + """Fetch the next batch of links from the backend and return *True* on success.""" + logger.debug( + "LinkFetcher[%s]: requesting next batch of links", self._statement_id + ) + next_chunk_index = self._get_next_chunk_index() + if next_chunk_index is None: + return False + + try: + links = self.backend.get_chunk_links(self._statement_id, next_chunk_index) + with self._link_data_update: + self._add_links(links) + self._link_data_update.notify_all() + except Exception as e: + logger.error( + f"LinkFetcher: Error fetching links for chunk {next_chunk_index}: {e}" + ) + with self._link_data_update: + self._error = e + self._link_data_update.notify_all() + return False + + logger.debug( + "LinkFetcher[%s]: received %d new link(s)", + self._statement_id, + len(links), + ) + return True + + def get_chunk_link(self, chunk_index: int) -> Optional[ExternalLink]: + """Return (blocking) the :class:`ExternalLink` associated with *chunk_index*.""" + logger.debug( + "LinkFetcher[%s]: waiting for link of chunk %d", + self._statement_id, + chunk_index, + ) + if chunk_index >= self.total_chunk_count: + return None + + with self._link_data_update: + while chunk_index not in self.chunk_index_to_link: + if self._error: + raise self._error + if self._shutdown_event.is_set(): + raise ProgrammingError( + "LinkFetcher is shutting down without providing link for chunk index {}".format( + chunk_index + ) + ) + self._link_data_update.wait() + + return self.chunk_index_to_link[chunk_index] + + @staticmethod + def _convert_to_thrift_link(link: ExternalLink) -> TSparkArrowResultLink: + """Convert SEA external links to Thrift format for compatibility with existing download manager.""" + # Parse the ISO format expiration time + expiry_time = int(dateutil.parser.parse(link.expiration).timestamp()) + return TSparkArrowResultLink( + fileLink=link.external_link, + expiryTime=expiry_time, + rowCount=link.row_count, + bytesNum=link.byte_count, + startRowOffset=link.row_offset, + httpHeaders=link.http_headers or {}, + ) + + def _worker_loop(self): + """Entry point for the background thread.""" + logger.debug("LinkFetcher[%s]: worker thread started", self._statement_id) + while not self._shutdown_event.is_set(): + links_downloaded = self._trigger_next_batch_download() + if not links_downloaded: + self._shutdown_event.set() + logger.debug("LinkFetcher[%s]: worker thread exiting", self._statement_id) + with self._link_data_update: + self._link_data_update.notify_all() + + def start(self): + """Spawn the worker thread.""" + logger.debug("LinkFetcher[%s]: starting worker thread", self._statement_id) + self._worker_thread = threading.Thread( + target=self._worker_loop, name=f"LinkFetcher-{self._statement_id}" + ) + self._worker_thread.start() + + def stop(self): + """Signal the worker thread to stop and wait for its termination.""" + logger.debug("LinkFetcher[%s]: stopping worker thread", self._statement_id) + self._shutdown_event.set() + self._worker_thread.join() + logger.debug("LinkFetcher[%s]: worker thread stopped", self._statement_id) + + +class SeaCloudFetchQueue(CloudFetchQueue): + """Queue implementation for EXTERNAL_LINKS disposition with ARROW format for SEA backend.""" + + def __init__( + self, + result_data: ResultData, + max_download_threads: int, + ssl_options: SSLOptions, + sea_client: SeaDatabricksClient, + statement_id: str, + total_chunk_count: int, + http_client, + lz4_compressed: bool = False, + description: List[Tuple] = [], + ): + """ + Initialize the SEA CloudFetchQueue. + + Args: + initial_links: Initial list of external links to download + schema_bytes: Arrow schema bytes + max_download_threads: Maximum number of download threads + ssl_options: SSL options for downloads + sea_client: SEA client for fetching additional links + statement_id: Statement ID for the query + total_chunk_count: Total number of chunks in the result set + lz4_compressed: Whether the data is LZ4 compressed + description: Column descriptions + """ + + super().__init__( + max_download_threads=max_download_threads, + ssl_options=ssl_options, + statement_id=statement_id, + schema_bytes=None, + lz4_compressed=lz4_compressed, + description=description, + # TODO: fix these arguments when telemetry is implemented in SEA + session_id_hex=None, + chunk_id=0, + http_client=http_client, + ) + + logger.debug( + "SeaCloudFetchQueue: Initialize CloudFetch loader for statement {}, total chunks: {}".format( + statement_id, total_chunk_count + ) + ) + + initial_links = result_data.external_links or [] + + # Track the current chunk we're processing + self._current_chunk_index = 0 + + self.link_fetcher = None # for empty responses, we do not need a link fetcher + if total_chunk_count > 0: + self.link_fetcher = LinkFetcher( + download_manager=self.download_manager, + backend=sea_client, + statement_id=statement_id, + initial_links=initial_links, + total_chunk_count=total_chunk_count, + ) + self.link_fetcher.start() + + # Initialize table and position + self.table = self._create_next_table() + + def _create_next_table(self) -> Union["pyarrow.Table", None]: + """Create next table by retrieving the logical next downloaded file.""" + if self.link_fetcher is None: + return None + + chunk_link = self.link_fetcher.get_chunk_link(self._current_chunk_index) + if chunk_link is None: + return None + + row_offset = chunk_link.row_offset + # NOTE: link has already been submitted to download manager at this point + arrow_table = self._create_table_at_offset(row_offset) + + self._current_chunk_index += 1 + + return arrow_table + + def close(self): + super().close() + if self.link_fetcher: + self.link_fetcher.stop() diff --git a/src/databricks/sql/backend/sea/result_set.py b/src/databricks/sql/backend/sea/result_set.py new file mode 100644 index 000000000..17838ed81 --- /dev/null +++ b/src/databricks/sql/backend/sea/result_set.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +from typing import Any, List, Optional, TYPE_CHECKING + +import logging + +from databricks.sql.backend.sea.models.base import ResultData, ResultManifest +from databricks.sql.backend.sea.utils.conversion import SqlTypeConverter + +try: + import pyarrow +except ImportError: + pyarrow = None + +if TYPE_CHECKING: + from databricks.sql.client import Connection + from databricks.sql.backend.sea.backend import SeaDatabricksClient +from databricks.sql.types import Row +from databricks.sql.backend.sea.queue import JsonQueue, SeaResultSetQueueFactory +from databricks.sql.backend.types import ExecuteResponse +from databricks.sql.result_set import ResultSet + +logger = logging.getLogger(__name__) + + +class SeaResultSet(ResultSet): + """ResultSet implementation for SEA backend.""" + + def __init__( + self, + connection: Connection, + execute_response: ExecuteResponse, + sea_client: SeaDatabricksClient, + result_data: ResultData, + manifest: ResultManifest, + buffer_size_bytes: int = 104857600, + arraysize: int = 10000, + ): + """ + Initialize a SeaResultSet with the response from a SEA query execution. + + Args: + connection: The parent connection + execute_response: Response from the execute command + sea_client: The SeaDatabricksClient instance for direct access + buffer_size_bytes: Buffer size for fetching results + arraysize: Default number of rows to fetch + result_data: Result data from SEA response + manifest: Manifest from SEA response + """ + + self.manifest = manifest + + statement_id = execute_response.command_id.to_sea_statement_id() + if statement_id is None: + raise ValueError("Command ID is not a SEA statement ID") + + results_queue = SeaResultSetQueueFactory.build_queue( + result_data, + self.manifest, + statement_id, + ssl_options=connection.session.ssl_options, + description=execute_response.description, + max_download_threads=sea_client.max_download_threads, + sea_client=sea_client, + lz4_compressed=execute_response.lz4_compressed, + http_client=connection.session.http_client, + ) + + # Call parent constructor with common attributes + super().__init__( + connection=connection, + backend=sea_client, + arraysize=arraysize, + buffer_size_bytes=buffer_size_bytes, + command_id=execute_response.command_id, + status=execute_response.status, + has_been_closed_server_side=execute_response.has_been_closed_server_side, + results_queue=results_queue, + description=execute_response.description, + is_staging_operation=execute_response.is_staging_operation, + lz4_compressed=execute_response.lz4_compressed, + arrow_schema_bytes=execute_response.arrow_schema_bytes, + ) + + def _convert_json_types(self, row: List[str]) -> List[Any]: + """ + Convert string values in the row to appropriate Python types based on column metadata. + """ + + # JSON + INLINE gives us string values, so we convert them to appropriate + # types based on column metadata + converted_row = [] + + for i, value in enumerate(row): + column_name = self.description[i][0] + column_type = self.description[i][1] + precision = self.description[i][4] + scale = self.description[i][5] + + converted_value = SqlTypeConverter.convert_value( + value, + column_type, + column_name=column_name, + precision=precision, + scale=scale, + ) + converted_row.append(converted_value) + + return converted_row + + def _convert_json_to_arrow_table(self, rows: List[List[str]]) -> "pyarrow.Table": + """ + Convert raw data rows to Arrow table. + + Args: + rows: List of raw data rows + + Returns: + PyArrow Table containing the converted values + """ + + if not rows: + return pyarrow.Table.from_pydict({}) + + # create a generator for row conversion + converted_rows_iter = (self._convert_json_types(row) for row in rows) + cols = list(map(list, zip(*converted_rows_iter))) + + names = [col[0] for col in self.description] + return pyarrow.Table.from_arrays(cols, names=names) + + def _create_json_table(self, rows: List[List[str]]) -> List[Row]: + """ + Convert raw data rows to Row objects with named columns based on description. + + Args: + rows: List of raw data rows + Returns: + List of Row objects with named columns and converted values + """ + + ResultRow = Row(*[col[0] for col in self.description]) + return [ResultRow(*self._convert_json_types(row)) for row in rows] + + def fetchmany_json(self, size: int) -> List[List[str]]: + """ + Fetch the next set of rows as a columnar table. + + Args: + size: Number of rows to fetch + + Returns: + Columnar table containing the fetched rows + + Raises: + ValueError: If size is negative + """ + + if size < 0: + raise ValueError(f"size argument for fetchmany is {size} but must be >= 0") + + results = self.results.next_n_rows(size) + self._next_row_index += len(results) + + return results + + def fetchall_json(self) -> List[List[str]]: + """ + Fetch all remaining rows as a columnar table. + + Returns: + Columnar table containing all remaining rows + """ + + results = self.results.remaining_rows() + self._next_row_index += len(results) + + return results + + def fetchmany_arrow(self, size: int) -> "pyarrow.Table": + """ + Fetch the next set of rows as an Arrow table. + + Args: + size: Number of rows to fetch + + Returns: + PyArrow Table containing the fetched rows + + Raises: + ImportError: If PyArrow is not installed + ValueError: If size is negative + """ + + if size < 0: + raise ValueError(f"size argument for fetchmany is {size} but must be >= 0") + + results = self.results.next_n_rows(size) + if isinstance(self.results, JsonQueue): + results = self._convert_json_to_arrow_table(results) + + self._next_row_index += results.num_rows + + return results + + def fetchall_arrow(self) -> "pyarrow.Table": + """ + Fetch all remaining rows as an Arrow table. + """ + + results = self.results.remaining_rows() + if isinstance(self.results, JsonQueue): + results = self._convert_json_to_arrow_table(results) + + self._next_row_index += results.num_rows + + return results + + def fetchone(self) -> Optional[Row]: + """ + Fetch the next row of a query result set, returning a single sequence, + or None when no more data is available. + + Returns: + A single Row object or None if no more rows are available + """ + + if isinstance(self.results, JsonQueue): + res = self._create_json_table(self.fetchmany_json(1)) + else: + res = self._convert_arrow_table(self.fetchmany_arrow(1)) + + return res[0] if res else None + + def fetchmany(self, size: int) -> List[Row]: + """ + Fetch the next set of rows of a query result, returning a list of rows. + + Args: + size: Number of rows to fetch (defaults to arraysize if None) + + Returns: + List of Row objects + + Raises: + ValueError: If size is negative + """ + + if isinstance(self.results, JsonQueue): + return self._create_json_table(self.fetchmany_json(size)) + else: + return self._convert_arrow_table(self.fetchmany_arrow(size)) + + def fetchall(self) -> List[Row]: + """ + Fetch all remaining rows of a query result, returning them as a list of rows. + + Returns: + List of Row objects containing all remaining rows + """ + + if isinstance(self.results, JsonQueue): + return self._create_json_table(self.fetchall_json()) + else: + return self._convert_arrow_table(self.fetchall_arrow()) diff --git a/src/databricks/sql/backend/sea/utils/constants.py b/src/databricks/sql/backend/sea/utils/constants.py new file mode 100644 index 000000000..61ecf969e --- /dev/null +++ b/src/databricks/sql/backend/sea/utils/constants.py @@ -0,0 +1,68 @@ +""" +Constants for the Statement Execution API (SEA) backend. +""" + +from typing import Dict +from enum import Enum + +# from https://docs.databricks.com/aws/en/sql/language-manual/sql-ref-parameters +ALLOWED_SESSION_CONF_TO_DEFAULT_VALUES_MAP: Dict[str, str] = { + "ANSI_MODE": "true", + "ENABLE_PHOTON": "true", + "LEGACY_TIME_PARSER_POLICY": "Exception", + "MAX_FILE_PARTITION_BYTES": "128m", + "READ_ONLY_EXTERNAL_METASTORE": "false", + "STATEMENT_TIMEOUT": "0", + "TIMEZONE": "UTC", + "USE_CACHED_RESULT": "true", + "QUERY_TAGS": "", +} + + +class ResultFormat(Enum): + """Enum for result format values.""" + + ARROW_STREAM = "ARROW_STREAM" + JSON_ARRAY = "JSON_ARRAY" + + +class ResultDisposition(Enum): + """Enum for result disposition values.""" + + HYBRID = "INLINE_OR_EXTERNAL_LINKS" + EXTERNAL_LINKS = "EXTERNAL_LINKS" + INLINE = "INLINE" + + +class ResultCompression(Enum): + """Enum for result compression values.""" + + LZ4_FRAME = "LZ4_FRAME" + NONE = None + + +class WaitTimeout(Enum): + """Enum for wait timeout values.""" + + ASYNC = "0s" + SYNC = "10s" + + +class MetadataCommands(Enum): + """SQL commands used in the SEA backend. + + These constants are used for metadata operations and other SQL queries + to ensure consistency and avoid string literal duplication. + """ + + SHOW_CATALOGS = "SHOW CATALOGS" + SHOW_SCHEMAS = "SHOW SCHEMAS IN {}" + SHOW_TABLES = "SHOW TABLES IN {}" + SHOW_TABLES_ALL_CATALOGS = "SHOW TABLES IN ALL CATALOGS" + SHOW_COLUMNS = "SHOW COLUMNS IN CATALOG {}" + + LIKE_PATTERN = " LIKE '{}'" + SCHEMA_LIKE_PATTERN = " SCHEMA" + LIKE_PATTERN + TABLE_LIKE_PATTERN = " TABLE" + LIKE_PATTERN + + CATALOG_SPECIFIC = "CATALOG {}" diff --git a/src/databricks/sql/backend/sea/utils/conversion.py b/src/databricks/sql/backend/sea/utils/conversion.py new file mode 100644 index 000000000..69c6dfbe2 --- /dev/null +++ b/src/databricks/sql/backend/sea/utils/conversion.py @@ -0,0 +1,173 @@ +""" +Type conversion utilities for the Databricks SQL Connector. + +This module provides functionality to convert string values from SEA Inline results +to appropriate Python types based on column metadata. +""" + +import datetime +import decimal +import logging +from dateutil import parser +from typing import Callable, Dict, Optional + +logger = logging.getLogger(__name__) + + +def _convert_decimal( + value: str, precision: Optional[int] = None, scale: Optional[int] = None +) -> decimal.Decimal: + """ + Convert a string value to a decimal with optional precision and scale. + + Args: + value: The string value to convert + precision: Optional precision (total number of significant digits) for the decimal + scale: Optional scale (number of decimal places) for the decimal + + Returns: + A decimal.Decimal object with appropriate precision and scale + """ + + # First create the decimal from the string value + result = decimal.Decimal(value) + + # Apply scale (quantize to specific number of decimal places) if specified + quantizer = None + if scale is not None: + quantizer = decimal.Decimal(f'0.{"0" * scale}') + + # Apply precision (total number of significant digits) if specified + context = None + if precision is not None: + context = decimal.Context(prec=precision) + + if quantizer is not None: + result = result.quantize(quantizer, context=context) + + return result + + +class SqlType: + """ + SQL type constants based on Thrift TTypeId values. + + These correspond to the normalized type names that come from the SEA backend + after normalize_sea_type_to_thrift processing (lowercase, without _TYPE suffix). + """ + + # Numeric types + TINYINT = "tinyint" # Maps to TTypeId.TINYINT_TYPE + SMALLINT = "smallint" # Maps to TTypeId.SMALLINT_TYPE + INT = "int" # Maps to TTypeId.INT_TYPE + BIGINT = "bigint" # Maps to TTypeId.BIGINT_TYPE + FLOAT = "float" # Maps to TTypeId.FLOAT_TYPE + DOUBLE = "double" # Maps to TTypeId.DOUBLE_TYPE + DECIMAL = "decimal" # Maps to TTypeId.DECIMAL_TYPE + + # Boolean type + BOOLEAN = "boolean" # Maps to TTypeId.BOOLEAN_TYPE + + # Date/Time types + DATE = "date" # Maps to TTypeId.DATE_TYPE + TIMESTAMP = "timestamp" # Maps to TTypeId.TIMESTAMP_TYPE + INTERVAL_YEAR_MONTH = ( + "interval_year_month" # Maps to TTypeId.INTERVAL_YEAR_MONTH_TYPE + ) + INTERVAL_DAY_TIME = "interval_day_time" # Maps to TTypeId.INTERVAL_DAY_TIME_TYPE + + # String types + CHAR = "char" # Maps to TTypeId.CHAR_TYPE + VARCHAR = "varchar" # Maps to TTypeId.VARCHAR_TYPE + STRING = "string" # Maps to TTypeId.STRING_TYPE + + # Binary type + BINARY = "binary" # Maps to TTypeId.BINARY_TYPE + + # Complex types + ARRAY = "array" # Maps to TTypeId.ARRAY_TYPE + MAP = "map" # Maps to TTypeId.MAP_TYPE + STRUCT = "struct" # Maps to TTypeId.STRUCT_TYPE + + # Other types + NULL = "null" # Maps to TTypeId.NULL_TYPE + UNION = "union" # Maps to TTypeId.UNION_TYPE + USER_DEFINED = "user_defined" # Maps to TTypeId.USER_DEFINED_TYPE + + +class SqlTypeConverter: + """ + Utility class for converting SQL types to Python types. + Based on the Thrift TTypeId types after normalization. + """ + + # SQL type to conversion function mapping + # TODO: complex types + TYPE_MAPPING: Dict[str, Callable] = { + # Numeric types + SqlType.TINYINT: lambda v: int(v), + SqlType.SMALLINT: lambda v: int(v), + SqlType.INT: lambda v: int(v), + SqlType.BIGINT: lambda v: int(v), + SqlType.FLOAT: lambda v: float(v), + SqlType.DOUBLE: lambda v: float(v), + SqlType.DECIMAL: _convert_decimal, + # Boolean type + SqlType.BOOLEAN: lambda v: v.lower() in ("true", "t", "1", "yes", "y"), + # Date/Time types + SqlType.DATE: lambda v: datetime.date.fromisoformat(v), + SqlType.TIMESTAMP: lambda v: parser.parse(v), + SqlType.INTERVAL_YEAR_MONTH: lambda v: v, # Keep as string for now + SqlType.INTERVAL_DAY_TIME: lambda v: v, # Keep as string for now + # String types - no conversion needed + SqlType.CHAR: lambda v: v, + SqlType.VARCHAR: lambda v: v, + SqlType.STRING: lambda v: v, + # Binary type + SqlType.BINARY: lambda v: bytes.fromhex(v), + # Other types + SqlType.NULL: lambda v: None, + # Complex types and user-defined types return as-is + SqlType.USER_DEFINED: lambda v: v, + } + + @staticmethod + def convert_value( + value: str, + sql_type: str, + column_name: Optional[str], + **kwargs, + ) -> object: + """ + Convert a string value to the appropriate Python type based on SQL type. + + Args: + value: The string value to convert + sql_type: The SQL type (e.g., 'tinyint', 'decimal') + column_name: The name of the column being converted + **kwargs: Additional keyword arguments for the conversion function + + Returns: + The converted value in the appropriate Python type + """ + + sql_type = sql_type.lower().strip() + + if sql_type not in SqlTypeConverter.TYPE_MAPPING: + return value + + converter_func = SqlTypeConverter.TYPE_MAPPING[sql_type] + try: + if sql_type == SqlType.DECIMAL: + precision = kwargs.get("precision", None) + scale = kwargs.get("scale", None) + return converter_func(value, precision, scale) + else: + return converter_func(value) + except Exception as e: + warning_message = f"Error converting value '{value}' to {sql_type}" + if column_name: + warning_message += f" in column {column_name}" + warning_message += f": {e}" + logger.warning(warning_message) + return value diff --git a/src/databricks/sql/backend/sea/utils/filters.py b/src/databricks/sql/backend/sea/utils/filters.py new file mode 100644 index 000000000..dd119264a --- /dev/null +++ b/src/databricks/sql/backend/sea/utils/filters.py @@ -0,0 +1,289 @@ +""" +Client-side filtering utilities for Databricks SQL connector. + +This module provides filtering capabilities for result sets returned by different backends. +""" + +from __future__ import annotations + +import io +import logging +from typing import ( + List, + Optional, + Any, + cast, + TYPE_CHECKING, +) + +if TYPE_CHECKING: + from databricks.sql.backend.sea.result_set import SeaResultSet + +from databricks.sql.backend.types import ExecuteResponse +from databricks.sql.backend.sea.models.base import ResultData +from databricks.sql.backend.sea.backend import SeaDatabricksClient +from databricks.sql.utils import CloudFetchQueue, ArrowQueue + +try: + import pyarrow + import pyarrow.compute as pc +except ImportError: + pyarrow = None + pc = None + +logger = logging.getLogger(__name__) + + +class ResultSetFilter: + """ + A general-purpose filter for result sets. + """ + + @staticmethod + def _create_execute_response(result_set: SeaResultSet) -> ExecuteResponse: + """ + Create an ExecuteResponse with parameters from the original result set. + + Args: + result_set: Original result set to copy parameters from + + Returns: + ExecuteResponse: New execute response object + """ + return ExecuteResponse( + command_id=result_set.command_id, + status=result_set.status, + description=result_set.description, + has_been_closed_server_side=result_set.has_been_closed_server_side, + lz4_compressed=result_set.lz4_compressed, + arrow_schema_bytes=result_set._arrow_schema_bytes, + is_staging_operation=False, + ) + + @staticmethod + def _update_manifest(result_set: SeaResultSet, new_row_count: int): + """ + Create a copy of the manifest with updated row count. + + Args: + result_set: Original result set to copy manifest from + new_row_count: New total row count for filtered data + + Returns: + Updated manifest copy + """ + filtered_manifest = result_set.manifest + filtered_manifest.total_row_count = new_row_count + return filtered_manifest + + @staticmethod + def _create_filtered_result_set( + result_set: SeaResultSet, + result_data: ResultData, + row_count: int, + ) -> "SeaResultSet": + """ + Create a new filtered SeaResultSet with the provided data. + + Args: + result_set: Original result set to copy parameters from + result_data: New result data for the filtered set + row_count: Number of rows in the filtered data + + Returns: + New filtered SeaResultSet + """ + from databricks.sql.backend.sea.result_set import SeaResultSet + + execute_response = ResultSetFilter._create_execute_response(result_set) + filtered_manifest = ResultSetFilter._update_manifest(result_set, row_count) + + return SeaResultSet( + connection=result_set.connection, + execute_response=execute_response, + sea_client=cast(SeaDatabricksClient, result_set.backend), + result_data=result_data, + manifest=filtered_manifest, + buffer_size_bytes=result_set.buffer_size_bytes, + arraysize=result_set.arraysize, + ) + + @staticmethod + def _filter_arrow_table( + table: Any, # pyarrow.Table + column_name: str, + allowed_values: List[str], + case_sensitive: bool = True, + ) -> Any: # returns pyarrow.Table + """ + Filter a PyArrow table by column values. + + Args: + table: The PyArrow table to filter + column_name: The name of the column to filter on + allowed_values: List of allowed values for the column + case_sensitive: Whether to perform case-sensitive comparison + + Returns: + A filtered PyArrow table + """ + if not pyarrow: + raise ImportError("PyArrow is required for Arrow table filtering") + + if table.num_rows == 0: + return table + + # Handle case-insensitive filtering by normalizing both column and allowed values + if not case_sensitive: + # Convert allowed values to uppercase + allowed_values = [v.upper() for v in allowed_values] + # Get column values as uppercase + column = pc.utf8_upper(table[column_name]) + else: + # Use column as-is + column = table[column_name] + + # Convert allowed_values to PyArrow Array + allowed_array = pyarrow.array(allowed_values) + + # Construct a boolean mask: True where column is in allowed_list + mask = pc.is_in(column, value_set=allowed_array) + return table.filter(mask) + + @staticmethod + def _filter_arrow_result_set( + result_set: SeaResultSet, + column_index: int, + allowed_values: List[str], + case_sensitive: bool = True, + ) -> SeaResultSet: + """ + Filter a SEA result set that contains Arrow tables. + + Args: + result_set: The SEA result set to filter (containing Arrow data) + column_index: The index of the column to filter on + allowed_values: List of allowed values for the column + case_sensitive: Whether to perform case-sensitive comparison + + Returns: + A filtered SEA result set + """ + # Validate column index and get column name + if column_index >= len(result_set.description): + raise ValueError(f"Column index {column_index} is out of bounds") + column_name = result_set.description[column_index][0] + + # Get all remaining rows as Arrow table and filter it + arrow_table = result_set.results.remaining_rows() + filtered_table = ResultSetFilter._filter_arrow_table( + arrow_table, column_name, allowed_values, case_sensitive + ) + + # Convert the filtered table to Arrow stream format for ResultData + sink = io.BytesIO() + with pyarrow.ipc.new_stream(sink, filtered_table.schema) as writer: + writer.write_table(filtered_table) + arrow_stream_bytes = sink.getvalue() + + # Create ResultData with attachment containing the filtered data + result_data = ResultData( + data=None, # No JSON data + external_links=None, # No external links + attachment=arrow_stream_bytes, # Arrow data as attachment + ) + + return ResultSetFilter._create_filtered_result_set( + result_set, result_data, filtered_table.num_rows + ) + + @staticmethod + def _filter_json_result_set( + result_set: SeaResultSet, + column_index: int, + allowed_values: List[str], + case_sensitive: bool = False, + ) -> SeaResultSet: + """ + Filter a result set by values in a specific column. + + Args: + result_set: The result set to filter + column_index: The index of the column to filter on + allowed_values: List of allowed values for the column + case_sensitive: Whether to perform case-sensitive comparison + + Returns: + A filtered result set + """ + # Validate column index (optional - not in arrow version but good practice) + if column_index >= len(result_set.description): + raise ValueError(f"Column index {column_index} is out of bounds") + + # Extract rows + all_rows = result_set.results.remaining_rows() + + # Convert allowed values if case-insensitive + if not case_sensitive: + allowed_values = [v.upper() for v in allowed_values] + # Helper lambda to get column value based on case sensitivity + get_column_value = ( + lambda row: row[column_index].upper() + if not case_sensitive + else row[column_index] + ) + + # Filter rows based on allowed values + filtered_rows = [ + row + for row in all_rows + if len(row) > column_index and get_column_value(row) in allowed_values + ] + + # Create filtered result set + result_data = ResultData(data=filtered_rows, external_links=None) + + return ResultSetFilter._create_filtered_result_set( + result_set, result_data, len(filtered_rows) + ) + + @staticmethod + def filter_tables_by_type( + result_set: SeaResultSet, table_types: Optional[List[str]] = None + ) -> SeaResultSet: + """ + Filter a result set of tables by the specified table types. + + This is a client-side filter that processes the result set after it has been + retrieved from the server. It filters out tables whose type does not match + any of the types in the table_types list. + + Args: + result_set: The original result set containing tables + table_types: List of table types to include (e.g., ["TABLE", "VIEW"]) + + Returns: + A filtered result set containing only tables of the specified types + """ + # Default table types if none specified + DEFAULT_TABLE_TYPES = ["TABLE", "VIEW", "SYSTEM TABLE"] + valid_types = table_types if table_types else DEFAULT_TABLE_TYPES + + # Check if we have an Arrow table (cloud fetch) or JSON data + # Table type is the 6th column (index 5) + if isinstance(result_set.results, (CloudFetchQueue, ArrowQueue)): + # For Arrow tables, we need to handle filtering differently + return ResultSetFilter._filter_arrow_result_set( + result_set, + column_index=5, + allowed_values=valid_types, + case_sensitive=True, + ) + else: + # For JSON data, use the existing filter method + return ResultSetFilter._filter_json_result_set( + result_set, + column_index=5, + allowed_values=valid_types, + case_sensitive=True, + ) diff --git a/src/databricks/sql/backend/sea/utils/http_client.py b/src/databricks/sql/backend/sea/utils/http_client.py new file mode 100644 index 000000000..caefe9929 --- /dev/null +++ b/src/databricks/sql/backend/sea/utils/http_client.py @@ -0,0 +1,299 @@ +import json +import logging +import ssl +import urllib.parse +import urllib.request +from typing import Dict, Any, Optional, List, Tuple, Union + +from urllib3 import HTTPConnectionPool, HTTPSConnectionPool, ProxyManager +from urllib3.util import make_headers +from urllib3.exceptions import MaxRetryError + +from databricks.sql.auth.authenticators import AuthProvider +from databricks.sql.auth.retry import CommandType, DatabricksRetryPolicy +from databricks.sql.types import SSLOptions +from databricks.sql.exc import ( + RequestError, +) +from databricks.sql.common.http_utils import ( + detect_and_parse_proxy, +) +from databricks.sql.common.url_utils import normalize_host_with_protocol + +logger = logging.getLogger(__name__) + + +class SeaHttpClient: + """ + HTTP client for Statement Execution API (SEA). + + This client uses urllib3 for robust HTTP communication with retry policies + and connection pooling. + """ + + retry_policy: Union[DatabricksRetryPolicy, int] + _pool: Optional[Union[HTTPConnectionPool, HTTPSConnectionPool]] + proxy_uri: Optional[str] + proxy_auth: Optional[Dict[str, str]] + realhost: Optional[str] + realport: Optional[int] + + def __init__( + self, + server_hostname: str, + port: int, + http_path: str, + http_headers: List[Tuple[str, str]], + auth_provider: AuthProvider, + ssl_options: SSLOptions, + **kwargs, + ): + """ + Initialize the SEA HTTP client. + + Args: + server_hostname: Hostname of the Databricks server + port: Port number for the connection + http_path: HTTP path for the connection + http_headers: List of HTTP headers to include in requests + auth_provider: Authentication provider + ssl_options: SSL configuration options + **kwargs: Additional keyword arguments including retry policy settings + """ + + self.server_hostname = server_hostname + self.port = port or 443 + self.http_path = http_path + self.auth_provider = auth_provider + self.ssl_options = ssl_options + + # Build base URL using url_utils for consistent normalization + normalized_host = normalize_host_with_protocol(server_hostname) + self.base_url = f"{normalized_host}:{self.port}" + + # Parse URL for proxy handling + parsed_url = urllib.parse.urlparse(self.base_url) + self.scheme = parsed_url.scheme + self.host = parsed_url.hostname + self.port = parsed_url.port or (443 if self.scheme == "https" else 80) + + # Setup headers + self.headers: Dict[str, str] = dict(http_headers) + self.headers.update({"Content-Type": "application/json"}) + + # Extract retry policy settings + self._retry_delay_min = kwargs.get("_retry_delay_min", 1.0) + self._retry_delay_max = kwargs.get("_retry_delay_max", 60.0) + self._retry_stop_after_attempts_count = kwargs.get( + "_retry_stop_after_attempts_count", 30 + ) + self._retry_stop_after_attempts_duration = kwargs.get( + "_retry_stop_after_attempts_duration", 900.0 + ) + self._retry_delay_default = kwargs.get("_retry_delay_default", 5.0) + self.force_dangerous_codes = kwargs.get("_retry_dangerous_codes", []) + + # Connection pooling settings + self.max_connections = kwargs.get("max_connections", 10) + + # Setup retry policy + self.enable_v3_retries = kwargs.get("_enable_v3_retries", True) + + if self.enable_v3_retries: + urllib3_kwargs = {"allowed_methods": ["GET", "POST", "DELETE"]} + _max_redirects = kwargs.get("_retry_max_redirects") + if _max_redirects: + if _max_redirects > self._retry_stop_after_attempts_count: + logger.warning( + "_retry_max_redirects > _retry_stop_after_attempts_count so it will have no affect!" + ) + urllib3_kwargs["redirect"] = _max_redirects + + self.retry_policy = DatabricksRetryPolicy( + delay_min=self._retry_delay_min, + delay_max=self._retry_delay_max, + stop_after_attempts_count=self._retry_stop_after_attempts_count, + 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, + ) + else: + # Legacy behavior - no automatic retries + logger.warning( + "Legacy retry behavior is enabled for this connection." + " This behaviour is not supported for the SEA backend." + ) + self.retry_policy = 0 + + # Handle proxy settings using shared utility + proxy_auth_method = kwargs.get("_proxy_auth_method") + proxy_uri, proxy_auth = detect_and_parse_proxy( + self.scheme, self.host, proxy_auth_method=proxy_auth_method + ) + + if proxy_uri: + parsed_proxy = urllib.parse.urlparse(proxy_uri) + self.realhost = self.host + self.realport = self.port + self.proxy_uri = proxy_uri + self.host = parsed_proxy.hostname + self.port = parsed_proxy.port or (443 if self.scheme == "https" else 80) + self.proxy_auth = proxy_auth + else: + self.realhost = self.realport = self.proxy_auth = self.proxy_uri = None + + # Initialize connection pool + self._pool = None + self._open() + + def _open(self): + """Initialize the connection pool.""" + pool_kwargs = {"maxsize": self.max_connections} + + if self.scheme == "http": + pool_class = HTTPConnectionPool + else: # https + pool_class = HTTPSConnectionPool + pool_kwargs.update( + { + "cert_reqs": ssl.CERT_REQUIRED + if self.ssl_options.tls_verify + else ssl.CERT_NONE, + "ca_certs": self.ssl_options.tls_trusted_ca_file, + "cert_file": self.ssl_options.tls_client_cert_file, + "key_file": self.ssl_options.tls_client_cert_key_file, + "key_password": self.ssl_options.tls_client_cert_key_password, + } + ) + + if self.using_proxy(): + proxy_manager = ProxyManager( + self.proxy_uri, + num_pools=1, + proxy_headers=self.proxy_auth, + ) + self._pool = proxy_manager.connection_from_host( + host=self.realhost, + port=self.realport, + scheme=self.scheme, + pool_kwargs=pool_kwargs, + ) + else: + self._pool = pool_class(self.host, self.port, **pool_kwargs) + + def close(self): + """Close the connection pool.""" + if self._pool: + self._pool.clear() + + def using_proxy(self) -> bool: + """Check if proxy is being used.""" + return self.realhost is not None + + def set_retry_command_type(self, command_type: CommandType): + """Set the command type for retry policy decision making.""" + if isinstance(self.retry_policy, DatabricksRetryPolicy): + self.retry_policy.command_type = command_type + + def start_retry_timer(self): + """Start the retry timer for duration-based retry limits.""" + if isinstance(self.retry_policy, DatabricksRetryPolicy): + self.retry_policy.start_retry_timer() + + def _get_auth_headers(self) -> Dict[str, str]: + """Get authentication headers from the auth provider.""" + headers: Dict[str, str] = {} + self.auth_provider.add_headers(headers) + return headers + + def _make_request( + self, + method: str, + path: str, + data: Optional[Dict[str, Any]] = None, + ) -> Dict[str, Any]: + """ + Make an HTTP request to the SEA endpoint. + + Args: + method: HTTP method (GET, POST, DELETE) + path: API endpoint path + data: Request payload data + + Returns: + Dict[str, Any]: Response data parsed from JSON + + Raises: + RequestError: If the request fails after retries + """ + + # Prepare headers + headers = {**self.headers, **self._get_auth_headers()} + + # Prepare request body + body = json.dumps(data).encode("utf-8") if data else b"" + if body: + headers["Content-Length"] = str(len(body)) + + # Set command type for retry policy + command_type = self._get_command_type_from_path(path, method) + self.set_retry_command_type(command_type) + self.start_retry_timer() + + logger.debug(f"Making {method} request to {path}") + + if self._pool is None: + raise RequestError("Connection pool not initialized", None) + + try: + with self._pool.request( + method=method.upper(), + url=path, + body=body, + headers=headers, + preload_content=False, + retries=self.retry_policy, + ) as response: + # Handle successful responses + if 200 <= response.status < 300: + if response.data: + return json.loads(response.data.decode()) + else: + return {} + + error_message = f"SEA HTTP request failed with status {response.status}" + raise Exception(error_message) + except MaxRetryError as e: + logger.error(f"SEA HTTP request failed with MaxRetryError: {e}") + raise + except Exception as e: + logger.error(f"SEA HTTP request failed with exception: {e}") + error_message = f"Error during request to server. {e}" + raise RequestError(error_message, None, None, e) + + def _get_command_type_from_path(self, path: str, method: str) -> CommandType: + """ + Determine the command type based on the API path and method. + + This helps the retry policy make appropriate decisions for different + types of SEA operations. + """ + + path = path.lower() + method = method.upper() + + if "/statements" in path: + if method == "POST" and path.endswith("/statements"): + return CommandType.EXECUTE_STATEMENT + elif "/cancel" in path: + return CommandType.OTHER # Cancel operation + elif method == "DELETE": + return CommandType.CLOSE_OPERATION + elif method == "GET": + return CommandType.GET_OPERATION_STATUS + elif "/sessions" in path: + if method == "DELETE": + return CommandType.CLOSE_SESSION + + return CommandType.OTHER diff --git a/src/databricks/sql/backend/sea/utils/normalize.py b/src/databricks/sql/backend/sea/utils/normalize.py new file mode 100644 index 000000000..d725d294b --- /dev/null +++ b/src/databricks/sql/backend/sea/utils/normalize.py @@ -0,0 +1,50 @@ +""" +Type normalization utilities for SEA backend. + +This module provides functionality to normalize SEA type names to match +Thrift type naming conventions. +""" + +from typing import Dict, Any + +# SEA types that need to be translated to Thrift types +# The list of all SEA types is available in the REST reference at: +# https://docs.databricks.com/api/workspace/statementexecution/executestatement +# The list of all Thrift types can be found in the ttypes.TTypeId definition +# The SEA types that do not align with Thrift are explicitly mapped below +SEA_TO_THRIFT_TYPE_MAP = { + "BYTE": "TINYINT", + "SHORT": "SMALLINT", + "LONG": "BIGINT", + "INTERVAL": "INTERVAL", # Default mapping, will be overridden if type_interval_type is present +} + + +def normalize_sea_type_to_thrift(type_name: str, col_data: Dict[str, Any]) -> str: + """ + Normalize SEA type names to match Thrift type naming conventions. + + Args: + type_name: The type name from SEA (e.g., "BYTE", "LONG", "INTERVAL") + col_data: The full column data dictionary from manifest (for accessing type_interval_type) + + Returns: + Normalized type name matching Thrift conventions + """ + # Early return if type doesn't need mapping + if type_name not in SEA_TO_THRIFT_TYPE_MAP: + return type_name + + normalized_type = SEA_TO_THRIFT_TYPE_MAP[type_name] + + # Special handling for interval types + if type_name == "INTERVAL": + type_interval_type = col_data.get("type_interval_type") + if type_interval_type: + return ( + "INTERVAL_YEAR_MONTH" + if any(t in type_interval_type.upper() for t in ["YEAR", "MONTH"]) + else "INTERVAL_DAY_TIME" + ) + + return normalized_type diff --git a/src/databricks/sql/thrift_backend.py b/src/databricks/sql/backend/thrift_backend.py similarity index 67% rename from src/databricks/sql/thrift_backend.py rename to src/databricks/sql/backend/thrift_backend.py index 5fbd9f749..e23f3389b 100644 --- a/src/databricks/sql/thrift_backend.py +++ b/src/databricks/sql/backend/thrift_backend.py @@ -1,13 +1,29 @@ -from decimal import Decimal +from __future__ import annotations + import errno import logging import math import time -import uuid import threading -from typing import List, Union +from typing import Dict, List, Optional, Union, Any, TYPE_CHECKING +from uuid import UUID + +from databricks.sql.common.unified_http_client import UnifiedHttpClient +from databricks.sql.result_set import ThriftResultSet +from databricks.sql.telemetry.models.event import StatementType + -from databricks.sql.thrift_api.TCLIService.ttypes import TOperationState +if TYPE_CHECKING: + from databricks.sql.client import Cursor + from databricks.sql.result_set import ResultSet + +from databricks.sql.backend.types import ( + CommandState, + SessionId, + CommandId, + ExecuteResponse, +) +from databricks.sql.backend.utils import guid_to_hex_id try: import pyarrow @@ -25,22 +41,22 @@ from databricks.sql.auth.authenticators import AuthProvider from databricks.sql.thrift_api.TCLIService import TCLIService, ttypes from databricks.sql import * -from databricks.sql.exc import MaxRetryDurationError from databricks.sql.thrift_api.TCLIService.TCLIService import ( Client as TCLIServiceClient, ) from databricks.sql.utils import ( - ExecuteResponse, + ThriftResultSetQueueFactory, _bound, RequestErrorInfo, NoRetryReason, - ResultSetQueueFactory, convert_arrow_based_set_to_arrow_table, convert_decimals_in_arrow_table, convert_column_based_set_to_arrow_table, + serialize_query_tags, ) from databricks.sql.types import SSLOptions +from databricks.sql.backend.databricks_client import DatabricksClient logger = logging.getLogger(__name__) @@ -66,16 +82,16 @@ # - 900s attempts-duration lines up w ODBC/JDBC drivers (for cluster startup > 10 mins) _retry_policy = { # (type, default, min, max) "_retry_delay_min": (float, 1, 0.1, 60), - "_retry_delay_max": (float, 30, 5, 3600), - "_retry_stop_after_attempts_count": (int, 5, 1, 60), + "_retry_delay_max": (float, 60, 5, 3600), + "_retry_stop_after_attempts_count": (int, 30, 1, 60), "_retry_stop_after_attempts_duration": (float, 900, 1, 86400), "_retry_delay_default": (float, 5, 1, 60), } -class ThriftBackend: - CLOSED_OP_STATE = ttypes.TOperationState.CLOSED_STATE - ERROR_OP_STATE = ttypes.TOperationState.ERROR_STATE +class ThriftDatabricksClient(DatabricksClient): + CLOSED_OP_STATE = CommandState.CLOSED + ERROR_OP_STATE = CommandState.FAILED _retry_delay_min: float _retry_delay_max: float @@ -91,12 +107,10 @@ def __init__( http_headers, auth_provider: AuthProvider, ssl_options: SSLOptions, - staging_allowed_local_path: Union[None, str, List[str]] = None, + http_client: UnifiedHttpClient, **kwargs, ): # Internal arguments in **kwargs: - # _user_agent_entry - # Tag to add to User-Agent header. For use by partners. # _username, _password # Username and password Basic authentication (no official support) # _connection_uri @@ -133,6 +147,11 @@ def __init__( # max_download_threads # Number of threads for handling cloud fetch downloads. Defaults to 10 + logger.debug( + "ThriftBackend.__init__(server_hostname=%s, port=%s, http_path=%s)" + % (server_hostname, port, http_path) + ) + port = port or 443 if kwargs.get("_connection_uri"): uri = kwargs.get("_connection_uri") @@ -145,22 +164,23 @@ def __init__( else: raise ValueError("No valid connection settings.") - self.staging_allowed_local_path = staging_allowed_local_path + self._host = server_hostname self._initialize_retry_args(kwargs) self._use_arrow_native_complex_types = kwargs.get( "_use_arrow_native_complex_types", True ) + self._use_arrow_native_decimals = kwargs.get("_use_arrow_native_decimals", True) self._use_arrow_native_timestamps = kwargs.get( "_use_arrow_native_timestamps", True ) # Cloud fetch - self.max_download_threads = kwargs.get("max_download_threads", 10) + self._max_download_threads = kwargs.get("max_download_threads", 10) self._ssl_options = ssl_options - self._auth_provider = auth_provider + self._http_client = http_client # Connector version 3 retry approach self.enable_v3_retries = kwargs.get("_enable_v3_retries", True) @@ -173,11 +193,17 @@ def __init__( self.force_dangerous_codes = kwargs.get("_retry_dangerous_codes", []) additional_transport_args = {} + + # Add proxy authentication method if specified + proxy_auth_method = kwargs.get("_proxy_auth_method") + if proxy_auth_method: + additional_transport_args["_proxy_auth_method"] = proxy_auth_method + _max_redirects: Union[None, int] = kwargs.get("_retry_max_redirects") if _max_redirects: if _max_redirects > self._retry_stop_after_attempts_count: - logger.warn( + logger.warning( "_retry_max_redirects > _retry_stop_after_attempts_count so it will have no affect!" ) urllib3_kwargs = {"redirect": _max_redirects} @@ -218,6 +244,11 @@ def __init__( raise self._request_lock = threading.RLock() + self._session_id_hex = None + + @property + def max_download_threads(self) -> int: + return self._max_download_threads # TODO: Move this bounding logic into DatabricksRetryPolicy for v3 (PECO-918) def _initialize_retry_args(self, kwargs): @@ -250,12 +281,15 @@ def _initialize_retry_args(self, kwargs): ) @staticmethod - def _check_response_for_error(response): + def _check_response_for_error(response, host_url=None): if response.status and response.status.statusCode in [ ttypes.TStatusCode.ERROR_STATUS, ttypes.TStatusCode.INVALID_HANDLE_STATUS, ]: - raise DatabaseError(response.status.errorMessage) + raise DatabaseError( + response.status.errorMessage, + host_url=host_url, + ) @staticmethod def _extract_error_message_from_headers(headers): @@ -306,7 +340,10 @@ def _handle_request_error(self, error_info, attempt, elapsed): no_retry_reason, attempt, elapsed ) network_request_error = RequestError( - user_friendly_error_message, full_error_info_context, error_info.error + user_friendly_error_message, + full_error_info_context, + self._host, + error_info.error, ) logger.info(network_request_error.message_with_context()) @@ -332,6 +369,7 @@ def make_request(self, method, request, retryable=True): Will stop retry attempts if total elapsed time + next retry delay would exceed _retry_stop_after_attempts_duration. """ + # basic strategy: build range iterator rep'ing number of available # retries. bounds can be computed from there. iterate over it with # retries until success or final failure achieved. @@ -392,6 +430,8 @@ def attempt_request(attempt): # TODO: don't use exception handling for GOS polling... + logger.error("ThriftBackend.attempt_request: HTTPError: %s", err) + gos_name = TCLIServiceClient.GetOperationStatus.__name__ if method.__name__ == gos_name: delay_default = ( @@ -423,23 +463,25 @@ def attempt_request(attempt): errno.ECONNRESET, # | 104 | 54 | errno.ETIMEDOUT, # | 110 | 60 | ] + # fmt: on gos_name = TCLIServiceClient.GetOperationStatus.__name__ # retry on timeout. Happens a lot in Azure and it is safe as data has not been sent to server yet if method.__name__ == gos_name or err.errno == errno.ETIMEDOUT: retry_delay = bound_retry_delay(attempt, self._retry_delay_default) - - # fmt: on log_string = f"{gos_name} failed with code {err.errno} and will attempt to retry" if err.errno in info_errs: logger.info(log_string) else: logger.warning(log_string) except Exception as err: + logger.error("ThriftBackend.attempt_request: Exception: %s", err) error = err retry_delay = extract_retry_delay(attempt) - error_message = ThriftBackend._extract_error_message_from_headers( - getattr(self._transport, "headers", {}) + error_message = ( + ThriftDatabricksClient._extract_error_message_from_headers( + getattr(self._transport, "headers", {}) + ) ) finally: # Calling `close()` here releases the active HTTP connection back to the pool @@ -475,7 +517,7 @@ def attempt_request(attempt): if not isinstance(response_or_error_info, RequestErrorInfo): # log nothing here, presume that main request logging covers response = response_or_error_info - ThriftBackend._check_response_for_error(response) + ThriftDatabricksClient._check_response_for_error(response, self._host) return response error_info = response_or_error_info @@ -489,7 +531,8 @@ def _check_protocol_version(self, t_open_session_resp): raise OperationalError( "Error: expected server to use a protocol version >= " "SPARK_CLI_SERVICE_PROTOCOL_V2, " - "instead got: {}".format(protocol_version) + "instead got: {}".format(protocol_version), + host_url=self._host, ) def _check_initial_namespace(self, catalog, schema, response): @@ -502,14 +545,16 @@ def _check_initial_namespace(self, catalog, schema, response): ): raise InvalidServerResponseError( "Setting initial namespace not supported by the DBR version, " - "Please use a Databricks SQL endpoint or a cluster with DBR >= 9.0." + "Please use a Databricks SQL endpoint or a cluster with DBR >= 9.0.", + host_url=self._host, ) if catalog: if not response.canUseMultipleCatalogs: raise InvalidServerResponseError( "Unexpected response from server: Trying to set initial catalog to {}, " - + "but server does not support multiple catalogs.".format(catalog) # type: ignore + + "but server does not support multiple catalogs.".format(catalog), # type: ignore + host_url=self._host, ) def _check_session_configuration(self, session_configuration): @@ -523,10 +568,11 @@ def _check_session_configuration(self, session_configuration): "while using the Databricks SQL connector, it must be false not {}".format( TIMESTAMP_AS_STRING_CONFIG, session_configuration[TIMESTAMP_AS_STRING_CONFIG], - ) + ), + host_url=self._host, ) - def open_session(self, session_configuration, catalog, schema): + def open_session(self, session_configuration, catalog, schema) -> SessionId: try: self._transport.open() session_configuration = { @@ -554,13 +600,27 @@ 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 + + properties = ( + {"serverProtocolVersion": response.serverProtocolVersion} + if response.serverProtocolVersion + else {} + ) + session_id = SessionId.from_thrift_handle( + response.sessionHandle, properties + ) + self._session_id_hex = session_id.hex_guid + return session_id except: self._transport.close() raise - def close_session(self, session_handle) -> None: - req = ttypes.TCloseSessionReq(sessionHandle=session_handle) + def close_session(self, session_id: SessionId) -> None: + thrift_handle = session_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift session ID") + + req = ttypes.TCloseSessionReq(sessionHandle=thrift_handle) try: self.make_request(self._client.CloseSession, req) finally: @@ -575,28 +635,31 @@ def _check_command_not_in_error_or_closed_state( get_operations_resp.displayMessage, { "operation-id": op_handle - and self.guid_to_hex_id(op_handle.operationId.guid), + and guid_to_hex_id(op_handle.operationId.guid), "diagnostic-info": get_operations_resp.diagnosticInfo, }, + host_url=self._host, ) else: raise ServerOperationError( get_operations_resp.errorMessage, { "operation-id": op_handle - and self.guid_to_hex_id(op_handle.operationId.guid), + and guid_to_hex_id(op_handle.operationId.guid), "diagnostic-info": None, }, + host_url=self._host, ) elif get_operations_resp.operationState == ttypes.TOperationState.CLOSED_STATE: raise DatabaseError( "Command {} unexpectedly closed server side".format( - op_handle and self.guid_to_hex_id(op_handle.operationId.guid) + op_handle and guid_to_hex_id(op_handle.operationId.guid) ), { "operation-id": op_handle - and self.guid_to_hex_id(op_handle.operationId.guid) + and guid_to_hex_id(op_handle.operationId.guid) }, + host_url=self._host, ) def _poll_for_status(self, op_handle): @@ -617,7 +680,10 @@ def _create_arrow_table(self, t_row_set, lz4_compressed, schema_bytes, descripti t_row_set.arrowBatches, lz4_compressed, schema_bytes ) else: - raise OperationalError("Unsupported TRowSet instance {}".format(t_row_set)) + raise OperationalError( + "Unsupported TRowSet instance {}".format(t_row_set), + host_url=self._host, + ) return convert_decimals_in_arrow_table(arrow_table, description), num_rows def _get_metadata_resp(self, op_handle): @@ -625,7 +691,7 @@ def _get_metadata_resp(self, op_handle): return self.make_request(self._client.GetResultSetMetadata, req) @staticmethod - def _hive_schema_to_arrow_schema(t_table_schema): + def _hive_schema_to_arrow_schema(t_table_schema, host_url=None): def map_type(t_type_entry): if t_type_entry.primitiveEntry: return { @@ -656,7 +722,8 @@ def map_type(t_type_entry): # Current thriftserver implementation should always return a primitiveEntry, # even for complex types raise OperationalError( - "Thrift protocol error: t_type_entry not a primitiveEntry" + "Thrift protocol error: t_type_entry not a primitiveEntry", + host_url=host_url, ) def convert_col(t_column_desc): @@ -667,7 +734,7 @@ def convert_col(t_column_desc): return pyarrow.schema([convert_col(col) for col in t_table_schema.columns]) @staticmethod - def _col_to_description(col): + def _col_to_description(col, field=None, host_url=None): type_entry = col.typeDesc.types[0] if type_entry.primitiveEntry: @@ -676,7 +743,8 @@ def _col_to_description(col): cleaned_type = (name[:-5] if name.endswith("_TYPE") else name).lower() else: raise OperationalError( - "Thrift protocol error: t_type_entry not a primitiveEntry" + "Thrift protocol error: t_type_entry not a primitiveEntry", + host_url=host_url, ) if type_entry.primitiveEntry.type == ttypes.TTypeId.DECIMAL_TYPE: @@ -689,17 +757,44 @@ def _col_to_description(col): else: raise OperationalError( "Decimal type did not provide typeQualifier precision, scale in " - "primitiveEntry {}".format(type_entry.primitiveEntry) + "primitiveEntry {}".format(type_entry.primitiveEntry), + host_url=host_url, ) else: precision, scale = None, None + # Extract variant type from field if available + if field is not None: + try: + # Check for variant type in metadata + if field.metadata and b"Spark:DataType:SqlName" in field.metadata: + sql_type = field.metadata.get(b"Spark:DataType:SqlName") + if sql_type == b"VARIANT": + cleaned_type = "variant" + except Exception as e: + logger.debug(f"Could not extract variant type from field: {e}") + return col.columnName, cleaned_type, None, None, precision, scale, None @staticmethod - def _hive_schema_to_description(t_table_schema): + def _hive_schema_to_description(t_table_schema, schema_bytes=None, host_url=None): + field_dict = {} + if pyarrow and schema_bytes: + try: + arrow_schema = pyarrow.ipc.read_schema(pyarrow.py_buffer(schema_bytes)) + # Build a dictionary mapping column names to fields + for field in arrow_schema: + field_dict[field.name] = field + except Exception as e: + logger.debug(f"Could not parse arrow schema: {e}") + return [ - ThriftBackend._col_to_description(col) for col in t_table_schema.columns + ThriftDatabricksClient._col_to_description( + col, + field_dict.get(col.columnName) if field_dict else None, + host_url, + ) + for col in t_table_schema.columns ] def _results_message_to_execute_response(self, resp, operation_state): @@ -719,68 +814,69 @@ def _results_message_to_execute_response(self, resp, operation_state): ttypes.TSparkRowSetType._VALUES_TO_NAMES[ t_result_set_metadata_resp.resultFormat ] - ) + ), + host_url=self._host, ) direct_results = resp.directResults has_been_closed_server_side = direct_results and direct_results.closeOperation + has_more_rows = ( (not direct_results) or (not direct_results.resultSet) or direct_results.resultSet.hasMoreRows ) - description = self._hive_schema_to_description( - t_result_set_metadata_resp.schema - ) if pyarrow: schema_bytes = ( t_result_set_metadata_resp.arrowSchema - or self._hive_schema_to_arrow_schema(t_result_set_metadata_resp.schema) + or self._hive_schema_to_arrow_schema( + t_result_set_metadata_resp.schema, self._host + ) .serialize() .to_pybytes() ) else: schema_bytes = None + description = self._hive_schema_to_description( + t_result_set_metadata_resp.schema, + schema_bytes, + self._host, + ) + lz4_compressed = t_result_set_metadata_resp.lz4Compressed - is_staging_operation = t_result_set_metadata_resp.isStagingOperation - if direct_results and direct_results.resultSet: - assert direct_results.resultSet.results.startRowOffset == 0 - assert direct_results.resultSetMetadata - - arrow_queue_opt = ResultSetQueueFactory.build_queue( - row_set_type=t_result_set_metadata_resp.resultFormat, - t_row_set=direct_results.resultSet.results, - arrow_schema_bytes=schema_bytes, - max_download_threads=self.max_download_threads, - lz4_compressed=lz4_compressed, - description=description, - ssl_options=self._ssl_options, - ) - else: - arrow_queue_opt = None - return ExecuteResponse( - arrow_queue=arrow_queue_opt, - status=operation_state, + command_id = CommandId.from_thrift_handle(resp.operationHandle) + + status = CommandState.from_thrift_state(operation_state) + if status is None: + raise ValueError(f"Unknown command state: {operation_state}") + + execute_response = ExecuteResponse( + command_id=command_id, + status=status, + description=description, has_been_closed_server_side=has_been_closed_server_side, - has_more_rows=has_more_rows, lz4_compressed=lz4_compressed, - is_staging_operation=is_staging_operation, - command_handle=resp.operationHandle, - description=description, + is_staging_operation=t_result_set_metadata_resp.isStagingOperation, arrow_schema_bytes=schema_bytes, + result_format=t_result_set_metadata_resp.resultFormat, ) - def get_execution_result(self, op_handle, cursor): + return execute_response, has_more_rows - assert op_handle is not None + def get_execution_result( + self, command_id: CommandId, cursor: Cursor + ) -> "ResultSet": + thrift_handle = command_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift command ID") req = ttypes.TFetchResultsReq( operationHandle=ttypes.TOperationHandle( - op_handle.operationId, - op_handle.operationType, + thrift_handle.operationId, + thrift_handle.operationType, False, - op_handle.modifiedRowCount, + thrift_handle.modifiedRowCount, ), maxRows=cursor.arraysize, maxBytes=cursor.buffer_size_bytes, @@ -792,40 +888,52 @@ def get_execution_result(self, op_handle, cursor): t_result_set_metadata_resp = resp.resultSetMetadata + if pyarrow: + schema_bytes = ( + t_result_set_metadata_resp.arrowSchema + or self._hive_schema_to_arrow_schema( + t_result_set_metadata_resp.schema, self._host + ) + .serialize() + .to_pybytes() + ) + else: + schema_bytes = None + + description = self._hive_schema_to_description( + t_result_set_metadata_resp.schema, + schema_bytes, + self._host, + ) + lz4_compressed = t_result_set_metadata_resp.lz4Compressed is_staging_operation = t_result_set_metadata_resp.isStagingOperation has_more_rows = resp.hasMoreRows - description = self._hive_schema_to_description( - t_result_set_metadata_resp.schema - ) - schema_bytes = ( - t_result_set_metadata_resp.arrowSchema - or self._hive_schema_to_arrow_schema(t_result_set_metadata_resp.schema) - .serialize() - .to_pybytes() - ) + status = CommandState.from_thrift_state(resp.status) or CommandState.RUNNING - queue = ResultSetQueueFactory.build_queue( - row_set_type=resp.resultSetMetadata.resultFormat, - t_row_set=resp.results, - arrow_schema_bytes=schema_bytes, - max_download_threads=self.max_download_threads, - lz4_compressed=lz4_compressed, + execute_response = ExecuteResponse( + command_id=command_id, + status=status, description=description, - ssl_options=self._ssl_options, - ) - - return ExecuteResponse( - arrow_queue=queue, - status=resp.status, has_been_closed_server_side=False, - has_more_rows=has_more_rows, lz4_compressed=lz4_compressed, is_staging_operation=is_staging_operation, - command_handle=op_handle, - description=description, arrow_schema_bytes=schema_bytes, + result_format=t_result_set_metadata_resp.resultFormat, + ) + + return ThriftResultSet( + connection=cursor.connection, + execute_response=execute_response, + thrift_client=self, + buffer_size_bytes=cursor.buffer_size_bytes, + arraysize=cursor.arraysize, + use_cloud_fetch=cursor.connection.use_cloud_fetch, + t_row_set=resp.results, + max_download_threads=self.max_download_threads, + ssl_options=self._ssl_options, + has_more_rows=has_more_rows, ) def _wait_until_command_done(self, op_handle, initial_operation_status_resp): @@ -846,45 +954,67 @@ def _wait_until_command_done(self, op_handle, initial_operation_status_resp): self._check_command_not_in_error_or_closed_state(op_handle, poll_resp) return operation_state - def get_query_state(self, op_handle) -> "TOperationState": - poll_resp = self._poll_for_status(op_handle) + def get_query_state(self, command_id: CommandId) -> CommandState: + thrift_handle = command_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift command ID") + + poll_resp = self._poll_for_status(thrift_handle) operation_state = poll_resp.operationState - self._check_command_not_in_error_or_closed_state(op_handle, poll_resp) - return operation_state + self._check_command_not_in_error_or_closed_state(thrift_handle, poll_resp) + state = CommandState.from_thrift_state(operation_state) + if state is None: + raise ValueError(f"Unknown command state: {operation_state}") + return state @staticmethod - def _check_direct_results_for_error(t_spark_direct_results): + def _check_direct_results_for_error(t_spark_direct_results, host_url=None): if t_spark_direct_results: if t_spark_direct_results.operationStatus: - ThriftBackend._check_response_for_error( - t_spark_direct_results.operationStatus + ThriftDatabricksClient._check_response_for_error( + t_spark_direct_results.operationStatus, + host_url, ) if t_spark_direct_results.resultSetMetadata: - ThriftBackend._check_response_for_error( - t_spark_direct_results.resultSetMetadata + ThriftDatabricksClient._check_response_for_error( + t_spark_direct_results.resultSetMetadata, + host_url, ) if t_spark_direct_results.resultSet: - ThriftBackend._check_response_for_error( - t_spark_direct_results.resultSet + ThriftDatabricksClient._check_response_for_error( + t_spark_direct_results.resultSet, + host_url, ) if t_spark_direct_results.closeOperation: - ThriftBackend._check_response_for_error( - t_spark_direct_results.closeOperation + ThriftDatabricksClient._check_response_for_error( + t_spark_direct_results.closeOperation, + host_url, ) def execute_command( self, - operation, - session_handle, - max_rows, - max_bytes, - lz4_compression, - cursor, + operation: str, + session_id: SessionId, + max_rows: int, + max_bytes: int, + lz4_compression: bool, + cursor: Cursor, use_cloud_fetch=True, parameters=[], async_op=False, - ): - assert session_handle is not None + enforce_embedded_schema_correctness=False, + row_limit: Optional[int] = None, + query_tags: Optional[Dict[str, Optional[str]]] = None, + ) -> Union["ResultSet", None]: + thrift_handle = session_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift session ID") + + logger.debug( + "ThriftBackend.execute_command(operation=%s, session_handle=%s)", + operation, + thrift_handle, + ) spark_arrow_types = ttypes.TSparkArrowTypes( timestampAsArrow=self._use_arrow_native_timestamps, @@ -894,55 +1024,121 @@ def execute_command( # DBR should be changed to use month_day_nano_interval intervalTypesAsArrow=False, ) + + # Build confOverlay with default configs and query_tags + merged_conf_overlay = { + # We want to receive proper Timestamp arrow types. + "spark.thriftserver.arrowBasedRowSet.timestampAsString": "false" + } + + # Serialize and add query_tags to confOverlay if provided + if query_tags: + serialized_tags = serialize_query_tags(query_tags) + if serialized_tags: + merged_conf_overlay["query_tags"] = serialized_tags + req = ttypes.TExecuteStatementReq( - sessionHandle=session_handle, + sessionHandle=thrift_handle, statement=operation, runAsync=True, - getDirectResults=ttypes.TSparkGetDirectResults( - maxRows=max_rows, maxBytes=max_bytes + # For async operation we don't want the direct results + getDirectResults=None + if async_op + else ttypes.TSparkGetDirectResults( + maxRows=max_rows, + maxBytes=max_bytes, ), canReadArrowResult=True if pyarrow else False, canDecompressLZ4Result=lz4_compression, canDownloadResult=use_cloud_fetch, - confOverlay={ - # We want to receive proper Timestamp arrow types. - "spark.thriftserver.arrowBasedRowSet.timestampAsString": "false" - }, + confOverlay=merged_conf_overlay, useArrowNativeTypes=spark_arrow_types, parameters=parameters, + enforceEmbeddedSchemaCorrectness=enforce_embedded_schema_correctness, + resultRowLimit=row_limit, ) resp = self.make_request(self._client.ExecuteStatement, req) if async_op: self._handle_execute_response_async(resp, cursor) + return None else: - return self._handle_execute_response(resp, cursor) + execute_response, has_more_rows = self._handle_execute_response( + resp, cursor + ) + + t_row_set = None + if resp.directResults and resp.directResults.resultSet: + t_row_set = resp.directResults.resultSet.results + + return ThriftResultSet( + connection=cursor.connection, + execute_response=execute_response, + thrift_client=self, + buffer_size_bytes=max_bytes, + arraysize=max_rows, + use_cloud_fetch=use_cloud_fetch, + t_row_set=t_row_set, + max_download_threads=self.max_download_threads, + ssl_options=self._ssl_options, + has_more_rows=has_more_rows, + ) - def get_catalogs(self, session_handle, max_rows, max_bytes, cursor): - assert session_handle is not None + def get_catalogs( + self, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, + ) -> ResultSet: + thrift_handle = session_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift session ID") req = ttypes.TGetCatalogsReq( - sessionHandle=session_handle, + sessionHandle=thrift_handle, getDirectResults=ttypes.TSparkGetDirectResults( maxRows=max_rows, maxBytes=max_bytes ), ) resp = self.make_request(self._client.GetCatalogs, req) - return self._handle_execute_response(resp, cursor) + + execute_response, has_more_rows = self._handle_execute_response(resp, cursor) + + t_row_set = None + if resp.directResults and resp.directResults.resultSet: + t_row_set = resp.directResults.resultSet.results + + return ThriftResultSet( + connection=cursor.connection, + execute_response=execute_response, + thrift_client=self, + buffer_size_bytes=max_bytes, + arraysize=max_rows, + use_cloud_fetch=cursor.connection.use_cloud_fetch, + t_row_set=t_row_set, + max_download_threads=self.max_download_threads, + ssl_options=self._ssl_options, + has_more_rows=has_more_rows, + ) def get_schemas( self, - session_handle, - max_rows, - max_bytes, - cursor, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, catalog_name=None, schema_name=None, - ): - assert session_handle is not None + ) -> ResultSet: + from databricks.sql.result_set import ThriftResultSet + + thrift_handle = session_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift session ID") req = ttypes.TGetSchemasReq( - sessionHandle=session_handle, + sessionHandle=thrift_handle, getDirectResults=ttypes.TSparkGetDirectResults( maxRows=max_rows, maxBytes=max_bytes ), @@ -950,23 +1146,45 @@ def get_schemas( schemaName=schema_name, ) resp = self.make_request(self._client.GetSchemas, req) - return self._handle_execute_response(resp, cursor) + + execute_response, has_more_rows = self._handle_execute_response(resp, cursor) + + t_row_set = None + if resp.directResults and resp.directResults.resultSet: + t_row_set = resp.directResults.resultSet.results + + return ThriftResultSet( + connection=cursor.connection, + execute_response=execute_response, + thrift_client=self, + buffer_size_bytes=max_bytes, + arraysize=max_rows, + use_cloud_fetch=cursor.connection.use_cloud_fetch, + t_row_set=t_row_set, + max_download_threads=self.max_download_threads, + ssl_options=self._ssl_options, + has_more_rows=has_more_rows, + ) def get_tables( self, - session_handle, - max_rows, - max_bytes, - cursor, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, catalog_name=None, schema_name=None, table_name=None, table_types=None, - ): - assert session_handle is not None + ) -> ResultSet: + from databricks.sql.result_set import ThriftResultSet + + thrift_handle = session_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift session ID") req = ttypes.TGetTablesReq( - sessionHandle=session_handle, + sessionHandle=thrift_handle, getDirectResults=ttypes.TSparkGetDirectResults( maxRows=max_rows, maxBytes=max_bytes ), @@ -976,23 +1194,45 @@ def get_tables( tableTypes=table_types, ) resp = self.make_request(self._client.GetTables, req) - return self._handle_execute_response(resp, cursor) + + execute_response, has_more_rows = self._handle_execute_response(resp, cursor) + + t_row_set = None + if resp.directResults and resp.directResults.resultSet: + t_row_set = resp.directResults.resultSet.results + + return ThriftResultSet( + connection=cursor.connection, + execute_response=execute_response, + thrift_client=self, + buffer_size_bytes=max_bytes, + arraysize=max_rows, + use_cloud_fetch=cursor.connection.use_cloud_fetch, + t_row_set=t_row_set, + max_download_threads=self.max_download_threads, + ssl_options=self._ssl_options, + has_more_rows=has_more_rows, + ) def get_columns( self, - session_handle, - max_rows, - max_bytes, - cursor, + session_id: SessionId, + max_rows: int, + max_bytes: int, + cursor: Cursor, catalog_name=None, schema_name=None, table_name=None, column_name=None, - ): - assert session_handle is not None + ) -> ResultSet: + from databricks.sql.result_set import ThriftResultSet + + thrift_handle = session_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift session ID") req = ttypes.TGetColumnsReq( - sessionHandle=session_handle, + sessionHandle=thrift_handle, getDirectResults=ttypes.TSparkGetDirectResults( maxRows=max_rows, maxBytes=max_bytes ), @@ -1002,11 +1242,33 @@ def get_columns( columnName=column_name, ) resp = self.make_request(self._client.GetColumns, req) - return self._handle_execute_response(resp, cursor) + + execute_response, has_more_rows = self._handle_execute_response(resp, cursor) + + t_row_set = None + if resp.directResults and resp.directResults.resultSet: + t_row_set = resp.directResults.resultSet.results + + return ThriftResultSet( + connection=cursor.connection, + execute_response=execute_response, + thrift_client=self, + buffer_size_bytes=max_bytes, + arraysize=max_rows, + use_cloud_fetch=cursor.connection.use_cloud_fetch, + t_row_set=t_row_set, + max_download_threads=self.max_download_threads, + ssl_options=self._ssl_options, + has_more_rows=has_more_rows, + ) def _handle_execute_response(self, resp, cursor): - cursor.active_op_handle = resp.operationHandle - self._check_direct_results_for_error(resp.directResults) + command_id = CommandId.from_thrift_handle(resp.operationHandle) + if command_id is None: + raise ValueError(f"Invalid Thrift handle: {resp.operationHandle}") + + cursor.active_command_id = command_id + self._check_direct_results_for_error(resp.directResults, self._host) final_operation_state = self._wait_until_command_done( resp.operationHandle, @@ -1016,28 +1278,35 @@ def _handle_execute_response(self, resp, cursor): return self._results_message_to_execute_response(resp, final_operation_state) def _handle_execute_response_async(self, resp, cursor): - cursor.active_op_handle = resp.operationHandle - self._check_direct_results_for_error(resp.directResults) + command_id = CommandId.from_thrift_handle(resp.operationHandle) + if command_id is None: + raise ValueError(f"Invalid Thrift handle: {resp.operationHandle}") + + cursor.active_command_id = command_id + self._check_direct_results_for_error(resp.directResults, self._host) def fetch_results( self, - op_handle, - max_rows, - max_bytes, - expected_row_start_offset, - lz4_compressed, + command_id: CommandId, + max_rows: int, + max_bytes: int, + expected_row_start_offset: int, + lz4_compressed: bool, arrow_schema_bytes, description, + chunk_id: int, use_cloud_fetch=True, ): - assert op_handle is not None + thrift_handle = command_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift command ID") req = ttypes.TFetchResultsReq( operationHandle=ttypes.TOperationHandle( - op_handle.operationId, - op_handle.operationType, + thrift_handle.operationId, + thrift_handle.operationType, False, - op_handle.modifiedRowCount, + thrift_handle.modifiedRowCount, ), maxRows=max_rows, maxBytes=max_bytes, @@ -1051,10 +1320,11 @@ def fetch_results( raise DataError( "fetch_results failed due to inconsistency in the state between the client and the server. Expected results to start from {} but they instead start at {}, some result batches must have been skipped".format( expected_row_start_offset, resp.results.startRowOffset - ) + ), + host_url=self._host, ) - queue = ResultSetQueueFactory.build_queue( + queue = ThriftResultSetQueueFactory.build_queue( row_set_type=resp.resultSetMetadata.resultFormat, t_row_set=resp.results, arrow_schema_bytes=arrow_schema_bytes, @@ -1062,49 +1332,32 @@ def fetch_results( lz4_compressed=lz4_compressed, description=description, ssl_options=self._ssl_options, + session_id_hex=self._session_id_hex, + statement_id=command_id.to_hex_guid(), + chunk_id=chunk_id, + http_client=self._http_client, ) - return queue, resp.hasMoreRows - - def close_command(self, op_handle): - req = ttypes.TCloseOperationReq(operationHandle=op_handle) - resp = self.make_request(self._client.CloseOperation, req) - return resp.status - - def cancel_command(self, active_op_handle): - logger.debug( - "Cancelling command {}".format( - self.guid_to_hex_id(active_op_handle.operationId.guid) - ) + return ( + queue, + resp.hasMoreRows, + len(resp.results.resultLinks) if resp.results.resultLinks else 0, ) - req = ttypes.TCancelOperationReq(active_op_handle) - self.make_request(self._client.CancelOperation, req) - @staticmethod - def handle_to_id(session_handle): - return session_handle.sessionId.guid - - @staticmethod - def handle_to_hex_id(session_handle: TCLIService.TSessionHandle): - this_uuid = uuid.UUID(bytes=session_handle.sessionId.guid) - return str(this_uuid) - - @staticmethod - def guid_to_hex_id(guid: bytes) -> str: - """Return a hexadecimal string instead of bytes + def cancel_command(self, command_id: CommandId) -> None: + thrift_handle = command_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift command ID") - Example: - IN b'\x01\xee\x1d)\xa4\x19\x1d\xb6\xa9\xc0\x8d\xf1\xfe\xbaB\xdd' - OUT '01ee1d29-a419-1db6-a9c0-8df1feba42dd' - - If conversion to hexadecimal fails, the original bytes are returned - """ + logger.debug("Cancelling command %s", command_id.to_hex_guid()) + req = ttypes.TCancelOperationReq(thrift_handle) + self.make_request(self._client.CancelOperation, req) - this_uuid: Union[bytes, uuid.UUID] + def close_command(self, command_id: CommandId) -> None: + thrift_handle = command_id.to_thrift_handle() + if not thrift_handle: + raise ValueError("Not a valid Thrift command ID") - try: - this_uuid = uuid.UUID(bytes=guid) - except Exception as e: - logger.debug(f"Unable to convert bytes to UUID: {bytes} -- {str(e)}") - this_uuid = guid - return str(this_uuid) + logger.debug("ThriftBackend.close_command(command_id=%s)", command_id) + req = ttypes.TCloseOperationReq(operationHandle=thrift_handle) + self.make_request(self._client.CloseOperation, req) diff --git a/src/databricks/sql/backend/types.py b/src/databricks/sql/backend/types.py new file mode 100644 index 000000000..5708f5e54 --- /dev/null +++ b/src/databricks/sql/backend/types.py @@ -0,0 +1,427 @@ +from dataclasses import dataclass +from enum import Enum +from typing import Dict, List, Optional, Any, Tuple +import logging + +from databricks.sql.backend.utils.guid_utils import guid_to_hex_id +from databricks.sql.telemetry.models.enums import StatementType +from databricks.sql.thrift_api.TCLIService import ttypes + +logger = logging.getLogger(__name__) + + +class CommandState(Enum): + """ + Enum representing the execution state of a command in Databricks SQL. + + This enum maps Thrift operation states to normalized command states, + providing a consistent interface for tracking command execution status + across different backend implementations. + + Attributes: + PENDING: Command is queued or initialized but not yet running + RUNNING: Command is currently executing + SUCCEEDED: Command completed successfully + FAILED: Command failed due to error, timeout, or unknown state + CLOSED: Command has been closed + CANCELLED: Command was cancelled before completion + """ + + PENDING = "PENDING" + RUNNING = "RUNNING" + SUCCEEDED = "SUCCEEDED" + FAILED = "FAILED" + CLOSED = "CLOSED" + CANCELLED = "CANCELLED" + + @classmethod + def from_thrift_state( + cls, state: ttypes.TOperationState + ) -> Optional["CommandState"]: + """ + Convert a Thrift TOperationState to a normalized CommandState. + + Args: + state: A TOperationState from the Thrift API representing the current + state of an operation + + Returns: + CommandState: The corresponding normalized command state + + Raises: + ValueError: If the provided state is not a recognized TOperationState + + State Mappings: + - INITIALIZED_STATE, PENDING_STATE -> PENDING + - RUNNING_STATE -> RUNNING + - FINISHED_STATE -> SUCCEEDED + - ERROR_STATE, TIMEDOUT_STATE, UKNOWN_STATE -> FAILED + - CLOSED_STATE -> CLOSED + - CANCELED_STATE -> CANCELLED + """ + + if state in ( + ttypes.TOperationState.INITIALIZED_STATE, + ttypes.TOperationState.PENDING_STATE, + ): + return cls.PENDING + elif state == ttypes.TOperationState.RUNNING_STATE: + return cls.RUNNING + elif state == ttypes.TOperationState.FINISHED_STATE: + return cls.SUCCEEDED + elif state in ( + ttypes.TOperationState.ERROR_STATE, + ttypes.TOperationState.TIMEDOUT_STATE, + ttypes.TOperationState.UKNOWN_STATE, + ): + return cls.FAILED + elif state == ttypes.TOperationState.CLOSED_STATE: + return cls.CLOSED + elif state == ttypes.TOperationState.CANCELED_STATE: + return cls.CANCELLED + else: + return None + + @classmethod + def from_sea_state(cls, state: str) -> Optional["CommandState"]: + """ + Map SEA state string to CommandState enum. + Args: + state: SEA state string + Returns: + CommandState: The corresponding CommandState enum value + """ + state_mapping = { + "PENDING": cls.PENDING, + "RUNNING": cls.RUNNING, + "SUCCEEDED": cls.SUCCEEDED, + "FAILED": cls.FAILED, + "CLOSED": cls.CLOSED, + "CANCELED": cls.CANCELLED, + } + + return state_mapping.get(state, None) + + +class BackendType(Enum): + """ + Enum representing the type of backend + """ + + THRIFT = "thrift" + SEA = "sea" + + +class SessionId: + """ + A normalized session identifier that works with both Thrift and SEA backends. + + This class abstracts away the differences between Thrift's TSessionHandle and + SEA's session ID string, providing a consistent interface for the connector. + """ + + def __init__( + self, + backend_type: BackendType, + guid: Any, + secret: Optional[Any] = None, + properties: Optional[Dict[str, Any]] = None, + ): + """ + Initialize a SessionId. + + Args: + backend_type: The type of backend (THRIFT or SEA) + guid: The primary identifier for the session + secret: The secret part of the identifier (only used for Thrift) + properties: Additional information about the session + """ + + self.backend_type = backend_type + self.guid = guid + self.secret = secret + self.properties = properties or {} + + def __str__(self) -> str: + """ + Return a string representation of the SessionId. + + For SEA backend, returns the guid. + For Thrift backend, returns a format like "guid|secret". + + Returns: + A string representation of the session ID + """ + + if self.backend_type == BackendType.SEA: + return str(self.guid) + elif self.backend_type == BackendType.THRIFT: + secret_hex = ( + guid_to_hex_id(self.secret) + if isinstance(self.secret, bytes) + else str(self.secret) + ) + return f"{self.hex_guid}|{secret_hex}" + return str(self.guid) + + @classmethod + def from_thrift_handle( + cls, session_handle, properties: Optional[Dict[str, Any]] = None + ): + """ + Create a SessionId from a Thrift session handle. + + Args: + session_handle: A TSessionHandle object from the Thrift API + + Returns: + A SessionId instance + """ + + if session_handle is None: + return None + + guid_bytes = session_handle.sessionId.guid + secret_bytes = session_handle.sessionId.secret + + if session_handle.serverProtocolVersion is not None: + if properties is None: + properties = {} + properties["serverProtocolVersion"] = session_handle.serverProtocolVersion + + return cls(BackendType.THRIFT, guid_bytes, secret_bytes, properties) + + @classmethod + def from_sea_session_id( + cls, session_id: str, properties: Optional[Dict[str, Any]] = None + ): + """ + Create a SessionId from a SEA session ID. + + Args: + session_id: The SEA session ID string + + Returns: + A SessionId instance + """ + + return cls(BackendType.SEA, session_id, properties=properties) + + def to_thrift_handle(self): + """ + Convert this SessionId to a Thrift TSessionHandle. + + Returns: + A TSessionHandle object or None if this is not a Thrift session ID + """ + + if self.backend_type != BackendType.THRIFT: + return None + + from databricks.sql.thrift_api.TCLIService import ttypes + + handle_identifier = ttypes.THandleIdentifier(guid=self.guid, secret=self.secret) + server_protocol_version = self.properties.get("serverProtocolVersion") + return ttypes.TSessionHandle( + sessionId=handle_identifier, serverProtocolVersion=server_protocol_version + ) + + def to_sea_session_id(self): + """ + Get the SEA session ID string. + + Returns: + The session ID string or None if this is not a SEA session ID + """ + + if self.backend_type != BackendType.SEA: + return None + + return self.guid + + @property + def hex_guid(self) -> str: + """ + Get a hexadecimal string representation of the session ID. + + Returns: + A hexadecimal string representation + """ + + if isinstance(self.guid, bytes): + return guid_to_hex_id(self.guid) + else: + return str(self.guid) + + @property + def protocol_version(self): + """ + Get the server protocol version for this session. + + Returns: + The server protocol version or None if it does not exist + It is not expected to exist for SEA sessions. + """ + + return self.properties.get("serverProtocolVersion") + + +class CommandId: + """ + A normalized command identifier that works with both Thrift and SEA backends. + + This class abstracts away the differences between Thrift's TOperationHandle and + SEA's statement ID string, providing a consistent interface for the connector. + """ + + def __init__( + self, + backend_type: BackendType, + guid: Any, + secret: Optional[Any] = None, + operation_type: Optional[int] = None, + has_result_set: bool = False, + modified_row_count: Optional[int] = None, + ): + """ + Initialize a CommandId. + + Args: + backend_type: The type of backend (THRIFT or SEA) + guid: The primary identifier for the command + secret: The secret part of the identifier (only used for Thrift) + operation_type: The operation type (only used for Thrift) + has_result_set: Whether the command has a result set + modified_row_count: The number of rows modified by the command + """ + + self.backend_type = backend_type + self.guid = guid + self.secret = secret + self.operation_type = operation_type + self.has_result_set = has_result_set + self.modified_row_count = modified_row_count + + def __str__(self) -> str: + """ + Return a string representation of the CommandId. + + For SEA backend, returns the guid. + For Thrift backend, returns a format like "guid|secret". + + Returns: + A string representation of the command ID + """ + + if self.backend_type == BackendType.SEA: + return str(self.guid) + elif self.backend_type == BackendType.THRIFT: + secret_hex = ( + guid_to_hex_id(self.secret) + if isinstance(self.secret, bytes) + else str(self.secret) + ) + return f"{self.to_hex_guid()}|{secret_hex}" + return str(self.guid) + + @classmethod + def from_thrift_handle(cls, operation_handle): + """ + Create a CommandId from a Thrift operation handle. + + Args: + operation_handle: A TOperationHandle object from the Thrift API + + Returns: + A CommandId instance + """ + + if operation_handle is None: + return None + + guid_bytes = operation_handle.operationId.guid + secret_bytes = operation_handle.operationId.secret + + return cls( + BackendType.THRIFT, + guid_bytes, + secret_bytes, + operation_handle.operationType, + operation_handle.hasResultSet, + operation_handle.modifiedRowCount, + ) + + @classmethod + def from_sea_statement_id(cls, statement_id: str): + """ + Create a CommandId from a SEA statement ID. + + Args: + statement_id: The SEA statement ID string + + Returns: + A CommandId instance + """ + + return cls(BackendType.SEA, statement_id) + + def to_thrift_handle(self): + """ + Convert this CommandId to a Thrift TOperationHandle. + + Returns: + A TOperationHandle object or None if this is not a Thrift command ID + """ + + if self.backend_type != BackendType.THRIFT: + return None + + from databricks.sql.thrift_api.TCLIService import ttypes + + handle_identifier = ttypes.THandleIdentifier(guid=self.guid, secret=self.secret) + return ttypes.TOperationHandle( + operationId=handle_identifier, + operationType=self.operation_type, + hasResultSet=self.has_result_set, + modifiedRowCount=self.modified_row_count, + ) + + def to_sea_statement_id(self): + """ + Get the SEA statement ID string. + + Returns: + The statement ID string or None if this is not a SEA statement ID + """ + + if self.backend_type != BackendType.SEA: + return None + + return self.guid + + def to_hex_guid(self) -> str: + """ + Get a hexadecimal string representation of the command ID. + + Returns: + A hexadecimal string representation + """ + + if isinstance(self.guid, bytes): + return guid_to_hex_id(self.guid) + else: + return str(self.guid) + + +@dataclass +class ExecuteResponse: + """Response from executing a SQL command.""" + + command_id: CommandId + status: CommandState + description: List[Tuple] + has_been_closed_server_side: bool = False + lz4_compressed: bool = True + is_staging_operation: bool = False + arrow_schema_bytes: Optional[bytes] = None + result_format: Optional[Any] = None diff --git a/src/databricks/sql/backend/utils/__init__.py b/src/databricks/sql/backend/utils/__init__.py new file mode 100644 index 000000000..3d601e5e6 --- /dev/null +++ b/src/databricks/sql/backend/utils/__init__.py @@ -0,0 +1,3 @@ +from .guid_utils import guid_to_hex_id + +__all__ = ["guid_to_hex_id"] diff --git a/src/databricks/sql/backend/utils/guid_utils.py b/src/databricks/sql/backend/utils/guid_utils.py new file mode 100644 index 000000000..a6cb0e0db --- /dev/null +++ b/src/databricks/sql/backend/utils/guid_utils.py @@ -0,0 +1,23 @@ +import uuid +import logging + +logger = logging.getLogger(__name__) + + +def guid_to_hex_id(guid: bytes) -> str: + """Return a hexadecimal string instead of bytes + + Example: + IN b'\x01\xee\x1d)\xa4\x19\x1d\xb6\xa9\xc0\x8d\xf1\xfe\xbaB\xdd' + OUT '01ee1d29-a419-1db6-a9c0-8df1feba42dd' + + If conversion to hexadecimal fails, a string representation of the original + bytes is returned + """ + + try: + this_uuid = uuid.UUID(bytes=guid) + except Exception as e: + logger.debug("Unable to convert bytes to UUID: %r -- %s", guid, str(e)) + return str(guid) + return str(this_uuid) diff --git a/src/databricks/sql/client.py b/src/databricks/sql/client.py index aefed1ef0..fe52f0c79 100755 --- a/src/databricks/sql/client.py +++ b/src/databricks/sql/client.py @@ -1,16 +1,15 @@ import time -from typing import Dict, Tuple, List, Optional, Any, Union, Sequence - +from typing import Dict, Tuple, List, Optional, Any, Union, Sequence, BinaryIO import pandas try: import pyarrow except ImportError: pyarrow = None -import requests import json import os import decimal +from urllib.parse import urlparse from uuid import UUID from databricks.sql import __version__ @@ -19,16 +18,25 @@ OperationalError, SessionAlreadyClosedError, CursorAlreadyClosedError, + InterfaceError, + NotSupportedError, + ProgrammingError, + TransactionError, + DatabaseError, ) + from databricks.sql.thrift_api.TCLIService import ttypes -from databricks.sql.thrift_backend import ThriftBackend +from databricks.sql.backend.thrift_backend import ThriftDatabricksClient +from databricks.sql.backend.databricks_client import DatabricksClient from databricks.sql.utils import ( - ExecuteResponse, ParamEscaper, inject_parameters, transform_paramstyle, ColumnTable, ColumnQueue, + build_client_context, + get_session_config_value, + serialize_query_tags, ) from databricks.sql.parameters.native import ( DbsqlParameterBase, @@ -41,24 +49,51 @@ ParameterApproach, ) - +from databricks.sql.result_set import ResultSet, ThriftResultSet from databricks.sql.types import Row, SSLOptions from databricks.sql.auth.auth import get_python_sql_connector_auth_provider from databricks.sql.experimental.oauth_persistence import OAuthPersistence +from databricks.sql.session import Session +from databricks.sql.backend.types import CommandId, BackendType, CommandState, SessionId + +from databricks.sql.auth.common import ClientContext +from databricks.sql.common.unified_http_client import UnifiedHttpClient +from databricks.sql.common.http import HttpMethod from databricks.sql.thrift_api.TCLIService.ttypes import ( + TOpenSessionResp, TSparkParameter, TOperationState, ) - +from databricks.sql.telemetry.telemetry_client import ( + TelemetryHelper, + TelemetryClientFactory, +) +from databricks.sql.telemetry.models.enums import DatabricksClientType +from databricks.sql.telemetry.models.event import ( + DriverConnectionParameters, + HostDetails, +) +from databricks.sql.telemetry.latency_logger import log_latency +from databricks.sql.telemetry.models.enums import StatementType logger = logging.getLogger(__name__) +if pyarrow is None: + logger.warning( + "[WARN] pyarrow is not installed by default since databricks-sql-connector 4.0.0," + "any arrow specific api (e.g. fetchmany_arrow) and cloud fetch will be disabled." + "If you need these features, please run pip install pyarrow or pip install databricks-sql-connector[pyarrow] to install" + ) + DEFAULT_RESULT_BUFFER_SIZE_BYTES = 104857600 DEFAULT_ARRAY_SIZE = 100000 NO_NATIVE_PARAMS: List = [] +# Transaction isolation level constants (extension to PEP 249) +TRANSACTION_ISOLATION_LEVEL_REPEATABLE_READ = "REPEATABLE_READ" + class Connection: def __init__( @@ -71,12 +106,18 @@ def __init__( catalog: Optional[str] = None, schema: Optional[str] = None, _use_arrow_native_complex_types: Optional[bool] = True, + ignore_transactions: bool = True, + query_tags: Optional[Dict[str, Optional[str]]] = None, **kwargs, ) -> None: """ Connect to a Databricks SQL endpoint or a Databricks cluster. Parameters: + :param use_sea: `bool`, optional (default is False) + Use the SEA backend instead of the Thrift backend. + :param use_hybrid_disposition: `bool`, optional (default is False) + Use the hybrid disposition instead of the inline disposition. :param server_hostname: Databricks instance host name. :param http_path: Http path either to a DBSQL endpoint (e.g. /sql/1.0/endpoints/1234567890abcdef) or to a DBR interactive cluster (e.g. /sql/protocolv1/o/1234567890123456/1234-123456-slid123) @@ -115,6 +156,9 @@ def __init__( port of the oauth redirect uri (localhost). This is required when custom oauth client_id `oauth_client_id` is set + user_agent_entry: `str`, optional + A custom tag to append to the User-Agent header. This is typically used by partners to identify their applications.. If not specified, it will use the default user agent PyDatabricksSqlConnector + experimental_oauth_persistence: configures preferred storage for persisting oauth tokens. This has to be a class implementing `OAuthPersistence`. When `auth_type` is set to `databricks-oauth` or `azure-oauth` without persisting the oauth token in a @@ -166,11 +210,26 @@ def read(self) -> Optional[OAuthToken]: 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. + :param enable_metric_view_metadata: `bool`, optional (default is False) + When True, enables metric view metadata support by setting the + spark.sql.thriftserver.metadata.metricview.enabled session configuration. + This allows + 1. cursor.tables() to return METRIC_VIEW table type + 2. cursor.columns() to return "measure" column type + :param fetch_autocommit_from_server: `bool`, optional (default is False) + When True, the connection.autocommit property queries the server for current state + using SET AUTOCOMMIT instead of returning cached value. + Set to True if autocommit might be changed by external means (e.g., external SQL commands). + When False (default), uses cached state for better performance. + :param ignore_transactions: `bool`, optional (default is True) + When True, transaction-related operations behave as follows: + - commit(): no-op (does nothing) + - rollback(): raises NotSupportedError + - autocommit setter: no-op (does nothing) + When False, transaction operations execute normally. """ # Internal arguments in **kwargs: - # _user_agent_entry - # Tag to add to User-Agent header. For use by partners. # _use_cert_as_auth # Use a TLS cert instead of a token # _enable_ssl @@ -206,64 +265,150 @@ def read(self) -> Optional[OAuthToken]: # use_cloud_fetch # Enable use of cloud fetch to extract large query results in parallel via cloud storage + logger.debug( + "Connection.__init__(server_hostname=%s, http_path=%s)", + server_hostname, + http_path, + ) + if access_token: access_token_kv = {"access_token": access_token} kwargs = {**kwargs, **access_token_kv} - self.open = False - self.host = server_hostname - self.port = kwargs.get("_port", 443) + enable_metric_view_metadata = kwargs.get("enable_metric_view_metadata", False) + if enable_metric_view_metadata: + if session_configuration is None: + session_configuration = {} + session_configuration[ + "spark.sql.thriftserver.metadata.metricview.enabled" + ] = "true" + + if query_tags is not None: + if session_configuration is None: + session_configuration = {} + serialized = serialize_query_tags(query_tags) + if serialized: + session_configuration["QUERY_TAGS"] = serialized + else: + session_configuration.pop("QUERY_TAGS", None) + self.disable_pandas = kwargs.get("_disable_pandas", False) self.lz4_compression = kwargs.get("enable_query_result_lz4_compression", True) - - auth_provider = get_python_sql_connector_auth_provider( - server_hostname, **kwargs + self.use_cloud_fetch = kwargs.get("use_cloud_fetch", True) + self._cursors = [] # type: List[Cursor] + self.telemetry_batch_size = kwargs.get( + "telemetry_batch_size", TelemetryClientFactory.DEFAULT_BATCH_SIZE ) - if not kwargs.get("_user_agent_entry"): - useragent_header = "{}/{}".format(USER_AGENT_NAME, __version__) - else: - useragent_header = "{}/{} ({})".format( - USER_AGENT_NAME, __version__, kwargs.get("_user_agent_entry") + client_context = build_client_context(server_hostname, __version__, **kwargs) + self.http_client = UnifiedHttpClient(client_context) + + try: + self.session = Session( + server_hostname, + http_path, + self.http_client, + http_headers, + session_configuration, + catalog, + schema, + _use_arrow_native_complex_types, + **kwargs, ) + self.session.open() + except Exception as e: + # Respect user's telemetry preference even during connection failure + enable_telemetry = kwargs.get("enable_telemetry", True) + TelemetryClientFactory.connection_failure_log( + error_name="Exception", + error_message=str(e), + host_url=server_hostname, + http_path=http_path, + port=kwargs.get("_port", 443), + client_context=client_context, + user_agent=self.session.useragent_header + if hasattr(self, "session") + else None, + enable_telemetry=enable_telemetry, + ) + raise e - base_headers = [("User-Agent", useragent_header)] - - self._ssl_options = SSLOptions( - # Double negation is generally a bad thing, but we have to keep backward compatibility - tls_verify=not kwargs.get( - "_tls_no_verify", False - ), # by default - verify cert and host - tls_verify_hostname=kwargs.get("_tls_verify_hostname", True), - tls_trusted_ca_file=kwargs.get("_tls_trusted_ca_file"), - tls_client_cert_file=kwargs.get("_tls_client_cert_file"), - tls_client_cert_key_file=kwargs.get("_tls_client_cert_key_file"), - tls_client_cert_key_password=kwargs.get("_tls_client_cert_key_password"), + self.use_inline_params = self._set_use_inline_params_with_warning( + kwargs.get("use_inline_params", False) + ) + self.staging_allowed_local_path = kwargs.get("staging_allowed_local_path", None) + self._fetch_autocommit_from_server = kwargs.get( + "fetch_autocommit_from_server", False + ) + self.ignore_transactions = ignore_transactions + + self.force_enable_telemetry = kwargs.get("force_enable_telemetry", False) + self.enable_telemetry = kwargs.get("enable_telemetry", True) + self.telemetry_enabled = TelemetryHelper.is_telemetry_enabled(self) + + TelemetryClientFactory.initialize_telemetry_client( + telemetry_enabled=self.telemetry_enabled, + session_id_hex=self.get_session_id_hex(), + auth_provider=self.session.auth_provider, + host_url=self.session.host, + batch_size=self.telemetry_batch_size, + client_context=client_context, + extra_headers=self.session.get_spog_headers(), ) - self.thrift_backend = ThriftBackend( - self.host, - self.port, - http_path, - (http_headers or []) + base_headers, - auth_provider, - ssl_options=self._ssl_options, - _use_arrow_native_complex_types=_use_arrow_native_complex_types, - **kwargs, + self._telemetry_client = TelemetryClientFactory.get_telemetry_client( + host_url=self.session.host ) - self._open_session_resp = self.thrift_backend.open_session( - session_configuration, catalog, schema + # Determine proxy usage + use_proxy = self.http_client.using_proxy() + proxy_host_info = None + if ( + use_proxy + and self.http_client.proxy_uri + and isinstance(self.http_client.proxy_uri, str) + ): + parsed = urlparse(self.http_client.proxy_uri) + proxy_host_info = HostDetails( + host_url=parsed.hostname or self.http_client.proxy_uri, + port=parsed.port or 8080, + ) + + driver_connection_params = DriverConnectionParameters( + http_path=http_path, + mode=DatabricksClientType.SEA + if self.session.use_sea + else DatabricksClientType.THRIFT, + host_info=HostDetails(host_url=server_hostname, port=self.session.port), + auth_mech=TelemetryHelper.get_auth_mechanism(self.session.auth_provider), + auth_flow=TelemetryHelper.get_auth_flow(self.session.auth_provider), + socket_timeout=kwargs.get("_socket_timeout", None), + azure_workspace_resource_id=kwargs.get("azure_workspace_resource_id", None), + azure_tenant_id=kwargs.get("azure_tenant_id", None), + use_proxy=use_proxy, + use_system_proxy=use_proxy, + proxy_host_info=proxy_host_info, + use_cf_proxy=False, # CloudFlare proxy not yet supported in Python + cf_proxy_host_info=None, # CloudFlare proxy not yet supported in Python + non_proxy_hosts=None, + allow_self_signed_support=kwargs.get("_tls_no_verify", False), + use_system_trust_store=True, # Python uses system SSL by default + enable_arrow=pyarrow is not None, + enable_direct_results=True, # Always enabled in Python + enable_sea_hybrid_results=kwargs.get("use_hybrid_disposition", False), + http_connection_pool_size=kwargs.get("pool_maxsize", None), + rows_fetched_per_block=DEFAULT_ARRAY_SIZE, + async_poll_interval_millis=2000, # Default polling interval + support_many_parameters=True, # Native parameters supported + enable_complex_datatype_support=_use_arrow_native_complex_types, + allowed_volume_ingestion_paths=self.staging_allowed_local_path, + query_tags=get_session_config_value(session_configuration, "query_tags"), ) - 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.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) + self._telemetry_client.export_initial_telemetry_log( + driver_connection_params=driver_connection_params, + user_agent=self.session.useragent_header, + session_id=self.get_session_id_hex(), ) def _set_use_inline_params_with_warning(self, value: Union[bool, str]): @@ -313,53 +458,70 @@ def __del__(self): logger.debug("Couldn't close unclosed connection: {}".format(e.message)) def get_session_id(self): - return self.thrift_backend.handle_to_id(self._session_handle) + """Get the raw session ID (backend-specific)""" + return self.session.guid - @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 + def get_session_id_hex(self): + """Get the session ID in hex format""" + return self.session.guid_hex @staticmethod def server_parameterized_queries_enabled(protocolVersion): - if ( - protocolVersion - and protocolVersion >= ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8 - ): - return True - else: - return False + """Check if parameterized queries are enabled for the given protocol version""" + return Session.server_parameterized_queries_enabled(protocolVersion) - def get_session_id_hex(self): - return self.thrift_backend.handle_to_hex_id(self._session_handle) + @property + def protocol_version(self): + """Get the protocol version from the Session object""" + return self.session.protocol_version + + @staticmethod + def get_protocol_version(openSessionResp: TOpenSessionResp): + """Get the protocol version from the OpenSessionResp object""" + properties = ( + {"serverProtocolVersion": openSessionResp.serverProtocolVersion} + if openSessionResp.serverProtocolVersion + else {} + ) + session_id = SessionId.from_thrift_handle( + openSessionResp.sessionHandle, properties + ) + return Session.get_protocol_version(session_id) + + @property + def open(self) -> bool: + """Return whether the connection is open by checking if the session is open.""" + return self.session.is_open def cursor( self, arraysize: int = DEFAULT_ARRAY_SIZE, buffer_size_bytes: int = DEFAULT_RESULT_BUFFER_SIZE_BYTES, + row_limit: Optional[int] = None, ) -> "Cursor": """ + Args: + arraysize: The maximum number of rows in direct results. + buffer_size_bytes: The maximum number of bytes in direct results. + row_limit: The maximum number of rows in the result. + Return a new Cursor object using the connection. Will throw an Error if the connection has been closed. """ if not self.open: - raise Error("Cannot create cursor from closed connection") + raise InterfaceError( + "Cannot create cursor from closed connection", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) cursor = Cursor( self, - self.thrift_backend, + self.session.backend, arraysize=arraysize, result_buffer_size_bytes=buffer_size_bytes, + row_limit=row_limit, ) self._cursors.append(cursor) return cursor @@ -373,44 +535,320 @@ def _close(self, close_cursors=True) -> None: for cursor in self._cursors: cursor.close() - logger.info(f"Closing session {self.get_session_id_hex()}") + try: + self.session.close() + except Exception as e: + logger.error(f"Attempt to close session raised a local exception: {e}") + + TelemetryClientFactory.close(host_url=self.session.host) + + # Close HTTP client that was created by this connection + if self.http_client: + self.http_client.close() + + @property + def autocommit(self) -> bool: + """ + Get auto-commit mode for this connection. + + Extension to PEP 249. Returns cached value by default. + If fetch_autocommit_from_server=True was set during connection, + queries server for current state. + + Returns: + bool: True if auto-commit is enabled, False otherwise + + Raises: + InterfaceError: If connection is closed + TransactionError: If fetch_autocommit_from_server=True and query fails + """ if not self.open: - logger.debug("Session appears to have been closed already") + raise InterfaceError( + "Cannot get autocommit on closed connection", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) + + if self._fetch_autocommit_from_server: + return self._fetch_autocommit_state_from_server() + return self.session.get_autocommit() + + @autocommit.setter + def autocommit(self, value: bool) -> None: + """ + Set auto-commit mode for this connection. + + Extension to PEP 249. Executes SET AUTOCOMMIT command on server. + + Args: + value: True to enable auto-commit, False to disable + + When ignore_transactions is True: + - This method is a no-op (does nothing) + + Raises: + InterfaceError: If connection is closed + TransactionError: If server rejects the change + """ + # No-op when ignore_transactions is True + if self.ignore_transactions: + return + + if not self.open: + raise InterfaceError( + "Cannot set autocommit on closed connection", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) + + # Create internal cursor for transaction control + cursor = None try: - self.thrift_backend.close_session(self._session_handle) - except RequestError as e: - if isinstance(e.args[1], SessionAlreadyClosedError): - logger.info("Session was closed by a prior request") + cursor = self.cursor() + sql = f"SET AUTOCOMMIT = {'TRUE' if value else 'FALSE'}" + cursor.execute(sql) + + # Update cached state on success + self.session.set_autocommit(value) + except DatabaseError as e: - if "Invalid SessionHandle" in str(e): - logger.warning( - f"Attempted to close session that was already closed: {e}" - ) - else: - logger.warning( - f"Attempt to close session raised an exception at the server: {e}" + # Wrap in TransactionError with context + raise TransactionError( + f"Failed to set autocommit to {value}: {e.message}", + context={ + **e.context, + "operation": "set_autocommit", + "autocommit_value": value, + }, + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) from e + finally: + if cursor: + cursor.close() + + def _fetch_autocommit_state_from_server(self) -> bool: + """ + Query server for current autocommit state using SET AUTOCOMMIT. + + Returns: + bool: Server's autocommit state + + Raises: + TransactionError: If query fails + """ + cursor = None + try: + cursor = self.cursor() + cursor.execute("SET AUTOCOMMIT") + + # Fetch result: should return row with value column + result = cursor.fetchone() + if result is None: + raise TransactionError( + "No result returned from SET AUTOCOMMIT query", + context={"operation": "fetch_autocommit"}, + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), ) - except Exception as e: - logger.error(f"Attempt to close session raised a local exception: {e}") - self.open = False + # Parse value (first column should be "true" or "false") + value_str = str(result[0]).lower() + autocommit_state = value_str == "true" - def commit(self): - """No-op because Databricks does not support transactions""" - pass + # Update cache + self.session.set_autocommit(autocommit_state) + + return autocommit_state + + except TransactionError: + # Re-raise TransactionError as-is + raise + except DatabaseError as e: + # Wrap other DatabaseErrors + raise TransactionError( + f"Failed to fetch autocommit state from server: {e.message}", + context={**e.context, "operation": "fetch_autocommit"}, + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) from e + finally: + if cursor: + cursor.close() + + def commit(self) -> None: + """ + Commit the current transaction. + + Per PEP 249. Should be called only when autocommit is disabled. + + When autocommit is False: + - Commits the current transaction + - Server automatically starts new transaction + + When autocommit is True: + - Server may throw error if no active transaction + + When ignore_transactions is True: + - This method is a no-op (does nothing) + + Raises: + InterfaceError: If connection is closed + TransactionError: If commit fails (e.g., no active transaction) + """ + # No-op when ignore_transactions is True + if self.ignore_transactions: + return + + if not self.open: + raise InterfaceError( + "Cannot commit on closed connection", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) + + cursor = None + try: + cursor = self.cursor() + cursor.execute("COMMIT") + + except DatabaseError as e: + raise TransactionError( + f"Failed to commit transaction: {e.message}", + context={**e.context, "operation": "commit"}, + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) from e + finally: + if cursor: + cursor.close() + + def rollback(self) -> None: + """ + Rollback the current transaction. - def rollback(self): - raise NotSupportedError("Transactions are not supported on Databricks") + Per PEP 249. Should be called only when autocommit is disabled. + + When autocommit is False: + - Rolls back the current transaction + - Server automatically starts new transaction + + When autocommit is True: + - ROLLBACK is forgiving (no-op, doesn't throw exception) + + When ignore_transactions is True: + - Raises NotSupportedError + + Note: ROLLBACK is safe to call even without active transaction. + + Raises: + InterfaceError: If connection is closed + NotSupportedError: If ignore_transactions is True + TransactionError: If rollback fails + """ + # Raise NotSupportedError when ignore_transactions is True + if self.ignore_transactions: + raise NotSupportedError( + "Transactions are not supported on Databricks", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) + + if not self.open: + raise InterfaceError( + "Cannot rollback on closed connection", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) + + cursor = None + try: + cursor = self.cursor() + cursor.execute("ROLLBACK") + + except DatabaseError as e: + raise TransactionError( + f"Failed to rollback transaction: {e.message}", + context={**e.context, "operation": "rollback"}, + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) from e + finally: + if cursor: + cursor.close() + + def get_transaction_isolation(self) -> str: + """ + Get the transaction isolation level. + + Extension to PEP 249. + + Databricks supports REPEATABLE_READ isolation level (Snapshot Isolation), + which is the default and only supported level. + + Returns: + str: "REPEATABLE_READ" - the transaction isolation level constant + + Raises: + InterfaceError: If connection is closed + """ + if not self.open: + raise InterfaceError( + "Cannot get transaction isolation on closed connection", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) + + return TRANSACTION_ISOLATION_LEVEL_REPEATABLE_READ + + def set_transaction_isolation(self, level: str) -> None: + """ + Set transaction isolation level. + + Extension to PEP 249. + + Databricks supports only REPEATABLE_READ isolation level (Snapshot Isolation). + This method validates that the requested level is supported but does not + execute any SQL, as REPEATABLE_READ is the default server behavior. + + Args: + level: Isolation level. Must be "REPEATABLE_READ" or "REPEATABLE READ" + (case-insensitive, underscores and spaces are interchangeable) + + Raises: + InterfaceError: If connection is closed + NotSupportedError: If isolation level not supported + """ + if not self.open: + raise InterfaceError( + "Cannot set transaction isolation on closed connection", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) + + # Normalize and validate isolation level + normalized_level = level.upper().replace("_", " ") + + if normalized_level != TRANSACTION_ISOLATION_LEVEL_REPEATABLE_READ.replace( + "_", " " + ): + raise NotSupportedError( + f"Setting transaction isolation level '{level}' is not supported. " + f"Only {TRANSACTION_ISOLATION_LEVEL_REPEATABLE_READ} is supported.", + host_url=self.session.host, + session_id_hex=self.get_session_id_hex(), + ) class Cursor: def __init__( self, connection: Connection, - thrift_backend: ThriftBackend, + backend: DatabricksClient, result_buffer_size_bytes: int = DEFAULT_RESULT_BUFFER_SIZE_BYTES, arraysize: int = DEFAULT_ARRAY_SIZE, + row_limit: Optional[int] = None, ) -> None: """ These objects represent a database cursor, which is used to manage the context of a fetch @@ -419,16 +857,19 @@ def __init__( Cursors are not isolated, i.e., any changes done to the database by a cursor are immediately visible by other cursors or connections. """ - self.connection = connection - self.rowcount = -1 # Return -1 as this is not supported - self.buffer_size_bytes = result_buffer_size_bytes + + self.connection: Connection = connection + + self.rowcount: int = -1 # Return -1 as this is not supported + self.buffer_size_bytes: int = result_buffer_size_bytes self.active_result_set: Union[ResultSet, None] = None - self.arraysize = arraysize + self.arraysize: int = arraysize + self.row_limit: Optional[int] = row_limit # Note that Cursor closed => active result set closed, but not vice versa - self.open = True - self.executing_command_id = None - self.thrift_backend = thrift_backend - self.active_op_handle = None + self.open: bool = True + self.executing_command_id: Optional[CommandId] = None + self.backend: DatabricksClient = backend + self.active_command_id: Optional[CommandId] = None self.escaper = ParamEscaper() self.lastrowid = None @@ -446,7 +887,11 @@ def __iter__(self): for row in self.active_result_set: yield row else: - raise Error("There is no active result set") + raise ProgrammingError( + "There is no active result set", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) def _determine_parameter_approach( self, params: Optional[TParameterCollection] @@ -583,10 +1028,16 @@ def _close_and_clear_active_result_set(self): def _check_not_closed(self): if not self.open: - raise Error("Attempting operation on closed cursor") + raise InterfaceError( + "Attempting operation on closed cursor", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) def _handle_staging_operation( - self, staging_allowed_local_path: Union[None, str, List[str]] + self, + staging_allowed_local_path: Union[None, str, List[str]], + input_stream: Optional[BinaryIO] = None, ): """Fetch the HTTP request instruction from a staging ingestion command and call the designated handler. @@ -595,23 +1046,43 @@ def _handle_staging_operation( is not descended from staging_allowed_local_path. """ + assert self.active_result_set is not None + row = self.active_result_set.fetchone() + assert row is not None + + # May be real headers, or could be json string + headers = ( + json.loads(row.headers) if isinstance(row.headers, str) else row.headers + ) + headers = dict(headers) if headers else {} + + # Handle __input_stream__ token for PUT operations + if ( + row.operation == "PUT" + and getattr(row, "localFile", None) == "__input_stream__" + ): + return self._handle_staging_put_stream( + presigned_url=row.presignedUrl, + stream=input_stream, + headers=headers, + ) + + # For non-streaming operations, validate staging_allowed_local_path if isinstance(staging_allowed_local_path, type(str())): _staging_allowed_local_paths = [staging_allowed_local_path] elif isinstance(staging_allowed_local_path, type(list())): _staging_allowed_local_paths = staging_allowed_local_path else: - raise Error( - "You must provide at least one staging_allowed_local_path when initialising a connection to perform ingestion commands" + raise ProgrammingError( + "You must provide at least one staging_allowed_local_path when initialising a connection to perform ingestion commands", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), ) abs_staging_allowed_local_paths = [ os.path.abspath(i) for i in _staging_allowed_local_paths ] - assert self.active_result_set is not None - row = self.active_result_set.fetchone() - assert row is not None - # Must set to None in cases where server response does not include localFile abs_localFile = None @@ -629,23 +1100,22 @@ def _handle_staging_operation( else: continue if not allow_operation: - raise Error( - "Local file operations are restricted to paths within the configured staging_allowed_local_path" + raise ProgrammingError( + "Local file operations are restricted to paths within the configured staging_allowed_local_path", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), ) - # May be real headers, or could be json string - headers = ( - json.loads(row.headers) if isinstance(row.headers, str) else row.headers - ) - handler_args = { "presigned_url": row.presignedUrl, "local_file": abs_localFile, - "headers": dict(headers) or {}, + "headers": headers, } logger.debug( - f"Attempting staging operation indicated by server: {row.operation} - {getattr(row, 'localFile', '')}" + "Attempting staging operation indicated by server: %s - %s", + row.operation, + getattr(row, "localFile", ""), ) # TODO: Create a retry loop here to re-attempt if the request times out or fails @@ -658,11 +1128,14 @@ def _handle_staging_operation( handler_args.pop("local_file") return self._handle_staging_remove(**handler_args) else: - raise Error( + raise ProgrammingError( f"Operation {row.operation} is not supported. " - + "Supported operations are GET, PUT, and REMOVE" + + "Supported operations are GET, PUT, and REMOVE", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), ) + @log_latency(StatementType.SQL) def _handle_staging_put( self, presigned_url: str, local_file: str, headers: Optional[dict] = None ): @@ -672,32 +1145,77 @@ def _handle_staging_put( """ if local_file is None: - raise Error("Cannot perform PUT without specifying a local_file") + raise ProgrammingError( + "Cannot perform PUT without specifying a local_file", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) with open(local_file, "rb") as fh: - r = requests.put(url=presigned_url, data=fh, headers=headers) + r = self.connection.http_client.request( + HttpMethod.PUT, presigned_url, body=fh.read(), headers=headers + ) - # fmt: off - # Design borrowed from: https://stackoverflow.com/a/2342589/5093960 + self._handle_staging_http_response(r) - OK = requests.codes.ok # 200 - CREATED = requests.codes.created # 201 - ACCEPTED = requests.codes.accepted # 202 - NO_CONTENT = requests.codes.no_content # 204 + def _handle_staging_http_response(self, r): + # fmt: off + # HTTP status codes + OK = 200 + CREATED = 201 + ACCEPTED = 202 + NO_CONTENT = 204 # fmt: on - if r.status_code not in [OK, CREATED, NO_CONTENT, ACCEPTED]: - raise Error( - f"Staging operation over HTTP was unsuccessful: {r.status_code}-{r.text}" + if r.status not in [OK, CREATED, NO_CONTENT, ACCEPTED]: + # Decode response data for error message + error_text = r.data.decode() if r.data else "" + raise OperationalError( + f"Staging operation over HTTP was unsuccessful: {r.status}-{error_text}", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), ) - if r.status_code == ACCEPTED: + if r.status == ACCEPTED: logger.debug( f"Response code {ACCEPTED} from server indicates ingestion command was accepted " + "but not yet applied on the server. It's possible this command may fail later." ) + @log_latency(StatementType.SQL) + def _handle_staging_put_stream( + self, + presigned_url: str, + stream: BinaryIO, + headers: dict = {}, + ) -> None: + """Handle PUT operation with streaming data. + + Args: + presigned_url: The presigned URL for upload + stream: Binary stream to upload + headers: HTTP headers + + Raises: + ProgrammingError: If no input stream is provided + OperationalError: If the upload fails + """ + + if not stream: + raise ProgrammingError( + "No input stream provided for streaming operation", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) + + r = self.connection.http_client.request( + HttpMethod.PUT, presigned_url, body=stream.read(), headers=headers + ) + + self._handle_staging_http_response(r) + + @log_latency(StatementType.SQL) def _handle_staging_get( self, local_file: str, presigned_url: str, headers: Optional[dict] = None ): @@ -707,36 +1225,57 @@ def _handle_staging_get( """ if local_file is None: - raise Error("Cannot perform GET without specifying a local_file") + raise ProgrammingError( + "Cannot perform GET without specifying a local_file", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) - r = requests.get(url=presigned_url, headers=headers) + r = self.connection.http_client.request( + HttpMethod.GET, presigned_url, headers=headers + ) # response.ok verifies the status code is not between 400-600. # Any 2xx or 3xx will evaluate r.ok == True - if not r.ok: - raise Error( - f"Staging operation over HTTP was unsuccessful: {r.status_code}-{r.text}" + if r.status >= 400: + # Decode response data for error message + error_text = r.data.decode() if r.data else "" + raise OperationalError( + f"Staging operation over HTTP was unsuccessful: {r.status}-{error_text}", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), ) with open(local_file, "wb") as fp: - fp.write(r.content) + fp.write(r.data) + @log_latency(StatementType.SQL) def _handle_staging_remove( self, presigned_url: str, headers: Optional[dict] = None ): """Make an HTTP DELETE request to the presigned_url""" - r = requests.delete(url=presigned_url, headers=headers) + r = self.connection.http_client.request( + HttpMethod.DELETE, presigned_url, headers=headers + ) - if not r.ok: - raise Error( - f"Staging operation over HTTP was unsuccessful: {r.status_code}-{r.text}" + if r.status >= 400: + # Decode response data for error message + error_text = r.data.decode() if r.data else "" + raise OperationalError( + f"Staging operation over HTTP was unsuccessful: {r.status}-{error_text}", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), ) + @log_latency(StatementType.QUERY) def execute( self, operation: str, parameters: Optional[TParameterCollection] = None, + enforce_embedded_schema_correctness=False, + input_stream: Optional[BinaryIO] = None, + query_tags: Optional[Dict[str, Optional[str]]] = None, ) -> "Cursor": """ Execute a query and wait for execution to complete. @@ -767,9 +1306,17 @@ def execute( Both will result in the query equivalent to "SELECT * FROM table WHERE field = 'foo' being sent to the server + :param query_tags: Optional dictionary of query tags to apply for this query only. + Tags are key-value pairs that can be used to identify and categorize queries. + Example: {"team": "data-eng", "application": "etl"} + :returns self """ + logger.debug( + "Cursor.execute(operation=%s, parameters=%s)", operation, parameters + ) + param_approach = self._determine_parameter_approach(parameters) if param_approach == ParameterApproach.NONE: prepared_params = NO_NATIVE_PARAMS @@ -791,9 +1338,9 @@ def execute( self._check_not_closed() self._close_and_clear_active_result_set() - execute_response = self.thrift_backend.execute_command( + self.active_result_set = self.backend.execute_command( operation=prepared_operation, - session_handle=self.connection._session_handle, + session_id=self.connection.session.session_id, max_rows=self.arraysize, max_bytes=self.buffer_size_bytes, lz4_compression=self.connection.lz4_compression, @@ -801,27 +1348,26 @@ def execute( use_cloud_fetch=self.connection.use_cloud_fetch, parameters=prepared_params, async_op=False, - ) - self.active_result_set = ResultSet( - self.connection, - execute_response, - self.thrift_backend, - self.buffer_size_bytes, - self.arraysize, - self.connection.use_cloud_fetch, + enforce_embedded_schema_correctness=enforce_embedded_schema_correctness, + row_limit=self.row_limit, + query_tags=query_tags, ) - if execute_response.is_staging_operation: + if self.active_result_set and self.active_result_set.is_staging_operation: self._handle_staging_operation( - staging_allowed_local_path=self.thrift_backend.staging_allowed_local_path + staging_allowed_local_path=self.connection.staging_allowed_local_path, + input_stream=input_stream, ) return self + @log_latency(StatementType.QUERY) def execute_async( self, operation: str, parameters: Optional[TParameterCollection] = None, + enforce_embedded_schema_correctness=False, + query_tags: Optional[Dict[str, Optional[str]]] = None, ) -> "Cursor": """ @@ -829,8 +1375,12 @@ def execute_async( :param operation: :param parameters: + :param query_tags: Optional dictionary of query tags to apply for this query only. + Tags are key-value pairs that can be used to identify and categorize queries. + Example: {"team": "data-eng", "application": "etl"} :return: """ + param_approach = self._determine_parameter_approach(parameters) if param_approach == ParameterApproach.NONE: prepared_params = NO_NATIVE_PARAMS @@ -852,9 +1402,9 @@ def execute_async( self._check_not_closed() self._close_and_clear_active_result_set() - self.thrift_backend.execute_command( + self.backend.execute_command( operation=prepared_operation, - session_handle=self.connection._session_handle, + session_id=self.connection.session.session_id, max_rows=self.arraysize, max_bytes=self.buffer_size_bytes, lz4_compression=self.connection.lz4_compression, @@ -862,18 +1412,32 @@ def execute_async( use_cloud_fetch=self.connection.use_cloud_fetch, parameters=prepared_params, async_op=True, + enforce_embedded_schema_correctness=enforce_embedded_schema_correctness, + row_limit=self.row_limit, + query_tags=query_tags, ) return self - def get_query_state(self) -> "TOperationState": + def get_query_state(self) -> CommandState: """ Get the state of the async executing query or basically poll the status of the query :return: """ self._check_not_closed() - return self.thrift_backend.get_query_state(self.active_op_handle) + if self.active_command_id is None: + raise Error("No active command to get state for") + return self.backend.get_query_state(self.active_command_id) + + def is_query_pending(self): + """ + Checks whether the async executing query is in pending state or not + + :return: + """ + operation_state = self.get_query_state() + return operation_state in [CommandState.PENDING, CommandState.RUNNING] def get_async_execution_result(self): """ @@ -884,41 +1448,35 @@ def get_async_execution_result(self): """ self._check_not_closed() - def is_executing(operation_state) -> "bool": - return not operation_state or operation_state in [ - ttypes.TOperationState.RUNNING_STATE, - ttypes.TOperationState.PENDING_STATE, - ] - - while is_executing(self.get_query_state()): + while self.is_query_pending(): # Poll after some default time time.sleep(self.ASYNC_DEFAULT_POLLING_INTERVAL) operation_state = self.get_query_state() - if operation_state == ttypes.TOperationState.FINISHED_STATE: - execute_response = self.thrift_backend.get_execution_result( - self.active_op_handle, self - ) - self.active_result_set = ResultSet( - self.connection, - execute_response, - self.thrift_backend, - self.buffer_size_bytes, - self.arraysize, + if operation_state == CommandState.SUCCEEDED: + self.active_result_set = self.backend.get_execution_result( + self.active_command_id, self ) - if execute_response.is_staging_operation: + if self.active_result_set and self.active_result_set.is_staging_operation: self._handle_staging_operation( - staging_allowed_local_path=self.thrift_backend.staging_allowed_local_path + staging_allowed_local_path=self.connection.staging_allowed_local_path ) return self else: - raise Error( - f"get_execution_result failed with Operation status {operation_state}" + raise OperationalError( + f"get_execution_result failed with Operation status {operation_state}", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), ) - def executemany(self, operation, seq_of_parameters): + def executemany( + self, + operation, + seq_of_parameters, + query_tags: Optional[Dict[str, Optional[str]]] = None, + ): """ Execute the operation once for every set of passed in parameters. @@ -927,12 +1485,17 @@ def executemany(self, operation, seq_of_parameters): Only the final result set is retained. + :param query_tags: Optional dictionary of query tags to apply for all queries in this batch. + Tags are key-value pairs that can be used to identify and categorize queries. + Example: {"team": "data-eng", "application": "etl"} + :returns self """ for parameters in seq_of_parameters: - self.execute(operation, parameters) + self.execute(operation, parameters, query_tags=query_tags) return self + @log_latency(StatementType.METADATA) def catalogs(self) -> "Cursor": """ Get all available catalogs. @@ -941,21 +1504,15 @@ def catalogs(self) -> "Cursor": """ self._check_not_closed() self._close_and_clear_active_result_set() - execute_response = self.thrift_backend.get_catalogs( - session_handle=self.connection._session_handle, + self.active_result_set = self.backend.get_catalogs( + session_id=self.connection.session.session_id, max_rows=self.arraysize, max_bytes=self.buffer_size_bytes, cursor=self, ) - self.active_result_set = ResultSet( - self.connection, - execute_response, - self.thrift_backend, - self.buffer_size_bytes, - self.arraysize, - ) return self + @log_latency(StatementType.METADATA) def schemas( self, catalog_name: Optional[str] = None, schema_name: Optional[str] = None ) -> "Cursor": @@ -967,23 +1524,17 @@ def schemas( """ self._check_not_closed() self._close_and_clear_active_result_set() - execute_response = self.thrift_backend.get_schemas( - session_handle=self.connection._session_handle, + self.active_result_set = self.backend.get_schemas( + session_id=self.connection.session.session_id, max_rows=self.arraysize, max_bytes=self.buffer_size_bytes, cursor=self, catalog_name=catalog_name, schema_name=schema_name, ) - self.active_result_set = ResultSet( - self.connection, - execute_response, - self.thrift_backend, - self.buffer_size_bytes, - self.arraysize, - ) return self + @log_latency(StatementType.METADATA) def tables( self, catalog_name: Optional[str] = None, @@ -1000,8 +1551,8 @@ def tables( self._check_not_closed() self._close_and_clear_active_result_set() - execute_response = self.thrift_backend.get_tables( - session_handle=self.connection._session_handle, + self.active_result_set = self.backend.get_tables( + session_id=self.connection.session.session_id, max_rows=self.arraysize, max_bytes=self.buffer_size_bytes, cursor=self, @@ -1010,15 +1561,9 @@ def tables( table_name=table_name, table_types=table_types, ) - self.active_result_set = ResultSet( - self.connection, - execute_response, - self.thrift_backend, - self.buffer_size_bytes, - self.arraysize, - ) return self + @log_latency(StatementType.METADATA) def columns( self, catalog_name: Optional[str] = None, @@ -1035,8 +1580,8 @@ def columns( self._check_not_closed() self._close_and_clear_active_result_set() - execute_response = self.thrift_backend.get_columns( - session_handle=self.connection._session_handle, + self.active_result_set = self.backend.get_columns( + session_id=self.connection.session.session_id, max_rows=self.arraysize, max_bytes=self.buffer_size_bytes, cursor=self, @@ -1045,13 +1590,6 @@ def columns( table_name=table_name, column_name=column_name, ) - self.active_result_set = ResultSet( - self.connection, - execute_response, - self.thrift_backend, - self.buffer_size_bytes, - self.arraysize, - ) return self def fetchall(self) -> List[Row]: @@ -1065,7 +1603,11 @@ def fetchall(self) -> List[Row]: if self.active_result_set: return self.active_result_set.fetchall() else: - raise Error("There is no active result set") + raise ProgrammingError( + "There is no active result set", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) def fetchone(self) -> Optional[Row]: """ @@ -1079,7 +1621,11 @@ def fetchone(self) -> Optional[Row]: if self.active_result_set: return self.active_result_set.fetchone() else: - raise Error("There is no active result set") + raise ProgrammingError( + "There is no active result set", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) def fetchmany(self, size: int) -> List[Row]: """ @@ -1101,21 +1647,33 @@ def fetchmany(self, size: int) -> List[Row]: if self.active_result_set: return self.active_result_set.fetchmany(size) else: - raise Error("There is no active result set") + raise ProgrammingError( + "There is no active result set", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) def fetchall_arrow(self) -> "pyarrow.Table": self._check_not_closed() if self.active_result_set: return self.active_result_set.fetchall_arrow() else: - raise Error("There is no active result set") + raise ProgrammingError( + "There is no active result set", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) def fetchmany_arrow(self, size) -> "pyarrow.Table": self._check_not_closed() if self.active_result_set: return self.active_result_set.fetchmany_arrow(size) else: - raise Error("There is no active result set") + raise ProgrammingError( + "There is no active result set", + host_url=self.connection.session.host, + session_id_hex=self.connection.get_session_id_hex(), + ) def cancel(self) -> None: """ @@ -1124,8 +1682,8 @@ def cancel(self) -> None: The command should be closed to free resources from the server. This method can be called from another thread. """ - if self.active_op_handle is not None: - self.thrift_backend.cancel_command(self.active_op_handle) + if self.active_command_id is not None: + self.backend.cancel_command(self.active_command_id) else: logger.warning( "Attempting to cancel a command, but there is no " @@ -1135,7 +1693,7 @@ def cancel(self) -> None: def close(self) -> None: """Close cursor""" self.open = False - self.active_op_handle = None + self.active_command_id = None if self.active_result_set: self._close_and_clear_active_result_set() @@ -1147,8 +1705,8 @@ def query_id(self) -> Optional[str]: This attribute will be ``None`` if the cursor has not had an operation invoked via the execute method yet, or if cursor was closed. """ - if self.active_op_handle is not None: - return str(UUID(bytes=self.active_op_handle.operationId.guid)) + if self.active_command_id is not None: + return self.active_command_id.to_hex_guid() return None @property @@ -1193,288 +1751,3 @@ def setinputsizes(self, sizes): def setoutputsize(self, size, column=None): """Does nothing by default""" pass - - -class ResultSet: - def __init__( - self, - connection: Connection, - execute_response: ExecuteResponse, - thrift_backend: ThriftBackend, - result_buffer_size_bytes: int = DEFAULT_RESULT_BUFFER_SIZE_BYTES, - arraysize: int = 10000, - use_cloud_fetch: bool = True, - ): - """ - A ResultSet manages the results of a single command. - - :param connection: The parent connection that was used to execute this command - :param execute_response: A `ExecuteResponse` class returned by a command execution - :param result_buffer_size_bytes: The size (in bytes) of the internal buffer + max fetch - amount :param arraysize: The max number of rows to fetch at a time (PEP-249) - """ - self.connection = connection - self.command_id = execute_response.command_handle - self.op_state = execute_response.status - self.has_been_closed_server_side = execute_response.has_been_closed_server_side - self.has_more_rows = execute_response.has_more_rows - self.buffer_size_bytes = result_buffer_size_bytes - self.lz4_compressed = execute_response.lz4_compressed - self.arraysize = arraysize - self.thrift_backend = thrift_backend - self.description = execute_response.description - self._arrow_schema_bytes = execute_response.arrow_schema_bytes - self._next_row_index = 0 - self._use_cloud_fetch = use_cloud_fetch - - if execute_response.arrow_queue: - # In this case the server has taken the fast path and returned an initial batch of - # results - self.results = execute_response.arrow_queue - else: - # In this case, there are results waiting on the server so we fetch now for simplicity - self._fill_results_buffer() - - def __iter__(self): - while True: - row = self.fetchone() - if row: - yield row - else: - break - - def _fill_results_buffer(self): - # At initialization or if the server does not have cloud fetch result links available - results, has_more_rows = self.thrift_backend.fetch_results( - op_handle=self.command_id, - max_rows=self.arraysize, - max_bytes=self.buffer_size_bytes, - expected_row_start_offset=self._next_row_index, - lz4_compressed=self.lz4_compressed, - arrow_schema_bytes=self._arrow_schema_bytes, - description=self.description, - use_cloud_fetch=self._use_cloud_fetch, - ) - self.results = results - self.has_more_rows = has_more_rows - - def _convert_columnar_table(self, table): - column_names = [c[0] for c in self.description] - ResultRow = Row(*column_names) - result = [] - for row_index in range(table.num_rows): - curr_row = [] - for col_index in range(table.num_columns): - curr_row.append(table.get_item(col_index, row_index)) - result.append(ResultRow(*curr_row)) - - return result - - def _convert_arrow_table(self, table): - column_names = [c[0] for c in self.description] - ResultRow = Row(*column_names) - - if self.connection.disable_pandas is True: - return [ - ResultRow(*[v.as_py() for v in r]) for r in zip(*table.itercolumns()) - ] - - # Need to use nullable types, as otherwise type can change when there are missing values. - # See https://arrow.apache.org/docs/python/pandas.html#nullable-types - # NOTE: This api is epxerimental https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html - dtype_mapping = { - pyarrow.int8(): pandas.Int8Dtype(), - pyarrow.int16(): pandas.Int16Dtype(), - pyarrow.int32(): pandas.Int32Dtype(), - pyarrow.int64(): pandas.Int64Dtype(), - pyarrow.uint8(): pandas.UInt8Dtype(), - pyarrow.uint16(): pandas.UInt16Dtype(), - pyarrow.uint32(): pandas.UInt32Dtype(), - pyarrow.uint64(): pandas.UInt64Dtype(), - pyarrow.bool_(): pandas.BooleanDtype(), - pyarrow.float32(): pandas.Float32Dtype(), - pyarrow.float64(): pandas.Float64Dtype(), - pyarrow.string(): pandas.StringDtype(), - } - - # Need to rename columns, as the to_pandas function cannot handle duplicate column names - table_renamed = table.rename_columns([str(c) for c in range(table.num_columns)]) - df = table_renamed.to_pandas( - types_mapper=dtype_mapping.get, - date_as_object=True, - timestamp_as_object=True, - ) - - res = df.to_numpy(na_value=None, dtype="object") - return [ResultRow(*v) for v in res] - - @property - def rownumber(self): - return self._next_row_index - - def fetchmany_arrow(self, size: int) -> "pyarrow.Table": - """ - Fetch the next set of rows of a query result, returning a PyArrow table. - - An empty sequence is returned when no more rows are available. - """ - if size < 0: - raise ValueError("size argument for fetchmany is %s but must be >= 0", size) - results = self.results.next_n_rows(size) - n_remaining_rows = size - results.num_rows - self._next_row_index += results.num_rows - - while ( - n_remaining_rows > 0 - and not self.has_been_closed_server_side - and self.has_more_rows - ): - self._fill_results_buffer() - partial_results = self.results.next_n_rows(n_remaining_rows) - results = pyarrow.concat_tables([results, partial_results]) - n_remaining_rows -= partial_results.num_rows - self._next_row_index += partial_results.num_rows - - return results - - def merge_columnar(self, result1, result2): - """ - Function to merge / combining the columnar results into a single result - :param result1: - :param result2: - :return: - """ - - if result1.column_names != result2.column_names: - raise ValueError("The columns in the results don't match") - - merged_result = [ - result1.column_table[i] + result2.column_table[i] - for i in range(result1.num_columns) - ] - return ColumnTable(merged_result, result1.column_names) - - def fetchmany_columnar(self, size: int): - """ - Fetch the next set of rows of a query result, returning a Columnar Table. - An empty sequence is returned when no more rows are available. - """ - if size < 0: - raise ValueError("size argument for fetchmany is %s but must be >= 0", size) - - results = self.results.next_n_rows(size) - n_remaining_rows = size - results.num_rows - self._next_row_index += results.num_rows - - while ( - n_remaining_rows > 0 - and not self.has_been_closed_server_side - and self.has_more_rows - ): - self._fill_results_buffer() - partial_results = self.results.next_n_rows(n_remaining_rows) - results = self.merge_columnar(results, partial_results) - n_remaining_rows -= partial_results.num_rows - self._next_row_index += partial_results.num_rows - - return results - - def fetchall_arrow(self) -> "pyarrow.Table": - """Fetch all (remaining) rows of a query result, returning them as a PyArrow table.""" - results = self.results.remaining_rows() - self._next_row_index += results.num_rows - - while not self.has_been_closed_server_side and self.has_more_rows: - self._fill_results_buffer() - partial_results = self.results.remaining_rows() - results = pyarrow.concat_tables([results, partial_results]) - self._next_row_index += partial_results.num_rows - - return results - - def fetchall_columnar(self): - """Fetch all (remaining) rows of a query result, returning them as a Columnar table.""" - results = self.results.remaining_rows() - self._next_row_index += results.num_rows - - while not self.has_been_closed_server_side and self.has_more_rows: - self._fill_results_buffer() - partial_results = self.results.remaining_rows() - results = self.merge_columnar(results, partial_results) - self._next_row_index += partial_results.num_rows - - return results - - def fetchone(self) -> Optional[Row]: - """ - Fetch the next row of a query result set, returning a single sequence, - or None when no more data is available. - """ - - if isinstance(self.results, ColumnQueue): - res = self._convert_columnar_table(self.fetchmany_columnar(1)) - else: - res = self._convert_arrow_table(self.fetchmany_arrow(1)) - - if len(res) > 0: - return res[0] - else: - return None - - def fetchall(self) -> List[Row]: - """ - Fetch all (remaining) rows of a query result, returning them as a list of rows. - """ - if isinstance(self.results, ColumnQueue): - return self._convert_columnar_table(self.fetchall_columnar()) - else: - return self._convert_arrow_table(self.fetchall_arrow()) - - def fetchmany(self, size: int) -> List[Row]: - """ - Fetch the next set of rows of a query result, returning a list of rows. - - An empty sequence is returned when no more rows are available. - """ - if isinstance(self.results, ColumnQueue): - return self._convert_columnar_table(self.fetchmany_columnar(size)) - else: - return self._convert_arrow_table(self.fetchmany_arrow(size)) - - def close(self) -> None: - """ - Close the cursor. - - If the connection has not been closed, and the cursor has not already - been closed on the server for some other reason, issue a request to the server to close it. - """ - try: - if ( - self.op_state != self.thrift_backend.CLOSED_OP_STATE - and not self.has_been_closed_server_side - and self.connection.open - ): - self.thrift_backend.close_command(self.command_id) - except RequestError as e: - if isinstance(e.args[1], CursorAlreadyClosedError): - logger.info("Operation was canceled by a prior request") - finally: - self.has_been_closed_server_side = True - self.op_state = self.thrift_backend.CLOSED_OP_STATE - - @staticmethod - def _get_schema_description(table_schema_message): - """ - Takes a TableSchema message and returns a description 7-tuple as specified by PEP-249 - """ - - def map_col_type(type_): - if type_.startswith("decimal"): - return "decimal" - else: - return type_ - - return [ - (column.name, map_col_type(column.datatype), None, None, None, None, None) - for column in table_schema_message.columns - ] diff --git a/src/databricks/sql/cloudfetch/download_manager.py b/src/databricks/sql/cloudfetch/download_manager.py index 7e96cd323..27265720f 100644 --- a/src/databricks/sql/cloudfetch/download_manager.py +++ b/src/databricks/sql/cloudfetch/download_manager.py @@ -1,7 +1,7 @@ import logging from concurrent.futures import ThreadPoolExecutor, Future -from typing import List, Union +from typing import List, Union, Tuple, Optional from databricks.sql.cloudfetch.downloader import ( ResultSetDownloadHandler, @@ -9,7 +9,7 @@ DownloadedFile, ) from databricks.sql.types import SSLOptions - +from databricks.sql.telemetry.models.event import StatementType from databricks.sql.thrift_api.TCLIService.ttypes import TSparkArrowResultLink logger = logging.getLogger(__name__) @@ -22,17 +22,23 @@ def __init__( max_download_threads: int, lz4_compressed: bool, ssl_options: SSLOptions, + session_id_hex: Optional[str], + statement_id: str, + chunk_id: int, + http_client, ): - self._pending_links: List[TSparkArrowResultLink] = [] - for link in links: + self._pending_links: List[Tuple[int, TSparkArrowResultLink]] = [] + self.chunk_id = chunk_id + for i, link in enumerate(links, start=chunk_id): if link.rowCount <= 0: continue logger.debug( - "ResultFileDownloadManager: adding file link, start offset {}, row count: {}".format( - link.startRowOffset, link.rowCount + "ResultFileDownloadManager: adding file link, chunk id {}, start offset {}, row count: {}".format( + i, link.startRowOffset, link.rowCount ) ) - self._pending_links.append(link) + self._pending_links.append((i, link)) + self.chunk_id += len(links) self._download_tasks: List[Future[DownloadedFile]] = [] self._max_download_threads: int = max_download_threads @@ -40,6 +46,9 @@ def __init__( self._downloadable_result_settings = DownloadableResultSettings(lz4_compressed) self._ssl_options = ssl_options + self.session_id_hex = session_id_hex + self.statement_id = statement_id + self._http_client = http_client def get_next_downloaded_file( self, next_row_offset: int @@ -89,18 +98,43 @@ def _schedule_downloads(self): while (len(self._download_tasks) < self._max_download_threads) and ( len(self._pending_links) > 0 ): - link = self._pending_links.pop(0) + chunk_id, link = self._pending_links.pop(0) logger.debug( - "- start: {}, row count: {}".format(link.startRowOffset, link.rowCount) + "- chunk: {}, start: {}, row count: {}".format( + chunk_id, link.startRowOffset, link.rowCount + ) ) handler = ResultSetDownloadHandler( settings=self._downloadable_result_settings, link=link, ssl_options=self._ssl_options, + chunk_id=chunk_id, + session_id_hex=self.session_id_hex, + statement_id=self.statement_id, + http_client=self._http_client, ) task = self._thread_pool.submit(handler.run) self._download_tasks.append(task) + def add_link(self, link: TSparkArrowResultLink): + """ + Add more links to the download manager. + + Args: + link: Link to add + """ + + if link.rowCount <= 0: + return + + logger.debug( + "ResultFileDownloadManager: adding file link, start offset {}, row count: {}".format( + link.startRowOffset, link.rowCount + ) + ) + self._pending_links.append((self.chunk_id, link)) + self.chunk_id += 1 + def _shutdown_manager(self): # Clear download handlers and shutdown the thread pool self._pending_links = [] diff --git a/src/databricks/sql/cloudfetch/downloader.py b/src/databricks/sql/cloudfetch/downloader.py index 228e07d6c..e6d1c6d10 100644 --- a/src/databricks/sql/cloudfetch/downloader.py +++ b/src/databricks/sql/cloudfetch/downloader.py @@ -1,30 +1,19 @@ import logging from dataclasses import dataclass +from typing import Optional -import requests -from requests.adapters import HTTPAdapter, Retry import lz4.frame import time - +from databricks.sql.common.http import HttpMethod from databricks.sql.thrift_api.TCLIService.ttypes import TSparkArrowResultLink from databricks.sql.exc import Error from databricks.sql.types import SSLOptions +from databricks.sql.telemetry.latency_logger import log_latency +from databricks.sql.telemetry.models.event import StatementType +from databricks.sql.common.unified_http_client import UnifiedHttpClient logger = logging.getLogger(__name__) -# TODO: Ideally, we should use a common retry policy (DatabricksRetryPolicy) for all the requests across the library. -# But DatabricksRetryPolicy should be updated first - currently it can work only with Thrift requests -retryPolicy = Retry( - total=5, # max retry attempts - backoff_factor=1, # min delay, 1 second - # TODO: `backoff_max` is supported since `urllib3` v2.0.0, but we allow >= 1.26. - # The default value (120 seconds) used since v1.26 looks reasonable enough - # backoff_max=60, # max delay, 60 seconds - # retry all status codes below 100, 429 (Too Many Requests), and all codes above 500, - # excluding 501 Not implemented - status_forcelist=[*range(0, 101), 429, 500, *range(502, 1000)], -) - @dataclass class DownloadedFile: @@ -52,12 +41,14 @@ class DownloadableResultSettings: link_expiry_buffer_secs (int): Time in seconds to prevent download of a link before it expires. Default 0 secs. download_timeout (int): Timeout for download requests. Default 60 secs. max_consecutive_file_download_retries (int): Number of consecutive download retries before shutting down. + min_cloudfetch_download_speed (float): Threshold in MB/s below which to log warning. Default 0.1 MB/s. """ is_lz4_compressed: bool link_expiry_buffer_secs: int = 0 download_timeout: int = 60 max_consecutive_file_download_retries: int = 0 + min_cloudfetch_download_speed: float = 0.1 class ResultSetDownloadHandler: @@ -66,11 +57,20 @@ def __init__( settings: DownloadableResultSettings, link: TSparkArrowResultLink, ssl_options: SSLOptions, + chunk_id: int, + session_id_hex: Optional[str], + statement_id: str, + http_client, ): self.settings = settings self.link = link self._ssl_options = ssl_options + self._http_client = http_client + self.chunk_id = chunk_id + self.session_id_hex = session_id_hex + self.statement_id = statement_id + @log_latency(StatementType.QUERY) def run(self) -> DownloadedFile: """ Download the file described in the cloud fetch link. @@ -80,9 +80,10 @@ def run(self) -> DownloadedFile: """ logger.debug( - "ResultSetDownloadHandler: starting file download, offset {}, row count {}".format( - self.link.startRowOffset, self.link.rowCount - ) + "ResultSetDownloadHandler: starting file download, chunk id %s, offset %s, row count %s", + self.chunk_id, + self.link.startRowOffset, + self.link.rowCount, ) # Check if link is already expired or is expiring @@ -90,51 +91,75 @@ def run(self) -> DownloadedFile: self.link, self.settings.link_expiry_buffer_secs ) - session = requests.Session() - session.mount("http://", HTTPAdapter(max_retries=retryPolicy)) - session.mount("https://", HTTPAdapter(max_retries=retryPolicy)) - - try: - # Get the file via HTTP request - response = session.get( - self.link.fileLink, - timeout=self.settings.download_timeout, - verify=self._ssl_options.tls_verify, - headers=self.link.httpHeaders - # TODO: Pass cert from `self._ssl_options` - ) - response.raise_for_status() - - # Save (and decompress if needed) the downloaded file - compressed_data = response.content - decompressed_data = ( - ResultSetDownloadHandler._decompress_data(compressed_data) - if self.settings.is_lz4_compressed - else compressed_data - ) + start_time = time.time() + + with self._http_client.request_context( + method=HttpMethod.GET, + url=self.link.fileLink, + timeout=self.settings.download_timeout, + headers=self.link.httpHeaders, + ) as response: + if response.status >= 400: + raise Exception(f"HTTP {response.status}: {response.data.decode()}") + compressed_data = response.data + + # Log download metrics + download_duration = time.time() - start_time + self._log_download_metrics( + self.link.fileLink, len(compressed_data), download_duration + ) - # The size of the downloaded file should match the size specified from TSparkArrowResultLink - if len(decompressed_data) != self.link.bytesNum: - logger.debug( - "ResultSetDownloadHandler: downloaded file size {} does not match the expected value {}".format( - len(decompressed_data), self.link.bytesNum - ) - ) + decompressed_data = ( + ResultSetDownloadHandler._decompress_data(compressed_data) + if self.settings.is_lz4_compressed + else compressed_data + ) + # The size of the downloaded file should match the size specified from TSparkArrowResultLink + if len(decompressed_data) != self.link.bytesNum: logger.debug( - "ResultSetDownloadHandler: successfully downloaded file, offset {}, row count {}".format( - self.link.startRowOffset, self.link.rowCount - ) + "ResultSetDownloadHandler: downloaded file size %s does not match the expected value %s", + len(decompressed_data), + self.link.bytesNum, ) - return DownloadedFile( - decompressed_data, - self.link.startRowOffset, - self.link.rowCount, + logger.debug( + "ResultSetDownloadHandler: successfully downloaded file, offset %s, row count %s", + self.link.startRowOffset, + self.link.rowCount, + ) + + return DownloadedFile( + decompressed_data, + self.link.startRowOffset, + self.link.rowCount, + ) + + def _log_download_metrics( + self, url: str, bytes_downloaded: int, duration_seconds: float + ): + """Log download speed metrics at INFO/WARN levels.""" + # Calculate speed in MB/s (ensure float division for precision) + speed_mbps = (float(bytes_downloaded) / (1024 * 1024)) / duration_seconds + + urlEndpoint = url.split("?")[0] + # INFO level logging + logger.info( + "CloudFetch download completed: %.4f MB/s, %d bytes in %.3fs from %s", + speed_mbps, + bytes_downloaded, + duration_seconds, + urlEndpoint, + ) + + # WARN level logging if below threshold + if speed_mbps < self.settings.min_cloudfetch_download_speed: + logger.warning( + "CloudFetch download slower than threshold: %.4f MB/s (threshold: %.1f MB/s) from %s", + speed_mbps, + self.settings.min_cloudfetch_download_speed, + url, ) - finally: - if session: - session.close() @staticmethod def _validate_link(link: TSparkArrowResultLink, expiry_buffer_secs: int): diff --git a/src/databricks/sql/common/agent.py b/src/databricks/sql/common/agent.py new file mode 100644 index 000000000..79d1b2b7a --- /dev/null +++ b/src/databricks/sql/common/agent.py @@ -0,0 +1,52 @@ +""" +Detects whether the Python SQL connector is being invoked by an AI coding agent +by checking for well-known environment variables that agents set in their spawned +shell processes. + +Detection only succeeds when exactly one agent environment variable is present, +to avoid ambiguous attribution when multiple agent environments overlap. + +Adding a new agent requires only a new entry in KNOWN_AGENTS. + +References for each environment variable: + - ANTIGRAVITY_AGENT: Closed source. Google Antigravity sets this variable. + - CLAUDECODE: https://github.com/anthropics/claude-code (sets CLAUDECODE=1) + - CLINE_ACTIVE: https://github.com/cline/cline (shipped in v3.24.0) + - CODEX_CI: https://github.com/openai/codex (part of UNIFIED_EXEC_ENV array in codex-rs) + - CURSOR_AGENT: Closed source. Referenced in a gist by johnlindquist. + - GEMINI_CLI: https://google-gemini.github.io/gemini-cli/docs/tools/shell.html (sets GEMINI_CLI=1) + - OPENCODE: https://github.com/opencode-ai/opencode (sets OPENCODE=1) +""" + +import os + +KNOWN_AGENTS = [ + ("ANTIGRAVITY_AGENT", "antigravity"), + ("CLAUDECODE", "claude-code"), + ("CLINE_ACTIVE", "cline"), + ("CODEX_CI", "codex"), + ("CURSOR_AGENT", "cursor"), + ("GEMINI_CLI", "gemini-cli"), + ("OPENCODE", "opencode"), +] + + +def detect(env=None): + """Detect which AI coding agent (if any) is driving the current process. + + Args: + env: Optional dict-like object for environment variable lookup. + Defaults to os.environ. Exists for testability. + + Returns: + The agent product string if exactly one agent is detected, + or an empty string otherwise. + """ + if env is None: + env = os.environ + + detected = [product for var, product in KNOWN_AGENTS if env.get(var)] + + if len(detected) == 1: + return detected[0] + return "" diff --git a/src/databricks/sql/common/feature_flag.py b/src/databricks/sql/common/feature_flag.py new file mode 100644 index 000000000..0b2c7490b --- /dev/null +++ b/src/databricks/sql/common/feature_flag.py @@ -0,0 +1,192 @@ +import json +import threading +import time +from dataclasses import dataclass, field +from concurrent.futures import ThreadPoolExecutor +from typing import Dict, Optional, List, Any, TYPE_CHECKING + +from databricks.sql.common.http import HttpMethod +from databricks.sql.common.url_utils import normalize_host_with_protocol + +if TYPE_CHECKING: + from databricks.sql.client import Connection + + +@dataclass +class FeatureFlagEntry: + """Represents a single feature flag from the server response.""" + + name: str + value: str + + +@dataclass +class FeatureFlagsResponse: + """Represents the full JSON response from the feature flag endpoint.""" + + flags: List[FeatureFlagEntry] = field(default_factory=list) + ttl_seconds: Optional[int] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> "FeatureFlagsResponse": + """Factory method to create an instance from a dictionary (parsed JSON).""" + flags_data = data.get("flags", []) + flags_list = [FeatureFlagEntry(**flag) for flag in flags_data] + return cls(flags=flags_list, ttl_seconds=data.get("ttl_seconds")) + + +# --- Constants --- +FEATURE_FLAGS_ENDPOINT_SUFFIX_FORMAT = ( + "/api/2.0/connector-service/feature-flags/PYTHON/{}" +) +DEFAULT_TTL_SECONDS = 900 # 15 minutes +REFRESH_BEFORE_EXPIRY_SECONDS = 10 # Start proactive refresh 10s before expiry + + +class FeatureFlagsContext: + """ + Manages fetching and caching of server-side feature flags for a connection. + + 1. The very first check for any flag is a synchronous, BLOCKING operation. + 2. Subsequent refreshes (triggered near TTL expiry) are done asynchronously + in the background, returning stale data until the refresh completes. + """ + + def __init__( + self, connection: "Connection", executor: ThreadPoolExecutor, http_client + ): + from databricks.sql import __version__ + + self._connection = connection + self._executor = executor # Used for ASYNCHRONOUS refreshes + self._lock = threading.RLock() + + # Cache state: `None` indicates the cache has never been loaded. + self._flags: Optional[Dict[str, str]] = None + self._ttl_seconds: int = DEFAULT_TTL_SECONDS + self._last_refresh_time: float = 0 + + endpoint_suffix = FEATURE_FLAGS_ENDPOINT_SUFFIX_FORMAT.format(__version__) + self._feature_flag_endpoint = ( + normalize_host_with_protocol(self._connection.session.host) + + endpoint_suffix + ) + + # Use the provided HTTP client + self._http_client = http_client + + def _is_refresh_needed(self) -> bool: + """Checks if the cache is due for a proactive background refresh.""" + if self._flags is None: + return False # Not eligible for refresh until loaded once. + + refresh_threshold = self._last_refresh_time + ( + self._ttl_seconds - REFRESH_BEFORE_EXPIRY_SECONDS + ) + return time.monotonic() > refresh_threshold + + def get_flag_value(self, name: str, default_value: Any) -> Any: + """ + Checks if a feature is enabled. + - BLOCKS on the first call until flags are fetched. + - Returns cached values on subsequent calls, triggering non-blocking refreshes if needed. + """ + with self._lock: + # If cache has never been loaded, perform a synchronous, blocking fetch. + if self._flags is None: + self._refresh_flags() + + # If a proactive background refresh is needed, start one. This is non-blocking. + elif self._is_refresh_needed(): + # We don't check for an in-flight refresh; the executor queues the task, which is safe. + self._executor.submit(self._refresh_flags) + + assert self._flags is not None + + # Now, return the value from the populated cache. + return self._flags.get(name, default_value) + + def _refresh_flags(self): + """Performs a synchronous network request to fetch and update flags.""" + headers = {} + try: + # Authenticate the request + self._connection.session.auth_provider.add_headers(headers) + headers["User-Agent"] = self._connection.session.useragent_header + headers.update(self._connection.session.get_spog_headers()) + + response = self._http_client.request( + HttpMethod.GET, self._feature_flag_endpoint, headers=headers, timeout=30 + ) + + if response.status == 200: + # Parse JSON response from urllib3 response data + response_data = json.loads(response.data.decode()) + ff_response = FeatureFlagsResponse.from_dict(response_data) + self._update_cache_from_response(ff_response) + else: + # On failure, initialize with an empty dictionary to prevent re-blocking. + if self._flags is None: + self._flags = {} + + except Exception as e: + # On exception, initialize with an empty dictionary to prevent re-blocking. + if self._flags is None: + self._flags = {} + + def _update_cache_from_response(self, ff_response: FeatureFlagsResponse): + """Atomically updates the internal cache state from a successful server response.""" + with self._lock: + self._flags = {flag.name: flag.value for flag in ff_response.flags} + if ff_response.ttl_seconds is not None and ff_response.ttl_seconds > 0: + self._ttl_seconds = ff_response.ttl_seconds + self._last_refresh_time = time.monotonic() + + +class FeatureFlagsContextFactory: + """ + Manages a singleton instance of FeatureFlagsContext per connection session. + Also manages a shared ThreadPoolExecutor for all background refresh operations. + """ + + _context_map: Dict[str, FeatureFlagsContext] = {} + _executor: Optional[ThreadPoolExecutor] = None + _lock = threading.Lock() + + @classmethod + def _initialize(cls): + """Initializes the shared executor for async refreshes if it doesn't exist.""" + if cls._executor is None: + cls._executor = ThreadPoolExecutor( + max_workers=3, thread_name_prefix="feature-flag-refresher" + ) + + @classmethod + def get_instance(cls, connection: "Connection") -> FeatureFlagsContext: + """Gets or creates a FeatureFlagsContext for the given connection.""" + with cls._lock: + cls._initialize() + assert cls._executor is not None + + # Cache at HOST level - share feature flags across connections to same host + # Feature flags are per-host, not per-session + key = connection.session.host + if key not in cls._context_map: + cls._context_map[key] = FeatureFlagsContext( + connection, cls._executor, connection.session.http_client + ) + return cls._context_map[key] + + @classmethod + def remove_instance(cls, connection: "Connection"): + """Removes the context for a given connection and shuts down the executor if no clients remain.""" + with cls._lock: + # Use host as key to match get_instance + key = connection.session.host + if key in cls._context_map: + cls._context_map.pop(key, None) + + # If this was the last active context, clean up the thread pool. + if not cls._context_map and cls._executor is not None: + cls._executor.shutdown(wait=False) + cls._executor = None diff --git a/src/databricks/sql/common/http.py b/src/databricks/sql/common/http.py new file mode 100644 index 000000000..cf76a5fba --- /dev/null +++ b/src/databricks/sql/common/http.py @@ -0,0 +1,40 @@ +import requests +from requests.adapters import HTTPAdapter +from urllib3.util.retry import Retry +from enum import Enum +import threading +from dataclasses import dataclass +from contextlib import contextmanager +from typing import Generator, Optional +import logging +from requests.adapters import HTTPAdapter +from databricks.sql.auth.retry import DatabricksRetryPolicy, CommandType + +logger = logging.getLogger(__name__) + + +# Enums for HTTP Methods +class HttpMethod(str, Enum): + GET = "GET" + POST = "POST" + PUT = "PUT" + DELETE = "DELETE" + + +# HTTP request headers +class HttpHeader(str, Enum): + CONTENT_TYPE = "Content-Type" + AUTHORIZATION = "Authorization" + + +# Dataclass for OAuthHTTP Response +@dataclass +class OAuthResponse: + token_type: str = "" + expires_in: int = 0 + ext_expires_in: int = 0 + expires_on: int = 0 + not_before: int = 0 + resource: str = "" + access_token: str = "" + refresh_token: str = "" diff --git a/src/databricks/sql/common/http_utils.py b/src/databricks/sql/common/http_utils.py new file mode 100644 index 000000000..b4e3c1c51 --- /dev/null +++ b/src/databricks/sql/common/http_utils.py @@ -0,0 +1,100 @@ +import ssl +import urllib.parse +import urllib.request +import logging +from typing import Dict, Any, Optional, Tuple, Union + +from urllib3 import HTTPConnectionPool, HTTPSConnectionPool, ProxyManager +from urllib3.util import make_headers + +from databricks.sql.auth.retry import DatabricksRetryPolicy +from databricks.sql.types import SSLOptions + +logger = logging.getLogger(__name__) + + +def detect_and_parse_proxy( + scheme: str, + host: Optional[str], + skip_bypass: bool = False, + proxy_auth_method: Optional[str] = None, +) -> Tuple[Optional[str], Optional[Dict[str, str]]]: + """ + Detect system proxy and return proxy URI and headers using standardized logic. + + Args: + scheme: URL scheme (http/https) + host: Target hostname (optional, only needed for bypass checking) + skip_bypass: If True, skip proxy bypass checking and return proxy config if found + proxy_auth_method: Authentication method ('basic', 'negotiate', or None) + + Returns: + Tuple of (proxy_uri, proxy_headers) or (None, None) if no proxy + """ + try: + # returns a dictionary of scheme -> proxy server URL mappings. + # https://docs.python.org/3/library/urllib.request.html#urllib.request.getproxies + proxy = urllib.request.getproxies().get(scheme) + except (KeyError, AttributeError): + # No proxy found or getproxies() failed - disable proxy + proxy = None + else: + # Proxy found, but check if this host should bypass proxy (unless skipped) + if not skip_bypass and host and urllib.request.proxy_bypass(host): + proxy = None # Host bypasses proxy per system rules + + if not proxy: + return None, None + + parsed_proxy = urllib.parse.urlparse(proxy) + + # Generate appropriate auth headers based on method + if proxy_auth_method == "negotiate": + proxy_headers = _generate_negotiate_headers(parsed_proxy.hostname) + elif proxy_auth_method == "basic" or proxy_auth_method is None: + # Default to basic if method not specified (backward compatibility) + proxy_headers = create_basic_proxy_auth_headers(parsed_proxy) + else: + raise ValueError(f"Unsupported proxy_auth_method: {proxy_auth_method}") + + return proxy, proxy_headers + + +def _generate_negotiate_headers( + proxy_hostname: Optional[str], +) -> Optional[Dict[str, str]]: + """Generate Kerberos/SPNEGO authentication headers""" + try: + from requests_kerberos import HTTPKerberosAuth + + logger.debug( + "Attempting to generate Kerberos SPNEGO token for proxy: %s", proxy_hostname + ) + auth = HTTPKerberosAuth() + negotiate_details = auth.generate_request_header( + None, proxy_hostname, is_preemptive=True + ) + if negotiate_details: + return {"proxy-authorization": negotiate_details} + else: + logger.debug("Unable to generate kerberos proxy auth headers") + except Exception as e: + logger.error("Error generating Kerberos proxy auth headers: %s", e) + + return None + + +def create_basic_proxy_auth_headers(parsed_proxy) -> Optional[Dict[str, str]]: + """ + Create basic auth headers for proxy if credentials are provided. + + Args: + parsed_proxy: Parsed proxy URL from urllib.parse.urlparse() + + Returns: + Dictionary of proxy auth headers or None if no credentials + """ + if parsed_proxy is None or not parsed_proxy.username: + return None + ap = f"{urllib.parse.unquote(parsed_proxy.username)}:{urllib.parse.unquote(parsed_proxy.password)}" + return make_headers(proxy_basic_auth=ap) diff --git a/src/databricks/sql/common/unified_http_client.py b/src/databricks/sql/common/unified_http_client.py new file mode 100644 index 000000000..ef55564c8 --- /dev/null +++ b/src/databricks/sql/common/unified_http_client.py @@ -0,0 +1,375 @@ +import logging +import ssl +import urllib.parse +import urllib.request +from contextlib import contextmanager +from typing import Dict, Any, Optional, Generator + +import urllib3 +from urllib3 import PoolManager, ProxyManager +from urllib3.util import make_headers +from urllib3.exceptions import MaxRetryError + +# Compatibility import for different urllib3 versions +try: + # If urllib3~=2.0 is installed + from urllib3 import BaseHTTPResponse +except ImportError: + # If urllib3~=1.0 is installed + from urllib3 import HTTPResponse as BaseHTTPResponse + +from databricks.sql.auth.retry import DatabricksRetryPolicy, CommandType +from databricks.sql.exc import RequestError +from databricks.sql.common.http import HttpMethod +from databricks.sql.common.http_utils import ( + detect_and_parse_proxy, +) + +logger = logging.getLogger(__name__) + + +def _extract_http_status_from_max_retry_error(e: MaxRetryError) -> Optional[int]: + """ + Extract HTTP status code from MaxRetryError if available. + + urllib3 structures MaxRetryError in different ways depending on the failure scenario: + - e.reason.response.status: Most common case when retries are exhausted + - e.response.status: Alternate structure in some scenarios + + Args: + e: MaxRetryError exception from urllib3 + + Returns: + HTTP status code as int if found, None otherwise + """ + # Try primary structure: e.reason.response.status + if ( + hasattr(e, "reason") + and e.reason is not None + and hasattr(e.reason, "response") + and e.reason.response is not None + ): + http_code = getattr(e.reason.response, "status", None) + if http_code is not None: + return http_code + + # Try alternate structure: e.response.status + if ( + hasattr(e, "response") + and e.response is not None + and hasattr(e.response, "status") + ): + return e.response.status + + return None + + +class UnifiedHttpClient: + """ + Unified HTTP client for all Databricks SQL connector HTTP operations. + + This client uses urllib3 for robust HTTP communication with retry policies, + connection pooling, SSL support, and proxy support. It replaces the various + singleton HTTP clients and direct requests usage throughout the codebase. + + The client supports per-request proxy decisions, automatically routing requests + through proxy or direct connections based on system proxy bypass rules and + the target hostname of each request. + """ + + def __init__(self, client_context): + """ + Initialize the unified HTTP client. + + Args: + client_context: ClientContext instance containing HTTP configuration + """ + self.config = client_context + # Since the unified http client is used for all requests, we need to have proxy and direct pool managers + # for per-request proxy decisions. + self._direct_pool_manager = None + self._proxy_pool_manager = None + self._retry_policy = None + self._proxy_uri = None + self._proxy_auth = None + self._setup_pool_managers() + + def _setup_pool_managers(self): + """Set up both direct and proxy pool managers for per-request proxy decisions.""" + + # SSL context setup + ssl_context = None + if self.config.ssl_options: + ssl_context = ssl.create_default_context() + + # Configure SSL verification + if not self.config.ssl_options.tls_verify: + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_NONE + elif not self.config.ssl_options.tls_verify_hostname: + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_REQUIRED + + # Load custom CA file if specified + if self.config.ssl_options.tls_trusted_ca_file: + ssl_context.load_verify_locations( + self.config.ssl_options.tls_trusted_ca_file + ) + + # Load client certificate if specified + if ( + self.config.ssl_options.tls_client_cert_file + and self.config.ssl_options.tls_client_cert_key_file + ): + ssl_context.load_cert_chain( + self.config.ssl_options.tls_client_cert_file, + self.config.ssl_options.tls_client_cert_key_file, + self.config.ssl_options.tls_client_cert_key_password, + ) + + # Create retry policy + self._retry_policy = DatabricksRetryPolicy( + delay_min=self.config.retry_delay_min, + delay_max=self.config.retry_delay_max, + stop_after_attempts_count=self.config.retry_stop_after_attempts_count, + stop_after_attempts_duration=self.config.retry_stop_after_attempts_duration, + delay_default=self.config.retry_delay_default, + force_dangerous_codes=self.config.retry_dangerous_codes, + ) + + # Initialize the required attributes that DatabricksRetryPolicy expects + # but doesn't initialize in its constructor + self._retry_policy._command_type = None + self._retry_policy._retry_start_time = None + + # Common pool manager kwargs + pool_kwargs = { + "num_pools": self.config.pool_connections, + "maxsize": self.config.pool_maxsize, + "retries": self._retry_policy, + "timeout": urllib3.Timeout( + connect=self.config.socket_timeout, read=self.config.socket_timeout + ) + if self.config.socket_timeout + else None, + "ssl_context": ssl_context, + } + + # Always create a direct pool manager + self._direct_pool_manager = PoolManager(**pool_kwargs) + + # Detect system proxy configuration + # We use 'https' as default scheme since most requests will be HTTPS + parsed_url = urllib.parse.urlparse(self.config.hostname) + self.scheme = parsed_url.scheme or "https" + self.host = parsed_url.hostname + + # Check if system has proxy configured for our scheme + try: + # Use shared proxy detection logic, skipping bypass since we handle that per-request + proxy_url, proxy_auth = detect_and_parse_proxy( + self.scheme, + self.host, + skip_bypass=True, + proxy_auth_method=self.config.proxy_auth_method, + ) + + if proxy_url: + # Store proxy configuration for per-request decisions + self._proxy_uri = proxy_url + self._proxy_auth = proxy_auth + + # Create proxy pool manager + self._proxy_pool_manager = ProxyManager( + proxy_url, proxy_headers=proxy_auth, **pool_kwargs + ) + logger.debug("Initialized with proxy support: %s", proxy_url) + else: + self._proxy_pool_manager = None + logger.debug("No system proxy detected, using direct connections only") + + except Exception as e: + # If proxy detection fails, fall back to direct connections only + logger.debug("Error detecting system proxy configuration: %s", e) + self._proxy_pool_manager = None + + def _should_use_proxy(self, target_host: str) -> bool: + """ + Determine if a request to the target host should use proxy. + + Args: + target_host: The hostname of the target URL + + Returns: + True if proxy should be used, False for direct connection + """ + # If no proxy is configured, always use direct connection + if not self._proxy_pool_manager or not self._proxy_uri: + return False + + # Check system proxy bypass rules for this specific host + try: + # proxy_bypass returns True if the host should BYPASS the proxy + # We want the opposite - True if we should USE the proxy + return not urllib.request.proxy_bypass(target_host) + except Exception as e: + # If proxy_bypass fails, default to using proxy (safer choice) + logger.debug("Error checking proxy bypass for host %s: %s", target_host, e) + return True + + def _get_pool_manager_for_url(self, url: str) -> Optional[urllib3.PoolManager]: + """ + Get the appropriate pool manager for the given URL. + + Args: + url: The target URL + + Returns: + PoolManager instance (either direct or proxy), or None if client is closed + """ + parsed_url = urllib.parse.urlparse(url) + target_host = parsed_url.hostname + + if target_host and self._should_use_proxy(target_host): + logger.debug("Using proxy for request to %s", target_host) + return self._proxy_pool_manager + else: + logger.debug("Using direct connection for request to %s", target_host) + return self._direct_pool_manager + + def _prepare_headers( + self, headers: Optional[Dict[str, str]] = None + ) -> Dict[str, str]: + """Prepare headers for the request, including User-Agent.""" + request_headers = {} + + if self.config.user_agent: + request_headers["User-Agent"] = self.config.user_agent + + if headers: + request_headers.update(headers) + + return request_headers + + def _prepare_retry_policy(self): + """Set up the retry policy for the current request.""" + if isinstance(self._retry_policy, DatabricksRetryPolicy): + # Set command type for HTTP requests to OTHER (not database commands) + self._retry_policy.command_type = CommandType.OTHER + # Start the retry timer for duration-based retry limits + self._retry_policy.start_retry_timer() + + @contextmanager + def request_context( + self, + method: HttpMethod, + url: str, + headers: Optional[Dict[str, str]] = None, + **kwargs, + ) -> Generator[BaseHTTPResponse, None, None]: + """ + Context manager for making HTTP requests with proper resource cleanup. + + Args: + method: HTTP method (HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE) + url: URL to request + headers: Optional headers dict + **kwargs: Additional arguments passed to urllib3 request + + Yields: + BaseHTTPResponse: The HTTP response object + """ + logger.debug( + "Making %s request to %s", method, urllib.parse.urlparse(url).netloc + ) + + request_headers = self._prepare_headers(headers) + + # Prepare retry policy for this request + self._prepare_retry_policy() + + # Select appropriate pool manager based on target URL + pool_manager = self._get_pool_manager_for_url(url) + + # DEFENSIVE: Check if pool_manager is None (client closing/closed) + # This prevents AttributeError race condition when telemetry cleanup happens + if pool_manager is None: + logger.debug( + "HTTP client closing or closed, cannot make request to %s", url + ) + raise RequestError("HTTP client is closing or has been closed") + + response = None + + try: + response = pool_manager.request( + method=method.value, url=url, headers=request_headers, **kwargs + ) + yield response + except MaxRetryError as e: + logger.error("HTTP request failed after retries: %s", e) + + # Extract HTTP status code from MaxRetryError if available + http_code = _extract_http_status_from_max_retry_error(e) + + context = {} + if http_code is not None: + context["http-code"] = http_code + logger.error("HTTP request failed with status code: %d", http_code) + + raise RequestError(f"HTTP request failed: {e}", context=context) + except Exception as e: + logger.error("HTTP request error: %s", e) + raise RequestError(f"HTTP request error: {e}") + finally: + if response: + response.close() + + def request( + self, + method: HttpMethod, + url: str, + headers: Optional[Dict[str, str]] = None, + **kwargs, + ) -> BaseHTTPResponse: + """ + Make an HTTP request. + + Args: + method: HTTP method (HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE, etc.) + url: URL to request + headers: Optional headers dict + **kwargs: Additional arguments passed to urllib3 request + + Returns: + BaseHTTPResponse: The HTTP response object with data and metadata pre-loaded + """ + with self.request_context(method, url, headers=headers, **kwargs) as response: + # Read the response data to ensure it's available after context exit + # Note: status and headers remain accessible after close(); calling response.read() loads and caches the response data so it remains accessible after the response is closed. + response.read() + return response + + def using_proxy(self) -> bool: + """Check if proxy support is available (not whether it's being used for a specific request).""" + return self._proxy_pool_manager is not None + + @property + def proxy_uri(self) -> Optional[str]: + """Get the configured proxy URI, if any.""" + return self._proxy_uri + + def close(self): + """Close the underlying connection pools.""" + if self._direct_pool_manager: + self._direct_pool_manager.clear() + self._direct_pool_manager = None + if self._proxy_pool_manager: + self._proxy_pool_manager.clear() + self._proxy_pool_manager = None + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() diff --git a/src/databricks/sql/common/url_utils.py b/src/databricks/sql/common/url_utils.py new file mode 100644 index 000000000..1c4d10369 --- /dev/null +++ b/src/databricks/sql/common/url_utils.py @@ -0,0 +1,45 @@ +""" +URL utility functions for the Databricks SQL connector. +""" + + +def normalize_host_with_protocol(host: str) -> str: + """ + Normalize a connection hostname by ensuring it has a protocol. + + This is useful for handling cases where users may provide hostnames with or without protocols + (common with dbt-databricks users copying URLs from their browser). + + Args: + host: Connection hostname which may or may not include a protocol prefix (https:// or http://) + and may or may not have a trailing slash + + Returns: + Normalized hostname with protocol prefix and no trailing slashes + + Examples: + normalize_host_with_protocol("myserver.com") -> "https://myserver.com" + normalize_host_with_protocol("https://myserver.com") -> "https://myserver.com" + normalize_host_with_protocol("HTTPS://myserver.com/") -> "https://myserver.com" + normalize_host_with_protocol("http://localhost:8080/") -> "http://localhost:8080" + + Raises: + ValueError: If host is None or empty string + """ + # Handle None or empty host + if not host or not host.strip(): + raise ValueError("Host cannot be None or empty") + + # Remove trailing slashes + host = host.rstrip("/") + + # Add protocol if not present (case-insensitive check) + host_lower = host.lower() + if not host_lower.startswith("https://") and not host_lower.startswith("http://"): + host = f"https://{host}" + elif host_lower.startswith("https://") or host_lower.startswith("http://"): + # Normalize protocol to lowercase + protocol_end = host.index("://") + 3 + host = host[:protocol_end].lower() + host[protocol_end:] + + return host diff --git a/src/databricks/sql/exc.py b/src/databricks/sql/exc.py index 3b27283a4..f4770f3c4 100644 --- a/src/databricks/sql/exc.py +++ b/src/databricks/sql/exc.py @@ -3,19 +3,38 @@ logger = logging.getLogger(__name__) - ### PEP-249 Mandated ### +# https://peps.python.org/pep-0249/#exceptions class Error(Exception): """Base class for DB-API2.0 exceptions. `message`: An optional user-friendly error message. It should be short, actionable and stable `context`: Optional extra context about the error. MUST be JSON serializable """ - def __init__(self, message=None, context=None, *args, **kwargs): + def __init__( + self, + message=None, + context=None, + host_url=None, + *args, + session_id_hex=None, + **kwargs, + ): super().__init__(message, *args, **kwargs) self.message = message self.context = context or {} + error_name = self.__class__.__name__ + if host_url: + from databricks.sql.telemetry.telemetry_client import TelemetryClientFactory + + telemetry_client = TelemetryClientFactory.get_telemetry_client( + host_url=host_url + ) + telemetry_client.export_failure_log( + error_name, self.message, session_id=session_id_hex + ) + def __str__(self): return self.message @@ -59,6 +78,23 @@ class NotSupportedError(DatabaseError): pass +class TransactionError(DatabaseError): + """ + Exception raised for transaction-specific errors. + + This exception is used when transaction control operations fail, such as: + - Setting autocommit mode (AUTOCOMMIT_SET_DURING_ACTIVE_TRANSACTION) + - Committing a transaction (MULTI_STATEMENT_TRANSACTION_NO_ACTIVE_TRANSACTION) + - Rolling back a transaction + - Setting transaction isolation level + + The exception includes context about which transaction operation failed + and preserves the underlying cause via exception chaining. + """ + + pass + + ### Custom error classes ### class InvalidServerResponseError(OperationalError): """Thrown if the server does not set the initial namespace correctly""" @@ -115,3 +151,24 @@ class SessionAlreadyClosedError(RequestError): class CursorAlreadyClosedError(RequestError): """Thrown if CancelOperation receives a code 404. ThriftBackend should gracefully proceed as this is expected.""" + + +class TelemetryRateLimitError(Exception): + """Raised when telemetry endpoint returns 429 or 503, indicating rate limiting or service unavailable. + This exception is used exclusively by the circuit breaker to track telemetry rate limiting events.""" + + +class TelemetryNonRateLimitError(Exception): + """Wrapper for telemetry errors that should NOT trigger circuit breaker. + + This exception wraps non-rate-limiting errors (network errors, timeouts, server errors, etc.) + and is excluded from circuit breaker failure counting. Only TelemetryRateLimitError should + open the circuit breaker. + + Attributes: + original_exception: The actual exception that occurred + """ + + def __init__(self, original_exception: Exception): + self.original_exception = original_exception + super().__init__(f"Non-rate-limit telemetry error: {original_exception}") diff --git a/src/databricks/sql/parameters/__init__.py b/src/databricks/sql/parameters/__init__.py index 3c39cf2bd..c05beb9e6 100644 --- a/src/databricks/sql/parameters/__init__.py +++ b/src/databricks/sql/parameters/__init__.py @@ -12,4 +12,6 @@ TimestampNTZParameter, TinyIntParameter, DecimalParameter, + MapParameter, + ArrayParameter, ) diff --git a/src/databricks/sql/parameters/native.py b/src/databricks/sql/parameters/native.py index 8a436355f..d0fb8d82c 100644 --- a/src/databricks/sql/parameters/native.py +++ b/src/databricks/sql/parameters/native.py @@ -1,12 +1,13 @@ import datetime import decimal from enum import Enum, auto -from typing import Optional, Sequence +from typing import Optional, Sequence, Any from databricks.sql.exc import NotSupportedError from databricks.sql.thrift_api.TCLIService.ttypes import ( TSparkParameter, TSparkParameterValue, + TSparkParameterValueArg, ) import datetime @@ -54,7 +55,17 @@ class DatabricksSupportedType(Enum): TAllowedParameterValue = Union[ - str, int, float, datetime.datetime, datetime.date, bool, decimal.Decimal, None + str, + int, + float, + datetime.datetime, + datetime.date, + bool, + decimal.Decimal, + None, + list, + dict, + tuple, ] @@ -82,6 +93,7 @@ class DbsqlParameterBase: CAST_EXPR: str name: Optional[str] + value: Any def as_tspark_param(self, named: bool) -> TSparkParameter: """Returns a TSparkParameter object that can be passed to the DBR thrift server.""" @@ -98,6 +110,10 @@ def as_tspark_param(self, named: bool) -> TSparkParameter: def _tspark_param_value(self): return TSparkParameterValue(stringValue=str(self.value)) + def _tspark_value_arg(self): + """Returns a TSparkParameterValueArg object that can be passed to the DBR thrift server.""" + return TSparkParameterValueArg(value=str(self.value), type=self._cast_expr()) + def _cast_expr(self): return self.CAST_EXPR @@ -428,6 +444,99 @@ def __init__(self, value: int, name: Optional[str] = None): CAST_EXPR = DatabricksSupportedType.TINYINT.name +class ArrayParameter(DbsqlParameterBase): + """Wrap a Python `Sequence` that will be bound to a Databricks SQL ARRAY type.""" + + def __init__(self, value: Sequence[Any], name: Optional[str] = None): + """ + :value: + The value to bind for this parameter. This will be casted to a ARRAY. + :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.name = name + self.value = [dbsql_parameter_from_primitive(val) for val in value] + + def as_tspark_param(self, named: bool = False) -> TSparkParameter: + """Returns a TSparkParameter object that can be passed to the DBR thrift server.""" + + tsp = TSparkParameter(type=self._cast_expr()) + tsp.arguments = [val._tspark_value_arg() for val in self.value] + + if named: + tsp.name = self.name + tsp.ordinal = False + elif not named: + tsp.ordinal = True + return tsp + + def _tspark_value_arg(self): + """Returns a TSparkParameterValueArg object that can be passed to the DBR thrift server.""" + tva = TSparkParameterValueArg(type=self._cast_expr()) + tva.arguments = [val._tspark_value_arg() for val in self.value] + return tva + + CAST_EXPR = DatabricksSupportedType.ARRAY.name + + +class MapParameter(DbsqlParameterBase): + """Wrap a Python `dict` that will be bound to a Databricks SQL MAP type.""" + + def __init__(self, value: dict, name: Optional[str] = None): + """ + :value: + The value to bind for this parameter. This will be casted to a MAP. + :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.name = name + self.value = [ + dbsql_parameter_from_primitive(item) + for key, val in value.items() + for item in (key, val) + ] + + def as_tspark_param(self, named: bool = False) -> TSparkParameter: + """Returns a TSparkParameter object that can be passed to the DBR thrift server.""" + + tsp = TSparkParameter(type=self._cast_expr()) + tsp.arguments = [val._tspark_value_arg() for val in self.value] + if named: + tsp.name = self.name + tsp.ordinal = False + elif not named: + tsp.ordinal = True + return tsp + + def _tspark_value_arg(self): + """Returns a TSparkParameterValueArg object that can be passed to the DBR thrift server.""" + tva = TSparkParameterValueArg(type=self._cast_expr()) + tva.arguments = [val._tspark_value_arg() for val in self.value] + return tva + + CAST_EXPR = DatabricksSupportedType.MAP.name + + class DecimalParameter(DbsqlParameterBase): """Wrap a Python `Decimal` that will be bound to a Databricks SQL DECIMAL type.""" @@ -543,23 +652,26 @@ def dbsql_parameter_from_primitive( # havoc. We can't use TYPE_INFERRENCE_MAP because mypy doesn't trust # its logic - if type(value) is int: + if isinstance(value, bool): + return BooleanParameter(value=value, name=name) + elif isinstance(value, int): return dbsql_parameter_from_int(value, name=name) - elif type(value) is str: + elif isinstance(value, str): return StringParameter(value=value, name=name) - elif type(value) is float: - return FloatParameter(value=value, name=name) - elif type(value) is datetime.datetime: + elif isinstance(value, float): + return DoubleParameter(value=value, name=name) + elif isinstance(value, datetime.datetime): return TimestampParameter(value=value, name=name) - elif type(value) is datetime.date: + elif isinstance(value, 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: + elif isinstance(value, decimal.Decimal): return DecimalParameter(value=value, name=name) + elif isinstance(value, dict): + return MapParameter(value=value, name=name) + elif isinstance(value, Sequence) and not isinstance(value, str): + return ArrayParameter(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" @@ -581,6 +693,8 @@ def dbsql_parameter_from_primitive( TimestampNTZParameter, TinyIntParameter, DecimalParameter, + ArrayParameter, + MapParameter, ] diff --git a/src/databricks/sql/result_set.py b/src/databricks/sql/result_set.py new file mode 100644 index 000000000..6c4c3a43a --- /dev/null +++ b/src/databricks/sql/result_set.py @@ -0,0 +1,439 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import List, Optional, TYPE_CHECKING, Tuple + +import logging +import pandas + +try: + import pyarrow +except ImportError: + pyarrow = None + +if TYPE_CHECKING: + from databricks.sql.backend.thrift_backend import ThriftDatabricksClient + from databricks.sql.client import Connection +from databricks.sql.backend.databricks_client import DatabricksClient +from databricks.sql.types import Row +from databricks.sql.exc import RequestError, CursorAlreadyClosedError +from databricks.sql.utils import ( + ColumnTable, + ColumnQueue, + concat_table_chunks, +) +from databricks.sql.backend.types import CommandId, CommandState, ExecuteResponse +from databricks.sql.telemetry.models.event import StatementType + +logger = logging.getLogger(__name__) + + +class ResultSet(ABC): + """ + Abstract base class for result sets returned by different backend implementations. + + This class defines the interface that all concrete result set implementations must follow. + """ + + def __init__( + self, + connection: Connection, + backend: DatabricksClient, + arraysize: int, + buffer_size_bytes: int, + command_id: CommandId, + status: CommandState, + has_been_closed_server_side: bool = False, + has_more_rows: bool = False, + results_queue=None, + description: List[Tuple] = [], + is_staging_operation: bool = False, + lz4_compressed: bool = False, + arrow_schema_bytes: Optional[bytes] = None, + ): + """ + A ResultSet manages the results of a single command. + + Parameters: + :param connection: The parent connection that was used to execute this command + :param backend: The specialised backend client to be invoked in the fetch phase + :param arraysize: The max number of rows to fetch at a time (PEP-249) + :param buffer_size_bytes: The size (in bytes) of the internal buffer + max fetch + :param command_id: The command ID + :param status: The command status + :param has_been_closed_server_side: Whether the command has been closed on the server + :param has_more_rows: Whether the command has more rows + :param results_queue: The results queue + :param description: column description of the results + :param is_staging_operation: Whether the command is a staging operation + """ + + self.connection = connection + self.backend = backend + self.arraysize = arraysize + self.buffer_size_bytes = buffer_size_bytes + self._next_row_index = 0 + self.description = description + self.command_id = command_id + self.status = status + self.has_been_closed_server_side = has_been_closed_server_side + self.has_more_rows = has_more_rows + self.results = results_queue + self._is_staging_operation = is_staging_operation + self.lz4_compressed = lz4_compressed + self._arrow_schema_bytes = arrow_schema_bytes + + def __iter__(self): + while True: + row = self.fetchone() + if row: + yield row + else: + break + + def _convert_arrow_table(self, table): + column_names = [c[0] for c in self.description] + ResultRow = Row(*column_names) + + if self.connection.disable_pandas is True: + return [ + ResultRow(*[v.as_py() for v in r]) for r in zip(*table.itercolumns()) + ] + + # Need to use nullable types, as otherwise type can change when there are missing values. + # See https://arrow.apache.org/docs/python/pandas.html#nullable-types + # NOTE: This api is epxerimental https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html + dtype_mapping = { + pyarrow.int8(): pandas.Int8Dtype(), + pyarrow.int16(): pandas.Int16Dtype(), + pyarrow.int32(): pandas.Int32Dtype(), + pyarrow.int64(): pandas.Int64Dtype(), + pyarrow.uint8(): pandas.UInt8Dtype(), + pyarrow.uint16(): pandas.UInt16Dtype(), + pyarrow.uint32(): pandas.UInt32Dtype(), + pyarrow.uint64(): pandas.UInt64Dtype(), + pyarrow.bool_(): pandas.BooleanDtype(), + pyarrow.float32(): pandas.Float32Dtype(), + pyarrow.float64(): pandas.Float64Dtype(), + pyarrow.string(): pandas.StringDtype(), + } + + # Need to rename columns, as the to_pandas function cannot handle duplicate column names + table_renamed = table.rename_columns([str(c) for c in range(table.num_columns)]) + df = table_renamed.to_pandas( + types_mapper=dtype_mapping.get, + date_as_object=True, + timestamp_as_object=True, + ) + + res = df.to_numpy(na_value=None, dtype="object") + return [ResultRow(*v) for v in res] + + @property + def rownumber(self): + return self._next_row_index + + @property + def is_staging_operation(self) -> bool: + """Whether this result set represents a staging operation.""" + return self._is_staging_operation + + @abstractmethod + def fetchone(self) -> Optional[Row]: + """Fetch the next row of a query result set.""" + pass + + @abstractmethod + def fetchmany(self, size: int) -> List[Row]: + """Fetch the next set of rows of a query result.""" + pass + + @abstractmethod + def fetchall(self) -> List[Row]: + """Fetch all remaining rows of a query result.""" + pass + + @abstractmethod + def fetchmany_arrow(self, size: int) -> "pyarrow.Table": + """Fetch the next set of rows as an Arrow table.""" + pass + + @abstractmethod + def fetchall_arrow(self) -> "pyarrow.Table": + """Fetch all remaining rows as an Arrow table.""" + pass + + def close(self) -> None: + """ + Close the result set. + + If the connection has not been closed, and the result set has not already + been closed on the server for some other reason, issue a request to the server to close it. + """ + try: + if self.results is not None: + self.results.close() + else: + logger.warning("result set close: queue not initialized") + + if ( + self.status != CommandState.CLOSED + and not self.has_been_closed_server_side + and self.connection.open + ): + self.backend.close_command(self.command_id) + except RequestError as e: + if isinstance(e.args[1], CursorAlreadyClosedError): + logger.info("Operation was canceled by a prior request") + finally: + self.has_been_closed_server_side = True + self.status = CommandState.CLOSED + + +class ThriftResultSet(ResultSet): + """ResultSet implementation for the Thrift backend.""" + + def __init__( + self, + connection: Connection, + execute_response: ExecuteResponse, + thrift_client: ThriftDatabricksClient, + buffer_size_bytes: int = 104857600, + arraysize: int = 10000, + use_cloud_fetch: bool = True, + t_row_set=None, + max_download_threads: int = 10, + ssl_options=None, + has_more_rows: bool = True, + ): + """ + Initialize a ThriftResultSet with direct access to the ThriftDatabricksClient. + + Parameters: + :param connection: The parent connection + :param execute_response: Response from the execute command + :param thrift_client: The ThriftDatabricksClient instance for direct access + :param buffer_size_bytes: Buffer size for fetching results + :param arraysize: Default number of rows to fetch + :param use_cloud_fetch: Whether to use cloud fetch for retrieving results + :param t_row_set: The TRowSet containing result data (if available) + :param max_download_threads: Maximum number of download threads for cloud fetch + :param ssl_options: SSL options for cloud fetch + :param has_more_rows: Whether there are more rows to fetch + """ + self.num_chunks = 0 + + # Initialize ThriftResultSet-specific attributes + self._use_cloud_fetch = use_cloud_fetch + self.has_more_rows = has_more_rows + + # Build the results queue if t_row_set is provided + results_queue = None + if t_row_set and execute_response.result_format is not None: + from databricks.sql.utils import ThriftResultSetQueueFactory + + # Create the results queue using the provided format + results_queue = ThriftResultSetQueueFactory.build_queue( + row_set_type=execute_response.result_format, + t_row_set=t_row_set, + arrow_schema_bytes=execute_response.arrow_schema_bytes or b"", + max_download_threads=max_download_threads, + lz4_compressed=execute_response.lz4_compressed, + description=execute_response.description, + ssl_options=ssl_options, + session_id_hex=connection.get_session_id_hex(), + statement_id=execute_response.command_id.to_hex_guid(), + chunk_id=self.num_chunks, + http_client=connection.http_client, + ) + if t_row_set.resultLinks: + self.num_chunks += len(t_row_set.resultLinks) + + # Call parent constructor with common attributes + super().__init__( + connection=connection, + backend=thrift_client, + arraysize=arraysize, + buffer_size_bytes=buffer_size_bytes, + command_id=execute_response.command_id, + status=execute_response.status, + has_been_closed_server_side=execute_response.has_been_closed_server_side, + has_more_rows=has_more_rows, + results_queue=results_queue, + description=execute_response.description, + is_staging_operation=execute_response.is_staging_operation, + lz4_compressed=execute_response.lz4_compressed, + arrow_schema_bytes=execute_response.arrow_schema_bytes, + ) + + # Initialize results queue if not provided + if not self.results: + self._fill_results_buffer() + + def _fill_results_buffer(self): + results, has_more_rows, result_links_count = self.backend.fetch_results( + command_id=self.command_id, + max_rows=self.arraysize, + max_bytes=self.buffer_size_bytes, + expected_row_start_offset=self._next_row_index, + lz4_compressed=self.lz4_compressed, + arrow_schema_bytes=self._arrow_schema_bytes, + description=self.description, + use_cloud_fetch=self._use_cloud_fetch, + chunk_id=self.num_chunks, + ) + self.results = results + self.has_more_rows = has_more_rows + self.num_chunks += result_links_count + + def _convert_columnar_table(self, table): + column_names = [c[0] for c in self.description] + ResultRow = Row(*column_names) + result = [] + for row_index in range(table.num_rows): + curr_row = [] + for col_index in range(table.num_columns): + curr_row.append(table.get_item(col_index, row_index)) + result.append(ResultRow(*curr_row)) + + return result + + def fetchmany_arrow(self, size: int) -> "pyarrow.Table": + """ + Fetch the next set of rows of a query result, returning a PyArrow table. + + An empty sequence is returned when no more rows are available. + """ + if size < 0: + raise ValueError("size argument for fetchmany is %s but must be >= 0", size) + results = self.results.next_n_rows(size) + partial_result_chunks = [results] + n_remaining_rows = size - results.num_rows + self._next_row_index += results.num_rows + + while ( + n_remaining_rows > 0 + and not self.has_been_closed_server_side + and self.has_more_rows + ): + self._fill_results_buffer() + partial_results = self.results.next_n_rows(n_remaining_rows) + partial_result_chunks.append(partial_results) + n_remaining_rows -= partial_results.num_rows + self._next_row_index += partial_results.num_rows + + return concat_table_chunks(partial_result_chunks) + + def fetchmany_columnar(self, size: int): + """ + Fetch the next set of rows of a query result, returning a Columnar Table. + An empty sequence is returned when no more rows are available. + """ + if size < 0: + raise ValueError("size argument for fetchmany is %s but must be >= 0", size) + + results = self.results.next_n_rows(size) + n_remaining_rows = size - results.num_rows + self._next_row_index += results.num_rows + partial_result_chunks = [results] + while ( + n_remaining_rows > 0 + and not self.has_been_closed_server_side + and self.has_more_rows + ): + self._fill_results_buffer() + partial_results = self.results.next_n_rows(n_remaining_rows) + partial_result_chunks.append(partial_results) + n_remaining_rows -= partial_results.num_rows + self._next_row_index += partial_results.num_rows + + return concat_table_chunks(partial_result_chunks) + + def fetchall_arrow(self) -> "pyarrow.Table": + """Fetch all (remaining) rows of a query result, returning them as a PyArrow table.""" + results = self.results.remaining_rows() + self._next_row_index += results.num_rows + partial_result_chunks = [results] + while not self.has_been_closed_server_side and self.has_more_rows: + self._fill_results_buffer() + partial_results = self.results.remaining_rows() + partial_result_chunks.append(partial_results) + self._next_row_index += partial_results.num_rows + + result_table = concat_table_chunks(partial_result_chunks) + # If PyArrow is installed and we have a ColumnTable result, convert it to PyArrow Table + # Valid only for metadata commands result set + if isinstance(result_table, ColumnTable) and pyarrow: + data = { + name: col + for name, col in zip( + result_table.column_names, result_table.column_table + ) + } + return pyarrow.Table.from_pydict(data) + return result_table + + def fetchall_columnar(self): + """Fetch all (remaining) rows of a query result, returning them as a Columnar table.""" + results = self.results.remaining_rows() + self._next_row_index += results.num_rows + partial_result_chunks = [results] + while not self.has_been_closed_server_side and self.has_more_rows: + self._fill_results_buffer() + partial_results = self.results.remaining_rows() + partial_result_chunks.append(partial_results) + self._next_row_index += partial_results.num_rows + + return concat_table_chunks(partial_result_chunks) + + def fetchone(self) -> Optional[Row]: + """ + Fetch the next row of a query result set, returning a single sequence, + or None when no more data is available. + """ + if isinstance(self.results, ColumnQueue): + res = self._convert_columnar_table(self.fetchmany_columnar(1)) + else: + res = self._convert_arrow_table(self.fetchmany_arrow(1)) + + if len(res) > 0: + return res[0] + else: + return None + + def fetchall(self) -> List[Row]: + """ + Fetch all (remaining) rows of a query result, returning them as a list of rows. + """ + if isinstance(self.results, ColumnQueue): + return self._convert_columnar_table(self.fetchall_columnar()) + else: + return self._convert_arrow_table(self.fetchall_arrow()) + + def fetchmany(self, size: int) -> List[Row]: + """ + Fetch the next set of rows of a query result, returning a list of rows. + + An empty sequence is returned when no more rows are available. + """ + if isinstance(self.results, ColumnQueue): + return self._convert_columnar_table(self.fetchmany_columnar(size)) + else: + return self._convert_arrow_table(self.fetchmany_arrow(size)) + + @staticmethod + def _get_schema_description(table_schema_message): + """ + Takes a TableSchema message and returns a description 7-tuple as specified by PEP-249 + """ + + def map_col_type(type_): + if type_.startswith("decimal"): + return "decimal" + else: + return type_ + + return [ + (column.name, map_col_type(column.datatype), None, None, None, None, None) + for column in table_schema_message.columns + ] diff --git a/src/databricks/sql/session.py b/src/databricks/sql/session.py new file mode 100644 index 000000000..65c0d6aca --- /dev/null +++ b/src/databricks/sql/session.py @@ -0,0 +1,267 @@ +import logging +from typing import Dict, Tuple, List, Optional, Any, Type + +from databricks.sql.thrift_api.TCLIService import ttypes +from databricks.sql.types import SSLOptions +from databricks.sql.auth.auth import get_python_sql_connector_auth_provider +from databricks.sql.auth.common import ClientContext +from databricks.sql.exc import SessionAlreadyClosedError, DatabaseError, RequestError +from databricks.sql import __version__ +from databricks.sql import USER_AGENT_NAME +from databricks.sql.backend.thrift_backend import ThriftDatabricksClient +from databricks.sql.backend.sea.backend import SeaDatabricksClient +from databricks.sql.backend.databricks_client import DatabricksClient +from databricks.sql.backend.types import SessionId, BackendType +from databricks.sql.common.unified_http_client import UnifiedHttpClient +from databricks.sql.common.agent import detect as detect_agent + +logger = logging.getLogger(__name__) + + +class Session: + def __init__( + self, + server_hostname: str, + http_path: str, + http_client: UnifiedHttpClient, + http_headers: Optional[List[Tuple[str, str]]] = None, + session_configuration: Optional[Dict[str, Any]] = None, + catalog: Optional[str] = None, + schema: Optional[str] = None, + _use_arrow_native_complex_types: Optional[bool] = True, + **kwargs, + ) -> None: + """ + Create a session to a Databricks SQL endpoint or a Databricks cluster. + + This class handles all session-related behavior and communication with the backend. + """ + + self.is_open = False + self.host = server_hostname + self.port = kwargs.get("_port", 443) + + self.session_configuration = session_configuration + self.catalog = catalog + self.schema = schema + self.http_path = http_path + + # Initialize autocommit state (JDBC default is True) + self._autocommit = True + + user_agent_entry = kwargs.get("user_agent_entry") + if user_agent_entry is None: + user_agent_entry = kwargs.get("_user_agent_entry") + if user_agent_entry is not None: + logger.warning( + "[WARN] Parameter '_user_agent_entry' is deprecated; use 'user_agent_entry' instead. " + "This parameter will be removed in the upcoming releases." + ) + + if user_agent_entry: + self.useragent_header = "{}/{} ({})".format( + USER_AGENT_NAME, __version__, user_agent_entry + ) + else: + self.useragent_header = "{}/{}".format(USER_AGENT_NAME, __version__) + + agent_product = detect_agent() + if agent_product: + self.useragent_header += " agent/{}".format(agent_product) + + base_headers = [("User-Agent", self.useragent_header)] + all_headers = (http_headers or []) + base_headers + + # Extract ?o= from http_path for SPOG routing. + # On SPOG hosts, the httpPath contains ?o= which routes Thrift + # requests via the URL. For SEA, telemetry, and feature flags (which use + # separate endpoints), we inject x-databricks-org-id as an HTTP header. + self._spog_headers = self._extract_spog_headers(http_path, all_headers) + if self._spog_headers: + all_headers = all_headers + list(self._spog_headers.items()) + + self.ssl_options = SSLOptions( + # Double negation is generally a bad thing, but we have to keep backward compatibility + tls_verify=not kwargs.get( + "_tls_no_verify", False + ), # by default - verify cert and host + tls_verify_hostname=kwargs.get("_tls_verify_hostname", True), + tls_trusted_ca_file=kwargs.get("_tls_trusted_ca_file"), + tls_client_cert_file=kwargs.get("_tls_client_cert_file"), + tls_client_cert_key_file=kwargs.get("_tls_client_cert_key_file"), + tls_client_cert_key_password=kwargs.get("_tls_client_cert_key_password"), + ) + + # Use the provided HTTP client (created in Connection) + self.http_client = http_client + + # Create auth provider with HTTP client context + self.auth_provider = get_python_sql_connector_auth_provider( + server_hostname, http_client=self.http_client, **kwargs + ) + + self.backend = self._create_backend( + server_hostname, + http_path, + all_headers, + self.auth_provider, + _use_arrow_native_complex_types, + kwargs, + ) + + self.protocol_version = None + + def _create_backend( + self, + server_hostname: str, + http_path: str, + all_headers: List[Tuple[str, str]], + auth_provider, + _use_arrow_native_complex_types: Optional[bool], + kwargs: dict, + ) -> DatabricksClient: + """Create and return the appropriate backend client.""" + self.use_sea = kwargs.get("use_sea", False) + + databricks_client_class: Type[DatabricksClient] + if self.use_sea: + logger.debug("Creating SEA backend client") + databricks_client_class = SeaDatabricksClient + else: + logger.debug("Creating Thrift backend client") + databricks_client_class = ThriftDatabricksClient + + common_args = { + "server_hostname": server_hostname, + "port": self.port, + "http_path": http_path, + "http_headers": all_headers, + "auth_provider": auth_provider, + "ssl_options": self.ssl_options, + "http_client": self.http_client, + "_use_arrow_native_complex_types": _use_arrow_native_complex_types, + **kwargs, + } + return databricks_client_class(**common_args) + + @staticmethod + def _extract_spog_headers(http_path, existing_headers): + """Extract ?o= from http_path and return as a header dict for SPOG routing.""" + if not http_path or "?" not in http_path: + return {} + + from urllib.parse import parse_qs + + query_string = http_path.split("?", 1)[1] + params = parse_qs(query_string) + org_id = params.get("o", [None])[0] + if not org_id: + logger.debug( + "SPOG header extraction: http_path has query string but no ?o= param, " + "skipping x-databricks-org-id injection" + ) + return {} + + # Don't override if explicitly set + if any(k == "x-databricks-org-id" for k, _ in existing_headers): + logger.debug( + "SPOG header extraction: x-databricks-org-id already set by caller, " + "not overriding with ?o=%s from http_path", + org_id, + ) + return {} + + logger.debug( + "SPOG header extraction: injecting x-databricks-org-id=%s " + "(extracted from ?o= in http_path)", + org_id, + ) + return {"x-databricks-org-id": org_id} + + def get_spog_headers(self): + """Returns SPOG routing headers (x-databricks-org-id) if ?o= was in http_path.""" + return dict(self._spog_headers) + + def open(self): + self._session_id = self.backend.open_session( + session_configuration=self.session_configuration, + catalog=self.catalog, + schema=self.schema, + ) + + self.protocol_version = self.get_protocol_version(self._session_id) + self.is_open = True + logger.info("Successfully opened session %s", str(self.guid_hex)) + + @staticmethod + def get_protocol_version(session_id: SessionId): + return session_id.protocol_version + + @staticmethod + def server_parameterized_queries_enabled(protocolVersion): + if ( + protocolVersion + and protocolVersion >= ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8 + ): + return True + else: + return False + + @property + def session_id(self) -> SessionId: + """Get the normalized session ID""" + return self._session_id + + @property + def guid(self) -> Any: + """Get the raw session ID (backend-specific)""" + return self._session_id.guid + + @property + def guid_hex(self) -> str: + """Get the session ID in hex format""" + return self._session_id.hex_guid + + def get_autocommit(self) -> bool: + """ + Get the cached autocommit state for this session. + + Returns: + bool: True if autocommit is enabled, False otherwise + """ + return self._autocommit + + def set_autocommit(self, value: bool) -> None: + """ + Update the cached autocommit state for this session. + + Args: + value: True to cache autocommit as enabled, False as disabled + """ + self._autocommit = value + + def close(self) -> None: + """Close the underlying session.""" + logger.info("Closing session %s", self.guid_hex) + if not self.is_open: + logger.debug("Session appears to have been closed already") + return + + try: + self.backend.close_session(self._session_id) + except RequestError as e: + if isinstance(e.args[1], SessionAlreadyClosedError): + logger.info("Session was closed by a prior request") + except DatabaseError as e: + if "Invalid SessionHandle" in str(e): + logger.warning( + "Attempted to close session that was already closed: %s", e + ) + else: + logger.warning( + "Attempt to close session raised an exception at the server: %s", e + ) + except Exception as e: + logger.error("Attempt to close session raised a local exception: %s", e) + + self.is_open = False diff --git a/src/databricks/sql/telemetry/circuit_breaker_manager.py b/src/databricks/sql/telemetry/circuit_breaker_manager.py new file mode 100644 index 000000000..a5df7371e --- /dev/null +++ b/src/databricks/sql/telemetry/circuit_breaker_manager.py @@ -0,0 +1,112 @@ +""" +Circuit breaker implementation for telemetry requests. + +This module provides circuit breaker functionality to prevent telemetry failures +from impacting the main SQL operations. It uses pybreaker library to implement +the circuit breaker pattern. +""" + +import logging +import threading +from typing import Dict + +import pybreaker +from pybreaker import CircuitBreaker, CircuitBreakerError, CircuitBreakerListener + +from databricks.sql.exc import TelemetryNonRateLimitError + +logger = logging.getLogger(__name__) + +# Circuit Breaker Constants +MINIMUM_CALLS = 20 # Number of failures before circuit opens +RESET_TIMEOUT = 30 # Seconds to wait before trying to close circuit +NAME_PREFIX = "telemetry-circuit-breaker" + +# Circuit Breaker State Constants (used in logging) +CIRCUIT_BREAKER_STATE_OPEN = "open" +CIRCUIT_BREAKER_STATE_CLOSED = "closed" +CIRCUIT_BREAKER_STATE_HALF_OPEN = "half-open" + +# Logging Message Constants +LOG_CIRCUIT_BREAKER_STATE_CHANGED = "Circuit breaker state changed from %s to %s for %s" +LOG_CIRCUIT_BREAKER_OPENED = ( + "Circuit breaker opened for %s - telemetry requests will be blocked" +) +LOG_CIRCUIT_BREAKER_CLOSED = ( + "Circuit breaker closed for %s - telemetry requests will be allowed" +) +LOG_CIRCUIT_BREAKER_HALF_OPEN = ( + "Circuit breaker half-open for %s - testing telemetry requests" +) + + +class CircuitBreakerStateListener(CircuitBreakerListener): + """Listener for circuit breaker state changes.""" + + def before_call(self, cb: CircuitBreaker, func, *args, **kwargs) -> None: + """Called before the circuit breaker calls a function.""" + pass + + def failure(self, cb: CircuitBreaker, exc: BaseException) -> None: + """Called when a function called by the circuit breaker fails.""" + pass + + def success(self, cb: CircuitBreaker) -> None: + """Called when a function called by the circuit breaker succeeds.""" + pass + + def state_change(self, cb: CircuitBreaker, old_state, new_state) -> None: + """Called when the circuit breaker state changes.""" + old_state_name = old_state.name if old_state else "None" + new_state_name = new_state.name if new_state else "None" + + logger.debug( + LOG_CIRCUIT_BREAKER_STATE_CHANGED, old_state_name, new_state_name, cb.name + ) + + if new_state_name == CIRCUIT_BREAKER_STATE_OPEN: + logger.debug(LOG_CIRCUIT_BREAKER_OPENED, cb.name) + elif new_state_name == CIRCUIT_BREAKER_STATE_CLOSED: + logger.debug(LOG_CIRCUIT_BREAKER_CLOSED, cb.name) + elif new_state_name == CIRCUIT_BREAKER_STATE_HALF_OPEN: + logger.debug(LOG_CIRCUIT_BREAKER_HALF_OPEN, cb.name) + + +class CircuitBreakerManager: + """ + Manages circuit breaker instances for telemetry requests. + + Creates and caches circuit breaker instances per host to ensure telemetry + failures don't impact main SQL operations. + """ + + _instances: Dict[str, CircuitBreaker] = {} + _lock = threading.RLock() + + @classmethod + def get_circuit_breaker(cls, host: str) -> CircuitBreaker: + """ + Get or create a circuit breaker instance for the specified host. + + Args: + host: The hostname for which to get the circuit breaker + + Returns: + CircuitBreaker instance for the host + """ + with cls._lock: + if host not in cls._instances: + breaker = CircuitBreaker( + fail_max=MINIMUM_CALLS, + reset_timeout=RESET_TIMEOUT, + name=f"{NAME_PREFIX}-{host}", + exclude=[ + TelemetryNonRateLimitError + ], # Don't count these as failures + ) + # Add state change listener for logging + breaker.add_listener(CircuitBreakerStateListener()) + cls._instances[host] = breaker + logger.debug("Created circuit breaker for host: %s", host) + + return cls._instances[host] diff --git a/src/databricks/sql/telemetry/latency_logger.py b/src/databricks/sql/telemetry/latency_logger.py new file mode 100644 index 000000000..2445c25c2 --- /dev/null +++ b/src/databricks/sql/telemetry/latency_logger.py @@ -0,0 +1,220 @@ +import time +import functools +from typing import Optional, Dict, Any +import logging +from databricks.sql.telemetry.telemetry_client import TelemetryClientFactory +from databricks.sql.telemetry.models.event import ( + SqlExecutionEvent, +) +from databricks.sql.telemetry.models.enums import ExecutionResultFormat, StatementType + +logger = logging.getLogger(__name__) + + +def _extract_cursor_data(cursor) -> Dict[str, Any]: + """ + Extract telemetry data directly from a Cursor object. + + OPTIMIZATION: Uses direct attribute access instead of wrapper objects. + This eliminates object creation overhead and method call indirection. + + Args: + cursor: The Cursor object to extract data from + + Returns: + Dict with telemetry data (values may be None if extraction fails) + """ + data = {} + + # Extract statement_id (query_id) - direct attribute access + try: + data["statement_id"] = cursor.query_id + except (AttributeError, Exception): + data["statement_id"] = None + + # Extract session_id_hex - direct method call + try: + data["session_id_hex"] = cursor.connection.get_session_id_hex() + except (AttributeError, Exception): + data["session_id_hex"] = None + + # Extract is_compressed - direct attribute access + try: + data["is_compressed"] = cursor.connection.lz4_compression + except (AttributeError, Exception): + data["is_compressed"] = False + + # Extract execution_result_format - inline logic + try: + if cursor.active_result_set is None: + data["execution_result"] = ExecutionResultFormat.FORMAT_UNSPECIFIED + else: + from databricks.sql.utils import ColumnQueue, CloudFetchQueue, ArrowQueue + + results = cursor.active_result_set.results + if isinstance(results, ColumnQueue): + data["execution_result"] = ExecutionResultFormat.COLUMNAR_INLINE + elif isinstance(results, CloudFetchQueue): + data["execution_result"] = ExecutionResultFormat.EXTERNAL_LINKS + elif isinstance(results, ArrowQueue): + data["execution_result"] = ExecutionResultFormat.INLINE_ARROW + else: + data["execution_result"] = ExecutionResultFormat.FORMAT_UNSPECIFIED + except (AttributeError, Exception): + data["execution_result"] = ExecutionResultFormat.FORMAT_UNSPECIFIED + + # Extract retry_count - direct attribute access + try: + if hasattr(cursor.backend, "retry_policy") and cursor.backend.retry_policy: + data["retry_count"] = len(cursor.backend.retry_policy.history) + else: + data["retry_count"] = 0 + except (AttributeError, Exception): + data["retry_count"] = 0 + + # chunk_id is always None for Cursor + data["chunk_id"] = None + + return data + + +def _extract_result_set_handler_data(handler) -> Dict[str, Any]: + """ + Extract telemetry data directly from a ResultSetDownloadHandler object. + + OPTIMIZATION: Uses direct attribute access instead of wrapper objects. + + Args: + handler: The ResultSetDownloadHandler object to extract data from + + Returns: + Dict with telemetry data (values may be None if extraction fails) + """ + data = {} + + # Extract session_id_hex - direct attribute access + try: + data["session_id_hex"] = handler.session_id_hex + except (AttributeError, Exception): + data["session_id_hex"] = None + + # Extract statement_id - direct attribute access + try: + data["statement_id"] = handler.statement_id + except (AttributeError, Exception): + data["statement_id"] = None + + # Extract is_compressed - direct attribute access + try: + data["is_compressed"] = handler.settings.is_lz4_compressed + except (AttributeError, Exception): + data["is_compressed"] = False + + # execution_result is always EXTERNAL_LINKS for result set handlers + data["execution_result"] = ExecutionResultFormat.EXTERNAL_LINKS + + # retry_count is not available for result set handlers + data["retry_count"] = None + + # Extract chunk_id - direct attribute access + try: + data["chunk_id"] = handler.chunk_id + except (AttributeError, Exception): + data["chunk_id"] = None + + return data + + +def _extract_telemetry_data(obj) -> Optional[Dict[str, Any]]: + """ + Extract telemetry data from an object based on its type. + + OPTIMIZATION: Returns a simple dict instead of creating wrapper objects. + This dict will be used to create the SqlExecutionEvent in the background thread. + + Args: + obj: The object to extract data from (Cursor, ResultSetDownloadHandler, etc.) + + Returns: + Dict with telemetry data, or None if object type is not supported + """ + obj_type = obj.__class__.__name__ + + if obj_type == "Cursor": + return _extract_cursor_data(obj) + elif obj_type == "ResultSetDownloadHandler": + return _extract_result_set_handler_data(obj) + else: + logger.debug("No telemetry extraction available for %s", obj_type) + return None + + +def log_latency(statement_type: StatementType = StatementType.NONE): + """ + Decorator for logging execution latency and telemetry information. + + This decorator measures the execution time of a method and sends telemetry + data about the operation, including latency, statement information, and + execution context. + + Args: + statement_type (StatementType): The type of SQL statement being executed. + + Usage: + @log_latency(StatementType.QUERY) + def execute(self, query): + # Method implementation + pass + + Returns: + function: A decorator that wraps methods to add latency logging. + + Note: + The wrapped method's object (self) must be a Cursor or + ResultSetDownloadHandler for telemetry data extraction. + """ + + def decorator(func): + @functools.wraps(func) + def wrapper(self, *args, **kwargs): + start_time = time.monotonic() + try: + return func(self, *args, **kwargs) + finally: + duration_ms = int((time.monotonic() - start_time) * 1000) + + # Always log for debugging + logger.debug("%s completed in %dms", func.__name__, duration_ms) + + # Fast check: use cached telemetry_enabled flag from connection + # Avoids dictionary lookup + instance check on every operation + connection = getattr(self, "connection", None) + if connection and getattr(connection, "telemetry_enabled", False): + session_id_hex = connection.get_session_id_hex() + if session_id_hex: + # Telemetry enabled - extract and send + telemetry_data = _extract_telemetry_data(self) + if telemetry_data: + sql_exec_event = SqlExecutionEvent( + statement_type=statement_type, + is_compressed=telemetry_data.get("is_compressed"), + execution_result=telemetry_data.get("execution_result"), + retry_count=telemetry_data.get("retry_count"), + chunk_id=telemetry_data.get("chunk_id"), + ) + + telemetry_client = ( + TelemetryClientFactory.get_telemetry_client( + host_url=connection.session.host + ) + ) + telemetry_client.export_latency_log( + latency_ms=duration_ms, + sql_execution_event=sql_exec_event, + sql_statement_id=telemetry_data.get("statement_id"), + session_id=session_id_hex, + ) + + return wrapper + + return decorator diff --git a/src/databricks/sql/telemetry/models/endpoint_models.py b/src/databricks/sql/telemetry/models/endpoint_models.py new file mode 100644 index 000000000..371dc67fb --- /dev/null +++ b/src/databricks/sql/telemetry/models/endpoint_models.py @@ -0,0 +1,39 @@ +import json +from dataclasses import dataclass, asdict +from typing import List, Optional +from databricks.sql.telemetry.utils import JsonSerializableMixin + + +@dataclass +class TelemetryRequest(JsonSerializableMixin): + """ + Represents a request to send telemetry data to the server side. + Contains the telemetry items to be uploaded and optional protocol buffer logs. + + Attributes: + uploadTime (int): Unix timestamp in milliseconds when the request is made + items (List[str]): List of telemetry event items to be uploaded + protoLogs (Optional[List[str]]): Optional list of protocol buffer formatted logs + """ + + uploadTime: int + items: List[str] + protoLogs: Optional[List[str]] + + +@dataclass +class TelemetryResponse(JsonSerializableMixin): + """ + Represents the response from the telemetry backend after processing a request. + Contains information about the success or failure of the telemetry upload. + + Attributes: + errors (List[str]): List of error messages if any occurred during processing + numSuccess (int): Number of successfully processed telemetry items + numProtoSuccess (int): Number of successfully processed protocol buffer logs + """ + + errors: List[str] + numSuccess: int + numProtoSuccess: int + numRealtimeSuccess: int diff --git a/src/databricks/sql/telemetry/models/enums.py b/src/databricks/sql/telemetry/models/enums.py new file mode 100644 index 000000000..dd8f26eb0 --- /dev/null +++ b/src/databricks/sql/telemetry/models/enums.py @@ -0,0 +1,44 @@ +from enum import Enum + + +class AuthFlow(Enum): + TYPE_UNSPECIFIED = "TYPE_UNSPECIFIED" + TOKEN_PASSTHROUGH = "TOKEN_PASSTHROUGH" + CLIENT_CREDENTIALS = "CLIENT_CREDENTIALS" + BROWSER_BASED_AUTHENTICATION = "BROWSER_BASED_AUTHENTICATION" + + +class AuthMech(Enum): + TYPE_UNSPECIFIED = "TYPE_UNSPECIFIED" + OTHER = "OTHER" + PAT = "PAT" + OAUTH = "OAUTH" + + +class DatabricksClientType(Enum): + SEA = "SEA" + THRIFT = "THRIFT" + + +class DriverVolumeOperationType(Enum): + TYPE_UNSPECIFIED = "TYPE_UNSPECIFIED" + PUT = "PUT" + GET = "GET" + DELETE = "DELETE" + LIST = "LIST" + QUERY = "QUERY" + + +class ExecutionResultFormat(Enum): + FORMAT_UNSPECIFIED = "FORMAT_UNSPECIFIED" + INLINE_ARROW = "INLINE_ARROW" + EXTERNAL_LINKS = "EXTERNAL_LINKS" + COLUMNAR_INLINE = "COLUMNAR_INLINE" + + +class StatementType(Enum): + NONE = "NONE" + QUERY = "QUERY" + SQL = "SQL" + UPDATE = "UPDATE" + METADATA = "METADATA" diff --git a/src/databricks/sql/telemetry/models/event.py b/src/databricks/sql/telemetry/models/event.py new file mode 100644 index 000000000..4d5a45038 --- /dev/null +++ b/src/databricks/sql/telemetry/models/event.py @@ -0,0 +1,271 @@ +from dataclasses import dataclass +from databricks.sql.telemetry.models.enums import ( + AuthMech, + AuthFlow, + DatabricksClientType, + DriverVolumeOperationType, + StatementType, + ExecutionResultFormat, +) +from typing import Optional +from databricks.sql.telemetry.utils import JsonSerializableMixin + + +@dataclass +class HostDetails(JsonSerializableMixin): + """ + Represents the host connection details for a Databricks workspace. + + Attributes: + host_url (str): The URL of the Databricks workspace (e.g., https://my-workspace.cloud.databricks.com) + port (int): The port number for the connection (typically 443 for HTTPS) + """ + + host_url: str + port: int + + +@dataclass +class DriverConnectionParameters(JsonSerializableMixin): + """ + Contains all connection parameters used to establish a connection to Databricks SQL. + This includes authentication details, host information, and connection settings. + + Attributes: + http_path (str): The HTTP path for the SQL endpoint + mode (DatabricksClientType): The type of client connection (e.g., THRIFT) + host_info (HostDetails): Details about the host connection + auth_mech (AuthMech): The authentication mechanism used + auth_flow (AuthFlow): The authentication flow type + socket_timeout (int): Connection timeout in milliseconds + azure_workspace_resource_id (str): Azure workspace resource ID + azure_tenant_id (str): Azure tenant ID + use_proxy (bool): Whether proxy is being used + use_system_proxy (bool): Whether system proxy is being used + proxy_host_info (HostDetails): Proxy host details if configured + use_cf_proxy (bool): Whether CloudFlare proxy is being used + cf_proxy_host_info (HostDetails): CloudFlare proxy host details if configured + non_proxy_hosts (list): List of hosts that bypass proxy + allow_self_signed_support (bool): Whether self-signed certificates are allowed + use_system_trust_store (bool): Whether system trust store is used + enable_arrow (bool): Whether Arrow format is enabled + enable_direct_results (bool): Whether direct results are enabled + enable_sea_hybrid_results (bool): Whether SEA hybrid results are enabled + http_connection_pool_size (int): HTTP connection pool size + rows_fetched_per_block (int): Number of rows fetched per block + async_poll_interval_millis (int): Async polling interval in milliseconds + support_many_parameters (bool): Whether many parameters are supported + enable_complex_datatype_support (bool): Whether complex datatypes are supported + allowed_volume_ingestion_paths (str): Allowed paths for volume ingestion + query_tags (str): Query tags for tracking and attribution + """ + + http_path: str + mode: DatabricksClientType + host_info: HostDetails + auth_mech: Optional[AuthMech] = None + auth_flow: Optional[AuthFlow] = None + socket_timeout: Optional[int] = None + azure_workspace_resource_id: Optional[str] = None + azure_tenant_id: Optional[str] = None + use_proxy: Optional[bool] = None + use_system_proxy: Optional[bool] = None + proxy_host_info: Optional[HostDetails] = None + use_cf_proxy: Optional[bool] = None + cf_proxy_host_info: Optional[HostDetails] = None + non_proxy_hosts: Optional[list] = None + allow_self_signed_support: Optional[bool] = None + use_system_trust_store: Optional[bool] = None + enable_arrow: Optional[bool] = None + enable_direct_results: Optional[bool] = None + enable_sea_hybrid_results: Optional[bool] = None + http_connection_pool_size: Optional[int] = None + rows_fetched_per_block: Optional[int] = None + async_poll_interval_millis: Optional[int] = None + support_many_parameters: Optional[bool] = None + enable_complex_datatype_support: Optional[bool] = None + allowed_volume_ingestion_paths: Optional[str] = None + query_tags: Optional[str] = None + + +@dataclass +class DriverSystemConfiguration(JsonSerializableMixin): + """ + Contains system-level configuration information about the client environment. + This includes details about the operating system, runtime, and driver version. + + Attributes: + driver_version (str): Version of the Databricks SQL driver + os_name (str): Name of the operating system + os_version (str): Version of the operating system + os_arch (str): Architecture of the operating system + runtime_name (str): Name of the Python runtime (e.g., CPython) + runtime_version (str): Version of the Python runtime + runtime_vendor (str): Vendor of the Python runtime + client_app_name (str): Name of the client application + locale_name (str): System locale setting + driver_name (str): Name of the driver + char_set_encoding (str): Character set encoding used + """ + + driver_version: str + os_name: str + os_version: str + os_arch: str + runtime_name: str + runtime_version: str + runtime_vendor: str + driver_name: str + char_set_encoding: str + client_app_name: Optional[str] = None + locale_name: Optional[str] = None + + +@dataclass +class DriverVolumeOperation(JsonSerializableMixin): + """ + Represents a volume operation performed by the driver. + Used for tracking volume-related operations in telemetry. + + Attributes: + volume_operation_type (DriverVolumeOperationType): Type of volume operation (e.g., LIST) + volume_path (str): Path to the volume being operated on + """ + + volume_operation_type: DriverVolumeOperationType + volume_path: str + + +@dataclass +class DriverErrorInfo(JsonSerializableMixin): + """ + Contains detailed information about errors that occur during driver operations. + Used for error tracking and debugging in telemetry. + + Attributes: + error_name (str): Name/type of the error + stack_trace (str): Full stack trace of the error + """ + + error_name: str + stack_trace: str + + +@dataclass +class ChunkDetails(JsonSerializableMixin): + """ + Contains detailed metrics about chunk downloads during result fetching. + + These metrics are accumulated across all chunk downloads for a single statement. + + Attributes: + initial_chunk_latency_millis (int): Latency of the first chunk download + slowest_chunk_latency_millis (int): Latency of the slowest chunk download + total_chunks_present (int): Total number of chunks available + total_chunks_iterated (int): Number of chunks actually downloaded + sum_chunks_download_time_millis (int): Total time spent downloading all chunks + """ + + initial_chunk_latency_millis: Optional[int] = None + slowest_chunk_latency_millis: Optional[int] = None + total_chunks_present: Optional[int] = None + total_chunks_iterated: Optional[int] = None + sum_chunks_download_time_millis: Optional[int] = None + + +@dataclass +class ResultLatency(JsonSerializableMixin): + """ + Contains latency metrics for different phases of query execution. + + This tracks two distinct phases: + 1. result_set_ready_latency_millis: Time from query submission until results are available (execute phase) + - Set when execute() completes + 2. result_set_consumption_latency_millis: Time spent iterating/fetching results (fetch phase) + - Measured from first fetch call until no more rows available + - In Java: tracked via markResultSetConsumption(hasNext) method + - Records start time on first fetch, calculates total on last fetch + + Attributes: + result_set_ready_latency_millis (int): Time until query results are ready (execution phase) + result_set_consumption_latency_millis (int): Time spent fetching/consuming results (fetch phase) + + """ + + result_set_ready_latency_millis: Optional[int] = None + result_set_consumption_latency_millis: Optional[int] = None + + +@dataclass +class OperationDetail(JsonSerializableMixin): + """ + Contains detailed information about the operation being performed. + + Attributes: + n_operation_status_calls (int): Number of status polling calls made + operation_status_latency_millis (int): Total latency of all status calls + operation_type (str): Specific operation type (e.g., EXECUTE_STATEMENT, LIST_TABLES, CANCEL_STATEMENT) + is_internal_call (bool): Whether this is an internal driver operation + """ + + n_operation_status_calls: Optional[int] = None + operation_status_latency_millis: Optional[int] = None + operation_type: Optional[str] = None + is_internal_call: Optional[bool] = None + + +@dataclass +class SqlExecutionEvent(JsonSerializableMixin): + """ + Represents a SQL query execution event. + Contains details about the query execution, including type, compression, and result format. + + Attributes: + statement_type (StatementType): Type of SQL statement + is_compressed (bool): Whether the result is compressed + execution_result (ExecutionResultFormat): Format of the execution result + retry_count (int): Number of retry attempts made + chunk_id (int): ID of the chunk if applicable (used for error tracking) + chunk_details (ChunkDetails): Aggregated chunk download metrics + result_latency (ResultLatency): Latency breakdown by execution phase + operation_detail (OperationDetail): Detailed operation information + """ + + statement_type: StatementType + is_compressed: bool + execution_result: ExecutionResultFormat + retry_count: Optional[int] + chunk_id: Optional[int] + chunk_details: Optional[ChunkDetails] = None + result_latency: Optional[ResultLatency] = None + operation_detail: Optional[OperationDetail] = None + + +@dataclass +class TelemetryEvent(JsonSerializableMixin): + """ + Main telemetry event class that aggregates all telemetry data. + Contains information about the session, system configuration, connection parameters, + and any operations or errors that occurred. + + Attributes: + session_id (str): Unique identifier for the session + sql_statement_id (Optional[str]): ID of the SQL statement if applicable + system_configuration (DriverSystemConfiguration): System configuration details + driver_connection_params (DriverConnectionParameters): Connection parameters + auth_type (Optional[str]): Type of authentication used + vol_operation (Optional[DriverVolumeOperation]): Volume operation details if applicable + sql_operation (Optional[SqlExecutionEvent]): SQL execution details if applicable + error_info (Optional[DriverErrorInfo]): Error information if an error occurred + operation_latency_ms (Optional[int]): Operation latency in milliseconds + """ + + system_configuration: DriverSystemConfiguration + driver_connection_params: DriverConnectionParameters + session_id: Optional[str] = None + sql_statement_id: Optional[str] = None + auth_type: Optional[str] = None + vol_operation: Optional[DriverVolumeOperation] = None + sql_operation: Optional[SqlExecutionEvent] = None + error_info: Optional[DriverErrorInfo] = None + operation_latency_ms: Optional[int] = None diff --git a/src/databricks/sql/telemetry/models/frontend_logs.py b/src/databricks/sql/telemetry/models/frontend_logs.py new file mode 100644 index 000000000..4cc314ec3 --- /dev/null +++ b/src/databricks/sql/telemetry/models/frontend_logs.py @@ -0,0 +1,65 @@ +from dataclasses import dataclass +from databricks.sql.telemetry.models.event import TelemetryEvent +from databricks.sql.telemetry.utils import JsonSerializableMixin +from typing import Optional + + +@dataclass +class TelemetryClientContext(JsonSerializableMixin): + """ + Contains client-side context information for telemetry events. + This includes timestamp and user agent information for tracking when and how the client is being used. + + Attributes: + timestamp_millis (int): Unix timestamp in milliseconds when the event occurred + user_agent (str): Identifier for the client application making the request + """ + + timestamp_millis: int + user_agent: str + + +@dataclass +class FrontendLogContext(JsonSerializableMixin): + """ + Wrapper for client context information in frontend logs. + Provides additional context about the client environment for telemetry events. + + Attributes: + client_context (TelemetryClientContext): Client-specific context information + """ + + client_context: TelemetryClientContext + + +@dataclass +class FrontendLogEntry(JsonSerializableMixin): + """ + Contains the actual telemetry event data in a frontend log. + Wraps the SQL driver log information for frontend processing. + + Attributes: + sql_driver_log (TelemetryEvent): The telemetry event containing SQL driver information + """ + + sql_driver_log: TelemetryEvent + + +@dataclass +class TelemetryFrontendLog(JsonSerializableMixin): + """ + Main container for frontend telemetry data. + Aggregates workspace information, event ID, context, and the actual log entry. + Used for sending telemetry data to the server side. + + Attributes: + workspace_id (int): Unique identifier for the Databricks workspace + frontend_log_event_id (str): Unique identifier for this telemetry event + context (FrontendLogContext): Context information about the client + entry (FrontendLogEntry): The actual telemetry event data + """ + + frontend_log_event_id: str + context: FrontendLogContext + entry: FrontendLogEntry + workspace_id: Optional[int] = None diff --git a/src/databricks/sql/telemetry/telemetry_client.py b/src/databricks/sql/telemetry/telemetry_client.py new file mode 100644 index 000000000..55d845e46 --- /dev/null +++ b/src/databricks/sql/telemetry/telemetry_client.py @@ -0,0 +1,758 @@ +import threading +import time +import logging +import json +from queue import Queue, Full +from concurrent.futures import ThreadPoolExecutor +from concurrent.futures import Future +from datetime import datetime, timezone +from typing import List, Dict, Any, Optional, TYPE_CHECKING +from databricks.sql.telemetry.models.event import ( + TelemetryEvent, + DriverSystemConfiguration, + DriverErrorInfo, + DriverConnectionParameters, + HostDetails, +) +from databricks.sql.telemetry.models.frontend_logs import ( + TelemetryFrontendLog, + TelemetryClientContext, + FrontendLogContext, + FrontendLogEntry, +) +from databricks.sql.telemetry.models.enums import ( + AuthMech, + AuthFlow, + DatabricksClientType, +) +from databricks.sql.telemetry.models.endpoint_models import ( + TelemetryRequest, + TelemetryResponse, +) +from databricks.sql.auth.authenticators import ( + AccessTokenAuthProvider, + DatabricksOAuthProvider, + ExternalAuthProvider, +) +import sys +import platform +import uuid +import locale +from databricks.sql.telemetry.utils import BaseTelemetryClient +from databricks.sql.common.feature_flag import FeatureFlagsContextFactory +from databricks.sql.common.unified_http_client import UnifiedHttpClient +from databricks.sql.common.http import HttpMethod +from databricks.sql.exc import RequestError +from databricks.sql.telemetry.telemetry_push_client import ( + ITelemetryPushClient, + TelemetryPushClient, + CircuitBreakerTelemetryPushClient, +) +from databricks.sql.common.url_utils import normalize_host_with_protocol + +if TYPE_CHECKING: + from databricks.sql.client import Connection + +logger = logging.getLogger(__name__) + + +class TelemetryHelper: + """Helper class for getting telemetry related information.""" + + _DRIVER_SYSTEM_CONFIGURATION = None + TELEMETRY_FEATURE_FLAG_NAME = "databricks.partnerplatform.clientConfigsFeatureFlags.enableTelemetryForPythonDriver" + + @classmethod + def get_driver_system_configuration(cls) -> DriverSystemConfiguration: + if cls._DRIVER_SYSTEM_CONFIGURATION is None: + from databricks.sql import __version__ + + cls._DRIVER_SYSTEM_CONFIGURATION = DriverSystemConfiguration( + driver_name="Databricks SQL Python Connector", + driver_version=__version__, + runtime_name=f"Python {sys.version.split()[0]}", + runtime_vendor=platform.python_implementation(), + runtime_version=platform.python_version(), + os_name=platform.system(), + os_version=platform.release(), + os_arch=platform.machine(), + client_app_name=None, # TODO: Add client app name + locale_name=locale.getlocale()[0] or locale.getdefaultlocale()[0], + char_set_encoding=sys.getdefaultencoding(), + ) + return cls._DRIVER_SYSTEM_CONFIGURATION + + @staticmethod + def get_auth_mechanism(auth_provider): + """Get the auth mechanism for the auth provider.""" + # AuthMech is an enum with the following values: + # TYPE_UNSPECIFIED, OTHER, PAT, OAUTH + + if not auth_provider: + return None + if isinstance(auth_provider, AccessTokenAuthProvider): + return AuthMech.PAT + elif isinstance(auth_provider, DatabricksOAuthProvider): + return AuthMech.OAUTH + else: + return AuthMech.OTHER + + @staticmethod + def get_auth_flow(auth_provider): + """Get the auth flow for the auth provider.""" + # AuthFlow is an enum with the following values: + # TYPE_UNSPECIFIED, TOKEN_PASSTHROUGH, CLIENT_CREDENTIALS, BROWSER_BASED_AUTHENTICATION + + if not auth_provider: + return None + if isinstance(auth_provider, DatabricksOAuthProvider): + if auth_provider._access_token and auth_provider._refresh_token: + return AuthFlow.TOKEN_PASSTHROUGH + else: + return AuthFlow.BROWSER_BASED_AUTHENTICATION + elif isinstance(auth_provider, ExternalAuthProvider): + return AuthFlow.CLIENT_CREDENTIALS + else: + return None + + @staticmethod + def is_telemetry_enabled(connection: "Connection") -> bool: + # Fast path: force enabled - skip feature flag fetch entirely + if connection.force_enable_telemetry: + return True + + # Fast path: disabled - no need to check feature flag + if not connection.enable_telemetry: + return False + + # Only fetch feature flags when enable_telemetry=True and not forced + context = FeatureFlagsContextFactory.get_instance(connection) + flag_value = context.get_flag_value( + TelemetryHelper.TELEMETRY_FEATURE_FLAG_NAME, default_value=False + ) + return str(flag_value).lower() == "true" + + +class NoopTelemetryClient(BaseTelemetryClient): + """ + NoopTelemetryClient is a telemetry client that does not send any events to the server. + It is used when telemetry is disabled. + """ + + _instance = None + _lock = threading.RLock() + + def __new__(cls): + if cls._instance is None: + with cls._lock: + if cls._instance is None: + cls._instance = super(NoopTelemetryClient, cls).__new__(cls) + return cls._instance + + def export_initial_telemetry_log( + self, driver_connection_params, user_agent, session_id=None + ): + pass + + def export_failure_log(self, error_name, error_message, session_id=None): + pass + + def export_latency_log( + self, latency_ms, sql_execution_event, sql_statement_id, session_id=None + ): + pass + + def close(self): + pass + + def _flush(self): + pass + + +class TelemetryClient(BaseTelemetryClient): + """ + Telemetry client class that handles sending telemetry events in batches to the server. + It uses a thread pool to handle asynchronous operations, that it gets from the TelemetryClientFactory. + """ + + # Telemetry endpoint paths + TELEMETRY_AUTHENTICATED_PATH = "/telemetry-ext" + TELEMETRY_UNAUTHENTICATED_PATH = "/telemetry-unauth" + + def __init__( + self, + telemetry_enabled: bool, + session_id_hex: str, + auth_provider, + host_url: str, + executor, + batch_size: int, + client_context, + extra_headers: Optional[Dict[str, str]] = None, + ) -> None: + logger.debug("Initializing TelemetryClient for connection: %s", session_id_hex) + self._telemetry_enabled = telemetry_enabled + self._batch_size = batch_size + self._session_id_hex = session_id_hex + self._auth_provider = auth_provider + self._user_agent = None + self._extra_headers = extra_headers or {} + + # OPTIMIZATION: Use lock-free Queue instead of list + lock + # Queue is thread-safe internally and has better performance under concurrency + self._events_queue: Queue[TelemetryFrontendLog] = Queue(maxsize=batch_size * 2) + + self._driver_connection_params = None + self._host_url = host_url + self._executor = executor + + # Create own HTTP client from client context + self._http_client = UnifiedHttpClient(client_context) + + # Create telemetry push client based on circuit breaker enabled flag + if client_context.telemetry_circuit_breaker_enabled: + # Create circuit breaker telemetry push client + # (circuit breakers created on-demand) + self._telemetry_push_client: ITelemetryPushClient = ( + CircuitBreakerTelemetryPushClient( + TelemetryPushClient(self._http_client), + host_url, + ) + ) + else: + # Circuit breaker disabled - use direct telemetry push client + self._telemetry_push_client = TelemetryPushClient(self._http_client) + + def _export_event(self, event): + """Add an event to the batch queue and flush if batch is full""" + logger.debug("Exporting event for connection %s", self._session_id_hex) + + # OPTIMIZATION: Use non-blocking put with queue + # No explicit lock needed - Queue is thread-safe internally + try: + self._events_queue.put_nowait(event) + except Full: + # Queue is full, trigger immediate flush + logger.debug("Event queue full, triggering flush") + self._flush() + # Try again after flush + try: + self._events_queue.put_nowait(event) + except Full: + # Still full, drop event (acceptable for telemetry) + logger.debug("Dropped telemetry event - queue still full") + + # Check if we should flush based on queue size + if self._events_queue.qsize() >= self._batch_size: + logger.debug( + "Batch size limit reached (%s), flushing events", self._batch_size + ) + self._flush() + + def _flush(self): + """Flush the current batch of events to the server""" + # OPTIMIZATION: Drain queue without locks + # Collect all events currently in the queue + events_to_flush = [] + while not self._events_queue.empty(): + try: + event = self._events_queue.get_nowait() + events_to_flush.append(event) + except: + # Queue is empty + break + + if events_to_flush: + logger.debug("Flushing %s telemetry events to server", len(events_to_flush)) + self._send_telemetry(events_to_flush) + + def _send_telemetry(self, events): + """Send telemetry events to the server""" + + request = TelemetryRequest( + uploadTime=int(time.time() * 1000), + items=[], + protoLogs=[event.to_json() for event in events], + ) + + sent_count = len(events) + + path = ( + self.TELEMETRY_AUTHENTICATED_PATH + if self._auth_provider + else self.TELEMETRY_UNAUTHENTICATED_PATH + ) + url = normalize_host_with_protocol(self._host_url) + path + + headers = {"Accept": "application/json", "Content-Type": "application/json"} + + if self._auth_provider: + self._auth_provider.add_headers(headers) + + headers.update(self._extra_headers) + + try: + logger.debug("Submitting telemetry request to thread pool") + + # Use unified HTTP client + future = self._executor.submit( + self._send_with_unified_client, + url, + data=request.to_json(), + headers=headers, + timeout=900, + ) + + future.add_done_callback( + lambda fut: self._telemetry_request_callback(fut, sent_count=sent_count) + ) + except Exception as e: + logger.debug("Failed to submit telemetry request: %s", e) + + def _send_with_unified_client(self, url, data, headers, timeout=900): + """Helper method to send telemetry using the unified HTTP client.""" + try: + response = self._telemetry_push_client.request( + HttpMethod.POST, url, body=data, headers=headers, timeout=timeout + ) + return response + except Exception as e: + logger.debug("Failed to send telemetry with unified client: %s", e) + raise + + def _telemetry_request_callback(self, future, sent_count: int): + """Callback function to handle telemetry request completion""" + try: + response = future.result() + + # Check if response is successful (urllib3 uses response.status) + is_success = 200 <= response.status < 300 + if not is_success: + logger.debug( + "Telemetry request failed with status code: %s, response: %s", + response.status, + response.data.decode() if response.data else "", + ) + + # Parse JSON response (urllib3 uses response.data) + response_data = json.loads(response.data.decode()) if response.data else {} + telemetry_response = TelemetryResponse(**response_data) + + logger.debug( + "Pushed Telemetry logs with success count: %s, error count: %s", + telemetry_response.numProtoSuccess, + len(telemetry_response.errors), + ) + + if telemetry_response.errors: + logger.debug( + "Telemetry push failed for some events with errors: %s", + telemetry_response.errors, + ) + + # Check for partial failures + if sent_count != telemetry_response.numProtoSuccess: + logger.debug( + "Partial failure pushing telemetry. Sent: %s, Succeeded: %s, Errors: %s", + sent_count, + telemetry_response.numProtoSuccess, + telemetry_response.errors, + ) + + except Exception as e: + logger.debug("Telemetry request failed with exception: %s", e) + + def _export_telemetry_log(self, session_id=None, **telemetry_event_kwargs): + """ + Common helper method for exporting telemetry logs. + + Args: + session_id: Optional session ID for this event. If not provided, uses the client's session ID. + **telemetry_event_kwargs: Keyword arguments to pass to TelemetryEvent constructor + """ + # Use provided session_id or fall back to client's session_id + actual_session_id = session_id or self._session_id_hex + logger.debug("Exporting telemetry log for connection %s", actual_session_id) + + try: + # Set common fields for all telemetry events + event_kwargs = { + "session_id": actual_session_id, + "system_configuration": TelemetryHelper.get_driver_system_configuration(), + "driver_connection_params": self._driver_connection_params, + } + # Add any additional fields passed in + event_kwargs.update(telemetry_event_kwargs) + + telemetry_frontend_log = TelemetryFrontendLog( + frontend_log_event_id=str(uuid.uuid4()), + context=FrontendLogContext( + client_context=TelemetryClientContext( + timestamp_millis=int(time.time() * 1000), + user_agent=self._user_agent, + ) + ), + entry=FrontendLogEntry(sql_driver_log=TelemetryEvent(**event_kwargs)), + ) + + self._export_event(telemetry_frontend_log) + + except Exception as e: + logger.debug("Failed to export telemetry log: %s", e) + + def export_initial_telemetry_log( + self, driver_connection_params, user_agent, session_id=None + ): + self._driver_connection_params = driver_connection_params + self._user_agent = user_agent + self._export_telemetry_log(session_id=session_id) + + def export_failure_log(self, error_name, error_message, session_id=None): + error_info = DriverErrorInfo(error_name=error_name, stack_trace=error_message) + self._export_telemetry_log(session_id=session_id, error_info=error_info) + + def export_latency_log( + self, latency_ms, sql_execution_event, sql_statement_id, session_id=None + ): + self._export_telemetry_log( + session_id=session_id, + sql_statement_id=sql_statement_id, + sql_operation=sql_execution_event, + operation_latency_ms=latency_ms, + ) + + def close(self): + """Flush remaining events before closing + + IMPORTANT: This method does NOT close self._http_client. + + Rationale: + - _flush() submits async work to the executor that uses _http_client + - If we closed _http_client here, async callbacks would fail with AttributeError + - Instead, we let _http_client live as long as needed: + * Pending futures hold references to self (via bound methods) + * This keeps self alive, which keeps self._http_client alive + * When all futures complete, Python GC will clean up naturally + - The __del__ method ensures eventual cleanup during garbage collection + + This design prevents race conditions while keeping telemetry truly async. + """ + logger.debug("Closing TelemetryClient for connection %s", self._session_id_hex) + self._flush() + + def __del__(self): + """Cleanup when TelemetryClient is garbage collected + + This ensures _http_client is eventually closed when the TelemetryClient + object is destroyed. By this point, all async work should be complete + (since the futures held references keeping us alive), so it's safe to + close the http client. + """ + try: + if hasattr(self, "_http_client") and self._http_client: + self._http_client.close() + except Exception: + pass + + +class _TelemetryClientHolder: + """ + Holds a telemetry client with reference counting. + Multiple connections to the same host share one client. + """ + + def __init__(self, client: BaseTelemetryClient): + self.client = client + self.refcount = 1 + + def increment(self): + """Increment reference count when a new connection uses this client""" + self.refcount += 1 + + def decrement(self): + """Decrement reference count when a connection closes""" + self.refcount -= 1 + return self.refcount + + +class TelemetryClientFactory: + """ + Static factory class for creating and managing telemetry clients. + It uses a thread pool to handle asynchronous operations and a single flush thread for all clients. + + Clients are shared at the HOST level - multiple connections to the same host + share a single TelemetryClient to enable efficient batching and reduce load + on the telemetry endpoint. + """ + + _clients: Dict[ + str, _TelemetryClientHolder + ] = {} # Map of host_url -> TelemetryClientHolder + _executor: Optional[ThreadPoolExecutor] = None + _initialized: bool = False + _lock = threading.RLock() # Thread safety for factory operations + # used RLock instead of Lock to avoid deadlocks when garbage collection is triggered + _original_excepthook = None + _excepthook_installed = False + + # Shared flush thread for all clients + _flush_thread = None + _flush_event = threading.Event() + _flush_interval_seconds = 300 # 5 minutes + + DEFAULT_BATCH_SIZE = 100 + UNKNOWN_HOST = "unknown-host" + + @staticmethod + def getHostUrlSafely(host_url): + """ + Safely get host URL with fallback to UNKNOWN_HOST. + + Args: + host_url: The host URL to validate + + Returns: + The host_url if valid, otherwise UNKNOWN_HOST + """ + if not host_url or not isinstance(host_url, str) or not host_url.strip(): + return TelemetryClientFactory.UNKNOWN_HOST + return host_url + + @classmethod + def _initialize(cls): + """Initialize the factory if not already initialized""" + + if not cls._initialized: + cls._clients = {} + cls._executor = ThreadPoolExecutor( + max_workers=10 + ) # Thread pool for async operations + cls._install_exception_hook() + cls._start_flush_thread() + cls._initialized = True + logger.debug( + "TelemetryClientFactory initialized with thread pool (max_workers=10)" + ) + + @classmethod + def _start_flush_thread(cls): + """Start the shared background thread for periodic flushing of all clients""" + cls._flush_event.clear() + cls._flush_thread = threading.Thread(target=cls._flush_worker, daemon=True) + cls._flush_thread.start() + + @classmethod + def _flush_worker(cls): + """Background worker thread for periodic flushing of all clients""" + while not cls._flush_event.wait(cls._flush_interval_seconds): + logger.debug("Performing periodic flush for all telemetry clients") + + with cls._lock: + clients_to_flush = list(cls._clients.values()) + + for holder in clients_to_flush: + holder.client._flush() + + @classmethod + def _stop_flush_thread(cls): + """Stop the shared background flush thread""" + if cls._flush_thread is not None: + cls._flush_event.set() + cls._flush_thread.join(timeout=1.0) + cls._flush_thread = None + + @classmethod + def _install_exception_hook(cls): + """Install global exception handler for unhandled exceptions""" + if not cls._excepthook_installed: + cls._original_excepthook = sys.excepthook + sys.excepthook = cls._handle_unhandled_exception + cls._excepthook_installed = True + logger.debug("Global exception handler installed for telemetry") + + @classmethod + def _handle_unhandled_exception(cls, exc_type, exc_value, exc_traceback): + """Handle unhandled exceptions by sending telemetry and flushing thread pool""" + logger.debug("Handling unhandled exception: %s", exc_type.__name__) + + clients_to_close = list(cls._clients.values()) + for holder in clients_to_close: + holder.client.close() + + # Call the original exception handler to maintain normal behavior + if cls._original_excepthook: + cls._original_excepthook(exc_type, exc_value, exc_traceback) + + @staticmethod + def initialize_telemetry_client( + telemetry_enabled, + session_id_hex, + auth_provider, + host_url, + batch_size, + client_context, + extra_headers=None, + ): + """ + Initialize a telemetry client for a specific connection if telemetry is enabled. + + Clients are shared at the HOST level - multiple connections to the same host + will share a single TelemetryClient with reference counting. + """ + try: + # Safely get host_url with fallback to UNKNOWN_HOST + host_url = TelemetryClientFactory.getHostUrlSafely(host_url) + + with TelemetryClientFactory._lock: + TelemetryClientFactory._initialize() + + if host_url in TelemetryClientFactory._clients: + # Reuse existing client for this host + holder = TelemetryClientFactory._clients[host_url] + holder.increment() + logger.debug( + "Reusing TelemetryClient for host %s (session %s, refcount=%d)", + host_url, + session_id_hex, + holder.refcount, + ) + else: + # Create new client for this host + logger.debug( + "Creating new TelemetryClient for host %s (session %s)", + host_url, + session_id_hex, + ) + if telemetry_enabled: + client = TelemetryClient( + telemetry_enabled=telemetry_enabled, + session_id_hex=session_id_hex, + auth_provider=auth_provider, + host_url=host_url, + executor=TelemetryClientFactory._executor, + batch_size=batch_size, + client_context=client_context, + extra_headers=extra_headers, + ) + TelemetryClientFactory._clients[ + host_url + ] = _TelemetryClientHolder(client) + else: + TelemetryClientFactory._clients[ + host_url + ] = _TelemetryClientHolder(NoopTelemetryClient()) + except Exception as e: + logger.debug("Failed to initialize telemetry client: %s", e) + # Fallback to NoopTelemetryClient to ensure connection doesn't fail + TelemetryClientFactory._clients[host_url] = _TelemetryClientHolder( + NoopTelemetryClient() + ) + + @staticmethod + def get_telemetry_client(host_url): + """ + Get the shared telemetry client for a specific host. + + Args: + host_url: The host URL to look up the client. If None/empty, uses UNKNOWN_HOST. + + Returns: + The shared TelemetryClient for this host, or NoopTelemetryClient if not found + """ + host_url = TelemetryClientFactory.getHostUrlSafely(host_url) + + if host_url in TelemetryClientFactory._clients: + return TelemetryClientFactory._clients[host_url].client + return NoopTelemetryClient() + + @staticmethod + def close(host_url): + """ + Close the telemetry client for a specific host. + + Decrements the reference count for the host's client. Only actually closes + the client when the reference count reaches zero (all connections to this host closed). + + Args: + host_url: The host URL whose client to close. If None/empty, uses UNKNOWN_HOST. + """ + host_url = TelemetryClientFactory.getHostUrlSafely(host_url) + + with TelemetryClientFactory._lock: + # Get the holder for this host + holder = TelemetryClientFactory._clients.get(host_url) + if holder is None: + logger.debug("No telemetry client found for host %s", host_url) + return + + # Decrement refcount + remaining_refs = holder.decrement() + logger.debug( + "Decremented refcount for host %s (refcount=%d)", + host_url, + remaining_refs, + ) + + # Only close if no more references + if remaining_refs <= 0: + logger.debug( + "Closing telemetry client for host %s (no more references)", + host_url, + ) + TelemetryClientFactory._clients.pop(host_url, None) + holder.client.close() + + # Shutdown executor if no more clients + if not TelemetryClientFactory._clients and TelemetryClientFactory._executor: + logger.debug( + "No more telemetry clients, shutting down thread pool executor" + ) + try: + TelemetryClientFactory._stop_flush_thread() + # Use wait=False to allow process to exit immediately + TelemetryClientFactory._executor.shutdown(wait=False) + except Exception as e: + logger.debug("Failed to shutdown thread pool executor: %s", e) + TelemetryClientFactory._executor = None + TelemetryClientFactory._initialized = False + + @staticmethod + def connection_failure_log( + error_name: str, + error_message: str, + host_url: str, + http_path: str, + port: int, + client_context, + user_agent: Optional[str] = None, + enable_telemetry: bool = True, + ): + """Send error telemetry when connection creation fails, using provided client context""" + + # Respect user's telemetry preference - don't force-enable + if not enable_telemetry: + logger.debug("Telemetry disabled, skipping connection failure log") + return + + UNAUTH_DUMMY_SESSION_ID = "unauth_session_id" + + TelemetryClientFactory.initialize_telemetry_client( + telemetry_enabled=True, + session_id_hex=UNAUTH_DUMMY_SESSION_ID, + auth_provider=None, + host_url=host_url, + batch_size=TelemetryClientFactory.DEFAULT_BATCH_SIZE, + client_context=client_context, + ) + + telemetry_client = TelemetryClientFactory.get_telemetry_client( + host_url=host_url + ) + telemetry_client._driver_connection_params = DriverConnectionParameters( + http_path=http_path, + mode=DatabricksClientType.THRIFT, # TODO: Add SEA mode + host_info=HostDetails(host_url=host_url, port=port), + ) + telemetry_client._user_agent = user_agent + + telemetry_client.export_failure_log(error_name, error_message) diff --git a/src/databricks/sql/telemetry/telemetry_push_client.py b/src/databricks/sql/telemetry/telemetry_push_client.py new file mode 100644 index 000000000..e77910007 --- /dev/null +++ b/src/databricks/sql/telemetry/telemetry_push_client.py @@ -0,0 +1,201 @@ +""" +Telemetry push client interface and implementations. + +This module provides an interface for telemetry push clients with two implementations: +1. TelemetryPushClient - Direct HTTP client implementation +2. CircuitBreakerTelemetryPushClient - Circuit breaker wrapper implementation +""" + +import logging +from abc import ABC, abstractmethod +from typing import Dict, Any, Optional + +try: + from urllib3 import BaseHTTPResponse +except ImportError: + from urllib3 import HTTPResponse as BaseHTTPResponse +from pybreaker import CircuitBreakerError + +from databricks.sql.common.unified_http_client import UnifiedHttpClient +from databricks.sql.common.http import HttpMethod +from databricks.sql.exc import ( + TelemetryRateLimitError, + TelemetryNonRateLimitError, + RequestError, +) +from databricks.sql.telemetry.circuit_breaker_manager import CircuitBreakerManager + +logger = logging.getLogger(__name__) + + +class ITelemetryPushClient(ABC): + """Interface for telemetry push clients.""" + + @abstractmethod + def request( + self, + method: HttpMethod, + url: str, + headers: Optional[Dict[str, str]] = None, + **kwargs, + ) -> BaseHTTPResponse: + """Make an HTTP request.""" + pass + + +class TelemetryPushClient(ITelemetryPushClient): + """Direct HTTP client implementation for telemetry requests.""" + + def __init__(self, http_client: UnifiedHttpClient): + """ + Initialize the telemetry push client. + + Args: + http_client: The underlying HTTP client + """ + self._http_client = http_client + logger.debug("TelemetryPushClient initialized") + + def request( + self, + method: HttpMethod, + url: str, + headers: Optional[Dict[str, str]] = None, + **kwargs, + ) -> BaseHTTPResponse: + """Make an HTTP request using the underlying HTTP client.""" + return self._http_client.request(method, url, headers, **kwargs) + + +class CircuitBreakerTelemetryPushClient(ITelemetryPushClient): + """Circuit breaker wrapper implementation for telemetry requests.""" + + def __init__(self, delegate: ITelemetryPushClient, host: str): + """ + Initialize the circuit breaker telemetry push client. + + Args: + delegate: The underlying telemetry push client to wrap + host: The hostname for circuit breaker identification + """ + self._delegate = delegate + self._host = host + + # Get circuit breaker for this host (creates if doesn't exist) + self._circuit_breaker = CircuitBreakerManager.get_circuit_breaker(host) + + logger.debug( + "CircuitBreakerTelemetryPushClient initialized for host %s", + host, + ) + + def _make_request_and_check_status( + self, + method: HttpMethod, + url: str, + headers: Optional[Dict[str, str]], + **kwargs, + ) -> BaseHTTPResponse: + """ + Make the request and check response status. + + Raises TelemetryRateLimitError for 429/503 (circuit breaker counts these). + Wraps other errors in TelemetryNonRateLimitError (circuit breaker excludes these). + + Args: + method: HTTP method + url: Request URL + headers: Request headers + **kwargs: Additional request parameters + + Returns: + HTTP response + + Raises: + TelemetryRateLimitError: For 429/503 status codes (circuit breaker counts) + TelemetryNonRateLimitError: For other errors (circuit breaker excludes) + """ + try: + response = self._delegate.request(method, url, headers, **kwargs) + + # Check for rate limiting or service unavailable + if response.status in [429, 503]: + logger.debug( + "Telemetry endpoint returned %d for host %s, triggering circuit breaker", + response.status, + self._host, + ) + raise TelemetryRateLimitError( + f"Telemetry endpoint rate limited or unavailable: {response.status}" + ) + + return response + + except Exception as e: + # Don't catch TelemetryRateLimitError - let it propagate to circuit breaker + if isinstance(e, TelemetryRateLimitError): + raise + + # Check if it's a RequestError with rate limiting status code (exhausted retries) + if isinstance(e, RequestError): + http_code = ( + e.context.get("http-code") + if hasattr(e, "context") and e.context + else None + ) + + if http_code in [429, 503]: + logger.debug( + "Telemetry retries exhausted with status %d for host %s, triggering circuit breaker", + http_code, + self._host, + ) + raise TelemetryRateLimitError( + f"Telemetry rate limited after retries: {http_code}" + ) + + # NOT rate limiting (500 errors, network errors, timeouts, etc.) + # Wrap in TelemetryNonRateLimitError so circuit breaker excludes it + logger.debug( + "Non-rate-limit telemetry error for host %s: %s, wrapping to exclude from circuit breaker", + self._host, + e, + ) + raise TelemetryNonRateLimitError(e) from e + + def request( + self, + method: HttpMethod, + url: str, + headers: Optional[Dict[str, str]] = None, + **kwargs, + ) -> BaseHTTPResponse: + """ + Make an HTTP request with circuit breaker protection. + + Circuit breaker only opens for TelemetryRateLimitError (429/503 responses). + Other errors are wrapped in TelemetryNonRateLimitError and excluded from circuit breaker. + All exceptions propagate to caller (TelemetryClient callback handles them). + """ + try: + # Use circuit breaker to protect the request + # TelemetryRateLimitError will trigger circuit breaker + # TelemetryNonRateLimitError is excluded from circuit breaker + return self._circuit_breaker.call( + self._make_request_and_check_status, + method, + url, + headers, + **kwargs, + ) + + except TelemetryNonRateLimitError as e: + # Unwrap and re-raise original exception + # Circuit breaker didn't count this, but caller should handle it + logger.debug( + "Non-rate-limit telemetry error for host %s, re-raising original: %s", + self._host, + e.original_exception, + ) + raise e.original_exception from e + # All other exceptions (TelemetryRateLimitError, CircuitBreakerError) propagate as-is diff --git a/src/databricks/sql/telemetry/utils.py b/src/databricks/sql/telemetry/utils.py new file mode 100644 index 000000000..b4f74c44f --- /dev/null +++ b/src/databricks/sql/telemetry/utils.py @@ -0,0 +1,69 @@ +import json +from enum import Enum +from dataclasses import asdict, is_dataclass +from abc import ABC, abstractmethod +import logging + +logger = logging.getLogger(__name__) + + +class BaseTelemetryClient(ABC): + """ + Base class for telemetry clients. + It is used to define the interface for telemetry clients. + """ + + @abstractmethod + def export_initial_telemetry_log(self, driver_connection_params, user_agent): + logger.debug("subclass must implement export_initial_telemetry_log") + pass + + @abstractmethod + def export_failure_log(self, error_name, error_message): + logger.debug("subclass must implement export_failure_log") + pass + + @abstractmethod + def export_latency_log(self, latency_ms, sql_execution_event, sql_statement_id): + logger.debug("subclass must implement export_latency_log") + pass + + @abstractmethod + def close(self): + logger.debug("subclass must implement close") + pass + + +class JsonSerializableMixin: + """Mixin class to provide JSON serialization capabilities to dataclasses.""" + + def to_json(self) -> str: + """ + Convert the object to a JSON string, excluding None values. + Handles Enum serialization and filters out None values from the output. + """ + if not is_dataclass(self): + raise TypeError( + f"{self.__class__.__name__} must be a dataclass to use JsonSerializableMixin" + ) + + return json.dumps( + asdict( + self, + dict_factory=lambda data: {k: v for k, v in data if v is not None}, + ), + cls=EnumEncoder, + ) + + +class EnumEncoder(json.JSONEncoder): + """ + Custom JSON encoder to handle Enum values. + This is used to convert Enum values to their string representations. + Default JSON encoder raises a TypeError for Enums. + """ + + def default(self, obj): + if isinstance(obj, Enum): + return obj.value + return super().default(obj) diff --git a/src/databricks/sql/thrift_api/TCLIService/ttypes.py b/src/databricks/sql/thrift_api/TCLIService/ttypes.py index 16abbc2ee..5a0e6bf5e 100644 --- a/src/databricks/sql/thrift_api/TCLIService/ttypes.py +++ b/src/databricks/sql/thrift_api/TCLIService/ttypes.py @@ -37,6 +37,7 @@ class TProtocolVersion(object): SPARK_CLI_SERVICE_PROTOCOL_V6 = 42246 SPARK_CLI_SERVICE_PROTOCOL_V7 = 42247 SPARK_CLI_SERVICE_PROTOCOL_V8 = 42248 + SPARK_CLI_SERVICE_PROTOCOL_V9 = 42249 _VALUES_TO_NAMES = { -7: "__HIVE_JDBC_WORKAROUND", @@ -59,6 +60,7 @@ class TProtocolVersion(object): 42246: "SPARK_CLI_SERVICE_PROTOCOL_V6", 42247: "SPARK_CLI_SERVICE_PROTOCOL_V7", 42248: "SPARK_CLI_SERVICE_PROTOCOL_V8", + 42249: "SPARK_CLI_SERVICE_PROTOCOL_V9", } _NAMES_TO_VALUES = { @@ -82,6 +84,7 @@ class TProtocolVersion(object): "SPARK_CLI_SERVICE_PROTOCOL_V6": 42246, "SPARK_CLI_SERVICE_PROTOCOL_V7": 42247, "SPARK_CLI_SERVICE_PROTOCOL_V8": 42248, + "SPARK_CLI_SERVICE_PROTOCOL_V9": 42249, } @@ -214,39 +217,6 @@ class TDBSqlArrowLayout(object): } -class TOperationIdempotencyType(object): - UNKNOWN = 0 - NON_IDEMPOTENT = 1 - IDEMPOTENT = 2 - - _VALUES_TO_NAMES = { - 0: "UNKNOWN", - 1: "NON_IDEMPOTENT", - 2: "IDEMPOTENT", - } - - _NAMES_TO_VALUES = { - "UNKNOWN": 0, - "NON_IDEMPOTENT": 1, - "IDEMPOTENT": 2, - } - - -class TOperationTimeoutLevel(object): - CLUSTER = 0 - SESSION = 1 - - _VALUES_TO_NAMES = { - 0: "CLUSTER", - 1: "SESSION", - } - - _NAMES_TO_VALUES = { - "CLUSTER": 0, - "SESSION": 1, - } - - class TStatusCode(object): SUCCESS_STATUS = 0 SUCCESS_WITH_INFO_STATUS = 1 @@ -493,39 +463,6 @@ class TGetInfoType(object): } -class TResultPersistenceMode(object): - ONLY_LARGE_RESULTS = 0 - ALL_QUERY_RESULTS = 1 - ALL_RESULTS = 2 - - _VALUES_TO_NAMES = { - 0: "ONLY_LARGE_RESULTS", - 1: "ALL_QUERY_RESULTS", - 2: "ALL_RESULTS", - } - - _NAMES_TO_VALUES = { - "ONLY_LARGE_RESULTS": 0, - "ALL_QUERY_RESULTS": 1, - "ALL_RESULTS": 2, - } - - -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 @@ -547,51 +484,6 @@ class TCacheLookupResult(object): } -class TCloudFetchDisabledReason(object): - ARROW_SUPPORT = 0 - CLOUD_FETCH_SUPPORT = 1 - PROTOCOL_VERSION = 2 - REGION_SUPPORT = 3 - BLOCKLISTED_OPERATION = 4 - SMALL_RESULT_SIZE = 5 - CUSTOMER_STORAGE_SUPPORT = 6 - UNKNOWN = 7 - - _VALUES_TO_NAMES = { - 0: "ARROW_SUPPORT", - 1: "CLOUD_FETCH_SUPPORT", - 2: "PROTOCOL_VERSION", - 3: "REGION_SUPPORT", - 4: "BLOCKLISTED_OPERATION", - 5: "SMALL_RESULT_SIZE", - 6: "CUSTOMER_STORAGE_SUPPORT", - 7: "UNKNOWN", - } - - _NAMES_TO_VALUES = { - "ARROW_SUPPORT": 0, - "CLOUD_FETCH_SUPPORT": 1, - "PROTOCOL_VERSION": 2, - "REGION_SUPPORT": 3, - "BLOCKLISTED_OPERATION": 4, - "SMALL_RESULT_SIZE": 5, - "CUSTOMER_STORAGE_SUPPORT": 6, - "UNKNOWN": 7, - } - - -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 +511,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 +667,7 @@ def __ne__(self, other): return not (self == other) -class TTAllowedParameterValueEntry(object): +class TPrimitiveTypeEntry(object): """ Attributes: - type @@ -838,7 +709,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 +1098,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) @@ -3393,150 +3264,6 @@ def __ne__(self, other): return not (self == other) -class TDBSqlCloudResultFile(object): - """ - Attributes: - - filePath - - startRowOffset - - 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,): - 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: - 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.filePath = 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.I64: - self.startRowOffset = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 3: - if ftype == TType.I64: - self.rowCount = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 4: - if ftype == TType.I64: - self.uncompressedBytes = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 5: - if ftype == TType.I64: - 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() - 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('TDBSqlCloudResultFile') - if self.filePath is not None: - oprot.writeFieldBegin('filePath', TType.STRING, 1) - oprot.writeString(self.filePath.encode('utf-8') if sys.version_info[0] == 2 else self.filePath) - oprot.writeFieldEnd() - if self.startRowOffset is not None: - oprot.writeFieldBegin('startRowOffset', TType.I64, 2) - oprot.writeI64(self.startRowOffset) - oprot.writeFieldEnd() - if self.rowCount is not None: - oprot.writeFieldBegin('rowCount', TType.I64, 3) - oprot.writeI64(self.rowCount) - oprot.writeFieldEnd() - if self.uncompressedBytes is not None: - oprot.writeFieldBegin('uncompressedBytes', TType.I64, 4) - oprot.writeI64(self.uncompressedBytes) - oprot.writeFieldEnd() - if self.compressedBytes is not None: - 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): - 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 TRowSet(object): """ Attributes: @@ -3547,12 +3274,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 +3286,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 +3304,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) + (_etype116, _size113) = iprot.readListBegin() + for _i117 in range(_size113): + _elem118 = TRow() + _elem118.read(iprot) + self.rows.append(_elem118) 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) + (_etype122, _size119) = iprot.readListBegin() + for _i123 in range(_size119): + _elem124 = TColumn() + _elem124.read(iprot) + self.columns.append(_elem124) iprot.readListEnd() else: iprot.skip(ftype) @@ -3611,33 +3336,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) + (_etype128, _size125) = iprot.readListBegin() + for _i129 in range(_size125): + _elem130 = TSparkArrowBatch() + _elem130.read(iprot) + self.arrowBatches.append(_elem130) 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) + (_etype134, _size131) = iprot.readListBegin() + for _i135 in range(_size131): + _elem136 = TSparkArrowResultLink() + _elem136.read(iprot) + self.resultLinks.append(_elem136) iprot.readListEnd() else: iprot.skip(ftype) @@ -3658,15 +3372,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 iter137 in self.rows: + iter137.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 iter138 in self.columns: + iter138.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.binaryColumns is not None: @@ -3680,22 +3394,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 iter139 in self.arrowBatches: + iter139.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 iter140 in self.resultLinks: + iter140.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() oprot.writeFieldStop() @@ -3720,22 +3427,28 @@ def __ne__(self, other): return not (self == other) -class TDBSqlTempView(object): +class TStatus(object): """ Attributes: - - name - - sqlStatement - - properties - - viewSchema + - statusCode + - infoMessages + - sqlState + - errorCode + - errorMessage + - displayMessage + - errorDetailsJson """ - def __init__(self, name=None, sqlStatement=None, properties=None, viewSchema=None,): - self.name = name - self.sqlStatement = sqlStatement - self.properties = properties - self.viewSchema = viewSchema + def __init__(self, statusCode=None, infoMessages=None, sqlState=None, errorCode=None, errorMessage=None, displayMessage=None, errorDetailsJson=None,): + self.statusCode = statusCode + self.infoMessages = infoMessages + self.sqlState = sqlState + self.errorCode = errorCode + self.errorMessage = errorMessage + self.displayMessage = displayMessage + self.errorDetailsJson = errorDetailsJson def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3747,29 +3460,43 @@ def read(self, iprot): if ftype == TType.STOP: break if fid == 1: - if ftype == TType.STRING: - self.name = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + if ftype == TType.I32: + self.statusCode = iprot.readI32() else: iprot.skip(ftype) elif fid == 2: - if ftype == TType.STRING: - self.sqlStatement = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + if ftype == TType.LIST: + self.infoMessages = [] + (_etype144, _size141) = iprot.readListBegin() + for _i145 in range(_size141): + _elem146 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.infoMessages.append(_elem146) + iprot.readListEnd() else: iprot.skip(ftype) 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 - iprot.readMapEnd() + if ftype == TType.STRING: + self.sqlState = 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.I32: + self.errorCode = iprot.readI32() + else: + iprot.skip(ftype) + elif fid == 5: + if ftype == TType.STRING: + self.errorMessage = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + elif fid == 6: + if ftype == TType.STRING: + 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.viewSchema = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.errorDetailsJson = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) else: @@ -3781,31 +3508,44 @@ 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('TDBSqlTempView') - if self.name is not None: - oprot.writeFieldBegin('name', TType.STRING, 1) - oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name) + oprot.writeStructBegin('TStatus') + if self.statusCode is not None: + oprot.writeFieldBegin('statusCode', TType.I32, 1) + oprot.writeI32(self.statusCode) oprot.writeFieldEnd() - if self.sqlStatement is not None: - oprot.writeFieldBegin('sqlStatement', TType.STRING, 2) - oprot.writeString(self.sqlStatement.encode('utf-8') if sys.version_info[0] == 2 else self.sqlStatement) + if self.infoMessages is not None: + oprot.writeFieldBegin('infoMessages', TType.LIST, 2) + oprot.writeListBegin(TType.STRING, len(self.infoMessages)) + for iter147 in self.infoMessages: + oprot.writeString(iter147.encode('utf-8') if sys.version_info[0] == 2 else iter147) + oprot.writeListEnd() oprot.writeFieldEnd() - 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) - oprot.writeMapEnd() + if self.sqlState is not None: + oprot.writeFieldBegin('sqlState', TType.STRING, 3) + oprot.writeString(self.sqlState.encode('utf-8') if sys.version_info[0] == 2 else self.sqlState) + oprot.writeFieldEnd() + if self.errorCode is not None: + oprot.writeFieldBegin('errorCode', TType.I32, 4) + oprot.writeI32(self.errorCode) + oprot.writeFieldEnd() + if self.errorMessage is not None: + oprot.writeFieldBegin('errorMessage', TType.STRING, 5) + oprot.writeString(self.errorMessage.encode('utf-8') if sys.version_info[0] == 2 else self.errorMessage) + oprot.writeFieldEnd() + if self.displayMessage is not None: + 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.viewSchema is not None: - oprot.writeFieldBegin('viewSchema', TType.STRING, 4) - oprot.writeString(self.viewSchema.encode('utf-8') if sys.version_info[0] == 2 else self.viewSchema) + 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() oprot.writeFieldStop() oprot.writeStructEnd() def validate(self): + if self.statusCode is None: + raise TProtocolException(message='Required field statusCode is unset!') return def __repr__(self): @@ -3820,16 +3560,18 @@ def __ne__(self, other): return not (self == other) -class TDBSqlSessionCapabilities(object): +class TNamespace(object): """ Attributes: - - supportsMultipleCatalogs + - catalogName + - schemaName """ - def __init__(self, supportsMultipleCatalogs=None,): - self.supportsMultipleCatalogs = supportsMultipleCatalogs + def __init__(self, catalogName=None, schemaName=None,): + self.catalogName = catalogName + self.schemaName = schemaName def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3841,8 +3583,13 @@ def read(self, iprot): if ftype == TType.STOP: break if fid == 1: - if ftype == TType.BOOL: - self.supportsMultipleCatalogs = iprot.readBool() + if ftype == TType.STRING: + self.catalogName = 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.STRING: + self.schemaName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() else: iprot.skip(ftype) else: @@ -3854,10 +3601,14 @@ 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('TDBSqlSessionCapabilities') - if self.supportsMultipleCatalogs is not None: - oprot.writeFieldBegin('supportsMultipleCatalogs', TType.BOOL, 1) - oprot.writeBool(self.supportsMultipleCatalogs) + oprot.writeStructBegin('TNamespace') + if self.catalogName is not None: + oprot.writeFieldBegin('catalogName', TType.STRING, 1) + oprot.writeString(self.catalogName.encode('utf-8') if sys.version_info[0] == 2 else self.catalogName) + oprot.writeFieldEnd() + if self.schemaName is not None: + oprot.writeFieldBegin('schemaName', TType.STRING, 2) + oprot.writeString(self.schemaName.encode('utf-8') if sys.version_info[0] == 2 else self.schemaName) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -3877,38 +3628,18 @@ def __ne__(self, other): return not (self == other) -class TExpressionInfo(object): +class THandleIdentifier(object): """ Attributes: - - className - - usage - - name - - extended - - db - - arguments - - examples - - note - - group - - since - - deprecated - - source + - guid + - secret """ - def __init__(self, className=None, usage=None, name=None, extended=None, db=None, arguments=None, examples=None, note=None, group=None, since=None, deprecated=None, source=None,): - self.className = className - self.usage = usage - self.name = name - self.extended = extended - self.db = db - self.arguments = arguments - self.examples = examples - self.note = note - self.group = group - self.since = since - self.deprecated = deprecated - self.source = source + def __init__(self, guid=None, secret=None,): + self.guid = guid + self.secret = secret def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -3921,62 +3652,12 @@ def read(self, iprot): break if fid == 1: if ftype == TType.STRING: - self.className = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.guid = iprot.readBinary() else: iprot.skip(ftype) elif fid == 2: if ftype == TType.STRING: - self.usage = 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.name = 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.STRING: - self.extended = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 5: - if ftype == TType.STRING: - self.db = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 6: - if ftype == TType.STRING: - self.arguments = 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.STRING: - self.examples = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 8: - if ftype == TType.STRING: - self.note = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 9: - if ftype == TType.STRING: - self.group = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 10: - if ftype == TType.STRING: - self.since = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 11: - if ftype == TType.STRING: - self.deprecated = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 12: - if ftype == TType.STRING: - self.source = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.secret = iprot.readBinary() else: iprot.skip(ftype) else: @@ -3988,59 +3669,23 @@ 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('TExpressionInfo') - if self.className is not None: - oprot.writeFieldBegin('className', TType.STRING, 1) - oprot.writeString(self.className.encode('utf-8') if sys.version_info[0] == 2 else self.className) - oprot.writeFieldEnd() - if self.usage is not None: - oprot.writeFieldBegin('usage', TType.STRING, 2) - oprot.writeString(self.usage.encode('utf-8') if sys.version_info[0] == 2 else self.usage) - oprot.writeFieldEnd() - if self.name is not None: - oprot.writeFieldBegin('name', TType.STRING, 3) - oprot.writeString(self.name.encode('utf-8') if sys.version_info[0] == 2 else self.name) - oprot.writeFieldEnd() - if self.extended is not None: - oprot.writeFieldBegin('extended', TType.STRING, 4) - oprot.writeString(self.extended.encode('utf-8') if sys.version_info[0] == 2 else self.extended) - oprot.writeFieldEnd() - if self.db is not None: - oprot.writeFieldBegin('db', TType.STRING, 5) - oprot.writeString(self.db.encode('utf-8') if sys.version_info[0] == 2 else self.db) - oprot.writeFieldEnd() - if self.arguments is not None: - oprot.writeFieldBegin('arguments', TType.STRING, 6) - oprot.writeString(self.arguments.encode('utf-8') if sys.version_info[0] == 2 else self.arguments) - oprot.writeFieldEnd() - if self.examples is not None: - oprot.writeFieldBegin('examples', TType.STRING, 7) - oprot.writeString(self.examples.encode('utf-8') if sys.version_info[0] == 2 else self.examples) - oprot.writeFieldEnd() - if self.note is not None: - oprot.writeFieldBegin('note', TType.STRING, 8) - oprot.writeString(self.note.encode('utf-8') if sys.version_info[0] == 2 else self.note) - oprot.writeFieldEnd() - if self.group is not None: - oprot.writeFieldBegin('group', TType.STRING, 9) - oprot.writeString(self.group.encode('utf-8') if sys.version_info[0] == 2 else self.group) - oprot.writeFieldEnd() - if self.since is not None: - oprot.writeFieldBegin('since', TType.STRING, 10) - oprot.writeString(self.since.encode('utf-8') if sys.version_info[0] == 2 else self.since) - oprot.writeFieldEnd() - if self.deprecated is not None: - oprot.writeFieldBegin('deprecated', TType.STRING, 11) - oprot.writeString(self.deprecated.encode('utf-8') if sys.version_info[0] == 2 else self.deprecated) + oprot.writeStructBegin('THandleIdentifier') + if self.guid is not None: + oprot.writeFieldBegin('guid', TType.STRING, 1) + oprot.writeBinary(self.guid) oprot.writeFieldEnd() - if self.source is not None: - oprot.writeFieldBegin('source', TType.STRING, 12) - oprot.writeString(self.source.encode('utf-8') if sys.version_info[0] == 2 else self.source) + if self.secret is not None: + oprot.writeFieldBegin('secret', TType.STRING, 2) + oprot.writeBinary(self.secret) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() def validate(self): + if self.guid is None: + raise TProtocolException(message='Required field guid is unset!') + if self.secret is None: + raise TProtocolException(message='Required field secret is unset!') return def __repr__(self): @@ -4055,16 +3700,18 @@ def __ne__(self, other): return not (self == other) -class TDBSqlConfValue(object): +class TSessionHandle(object): """ Attributes: - - value + - sessionId + - serverProtocolVersion """ - def __init__(self, value=None,): - self.value = value + def __init__(self, sessionId=None, serverProtocolVersion=None,): + self.sessionId = sessionId + self.serverProtocolVersion = serverProtocolVersion def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -4076,8 +3723,14 @@ def read(self, iprot): if ftype == TType.STOP: break if fid == 1: - if ftype == TType.STRING: - self.value = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + if ftype == TType.STRUCT: + self.sessionId = THandleIdentifier() + self.sessionId.read(iprot) + else: + iprot.skip(ftype) + elif fid == 3329: + if ftype == TType.I32: + self.serverProtocolVersion = iprot.readI32() else: iprot.skip(ftype) else: @@ -4089,15 +3742,21 @@ 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('TDBSqlConfValue') - if self.value is not None: - oprot.writeFieldBegin('value', TType.STRING, 1) - oprot.writeString(self.value.encode('utf-8') if sys.version_info[0] == 2 else self.value) + oprot.writeStructBegin('TSessionHandle') + if self.sessionId is not None: + oprot.writeFieldBegin('sessionId', TType.STRUCT, 1) + self.sessionId.write(oprot) + oprot.writeFieldEnd() + if self.serverProtocolVersion is not None: + oprot.writeFieldBegin('serverProtocolVersion', TType.I32, 3329) + oprot.writeI32(self.serverProtocolVersion) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() def validate(self): + if self.sessionId is None: + raise TProtocolException(message='Required field sessionId is unset!') return def __repr__(self): @@ -4112,28 +3771,22 @@ def __ne__(self, other): return not (self == other) -class TDBSqlSessionConf(object): +class TOperationHandle(object): """ Attributes: - - confs - - tempViews - - currentDatabase - - currentCatalog - - sessionCapabilities - - expressionsInfos - - internalConfs + - operationId + - operationType + - hasResultSet + - modifiedRowCount """ - def __init__(self, confs=None, tempViews=None, currentDatabase=None, currentCatalog=None, sessionCapabilities=None, expressionsInfos=None, internalConfs=None,): - self.confs = confs - self.tempViews = tempViews - self.currentDatabase = currentDatabase - self.currentCatalog = currentCatalog - self.sessionCapabilities = sessionCapabilities - self.expressionsInfos = expressionsInfos - self.internalConfs = internalConfs + def __init__(self, operationId=None, operationType=None, hasResultSet=None, modifiedRowCount=None,): + self.operationId = operationId + self.operationType = operationType + self.hasResultSet = hasResultSet + self.modifiedRowCount = modifiedRowCount def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -4145,64 +3798,24 @@ def read(self, iprot): if ftype == TType.STOP: break 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 - iprot.readMapEnd() + if ftype == TType.STRUCT: + self.operationId = THandleIdentifier() + self.operationId.read(iprot) 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) - iprot.readListEnd() + if ftype == TType.I32: + self.operationType = iprot.readI32() else: iprot.skip(ftype) elif fid == 3: - if ftype == TType.STRING: - self.currentDatabase = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + if ftype == TType.BOOL: + self.hasResultSet = iprot.readBool() else: iprot.skip(ftype) elif fid == 4: - if ftype == TType.STRING: - self.currentCatalog = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 5: - if ftype == TType.STRUCT: - self.sessionCapabilities = TDBSqlSessionCapabilities() - self.sessionCapabilities.read(iprot) - else: - iprot.skip(ftype) - 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) - 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 - iprot.readMapEnd() + if ftype == TType.DOUBLE: + self.modifiedRowCount = iprot.readDouble() else: iprot.skip(ftype) else: @@ -4214,53 +3827,33 @@ 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('TDBSqlSessionConf') - 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) - 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) - oprot.writeListEnd() - oprot.writeFieldEnd() - if self.currentDatabase is not None: - oprot.writeFieldBegin('currentDatabase', TType.STRING, 3) - oprot.writeString(self.currentDatabase.encode('utf-8') if sys.version_info[0] == 2 else self.currentDatabase) - oprot.writeFieldEnd() - if self.currentCatalog is not None: - oprot.writeFieldBegin('currentCatalog', TType.STRING, 4) - oprot.writeString(self.currentCatalog.encode('utf-8') if sys.version_info[0] == 2 else self.currentCatalog) + oprot.writeStructBegin('TOperationHandle') + if self.operationId is not None: + oprot.writeFieldBegin('operationId', TType.STRUCT, 1) + self.operationId.write(oprot) oprot.writeFieldEnd() - if self.sessionCapabilities is not None: - oprot.writeFieldBegin('sessionCapabilities', TType.STRUCT, 5) - self.sessionCapabilities.write(oprot) + if self.operationType is not None: + oprot.writeFieldBegin('operationType', TType.I32, 2) + oprot.writeI32(self.operationType) oprot.writeFieldEnd() - 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) - oprot.writeListEnd() + if self.hasResultSet is not None: + oprot.writeFieldBegin('hasResultSet', TType.BOOL, 3) + oprot.writeBool(self.hasResultSet) 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) - oprot.writeMapEnd() + if self.modifiedRowCount is not None: + oprot.writeFieldBegin('modifiedRowCount', TType.DOUBLE, 4) + oprot.writeDouble(self.modifiedRowCount) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() def validate(self): + if self.operationId is None: + raise TProtocolException(message='Required field operationId is unset!') + if self.operationType is None: + raise TProtocolException(message='Required field operationType is unset!') + if self.hasResultSet is None: + raise TProtocolException(message='Required field hasResultSet is unset!') return def __repr__(self): @@ -4275,30 +3868,32 @@ def __ne__(self, other): return not (self == other) -class TStatus(object): +class TOpenSessionReq(object): """ Attributes: - - statusCode - - infoMessages - - sqlState - - errorCode - - errorMessage - - displayMessage - - errorDetailsJson - - responseValidation + - client_protocol + - username + - password + - configuration + - getInfos + - client_protocol_i64 + - connectionProperties + - initialNamespace + - canUseMultipleCatalogs """ - def __init__(self, statusCode=None, infoMessages=None, sqlState=None, errorCode=None, errorMessage=None, displayMessage=None, errorDetailsJson=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 __init__(self, client_protocol= -7, username=None, password=None, configuration=None, getInfos=None, client_protocol_i64=None, connectionProperties=None, initialNamespace=None, canUseMultipleCatalogs=None,): + self.client_protocol = client_protocol + self.username = username + self.password = password + self.configuration = configuration + self.getInfos = getInfos + self.client_protocol_i64 = client_protocol_i64 + self.connectionProperties = connectionProperties + self.initialNamespace = initialNamespace + self.canUseMultipleCatalogs = canUseMultipleCatalogs def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -4311,505 +3906,38 @@ def read(self, iprot): break if fid == 1: if ftype == TType.I32: - self.statusCode = iprot.readI32() + self.client_protocol = iprot.readI32() else: iprot.skip(ftype) 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) - iprot.readListEnd() + if ftype == TType.STRING: + self.username = 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.sqlState = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.password = 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.I32: - self.errorCode = iprot.readI32() + if ftype == TType.MAP: + self.configuration = {} + (_ktype149, _vtype150, _size148) = iprot.readMapBegin() + for _i152 in range(_size148): + _key153 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val154 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.configuration[_key153] = _val154 + iprot.readMapEnd() else: iprot.skip(ftype) - elif fid == 5: - if ftype == TType.STRING: - self.errorMessage = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 6: - if ftype == TType.STRING: - 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() - 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('TStatus') - if self.statusCode is not None: - oprot.writeFieldBegin('statusCode', TType.I32, 1) - oprot.writeI32(self.statusCode) - oprot.writeFieldEnd() - 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) - oprot.writeListEnd() - oprot.writeFieldEnd() - if self.sqlState is not None: - oprot.writeFieldBegin('sqlState', TType.STRING, 3) - oprot.writeString(self.sqlState.encode('utf-8') if sys.version_info[0] == 2 else self.sqlState) - oprot.writeFieldEnd() - if self.errorCode is not None: - oprot.writeFieldBegin('errorCode', TType.I32, 4) - oprot.writeI32(self.errorCode) - oprot.writeFieldEnd() - if self.errorMessage is not None: - oprot.writeFieldBegin('errorMessage', TType.STRING, 5) - oprot.writeString(self.errorMessage.encode('utf-8') if sys.version_info[0] == 2 else self.errorMessage) - oprot.writeFieldEnd() - if self.displayMessage is not None: - 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) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - if self.statusCode is None: - raise TProtocolException(message='Required field statusCode 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 TNamespace(object): - """ - Attributes: - - catalogName - - schemaName - - """ - - - def __init__(self, catalogName=None, schemaName=None,): - self.catalogName = catalogName - self.schemaName = schemaName - - 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.catalogName = 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.STRING: - self.schemaName = 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('TNamespace') - if self.catalogName is not None: - oprot.writeFieldBegin('catalogName', TType.STRING, 1) - oprot.writeString(self.catalogName.encode('utf-8') if sys.version_info[0] == 2 else self.catalogName) - oprot.writeFieldEnd() - if self.schemaName is not None: - oprot.writeFieldBegin('schemaName', TType.STRING, 2) - oprot.writeString(self.schemaName.encode('utf-8') if sys.version_info[0] == 2 else self.schemaName) - 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 THandleIdentifier(object): - """ - Attributes: - - guid - - secret - - executionVersion - - """ - - - def __init__(self, guid=None, secret=None, executionVersion=None,): - self.guid = guid - self.secret = secret - self.executionVersion = executionVersion - - 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.guid = iprot.readBinary() - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.STRING: - self.secret = iprot.readBinary() - else: - iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.I16: - self.executionVersion = iprot.readI16() - 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('THandleIdentifier') - if self.guid is not None: - oprot.writeFieldBegin('guid', TType.STRING, 1) - oprot.writeBinary(self.guid) - oprot.writeFieldEnd() - if self.secret is not None: - oprot.writeFieldBegin('secret', TType.STRING, 2) - oprot.writeBinary(self.secret) - oprot.writeFieldEnd() - if self.executionVersion is not None: - oprot.writeFieldBegin('executionVersion', TType.I16, 3329) - oprot.writeI16(self.executionVersion) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - if self.guid is None: - raise TProtocolException(message='Required field guid is unset!') - if self.secret is None: - raise TProtocolException(message='Required field secret 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 TSessionHandle(object): - """ - Attributes: - - sessionId - - serverProtocolVersion - - """ - - - def __init__(self, sessionId=None, serverProtocolVersion=None,): - self.sessionId = sessionId - self.serverProtocolVersion = serverProtocolVersion - - 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.sessionId = THandleIdentifier() - self.sessionId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.I32: - self.serverProtocolVersion = 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('TSessionHandle') - if self.sessionId is not None: - oprot.writeFieldBegin('sessionId', TType.STRUCT, 1) - self.sessionId.write(oprot) - oprot.writeFieldEnd() - if self.serverProtocolVersion is not None: - oprot.writeFieldBegin('serverProtocolVersion', TType.I32, 3329) - oprot.writeI32(self.serverProtocolVersion) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - if self.sessionId is None: - raise TProtocolException(message='Required field sessionId 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 TOperationHandle(object): - """ - Attributes: - - operationId - - operationType - - hasResultSet - - modifiedRowCount - - """ - - - def __init__(self, operationId=None, operationType=None, hasResultSet=None, modifiedRowCount=None,): - self.operationId = operationId - self.operationType = operationType - self.hasResultSet = hasResultSet - self.modifiedRowCount = modifiedRowCount - - 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.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.I32: - self.operationType = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 3: - if ftype == TType.BOOL: - self.hasResultSet = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 4: - if ftype == TType.DOUBLE: - self.modifiedRowCount = 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('TOperationHandle') - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 1) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.operationType is not None: - oprot.writeFieldBegin('operationType', TType.I32, 2) - oprot.writeI32(self.operationType) - oprot.writeFieldEnd() - if self.hasResultSet is not None: - oprot.writeFieldBegin('hasResultSet', TType.BOOL, 3) - oprot.writeBool(self.hasResultSet) - oprot.writeFieldEnd() - if self.modifiedRowCount is not None: - oprot.writeFieldBegin('modifiedRowCount', TType.DOUBLE, 4) - oprot.writeDouble(self.modifiedRowCount) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - if self.operationId is None: - raise TProtocolException(message='Required field operationId is unset!') - if self.operationType is None: - raise TProtocolException(message='Required field operationType is unset!') - if self.hasResultSet is None: - raise TProtocolException(message='Required field hasResultSet 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 TOpenSessionReq(object): - """ - Attributes: - - client_protocol - - username - - password - - configuration - - getInfos - - client_protocol_i64 - - connectionProperties - - initialNamespace - - canUseMultipleCatalogs - - sessionId - - """ - - - def __init__(self, client_protocol= -7, username=None, password=None, configuration=None, getInfos=None, client_protocol_i64=None, connectionProperties=None, initialNamespace=None, canUseMultipleCatalogs=None, sessionId=None,): - self.client_protocol = client_protocol - self.username = username - self.password = password - self.configuration = configuration - self.getInfos = getInfos - self.client_protocol_i64 = client_protocol_i64 - self.connectionProperties = connectionProperties - self.initialNamespace = initialNamespace - self.canUseMultipleCatalogs = canUseMultipleCatalogs - self.sessionId = sessionId - - 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.client_protocol = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.STRING: - self.username = 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.password = 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.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 - 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) - iprot.readListEnd() + elif fid == 1281: + if ftype == TType.LIST: + self.getInfos = [] + (_etype158, _size155) = iprot.readListBegin() + for _i159 in range(_size155): + _elem160 = iprot.readI32() + self.getInfos.append(_elem160) + iprot.readListEnd() else: iprot.skip(ftype) elif fid == 1282: @@ -4820,11 +3948,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 + (_ktype162, _vtype163, _size161) = iprot.readMapBegin() + for _i165 in range(_size161): + _key166 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val167 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.connectionProperties[_key166] = _val167 iprot.readMapEnd() else: iprot.skip(ftype) @@ -4839,12 +3967,6 @@ def read(self, iprot): self.canUseMultipleCatalogs = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.sessionId = THandleIdentifier() - self.sessionId.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -4870,16 +3992,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 kiter168, viter169 in self.configuration.items(): + oprot.writeString(kiter168.encode('utf-8') if sys.version_info[0] == 2 else kiter168) + oprot.writeString(viter169.encode('utf-8') if sys.version_info[0] == 2 else viter169) 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 iter170 in self.getInfos: + oprot.writeI32(iter170) oprot.writeListEnd() oprot.writeFieldEnd() if self.client_protocol_i64 is not None: @@ -4889,9 +4011,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 kiter171, viter172 in self.connectionProperties.items(): + oprot.writeString(kiter171.encode('utf-8') if sys.version_info[0] == 2 else kiter171) + oprot.writeString(viter172.encode('utf-8') if sys.version_info[0] == 2 else viter172) oprot.writeMapEnd() oprot.writeFieldEnd() if self.initialNamespace is not None: @@ -4902,10 +4024,6 @@ def write(self, oprot): oprot.writeFieldBegin('canUseMultipleCatalogs', TType.BOOL, 1285) oprot.writeBool(self.canUseMultipleCatalogs) oprot.writeFieldEnd() - if self.sessionId is not None: - oprot.writeFieldBegin('sessionId', TType.STRUCT, 3329) - self.sessionId.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -4976,11 +4094,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 + (_ktype174, _vtype175, _size173) = iprot.readMapBegin() + for _i177 in range(_size173): + _key178 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val179 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.configuration[_key178] = _val179 iprot.readMapEnd() else: iprot.skip(ftype) @@ -4998,11 +4116,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) + (_etype183, _size180) = iprot.readListBegin() + for _i184 in range(_size180): + _elem185 = TGetInfoValue() + _elem185.read(iprot) + self.getInfos.append(_elem185) iprot.readListEnd() else: iprot.skip(ftype) @@ -5031,16 +4149,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 kiter186, viter187 in self.configuration.items(): + oprot.writeString(kiter186.encode('utf-8') if sys.version_info[0] == 2 else kiter186) + oprot.writeString(viter187.encode('utf-8') if sys.version_info[0] == 2 else viter187) 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 iter188 in self.getInfos: + iter188.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.initialNamespace is not None: @@ -5310,15 +4428,13 @@ class TGetInfoReq(object): Attributes: - sessionHandle - infoType - - sessionConf """ - def __init__(self, sessionHandle=None, infoType=None, sessionConf=None,): + def __init__(self, sessionHandle=None, infoType=None,): self.sessionHandle = sessionHandle self.infoType = infoType - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -5340,12 +4456,6 @@ def read(self, iprot): self.infoType = iprot.readI32() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -5364,10 +4474,6 @@ def write(self, oprot): oprot.writeFieldBegin('infoType', TType.I32, 2) oprot.writeI32(self.infoType) oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3329) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -5747,32 +4853,12 @@ class TExecuteStatementReq(object): - parameters - maxBytesPerBatch - statementConf - - operationId - - sessionConf - - rejectHighCostQueries - - estimatedCost - - executionVersion - - 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, parameters=None, maxBytesPerBatch=None, statementConf=None, enforceEmbeddedSchemaCorrectness=False,): self.sessionHandle = sessionHandle self.statement = statement self.confOverlay = confOverlay @@ -5788,27 +4874,7 @@ def __init__(self, sessionHandle=None, statement=None, confOverlay=None, runAsyn self.parameters = parameters self.maxBytesPerBatch = maxBytesPerBatch self.statementConf = statementConf - self.operationId = operationId - self.sessionConf = sessionConf - self.rejectHighCostQueries = rejectHighCostQueries - self.estimatedCost = estimatedCost - self.executionVersion = executionVersion - 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 +4899,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 + (_ktype190, _vtype191, _size189) = iprot.readMapBegin() + for _i193 in range(_size189): + _key194 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _val195 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.confOverlay[_key194] = _val195 iprot.readMapEnd() else: iprot.skip(ftype) @@ -5891,11 +4957,11 @@ def read(self, iprot): 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) + (_etype199, _size196) = iprot.readListBegin() + for _i200 in range(_size196): + _elem201 = TSparkParameter() + _elem201.read(iprot) + self.parameters.append(_elem201) iprot.readListEnd() else: iprot.skip(ftype) @@ -5910,120 +4976,11 @@ def read(self, iprot): self.statementConf.read(iprot) else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3331: - if ftype == TType.BOOL: - self.rejectHighCostQueries = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3332: - if ftype == TType.DOUBLE: - self.estimatedCost = iprot.readDouble() - else: - iprot.skip(ftype) - elif fid == 3333: - if ftype == TType.I16: - self.executionVersion = iprot.readI16() - else: - iprot.skip(ftype) - elif fid == 3334: - if ftype == TType.STRING: - self.requestValidation = iprot.readBinary() - else: - iprot.skip(ftype) - elif fid == 3335: - if ftype == TType.I32: - self.resultPersistenceMode = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 3336: - if ftype == TType.BOOL: - 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 +5002,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 kiter202, viter203 in self.confOverlay.items(): + oprot.writeString(kiter202.encode('utf-8') if sys.version_info[0] == 2 else kiter202) + oprot.writeString(viter203.encode('utf-8') if sys.version_info[0] == 2 else viter203) oprot.writeMapEnd() oprot.writeFieldEnd() if self.runAsync is not None: @@ -6089,8 +5046,8 @@ def write(self, oprot): 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) + for iter204 in self.parameters: + iter204.write(oprot) oprot.writeListEnd() oprot.writeFieldEnd() if self.maxBytesPerBatch is not None: @@ -6101,93 +5058,10 @@ def write(self, oprot): 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) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() - if self.rejectHighCostQueries is not None: - oprot.writeFieldBegin('rejectHighCostQueries', TType.BOOL, 3331) - oprot.writeBool(self.rejectHighCostQueries) - oprot.writeFieldEnd() - if self.estimatedCost is not None: - oprot.writeFieldBegin('estimatedCost', TType.DOUBLE, 3332) - oprot.writeDouble(self.estimatedCost) - oprot.writeFieldEnd() - if self.executionVersion is not None: - oprot.writeFieldBegin('executionVersion', TType.I16, 3333) - oprot.writeI16(self.executionVersion) - oprot.writeFieldEnd() - if self.requestValidation is not None: - oprot.writeFieldBegin('requestValidation', TType.STRING, 3334) - oprot.writeBinary(self.requestValidation) - oprot.writeFieldEnd() - if self.resultPersistenceMode is not None: - oprot.writeFieldBegin('resultPersistenceMode', TType.I32, 3335) - oprot.writeI32(self.resultPersistenceMode) - oprot.writeFieldEnd() - if self.trimArrowBatchesToLimit is not None: - 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,16 +5084,20 @@ def __ne__(self, other): return not (self == other) -class TDBSqlStatement(object): +class TSparkParameterValue(object): """ Attributes: - - statement + - stringValue + - doubleValue + - booleanValue """ - def __init__(self, statement=None,): - self.statement = statement + 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: @@ -6232,7 +5110,17 @@ def read(self, iprot): 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() + 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: @@ -6244,10 +5132,18 @@ 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.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() @@ -6267,20 +5163,20 @@ def __ne__(self, other): return not (self == other) -class TSparkParameterValue(object): +class TSparkParameterValueArg(object): """ Attributes: - - stringValue - - doubleValue - - booleanValue + - type + - value + - arguments """ - def __init__(self, stringValue=None, doubleValue=None, booleanValue=None,): - self.stringValue = stringValue - self.doubleValue = doubleValue - self.booleanValue = booleanValue + def __init__(self, type=None, value=None, arguments=None,): + self.type = type + self.value = value + self.arguments = arguments def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -6293,17 +5189,23 @@ def read(self, iprot): 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() + self.type = 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() + if ftype == TType.STRING: + self.value = 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.BOOL: - self.booleanValue = iprot.readBool() + if ftype == TType.LIST: + self.arguments = [] + (_etype208, _size205) = iprot.readListBegin() + for _i209 in range(_size205): + _elem210 = TSparkParameterValueArg() + _elem210.read(iprot) + self.arguments.append(_elem210) + iprot.readListEnd() else: iprot.skip(ftype) else: @@ -6315,18 +5217,21 @@ 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.writeStructBegin('TSparkParameterValueArg') + if self.type is not None: + oprot.writeFieldBegin('type', TType.STRING, 1) + oprot.writeString(self.type.encode('utf-8') if sys.version_info[0] == 2 else self.type) oprot.writeFieldEnd() - if self.doubleValue is not None: - oprot.writeFieldBegin('doubleValue', TType.DOUBLE, 2) - oprot.writeDouble(self.doubleValue) + if self.value is not None: + oprot.writeFieldBegin('value', TType.STRING, 2) + oprot.writeString(self.value.encode('utf-8') if sys.version_info[0] == 2 else self.value) oprot.writeFieldEnd() - if self.booleanValue is not None: - oprot.writeFieldBegin('booleanValue', TType.BOOL, 3) - oprot.writeBool(self.booleanValue) + if self.arguments is not None: + oprot.writeFieldBegin('arguments', TType.LIST, 3) + oprot.writeListBegin(TType.STRUCT, len(self.arguments)) + for iter211 in self.arguments: + iter211.write(oprot) + oprot.writeListEnd() oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -6353,15 +5258,17 @@ class TSparkParameter(object): - name - type - value + - arguments """ - def __init__(self, ordinal=None, name=None, type=None, value=None,): + def __init__(self, ordinal=None, name=None, type=None, value=None, arguments=None,): self.ordinal = ordinal self.name = name self.type = type self.value = value + self.arguments = arguments def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -6393,6 +5300,17 @@ def read(self, iprot): self.value.read(iprot) else: iprot.skip(ftype) + elif fid == 5: + if ftype == TType.LIST: + self.arguments = [] + (_etype215, _size212) = iprot.readListBegin() + for _i216 in range(_size212): + _elem217 = TSparkParameterValueArg() + _elem217.read(iprot) + self.arguments.append(_elem217) + iprot.readListEnd() + else: + iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -6419,6 +5337,13 @@ def write(self, oprot): oprot.writeFieldBegin('value', TType.STRUCT, 4) self.value.write(oprot) oprot.writeFieldEnd() + if self.arguments is not None: + oprot.writeFieldBegin('arguments', TType.LIST, 5) + oprot.writeListBegin(TType.STRUCT, len(self.arguments)) + for iter218 in self.arguments: + iter218.write(oprot) + oprot.writeListEnd() + oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -6534,32 +5459,14 @@ class TExecuteStatementResp(object): - status - operationHandle - directResults - - executionRejected - - maxClusterCapacity - - queryCost - - 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,): self.status = status self.operationHandle = operationHandle self.directResults = directResults - self.executionRejected = executionRejected - self.maxClusterCapacity = maxClusterCapacity - self.queryCost = queryCost - 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: @@ -6588,58 +5495,6 @@ def read(self, iprot): self.directResults.read(iprot) else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.BOOL: - self.executionRejected = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.DOUBLE: - self.maxClusterCapacity = iprot.readDouble() - else: - iprot.skip(ftype) - elif fid == 3331: - if ftype == TType.DOUBLE: - self.queryCost = iprot.readDouble() - else: - iprot.skip(ftype) - elif fid == 3332: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3333: - if ftype == TType.DOUBLE: - self.currentClusterLoad = iprot.readDouble() - else: - iprot.skip(ftype) - elif fid == 3334: - if ftype == TType.I32: - 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() @@ -6662,45 +5517,6 @@ def write(self, oprot): oprot.writeFieldBegin('directResults', TType.STRUCT, 1281) self.directResults.write(oprot) oprot.writeFieldEnd() - if self.executionRejected is not None: - oprot.writeFieldBegin('executionRejected', TType.BOOL, 3329) - oprot.writeBool(self.executionRejected) - oprot.writeFieldEnd() - if self.maxClusterCapacity is not None: - oprot.writeFieldBegin('maxClusterCapacity', TType.DOUBLE, 3330) - oprot.writeDouble(self.maxClusterCapacity) - oprot.writeFieldEnd() - if self.queryCost is not None: - oprot.writeFieldBegin('queryCost', TType.DOUBLE, 3331) - oprot.writeDouble(self.queryCost) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3332) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() - if self.currentClusterLoad is not None: - oprot.writeFieldBegin('currentClusterLoad', TType.DOUBLE, 3333) - oprot.writeDouble(self.currentClusterLoad) - oprot.writeFieldEnd() - if self.idempotencyType is not None: - 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() @@ -6727,18 +5543,14 @@ class TGetTypeInfoReq(object): - sessionHandle - getDirectResults - runAsync - - operationId - - sessionConf """ - def __init__(self, sessionHandle=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): + def __init__(self, sessionHandle=None, getDirectResults=None, runAsync=False,): self.sessionHandle = sessionHandle self.getDirectResults = getDirectResults self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -6766,18 +5578,6 @@ def read(self, iprot): self.runAsync = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -6800,14 +5600,6 @@ def write(self, oprot): oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) oprot.writeBool(self.runAsync) oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -6918,18 +5710,14 @@ class TGetCatalogsReq(object): - sessionHandle - getDirectResults - runAsync - - operationId - - sessionConf """ - def __init__(self, sessionHandle=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): + def __init__(self, sessionHandle=None, getDirectResults=None, runAsync=False,): self.sessionHandle = sessionHandle self.getDirectResults = getDirectResults self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -6957,18 +5745,6 @@ def read(self, iprot): self.runAsync = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -6991,14 +5767,6 @@ def write(self, oprot): oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) oprot.writeBool(self.runAsync) oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -7111,20 +5879,16 @@ class TGetSchemasReq(object): - schemaName - getDirectResults - runAsync - - operationId - - sessionConf """ - def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): + def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, getDirectResults=None, runAsync=False,): self.sessionHandle = sessionHandle self.catalogName = catalogName self.schemaName = schemaName self.getDirectResults = getDirectResults self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -7162,18 +5926,6 @@ def read(self, iprot): self.runAsync = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -7204,14 +5956,6 @@ def write(self, oprot): oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) oprot.writeBool(self.runAsync) oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -7326,13 +6070,11 @@ class TGetTablesReq(object): - tableTypes - getDirectResults - runAsync - - operationId - - sessionConf """ - def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, tableName=None, tableTypes=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): + def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, tableName=None, tableTypes=None, getDirectResults=None, runAsync=False,): self.sessionHandle = sessionHandle self.catalogName = catalogName self.schemaName = schemaName @@ -7340,8 +6082,6 @@ def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, tableN self.tableTypes = tableTypes self.getDirectResults = getDirectResults self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -7376,10 +6116,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) + (_etype222, _size219) = iprot.readListBegin() + for _i223 in range(_size219): + _elem224 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.tableTypes.append(_elem224) iprot.readListEnd() else: iprot.skip(ftype) @@ -7394,18 +6134,6 @@ def read(self, iprot): self.runAsync = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -7435,8 +6163,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 iter225 in self.tableTypes: + oprot.writeString(iter225.encode('utf-8') if sys.version_info[0] == 2 else iter225) oprot.writeListEnd() oprot.writeFieldEnd() if self.getDirectResults is not None: @@ -7447,14 +6175,6 @@ def write(self, oprot): oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) oprot.writeBool(self.runAsync) oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -7565,18 +6285,14 @@ class TGetTableTypesReq(object): - sessionHandle - getDirectResults - runAsync - - operationId - - sessionConf """ - def __init__(self, sessionHandle=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): + def __init__(self, sessionHandle=None, getDirectResults=None, runAsync=False,): self.sessionHandle = sessionHandle self.getDirectResults = getDirectResults self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -7604,18 +6320,6 @@ def read(self, iprot): self.runAsync = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -7638,14 +6342,6 @@ def write(self, oprot): oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) oprot.writeBool(self.runAsync) oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -7760,13 +6456,11 @@ class TGetColumnsReq(object): - columnName - getDirectResults - runAsync - - operationId - - sessionConf """ - def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, tableName=None, columnName=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): + def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, tableName=None, columnName=None, getDirectResults=None, runAsync=False,): self.sessionHandle = sessionHandle self.catalogName = catalogName self.schemaName = schemaName @@ -7774,8 +6468,6 @@ def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, tableN self.columnName = columnName self.getDirectResults = getDirectResults self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -7823,18 +6515,6 @@ def read(self, iprot): self.runAsync = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -7873,14 +6553,6 @@ def write(self, oprot): oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) oprot.writeBool(self.runAsync) oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -7994,21 +6666,17 @@ class TGetFunctionsReq(object): - functionName - getDirectResults - runAsync - - operationId - - sessionConf """ - def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, functionName=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): + def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, functionName=None, getDirectResults=None, runAsync=False,): self.sessionHandle = sessionHandle self.catalogName = catalogName self.schemaName = schemaName self.functionName = functionName self.getDirectResults = getDirectResults self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -8051,18 +6719,6 @@ def read(self, iprot): self.runAsync = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -8097,14 +6753,6 @@ def write(self, oprot): oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) oprot.writeBool(self.runAsync) oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -8220,21 +6868,17 @@ class TGetPrimaryKeysReq(object): - tableName - getDirectResults - runAsync - - operationId - - sessionConf """ - def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, tableName=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): + def __init__(self, sessionHandle=None, catalogName=None, schemaName=None, tableName=None, getDirectResults=None, runAsync=False,): self.sessionHandle = sessionHandle self.catalogName = catalogName self.schemaName = schemaName self.tableName = tableName self.getDirectResults = getDirectResults self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -8277,18 +6921,6 @@ def read(self, iprot): self.runAsync = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -8323,13 +6955,238 @@ def write(self, oprot): oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) oprot.writeBool(self.runAsync) oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + if self.sessionHandle is None: + raise TProtocolException(message='Required field sessionHandle 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 TGetPrimaryKeysResp(object): + """ + Attributes: + - status + - operationHandle + - directResults + + """ + + + def __init__(self, status=None, operationHandle=None, directResults=None,): + self.status = status + self.operationHandle = operationHandle + self.directResults = directResults + + 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 == 1281: + if ftype == TType.STRUCT: + self.directResults = TSparkDirectResults() + self.directResults.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('TGetPrimaryKeysResp') + if self.status is not None: + oprot.writeFieldBegin('status', TType.STRUCT, 1) + self.status.write(oprot) oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) + if self.operationHandle is not None: + oprot.writeFieldBegin('operationHandle', TType.STRUCT, 2) + self.operationHandle.write(oprot) + oprot.writeFieldEnd() + if self.directResults is not None: + oprot.writeFieldBegin('directResults', TType.STRUCT, 1281) + self.directResults.write(oprot) + 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) + + +class TGetCrossReferenceReq(object): + """ + Attributes: + - sessionHandle + - parentCatalogName + - parentSchemaName + - parentTableName + - foreignCatalogName + - foreignSchemaName + - foreignTableName + - getDirectResults + - runAsync + + """ + + + def __init__(self, sessionHandle=None, parentCatalogName=None, parentSchemaName=None, parentTableName=None, foreignCatalogName=None, foreignSchemaName=None, foreignTableName=None, getDirectResults=None, runAsync=False,): + self.sessionHandle = sessionHandle + self.parentCatalogName = parentCatalogName + self.parentSchemaName = parentSchemaName + self.parentTableName = parentTableName + self.foreignCatalogName = foreignCatalogName + self.foreignSchemaName = foreignSchemaName + self.foreignTableName = foreignTableName + self.getDirectResults = getDirectResults + self.runAsync = runAsync + + 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.sessionHandle = TSessionHandle() + self.sessionHandle.read(iprot) + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.STRING: + self.parentCatalogName = 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.parentSchemaName = 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.STRING: + self.parentTableName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + elif fid == 5: + if ftype == TType.STRING: + self.foreignCatalogName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + elif fid == 6: + if ftype == TType.STRING: + self.foreignSchemaName = 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.STRING: + self.foreignTableName = 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.STRUCT: + self.getDirectResults = TSparkGetDirectResults() + self.getDirectResults.read(iprot) + else: + iprot.skip(ftype) + elif fid == 1282: + if ftype == TType.BOOL: + self.runAsync = 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('TGetCrossReferenceReq') + if self.sessionHandle is not None: + oprot.writeFieldBegin('sessionHandle', TType.STRUCT, 1) + self.sessionHandle.write(oprot) + oprot.writeFieldEnd() + if self.parentCatalogName is not None: + oprot.writeFieldBegin('parentCatalogName', TType.STRING, 2) + oprot.writeString(self.parentCatalogName.encode('utf-8') if sys.version_info[0] == 2 else self.parentCatalogName) + oprot.writeFieldEnd() + if self.parentSchemaName is not None: + oprot.writeFieldBegin('parentSchemaName', TType.STRING, 3) + oprot.writeString(self.parentSchemaName.encode('utf-8') if sys.version_info[0] == 2 else self.parentSchemaName) + oprot.writeFieldEnd() + if self.parentTableName is not None: + oprot.writeFieldBegin('parentTableName', TType.STRING, 4) + oprot.writeString(self.parentTableName.encode('utf-8') if sys.version_info[0] == 2 else self.parentTableName) + oprot.writeFieldEnd() + if self.foreignCatalogName is not None: + oprot.writeFieldBegin('foreignCatalogName', TType.STRING, 5) + oprot.writeString(self.foreignCatalogName.encode('utf-8') if sys.version_info[0] == 2 else self.foreignCatalogName) + oprot.writeFieldEnd() + if self.foreignSchemaName is not None: + oprot.writeFieldBegin('foreignSchemaName', TType.STRING, 6) + oprot.writeString(self.foreignSchemaName.encode('utf-8') if sys.version_info[0] == 2 else self.foreignSchemaName) + oprot.writeFieldEnd() + if self.foreignTableName is not None: + oprot.writeFieldBegin('foreignTableName', TType.STRING, 7) + oprot.writeString(self.foreignTableName.encode('utf-8') if sys.version_info[0] == 2 else self.foreignTableName) + oprot.writeFieldEnd() + if self.getDirectResults is not None: + oprot.writeFieldBegin('getDirectResults', TType.STRUCT, 1281) + self.getDirectResults.write(oprot) + oprot.writeFieldEnd() + if self.runAsync is not None: + oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) + oprot.writeBool(self.runAsync) oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -8351,264 +7208,7 @@ def __ne__(self, other): return not (self == other) -class TGetPrimaryKeysResp(object): - """ - Attributes: - - status - - operationHandle - - directResults - - """ - - - def __init__(self, status=None, operationHandle=None, directResults=None,): - self.status = status - self.operationHandle = operationHandle - self.directResults = directResults - - 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 == 1281: - if ftype == TType.STRUCT: - self.directResults = TSparkDirectResults() - self.directResults.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('TGetPrimaryKeysResp') - 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.directResults is not None: - oprot.writeFieldBegin('directResults', TType.STRUCT, 1281) - self.directResults.write(oprot) - 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) - - -class TGetCrossReferenceReq(object): - """ - Attributes: - - sessionHandle - - parentCatalogName - - parentSchemaName - - parentTableName - - foreignCatalogName - - foreignSchemaName - - foreignTableName - - getDirectResults - - runAsync - - operationId - - sessionConf - - """ - - - def __init__(self, sessionHandle=None, parentCatalogName=None, parentSchemaName=None, parentTableName=None, foreignCatalogName=None, foreignSchemaName=None, foreignTableName=None, getDirectResults=None, runAsync=False, operationId=None, sessionConf=None,): - self.sessionHandle = sessionHandle - self.parentCatalogName = parentCatalogName - self.parentSchemaName = parentSchemaName - self.parentTableName = parentTableName - self.foreignCatalogName = foreignCatalogName - self.foreignSchemaName = foreignSchemaName - self.foreignTableName = foreignTableName - self.getDirectResults = getDirectResults - self.runAsync = runAsync - self.operationId = operationId - self.sessionConf = sessionConf - - 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.sessionHandle = TSessionHandle() - self.sessionHandle.read(iprot) - else: - iprot.skip(ftype) - elif fid == 2: - if ftype == TType.STRING: - self.parentCatalogName = 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.parentSchemaName = 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.STRING: - self.parentTableName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 5: - if ftype == TType.STRING: - self.foreignCatalogName = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - else: - iprot.skip(ftype) - elif fid == 6: - if ftype == TType.STRING: - self.foreignSchemaName = 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.STRING: - self.foreignTableName = 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.STRUCT: - self.getDirectResults = TSparkGetDirectResults() - self.getDirectResults.read(iprot) - else: - iprot.skip(ftype) - elif fid == 1282: - if ftype == TType.BOOL: - self.runAsync = iprot.readBool() - else: - iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRUCT: - self.operationId = THandleIdentifier() - self.operationId.read(iprot) - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.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('TGetCrossReferenceReq') - if self.sessionHandle is not None: - oprot.writeFieldBegin('sessionHandle', TType.STRUCT, 1) - self.sessionHandle.write(oprot) - oprot.writeFieldEnd() - if self.parentCatalogName is not None: - oprot.writeFieldBegin('parentCatalogName', TType.STRING, 2) - oprot.writeString(self.parentCatalogName.encode('utf-8') if sys.version_info[0] == 2 else self.parentCatalogName) - oprot.writeFieldEnd() - if self.parentSchemaName is not None: - oprot.writeFieldBegin('parentSchemaName', TType.STRING, 3) - oprot.writeString(self.parentSchemaName.encode('utf-8') if sys.version_info[0] == 2 else self.parentSchemaName) - oprot.writeFieldEnd() - if self.parentTableName is not None: - oprot.writeFieldBegin('parentTableName', TType.STRING, 4) - oprot.writeString(self.parentTableName.encode('utf-8') if sys.version_info[0] == 2 else self.parentTableName) - oprot.writeFieldEnd() - if self.foreignCatalogName is not None: - oprot.writeFieldBegin('foreignCatalogName', TType.STRING, 5) - oprot.writeString(self.foreignCatalogName.encode('utf-8') if sys.version_info[0] == 2 else self.foreignCatalogName) - oprot.writeFieldEnd() - if self.foreignSchemaName is not None: - oprot.writeFieldBegin('foreignSchemaName', TType.STRING, 6) - oprot.writeString(self.foreignSchemaName.encode('utf-8') if sys.version_info[0] == 2 else self.foreignSchemaName) - oprot.writeFieldEnd() - if self.foreignTableName is not None: - oprot.writeFieldBegin('foreignTableName', TType.STRING, 7) - oprot.writeString(self.foreignTableName.encode('utf-8') if sys.version_info[0] == 2 else self.foreignTableName) - oprot.writeFieldEnd() - if self.getDirectResults is not None: - oprot.writeFieldBegin('getDirectResults', TType.STRUCT, 1281) - self.getDirectResults.write(oprot) - oprot.writeFieldEnd() - if self.runAsync is not None: - oprot.writeFieldBegin('runAsync', TType.BOOL, 1282) - oprot.writeBool(self.runAsync) - oprot.writeFieldEnd() - if self.operationId is not None: - oprot.writeFieldBegin('operationId', TType.STRUCT, 3329) - self.operationId.write(oprot) - oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3330) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() - oprot.writeFieldStop() - oprot.writeStructEnd() - - def validate(self): - if self.sessionHandle is None: - raise TProtocolException(message='Required field sessionHandle 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 TGetCrossReferenceResp(object): +class TGetCrossReferenceResp(object): """ Attributes: - status @@ -8770,11 +7370,7 @@ class TGetOperationStatusResp(object): - operationState - sqlState - errorCode - - errorMessage: The long-form error message. This is deprecated in DBR, - however servers expecting to serve to Simba drivers should be careful - to keep returning this as these drivers still depend on it. - - Clients should avoid using this field and prefer displayMessage and diagnosticInfo if given. + - errorMessage - taskStatus - operationStarted - operationCompleted @@ -8784,15 +7380,11 @@ class TGetOperationStatusResp(object): - displayMessage - diagnosticInfo - errorDetailsJson - - responseValidation - - idempotencyType - - statementTimeout - - statementTimeoutLevel """ - 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, errorDetailsJson=None,): self.status = status self.operationState = operationState self.sqlState = sqlState @@ -8807,10 +7399,6 @@ def __init__(self, status=None, operationState=None, sqlState=None, errorCode=No self.displayMessage = displayMessage self.diagnosticInfo = diagnosticInfo self.errorDetailsJson = errorDetailsJson - self.responseValidation = responseValidation - self.idempotencyType = idempotencyType - self.statementTimeout = statementTimeout - self.statementTimeoutLevel = statementTimeoutLevel def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -8893,26 +7481,6 @@ def read(self, iprot): 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() - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.I32: - self.idempotencyType = iprot.readI32() - else: - iprot.skip(ftype) - elif fid == 3331: - if ftype == TType.I64: - self.statementTimeout = iprot.readI64() - else: - iprot.skip(ftype) - elif fid == 3332: - if ftype == TType.I32: - self.statementTimeoutLevel = iprot.readI32() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -8979,22 +7547,6 @@ def write(self, oprot): 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) - oprot.writeFieldEnd() - if self.idempotencyType is not None: - oprot.writeFieldBegin('idempotencyType', TType.I32, 3330) - oprot.writeI32(self.idempotencyType) - oprot.writeFieldEnd() - if self.statementTimeout is not None: - oprot.writeFieldBegin('statementTimeout', TType.I64, 3331) - oprot.writeI64(self.statementTimeout) - oprot.writeFieldEnd() - if self.statementTimeoutLevel is not None: - oprot.writeFieldBegin('statementTimeoutLevel', TType.I32, 3332) - oprot.writeI32(self.statementTimeoutLevel) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -9019,16 +7571,12 @@ class TCancelOperationReq(object): """ Attributes: - operationHandle - - executionVersion - - replacedByNextAttempt """ - def __init__(self, operationHandle=None, executionVersion=None, replacedByNextAttempt=None,): + def __init__(self, operationHandle=None,): self.operationHandle = operationHandle - self.executionVersion = executionVersion - self.replacedByNextAttempt = replacedByNextAttempt def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -9045,16 +7593,6 @@ def read(self, iprot): self.operationHandle.read(iprot) else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.I16: - self.executionVersion = iprot.readI16() - else: - iprot.skip(ftype) - elif fid == 3330: - if ftype == TType.BOOL: - self.replacedByNextAttempt = iprot.readBool() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -9069,14 +7607,6 @@ def write(self, oprot): oprot.writeFieldBegin('operationHandle', TType.STRUCT, 1) self.operationHandle.write(oprot) oprot.writeFieldEnd() - if self.executionVersion is not None: - oprot.writeFieldBegin('executionVersion', TType.I16, 3329) - oprot.writeI16(self.executionVersion) - oprot.writeFieldEnd() - if self.replacedByNextAttempt is not None: - oprot.writeFieldBegin('replacedByNextAttempt', TType.BOOL, 3330) - oprot.writeBool(self.replacedByNextAttempt) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -9161,14 +7691,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 +7713,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 +7727,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() @@ -9292,14 +7811,12 @@ class TGetResultSetMetadataReq(object): """ Attributes: - operationHandle - - includeCloudResultFiles """ - def __init__(self, operationHandle=None, includeCloudResultFiles=None,): + def __init__(self, operationHandle=None,): self.operationHandle = operationHandle - self.includeCloudResultFiles = includeCloudResultFiles def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -9316,11 +7833,6 @@ def read(self, iprot): self.operationHandle.read(iprot) else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.BOOL: - self.includeCloudResultFiles = iprot.readBool() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -9335,10 +7847,6 @@ def write(self, oprot): oprot.writeFieldBegin('operationHandle', TType.STRUCT, 1) self.operationHandle.write(oprot) oprot.writeFieldEnd() - if self.includeCloudResultFiles is not None: - oprot.writeFieldBegin('includeCloudResultFiles', TType.BOOL, 3329) - oprot.writeBool(self.includeCloudResultFiles) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -9371,23 +7879,11 @@ class TGetResultSetMetadataResp(object): - uncompressedBytes - compressedBytes - isStagingOperation - - reasonForNoCloudFetch - - 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,): self.status = status self.schema = schema self.resultFormat = resultFormat @@ -9397,18 +7893,6 @@ def __init__(self, status=None, schema=None, resultFormat=None, lz4Compressed=No self.uncompressedBytes = uncompressedBytes self.compressedBytes = compressedBytes self.isStagingOperation = isStagingOperation - self.reasonForNoCloudFetch = reasonForNoCloudFetch - 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: @@ -9466,73 +7950,6 @@ def read(self, iprot): self.isStagingOperation = iprot.readBool() else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.I32: - self.reasonForNoCloudFetch = iprot.readI32() - else: - iprot.skip(ftype) - 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) - iprot.readListEnd() - else: - iprot.skip(ftype) - elif fid == 3331: - if ftype == TType.STRING: - self.manifestFile = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() - 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() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -9579,57 +7996,6 @@ def write(self, oprot): oprot.writeFieldBegin('isStagingOperation', TType.BOOL, 1287) oprot.writeBool(self.isStagingOperation) oprot.writeFieldEnd() - if self.reasonForNoCloudFetch is not None: - oprot.writeFieldBegin('reasonForNoCloudFetch', TType.I32, 3329) - oprot.writeI32(self.reasonForNoCloudFetch) - oprot.writeFieldEnd() - 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) - oprot.writeListEnd() - oprot.writeFieldEnd() - if self.manifestFile is not None: - oprot.writeFieldBegin('manifestFile', TType.STRING, 3331) - 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.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -9787,17 +8153,15 @@ class TFetchResultsResp(object): - hasMoreRows - results - resultSetMetadata - - responseValidation """ - def __init__(self, status=None, hasMoreRows=None, results=None, resultSetMetadata=None, responseValidation=None,): + def __init__(self, status=None, hasMoreRows=None, results=None, resultSetMetadata=None,): self.status = status self.hasMoreRows = hasMoreRows self.results = results self.resultSetMetadata = resultSetMetadata - self.responseValidation = responseValidation def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -9831,11 +8195,6 @@ def read(self, iprot): self.resultSetMetadata.read(iprot) else: iprot.skip(ftype) - elif fid == 3329: - if ftype == TType.STRING: - self.responseValidation = iprot.readBinary() - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -9862,10 +8221,6 @@ def write(self, oprot): oprot.writeFieldBegin('resultSetMetadata', TType.STRUCT, 1281) self.resultSetMetadata.write(oprot) oprot.writeFieldEnd() - if self.responseValidation is not None: - oprot.writeFieldBegin('responseValidation', TType.STRING, 3329) - oprot.writeBinary(self.responseValidation) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -9892,16 +8247,14 @@ class TGetDelegationTokenReq(object): - sessionHandle - owner - renewer - - sessionConf """ - def __init__(self, sessionHandle=None, owner=None, renewer=None, sessionConf=None,): + def __init__(self, sessionHandle=None, owner=None, renewer=None,): self.sessionHandle = sessionHandle self.owner = owner self.renewer = renewer - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -9928,12 +8281,6 @@ def read(self, iprot): self.renewer = 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.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -9956,10 +8303,6 @@ def write(self, oprot): oprot.writeFieldBegin('renewer', TType.STRING, 3) oprot.writeString(self.renewer.encode('utf-8') if sys.version_info[0] == 2 else self.renewer) oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3329) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -10060,15 +8403,13 @@ class TCancelDelegationTokenReq(object): Attributes: - sessionHandle - delegationToken - - sessionConf """ - def __init__(self, sessionHandle=None, delegationToken=None, sessionConf=None,): + def __init__(self, sessionHandle=None, delegationToken=None,): self.sessionHandle = sessionHandle self.delegationToken = delegationToken - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -10090,12 +8431,6 @@ def read(self, iprot): self.delegationToken = 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.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -10114,10 +8449,6 @@ def write(self, oprot): oprot.writeFieldBegin('delegationToken', TType.STRING, 2) oprot.writeString(self.delegationToken.encode('utf-8') if sys.version_info[0] == 2 else self.delegationToken) oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3329) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -10205,15 +8536,13 @@ class TRenewDelegationTokenReq(object): Attributes: - sessionHandle - delegationToken - - sessionConf """ - def __init__(self, sessionHandle=None, delegationToken=None, sessionConf=None,): + def __init__(self, sessionHandle=None, delegationToken=None,): self.sessionHandle = sessionHandle self.delegationToken = delegationToken - self.sessionConf = sessionConf def read(self, iprot): if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: @@ -10235,12 +8564,6 @@ def read(self, iprot): self.delegationToken = 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.STRUCT: - self.sessionConf = TDBSqlSessionConf() - self.sessionConf.read(iprot) - else: - iprot.skip(ftype) else: iprot.skip(ftype) iprot.readFieldEnd() @@ -10259,10 +8582,6 @@ def write(self, oprot): oprot.writeFieldBegin('delegationToken', TType.STRING, 2) oprot.writeString(self.delegationToken.encode('utf-8') if sys.version_info[0] == 2 else self.delegationToken) oprot.writeFieldEnd() - if self.sessionConf is not None: - oprot.writeFieldBegin('sessionConf', TType.STRUCT, 3329) - self.sessionConf.write(oprot) - oprot.writeFieldEnd() oprot.writeFieldStop() oprot.writeStructEnd() @@ -10378,25 +8697,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) + (_etype229, _size226) = iprot.readListBegin() + for _i230 in range(_size226): + _elem231 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + self.headerNames.append(_elem231) 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) + (_etype235, _size232) = iprot.readListBegin() + for _i236 in range(_size232): + _elem237 = [] + (_etype241, _size238) = iprot.readListBegin() + for _i242 in range(_size238): + _elem243 = iprot.readString().decode('utf-8', errors='replace') if sys.version_info[0] == 2 else iprot.readString() + _elem237.append(_elem243) iprot.readListEnd() - self.rows.append(_elem301) + self.rows.append(_elem237) iprot.readListEnd() else: iprot.skip(ftype) @@ -10433,17 +8752,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 iter244 in self.headerNames: + oprot.writeString(iter244.encode('utf-8') if sys.version_info[0] == 2 else iter244) 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 iter245 in self.rows: + oprot.writeListBegin(TType.STRING, len(iter245)) + for iter246 in iter245: + oprot.writeString(iter246.encode('utf-8') if sys.version_info[0] == 2 else iter246) oprot.writeListEnd() oprot.writeListEnd() oprot.writeFieldEnd() @@ -10502,8 +8821,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 +8856,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 @@ -10712,18 +9031,6 @@ def __ne__(self, other): (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 = ( - None, # 0 - (1, TType.STRING, 'filePath', 'UTF8', None, ), # 1 - (2, TType.I64, 'startRowOffset', None, None, ), # 2 - (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 = ( None, # 0 @@ -12009,93087 +10316,1309 @@ 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 = ( - 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 -) -all_structs.append(TOpenSessionReq) -TOpenSessionReq.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 - 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.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 - 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.STRUCT, 'sessionId', [THandleIdentifier, None], None, ), # 3329 -) -all_structs.append(TOpenSessionResp) -TOpenSessionResp.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 - 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(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 -) -all_structs.append(TGetInfoReq) -TGetInfoReq.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.I32, 'infoType', 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 - 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.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 -) -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 - (5, TType.BOOL, 'nullTypeAsArrow', None, None, ), # 5 -) -all_structs.append(TExecuteStatementReq) -TExecuteStatementReq.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 - 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, '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 - None, # 1290 - None, # 1291 - None, # 1292 - None, # 1293 - None, # 1294 - None, # 1295 - (1296, TType.STRUCT, 'statementConf', [TStatementConf, None], 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.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 -) -all_structs.append(TDBSqlStatement) -TDBSqlStatement.thrift_spec = ( - None, # 0 - (1, TType.STRING, 'statement', 'UTF8', None, ), # 1 -) -all_structs.append(TSparkParameterValue) -TSparkParameterValue.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 -) -all_structs.append(TSparkParameter) -TSparkParameter.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 -) -all_structs.append(TStatementConf) -TStatementConf.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 -) -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 - 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 - 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 - (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 -) -all_structs.append(TGetTypeInfoReq) -TGetTypeInfoReq.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, 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 - (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 - 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.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 -) -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 - 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(TGetCatalogsReq) -TGetCatalogsReq.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, 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 - (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 - 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.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 -) -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 - 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(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 - 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 - (1282, TType.BOOL, 'runAsync', None, False, ), # 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.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 -) -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 - 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(TGetTablesReq) -TGetTablesReq.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, # 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 - (1282, TType.BOOL, 'runAsync', None, False, ), # 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.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 -) -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 - 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(TGetTableTypesReq) -TGetTableTypesReq.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, 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 - (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 - 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.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 -) -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 - 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(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, 'tableName', 'UTF8', None, ), # 4 - (5, TType.STRING, 'columnName', 'UTF8', 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 - (1282, TType.BOOL, 'runAsync', None, False, ), # 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.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 -) -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 - 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(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, 'functionName', 'UTF8', 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 - (1282, TType.BOOL, 'runAsync', None, False, ), # 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.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 -) -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 - 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(TGetPrimaryKeysReq) -TGetPrimaryKeysReq.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 - 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 - (1282, TType.BOOL, 'runAsync', None, False, ), # 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.STRUCT, 'operationId', [THandleIdentifier, None], None, ), # 3329 - (3330, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3330 -) -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 - 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(TGetCrossReferenceReq) -TGetCrossReferenceReq.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 - 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 - (1282, TType.BOOL, 'runAsync', None, False, ), # 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.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(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 = ( - 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 - 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, 'displayMessage', 'UTF8', None, ), # 1281 - (1282, TType.STRING, 'diagnosticInfo', 'UTF8', None, ), # 1282 - (1283, TType.STRING, 'errorDetailsJson', 'UTF8', 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 - (3330, TType.I32, 'idempotencyType', None, None, ), # 3330 - (3331, TType.I64, 'statementTimeout', None, None, ), # 3331 - (3332, TType.I32, 'statementTimeoutLevel', None, None, ), # 3332 -) -all_structs.append(TCancelOperationReq) -TCancelOperationReq.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 - 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 - (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 - 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, 'closeReason', None, 0, ), # 3329 -) -all_structs.append(TCloseOperationResp) -TCloseOperationResp.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 -) -all_structs.append(TGetResultSetMetadataReq) -TGetResultSetMetadataReq.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 - 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.BOOL, 'includeCloudResultFiles', None, None, ), # 3329 -) -all_structs.append(TGetResultSetMetadataResp) -TGetResultSetMetadataResp.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 - (2, TType.STRUCT, 'schema', [TTableSchema, 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.I32, 'resultFormat', None, None, ), # 1281 - (1282, TType.BOOL, 'lz4Compressed', None, None, ), # 1282 - (1283, TType.STRING, 'arrowSchema', 'BINARY', None, ), # 1283 - (1284, TType.I32, 'cacheLookupResult', None, None, ), # 1284 - (1285, TType.I64, 'uncompressedBytes', None, None, ), # 1285 - (1286, TType.I64, 'compressedBytes', None, None, ), # 1286 - (1287, TType.BOOL, 'isStagingOperation', None, 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, '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 -) -all_structs.append(TFetchResultsReq) -TFetchResultsReq.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 1 - (2, TType.I32, 'orientation', None, 0, ), # 2 - (3, TType.I64, 'maxRows', None, None, ), # 3 - (4, TType.I16, 'fetchType', None, 0, ), # 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.I64, 'maxBytes', None, None, ), # 1281 - (1282, TType.I64, 'startRowOffset', None, None, ), # 1282 - (1283, TType.BOOL, 'includeResultSetMetadata', None, None, ), # 1283 -) -all_structs.append(TFetchResultsResp) -TFetchResultsResp.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 - (2, TType.BOOL, 'hasMoreRows', None, None, ), # 2 - (3, TType.STRUCT, 'results', [TRowSet, None], 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, 'resultSetMetadata', [TGetResultSetMetadataResp, 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.STRING, 'responseValidation', 'BINARY', None, ), # 3329 -) -all_structs.append(TGetDelegationTokenReq) -TGetDelegationTokenReq.thrift_spec = ( - None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.STRING, 'owner', 'UTF8', None, ), # 2 - (3, TType.STRING, 'renewer', 'UTF8', 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.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3329 ) -all_structs.append(TGetDelegationTokenResp) -TGetDelegationTokenResp.thrift_spec = ( +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 +) +all_structs.append(TNamespace) +TNamespace.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 - (2, TType.STRING, 'delegationToken', 'UTF8', None, ), # 2 + (1, TType.STRING, 'catalogName', 'UTF8', None, ), # 1 + (2, TType.STRING, 'schemaName', 'UTF8', None, ), # 2 ) -all_structs.append(TCancelDelegationTokenReq) -TCancelDelegationTokenReq.thrift_spec = ( +all_structs.append(THandleIdentifier) +THandleIdentifier.thrift_spec = ( None, # 0 - (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.STRING, 'delegationToken', 'UTF8', None, ), # 2 + (1, TType.STRING, 'guid', 'BINARY', None, ), # 1 + (2, TType.STRING, 'secret', 'BINARY', None, ), # 2 +) +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 @@ -108416,21 +14945,2657 @@ def __ne__(self, other): None, # 3326 None, # 3327 None, # 3328 - (3329, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3329 + (3329, TType.I32, 'serverProtocolVersion', None, None, ), # 3329 +) +all_structs.append(TOperationHandle) +TOperationHandle.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 +) +all_structs.append(TOpenSessionReq) +TOpenSessionReq.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 + 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.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 +) +all_structs.append(TOpenSessionResp) +TOpenSessionResp.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 + 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(TCancelDelegationTokenResp) -TCancelDelegationTokenResp.thrift_spec = ( +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(TRenewDelegationTokenReq) -TRenewDelegationTokenReq.thrift_spec = ( +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 +) +all_structs.append(TGetInfoReq) +TGetInfoReq.thrift_spec = ( None, # 0 (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 - (2, TType.STRING, 'delegationToken', 'UTF8', None, ), # 2 - None, # 3 - None, # 4 - None, # 5 + (2, TType.I32, 'infoType', None, None, ), # 2 +) +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 + (5, TType.BOOL, 'nullTypeAsArrow', None, None, ), # 5 +) +all_structs.append(TExecuteStatementReq) +TExecuteStatementReq.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 None, # 6 None, # 7 None, # 8 @@ -109706,22 +18871,22 @@ def __ne__(self, other): None, # 1278 None, # 1279 None, # 1280 - None, # 1281 - None, # 1282 - None, # 1283 - None, # 1284 - None, # 1285 - None, # 1286 - None, # 1287 - None, # 1288 - None, # 1289 + (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 None, # 1290 None, # 1291 None, # 1292 None, # 1293 None, # 1294 None, # 1295 - None, # 1296 + (1296, TType.STRUCT, 'statementConf', [TStatementConf, None], None, ), # 1296 None, # 1297 None, # 1298 None, # 1299 @@ -111754,7 +20919,29697 @@ def __ne__(self, other): None, # 3326 None, # 3327 None, # 3328 - (3329, TType.STRUCT, 'sessionConf', [TDBSqlSessionConf, None], None, ), # 3329 + None, # 3329 + None, # 3330 + None, # 3331 + None, # 3332 + None, # 3333 + None, # 3334 + None, # 3335 + None, # 3336 + None, # 3337 + None, # 3338 + None, # 3339 + None, # 3340 + None, # 3341 + None, # 3342 + None, # 3343 + None, # 3344 + None, # 3345 + None, # 3346 + None, # 3347 + None, # 3348 + None, # 3349 + None, # 3350 + None, # 3351 + None, # 3352 + (3353, TType.BOOL, 'enforceEmbeddedSchemaCorrectness', None, False, ), # 3353 +) +all_structs.append(TSparkParameterValue) +TSparkParameterValue.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 +) +all_structs.append(TSparkParameterValueArg) +TSparkParameterValueArg.thrift_spec = ( + None, # 0 + (1, TType.STRING, 'type', 'UTF8', None, ), # 1 + (2, TType.STRING, 'value', 'UTF8', None, ), # 2 + (3, TType.LIST, 'arguments', (TType.STRUCT, [TSparkParameterValueArg, None], False), None, ), # 3 +) +all_structs.append(TSparkParameter) +TSparkParameter.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 + (5, TType.LIST, 'arguments', (TType.STRUCT, [TSparkParameterValueArg, None], False), None, ), # 5 +) +all_structs.append(TStatementConf) +TStatementConf.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 +) +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 + 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(TGetTypeInfoReq) +TGetTypeInfoReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, 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 + (1281, TType.STRUCT, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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 + 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(TGetCatalogsReq) +TGetCatalogsReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, 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 + (1281, TType.STRUCT, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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 + 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(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 + 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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 + 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(TGetTablesReq) +TGetTablesReq.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, # 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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 + 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(TGetTableTypesReq) +TGetTableTypesReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, 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 + (1281, TType.STRUCT, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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 + 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(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, 'tableName', 'UTF8', None, ), # 4 + (5, TType.STRING, 'columnName', 'UTF8', 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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 + 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(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, 'functionName', 'UTF8', 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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 + 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(TGetPrimaryKeysReq) +TGetPrimaryKeysReq.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 + 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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 + 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(TGetCrossReferenceReq) +TGetCrossReferenceReq.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 + 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, 'getDirectResults', [TSparkGetDirectResults, None], None, ), # 1281 + (1282, TType.BOOL, 'runAsync', None, False, ), # 1282 +) +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(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 = ( + 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 + 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, 'displayMessage', 'UTF8', None, ), # 1281 + (1282, TType.STRING, 'diagnosticInfo', 'UTF8', None, ), # 1282 + (1283, TType.STRING, 'errorDetailsJson', 'UTF8', None, ), # 1283 +) +all_structs.append(TCancelOperationReq) +TCancelOperationReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 1 +) +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 = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 +) +all_structs.append(TGetResultSetMetadataReq) +TGetResultSetMetadataReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 1 +) +all_structs.append(TGetResultSetMetadataResp) +TGetResultSetMetadataResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.STRUCT, 'schema', [TTableSchema, 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.I32, 'resultFormat', None, None, ), # 1281 + (1282, TType.BOOL, 'lz4Compressed', None, None, ), # 1282 + (1283, TType.STRING, 'arrowSchema', 'BINARY', None, ), # 1283 + (1284, TType.I32, 'cacheLookupResult', None, None, ), # 1284 + (1285, TType.I64, 'uncompressedBytes', None, None, ), # 1285 + (1286, TType.I64, 'compressedBytes', None, None, ), # 1286 + (1287, TType.BOOL, 'isStagingOperation', None, None, ), # 1287 +) +all_structs.append(TFetchResultsReq) +TFetchResultsReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'operationHandle', [TOperationHandle, None], None, ), # 1 + (2, TType.I32, 'orientation', None, 0, ), # 2 + (3, TType.I64, 'maxRows', None, None, ), # 3 + (4, TType.I16, 'fetchType', None, 0, ), # 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.I64, 'maxBytes', None, None, ), # 1281 + (1282, TType.I64, 'startRowOffset', None, None, ), # 1282 + (1283, TType.BOOL, 'includeResultSetMetadata', None, None, ), # 1283 +) +all_structs.append(TFetchResultsResp) +TFetchResultsResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.BOOL, 'hasMoreRows', None, None, ), # 2 + (3, TType.STRUCT, 'results', [TRowSet, None], 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, 'resultSetMetadata', [TGetResultSetMetadataResp, None], None, ), # 1281 +) +all_structs.append(TGetDelegationTokenReq) +TGetDelegationTokenReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 + (2, TType.STRING, 'owner', 'UTF8', None, ), # 2 + (3, TType.STRING, 'renewer', 'UTF8', None, ), # 3 +) +all_structs.append(TGetDelegationTokenResp) +TGetDelegationTokenResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 + (2, TType.STRING, 'delegationToken', 'UTF8', None, ), # 2 +) +all_structs.append(TCancelDelegationTokenReq) +TCancelDelegationTokenReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 + (2, TType.STRING, 'delegationToken', 'UTF8', None, ), # 2 +) +all_structs.append(TCancelDelegationTokenResp) +TCancelDelegationTokenResp.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'status', [TStatus, None], None, ), # 1 +) +all_structs.append(TRenewDelegationTokenReq) +TRenewDelegationTokenReq.thrift_spec = ( + None, # 0 + (1, TType.STRUCT, 'sessionHandle', [TSessionHandle, None], None, ), # 1 + (2, TType.STRING, 'delegationToken', 'UTF8', None, ), # 2 ) all_structs.append(TRenewDelegationTokenResp) TRenewDelegationTokenResp.thrift_spec = ( diff --git a/src/databricks/sql/types.py b/src/databricks/sql/types.py index fef22cd9f..e188ef577 100644 --- a/src/databricks/sql/types.py +++ b/src/databricks/sql/types.py @@ -158,6 +158,7 @@ def asDict(self, recursive: bool = False) -> Dict[str, Any]: >>> row.asDict(True) == {'key': 1, 'value': {'name': 'a', 'age': 2}} True """ + if not hasattr(self, "__fields__"): raise TypeError("Cannot convert a Row class into dict") diff --git a/src/databricks/sql/utils.py b/src/databricks/sql/utils.py index cd655c4ea..ce2670969 100644 --- a/src/databricks/sql/utils.py +++ b/src/databricks/sql/utils.py @@ -1,14 +1,14 @@ from __future__ import annotations +from typing import Any, Dict, List, Optional, Tuple, Union, Sequence -import pytz +from dateutil import parser import datetime import decimal from abc import ABC, abstractmethod from collections import OrderedDict, namedtuple -from collections.abc import Iterable +from collections.abc import Mapping from decimal import Decimal from enum import Enum -from typing import Any, Dict, List, Optional, Union import re import lz4.frame @@ -18,7 +18,7 @@ except ImportError: pyarrow = None -from databricks.sql import OperationalError, exc +from databricks.sql import OperationalError from databricks.sql.cloudfetch.download_manager import ResultFileDownloadManager from databricks.sql.thrift_api.TCLIService.ttypes import ( TRowSet, @@ -26,7 +26,8 @@ TSparkRowSetType, ) from databricks.sql.types import SSLOptions - +from databricks.sql.backend.types import CommandId +from databricks.sql.telemetry.models.event import StatementType from databricks.sql.parameters.native import ParameterStructure, TDbsqlParameter import logging @@ -37,6 +38,21 @@ logger = logging.getLogger(__name__) +def get_session_config_value( + session_configuration: Optional[Dict[str, Any]], key: str +) -> Optional[str]: + """Get a session configuration value with case-insensitive key matching""" + if not session_configuration: + return None + + key_upper = key.upper() + for k, v in session_configuration.items(): + if k.upper() == key_upper: + return str(v) if v is not None else None + + return None + + class ResultSetQueue(ABC): @abstractmethod def next_n_rows(self, num_rows: int): @@ -46,8 +62,12 @@ def next_n_rows(self, num_rows: int): def remaining_rows(self): pass + @abstractmethod + def close(self): + pass -class ResultSetQueueFactory(ABC): + +class ThriftResultSetQueueFactory(ABC): @staticmethod def build_queue( row_set_type: TSparkRowSetType, @@ -55,11 +75,15 @@ def build_queue( arrow_schema_bytes: bytes, max_download_threads: int, ssl_options: SSLOptions, + session_id_hex: Optional[str], + statement_id: str, + chunk_id: int, + http_client, lz4_compressed: bool = True, - description: Optional[List[List[Any]]] = None, + description: List[Tuple] = [], ) -> ResultSetQueue: """ - Factory method to build a result set queue. + Factory method to build a result set queue for Thrift backend. Args: row_set_type (enum): Row set type (Arrow, Column, or URL). @@ -73,6 +97,7 @@ def build_queue( Returns: ResultSetQueue """ + if row_set_type == TSparkRowSetType.ARROW_BASED_SET: arrow_table, n_valid_rows = convert_arrow_based_set_to_arrow_table( t_row_set.arrowBatches, lz4_compressed, arrow_schema_bytes @@ -92,7 +117,7 @@ def build_queue( return ColumnQueue(ColumnTable(converted_column_table, column_names)) elif row_set_type == TSparkRowSetType.URL_BASED_SET: - return CloudFetchQueue( + return ThriftCloudFetchQueue( schema_bytes=arrow_schema_bytes, start_row_offset=t_row_set.startRowOffset, result_links=t_row_set.resultLinks, @@ -100,6 +125,10 @@ def build_queue( description=description, max_download_threads=max_download_threads, ssl_options=ssl_options, + session_id_hex=session_id_hex, + statement_id=statement_id, + chunk_id=chunk_id, + http_client=http_client, ) else: raise AssertionError("Row set type is not valid") @@ -157,6 +186,9 @@ def remaining_rows(self): self.cur_row_index += slice.num_rows return slice + def close(self): + return + class ArrowQueue(ResultSetQueue): def __init__( @@ -172,12 +204,14 @@ def __init__( :param n_valid_rows: The index of the last valid row in the table :param start_row_index: The first row in the table we should start fetching from """ + self.cur_row_index = start_row_index self.arrow_table = arrow_table self.n_valid_rows = n_valid_rows def next_n_rows(self, num_rows: int) -> "pyarrow.Table": """Get upto the next n rows of the Arrow dataframe""" + length = min(num_rows, self.n_valid_rows - self.cur_row_index) # Note that the table.slice API is not the same as Python's slice # The second argument should be length, not end index @@ -192,80 +226,84 @@ def remaining_rows(self) -> "pyarrow.Table": self.cur_row_index += slice.num_rows return slice + def close(self): + return + + +class CloudFetchQueue(ResultSetQueue, ABC): + """Base class for cloud fetch queues that handle EXTERNAL_LINKS disposition with ARROW format.""" -class CloudFetchQueue(ResultSetQueue): def __init__( self, - schema_bytes, max_download_threads: int, ssl_options: SSLOptions, - start_row_offset: int = 0, - result_links: Optional[List[TSparkArrowResultLink]] = None, + session_id_hex: Optional[str], + statement_id: str, + chunk_id: int, + http_client, + schema_bytes: Optional[bytes] = None, lz4_compressed: bool = True, - description: Optional[List[List[Any]]] = None, + description: List[Tuple] = [], ): """ - A queue-like wrapper over CloudFetch arrow batches. + Initialize the base CloudFetchQueue. - Attributes: - schema_bytes (bytes): Table schema in bytes. - max_download_threads (int): Maximum number of downloader thread pool threads. - start_row_offset (int): The offset of the first row of the cloud fetch links. - result_links (List[TSparkArrowResultLink]): Links containing the downloadable URL and metadata. - lz4_compressed (bool): Whether the files are lz4 compressed. - description (List[List[Any]]): Hive table schema description. + Args: + max_download_threads: Maximum number of download threads + ssl_options: SSL options for downloads + schema_bytes: Arrow schema bytes + lz4_compressed: Whether the data is LZ4 compressed + description: Column descriptions """ + self.schema_bytes = schema_bytes self.max_download_threads = max_download_threads - self.start_row_index = start_row_offset - self.result_links = result_links self.lz4_compressed = lz4_compressed self.description = description self._ssl_options = ssl_options + self.session_id_hex = session_id_hex + self.statement_id = statement_id + self.chunk_id = chunk_id + self._http_client = http_client - logger.debug( - "Initialize CloudFetch loader, row set start offset: {}, file list:".format( - start_row_offset - ) - ) - if result_links is not None: - for result_link in result_links: - logger.debug( - "- start row offset: {}, row count: {}".format( - result_link.startRowOffset, result_link.rowCount - ) - ) + # Table state + self.table = None + self.table_row_index = 0 + + # Initialize download manager self.download_manager = ResultFileDownloadManager( - links=result_links or [], - max_download_threads=self.max_download_threads, - lz4_compressed=self.lz4_compressed, - ssl_options=self._ssl_options, + links=[], + max_download_threads=max_download_threads, + lz4_compressed=lz4_compressed, + ssl_options=ssl_options, + session_id_hex=session_id_hex, + statement_id=statement_id, + chunk_id=chunk_id, + http_client=http_client, ) - self.table = self._create_next_table() - self.table_row_index = 0 - def next_n_rows(self, num_rows: int) -> "pyarrow.Table": """ Get up to the next n rows of the cloud fetch Arrow dataframes. Args: num_rows (int): Number of rows to retrieve. - Returns: pyarrow.Table """ + if not self.table: logger.debug("CloudFetchQueue: no more rows available") # Return empty pyarrow table to cause retry of fetch return self._create_empty_table() logger.debug("CloudFetchQueue: trying to get {} next rows".format(num_rows)) results = self.table.slice(0, 0) + partial_result_chunks = [results] while num_rows > 0 and self.table: # Get remaining of num_rows or the rest of the current table, whichever is smaller length = min(num_rows, self.table.num_rows - self.table_row_index) table_slice = self.table.slice(self.table_row_index, length) - results = pyarrow.concat_tables([results, table_slice]) + partial_result_chunks.append(table_slice) self.table_row_index += table_slice.num_rows # Replace current table with the next table if we are at the end of the current table @@ -275,7 +313,7 @@ def next_n_rows(self, num_rows: int) -> "pyarrow.Table": num_rows -= table_slice.num_rows logger.debug("CloudFetchQueue: collected {} next rows".format(results.num_rows)) - return results + return concat_table_chunks(partial_result_chunks) def remaining_rows(self) -> "pyarrow.Table": """ @@ -284,35 +322,30 @@ def remaining_rows(self) -> "pyarrow.Table": Returns: pyarrow.Table """ + if not self.table: # Return empty pyarrow table to cause retry of fetch return self._create_empty_table() results = self.table.slice(0, 0) + partial_result_chunks = [results] while self.table: table_slice = self.table.slice( self.table_row_index, self.table.num_rows - self.table_row_index ) - results = pyarrow.concat_tables([results, table_slice]) + partial_result_chunks.append(table_slice) self.table_row_index += table_slice.num_rows self.table = self._create_next_table() self.table_row_index = 0 - return results + return concat_table_chunks(partial_result_chunks) + + def _create_table_at_offset(self, offset: int) -> Union["pyarrow.Table", None]: + """Create next table at the given row offset""" - def _create_next_table(self) -> Union["pyarrow.Table", None]: - logger.debug( - "CloudFetchQueue: Trying to get downloaded file for row {}".format( - self.start_row_index - ) - ) # Create next table by retrieving the logical next downloaded file, or return None to signal end of queue - downloaded_file = self.download_manager.get_next_downloaded_file( - self.start_row_index - ) + downloaded_file = self.download_manager.get_next_downloaded_file(offset) if not downloaded_file: logger.debug( - "CloudFetchQueue: Cannot find downloaded file for row {}".format( - self.start_row_index - ) + "CloudFetchQueue: Cannot find downloaded file for row {}".format(offset) ) # None signals no more Arrow tables can be built from the remaining handlers if any remain return None @@ -327,26 +360,103 @@ def _create_next_table(self) -> Union["pyarrow.Table", None]: # At this point, whether the file has extraneous rows or not, the arrow table should have the correct num rows assert downloaded_file.row_count == arrow_table.num_rows - self.start_row_index += arrow_table.num_rows - - logger.debug( - "CloudFetchQueue: Found downloaded file, row count: {}, new start offset: {}".format( - arrow_table.num_rows, self.start_row_index - ) - ) return arrow_table + @abstractmethod + def _create_next_table(self) -> Union["pyarrow.Table", None]: + """Create next table by retrieving the logical next downloaded file.""" + pass + def _create_empty_table(self) -> "pyarrow.Table": - # Create a 0-row table with just the schema bytes + """Create a 0-row table with just the schema bytes.""" + if not self.schema_bytes: + return pyarrow.Table.from_pydict({}) return create_arrow_table_from_arrow_file(self.schema_bytes, self.description) + def close(self): + self.download_manager._shutdown_manager() -ExecuteResponse = namedtuple( - "ExecuteResponse", - "status has_been_closed_server_side has_more_rows description lz4_compressed is_staging_operation " - "command_handle arrow_queue arrow_schema_bytes", -) + +class ThriftCloudFetchQueue(CloudFetchQueue): + """Queue implementation for EXTERNAL_LINKS disposition with ARROW format for Thrift backend.""" + + def __init__( + self, + schema_bytes, + max_download_threads: int, + ssl_options: SSLOptions, + session_id_hex: Optional[str], + statement_id: str, + chunk_id: int, + http_client, + start_row_offset: int = 0, + result_links: Optional[List[TSparkArrowResultLink]] = None, + lz4_compressed: bool = True, + description: List[Tuple] = [], + ): + """ + Initialize the Thrift CloudFetchQueue. + + Args: + schema_bytes: Table schema in bytes + max_download_threads: Maximum number of downloader thread pool threads + ssl_options: SSL options for downloads + start_row_offset: The offset of the first row of the cloud fetch links + result_links: Links containing the downloadable URL and metadata + lz4_compressed: Whether the files are lz4 compressed + description: Hive table schema description + """ + super().__init__( + max_download_threads=max_download_threads, + ssl_options=ssl_options, + schema_bytes=schema_bytes, + lz4_compressed=lz4_compressed, + description=description, + session_id_hex=session_id_hex, + statement_id=statement_id, + chunk_id=chunk_id, + http_client=http_client, + ) + + self.start_row_index = start_row_offset + self.result_links = result_links or [] + self.session_id_hex = session_id_hex + self.statement_id = statement_id + self.chunk_id = chunk_id + + logger.debug( + "Initialize CloudFetch loader, row set start offset: {}, file list:".format( + start_row_offset + ) + ) + if self.result_links: + for result_link in self.result_links: + logger.debug( + "- start row offset: {}, row count: {}".format( + result_link.startRowOffset, result_link.rowCount + ) + ) + self.download_manager.add_link(result_link) + + # Initialize table and position + self.table = self._create_next_table() + + def _create_next_table(self) -> Union["pyarrow.Table", None]: + logger.debug( + "ThriftCloudFetchQueue: Trying to get downloaded file for row {}".format( + self.start_row_index + ) + ) + arrow_table = self._create_table_at_offset(self.start_row_index) + if arrow_table: + self.start_row_index += arrow_table.num_rows + logger.debug( + "ThriftCloudFetchQueue: Found downloaded file, row count: {}, new start offset: {}".format( + arrow_table.num_rows, self.start_row_index + ) + ) + return arrow_table def _bound(min_x, max_x, x): @@ -429,7 +539,7 @@ def user_friendly_error_message(self, no_retry_reason, attempt, elapsed): # Taken from PyHive class ParamEscaper: _DATE_FORMAT = "%Y-%m-%d" - _TIME_FORMAT = "%H:%M:%S.%f" + _TIME_FORMAT = "%H:%M:%S.%f %z" _DATETIME_FORMAT = "{} {}".format(_DATE_FORMAT, _TIME_FORMAT) def escape_args(self, parameters): @@ -458,13 +568,22 @@ def escape_string(self, item): return "'{}'".format(item.replace("\\", "\\\\").replace("'", "\\'")) def escape_sequence(self, item): - l = map(str, map(self.escape_item, item)) - return "(" + ",".join(l) + ")" + l = map(self.escape_item, item) + l = list(map(str, l)) + return "ARRAY(" + ",".join(l) + ")" + + def escape_mapping(self, item): + l = map( + self.escape_item, + (element for key, value in item.items() for element in (key, value)), + ) + l = list(map(str, l)) + return "MAP(" + ",".join(l) + ")" def escape_datetime(self, item, format, cutoff=0): dt_str = item.strftime(format) formatted = dt_str[:-cutoff] if cutoff and format.endswith(".%f") else dt_str - return "'{}'".format(formatted) + return "'{}'".format(formatted.strip()) def escape_decimal(self, item): return str(item) @@ -476,14 +595,16 @@ def escape_item(self, item): return self.escape_number(item) elif isinstance(item, str): return self.escape_string(item) - elif isinstance(item, Iterable): - return self.escape_sequence(item) elif isinstance(item, datetime.datetime): return self.escape_datetime(item, self._DATETIME_FORMAT) elif isinstance(item, datetime.date): return self.escape_datetime(item, self._DATE_FORMAT) elif isinstance(item, decimal.Decimal): return self.escape_decimal(item) + elif isinstance(item, Sequence): + return self.escape_sequence(item) + elif isinstance(item, Mapping): + return self.escape_mapping(item) else: raise exc.ProgrammingError("Unsupported object {}".format(item)) @@ -565,6 +686,7 @@ def transform_paramstyle( Returns: str """ + output = operation if ( param_structure == ParameterStructure.POSITIONAL @@ -611,21 +733,31 @@ def convert_arrow_based_set_to_arrow_table(arrow_batches, lz4_compressed, schema def convert_decimals_in_arrow_table(table, description) -> "pyarrow.Table": + new_columns = [] + new_fields = [] + for i, col in enumerate(table.itercolumns()): + field = table.field(i) + if description[i][1] == "decimal": - decimal_col = col.to_pandas().apply( - lambda v: v if v is None else Decimal(v) - ) precision, scale = description[i][4], description[i][5] assert scale is not None assert precision is not None - # Spark limits decimal to a maximum scale of 38, - # so 128 is guaranteed to be big enough + # create the target decimal type dtype = pyarrow.decimal128(precision, scale) - col_data = pyarrow.array(decimal_col, type=dtype) - field = table.field(i).with_type(dtype) - table = table.set_column(i, field, col_data) - return table + + new_col = col.cast(dtype) + new_field = field.with_type(dtype) + + new_columns.append(new_col) + new_fields.append(new_field) + else: + new_columns.append(col) + new_fields.append(field) + + new_schema = pyarrow.schema(new_fields) + + return pyarrow.Table.from_arrays(new_columns, schema=new_schema) def convert_to_assigned_datatypes_in_column_table(column_table, description): @@ -642,16 +774,7 @@ def convert_to_assigned_datatypes_in_column_table(column_table, description): ) elif description[i][1] == "timestamp": converted_column_table.append( - tuple( - ( - v - if v is None - else datetime.datetime.strptime( - v, "%Y-%m-%d %H:%M:%S.%f" - ).replace(tzinfo=pytz.UTC) - ) - for v in col - ) + tuple((v if v is None else parser.parse(v)) for v in col) ) else: converted_column_table.append(col) @@ -751,3 +874,119 @@ def _create_python_tuple(t_col_value_wrapper): result[i] = None return tuple(result) + + +def concat_table_chunks( + table_chunks: List[Union["pyarrow.Table", ColumnTable]] +) -> Union["pyarrow.Table", ColumnTable]: + if len(table_chunks) == 0: + return table_chunks + + if isinstance(table_chunks[0], ColumnTable): + ## Check if all have the same column names + if not all( + table.column_names == table_chunks[0].column_names for table in table_chunks + ): + raise ValueError("The columns in the results don't match") + + result_table: List[List[Any]] = [[] for _ in range(table_chunks[0].num_columns)] + for i in range(0, len(table_chunks)): + for j in range(table_chunks[i].num_columns): + result_table[j].extend(table_chunks[i].column_table[j]) + return ColumnTable(result_table, table_chunks[0].column_names) + else: + return pyarrow.concat_tables(table_chunks, promote_options="default") + + +def serialize_query_tags( + query_tags: Optional[Dict[str, Optional[str]]] +) -> Optional[str]: + """ + Serialize query_tags dictionary to a string format. + + Format: "key1:value1,key2:value2" + Special cases: + - If value is None, omit the colon and value (e.g., "key1:value1,key2,key3:value3") + - Escape special characters (:, ,, \\) in values with a leading backslash + - Backslashes in keys are escaped; other special characters in keys are not escaped + + Args: + query_tags: Dictionary of query tags where keys are strings and values are optional strings + + Returns: + Serialized string or None if query_tags is None or empty + """ + if not query_tags: + return None + + def escape_value(value: str) -> str: + """Escape special characters in tag values.""" + # Escape backslash first to avoid double-escaping + value = value.replace("\\", r"\\") + # Escape colon and comma + value = value.replace(":", r"\:") + value = value.replace(",", r"\,") + return value + + serialized_parts = [] + for key, value in query_tags.items(): + escaped_key = key.replace("\\", r"\\") + if value is None: + # No colon or value when value is None + serialized_parts.append(escaped_key) + else: + escaped_value = escape_value(value) + serialized_parts.append(f"{escaped_key}:{escaped_value}") + + return ",".join(serialized_parts) + + +def build_client_context(server_hostname: str, version: str, **kwargs): + """Build ClientContext for HTTP client configuration.""" + from databricks.sql.auth.common import ClientContext + from databricks.sql.types import SSLOptions + + # Extract SSL options + ssl_options = SSLOptions( + tls_verify=not kwargs.get("_tls_no_verify", False), + tls_verify_hostname=kwargs.get("_tls_verify_hostname", True), + tls_trusted_ca_file=kwargs.get("_tls_trusted_ca_file"), + tls_client_cert_file=kwargs.get("_tls_client_cert_file"), + tls_client_cert_key_file=kwargs.get("_tls_client_cert_key_file"), + tls_client_cert_key_password=kwargs.get("_tls_client_cert_key_password"), + ) + + # Build user agent + from databricks.sql.common.agent import detect as detect_agent + + user_agent_entry = kwargs.get("user_agent_entry", "") + if user_agent_entry: + user_agent = f"PyDatabricksSqlConnector/{version} ({user_agent_entry})" + else: + user_agent = f"PyDatabricksSqlConnector/{version}" + + agent_product = detect_agent() + if agent_product: + user_agent += f" agent/{agent_product}" + + # Explicitly construct ClientContext with proper types + return ClientContext( + hostname=server_hostname, + ssl_options=ssl_options, + user_agent=user_agent, + socket_timeout=kwargs.get("_socket_timeout"), + retry_stop_after_attempts_count=kwargs.get("_retry_stop_after_attempts_count"), + retry_delay_min=kwargs.get("_retry_delay_min"), + retry_delay_max=kwargs.get("_retry_delay_max"), + retry_stop_after_attempts_duration=kwargs.get( + "_retry_stop_after_attempts_duration" + ), + retry_delay_default=kwargs.get("_retry_delay_default"), + retry_dangerous_codes=kwargs.get("_retry_dangerous_codes"), + proxy_auth_method=kwargs.get("_proxy_auth_method"), + pool_connections=kwargs.get("_pool_connections"), + pool_maxsize=kwargs.get("_pool_maxsize"), + telemetry_circuit_breaker_enabled=kwargs.get( + "_telemetry_circuit_breaker_enabled" + ), + ) diff --git a/src/databricks/sqlalchemy/README.sqlalchemy.md b/src/databricks/sqlalchemy/README.sqlalchemy.md deleted file mode 100644 index 8aa51973e..000000000 --- a/src/databricks/sqlalchemy/README.sqlalchemy.md +++ /dev/null @@ -1,203 +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 3ed92aba3..000000000 --- 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" diff --git a/src/databricks/sqlalchemy/__init__.py b/src/databricks/sqlalchemy/__init__.py deleted file mode 100644 index 2a17ac3e0..000000000 --- a/src/databricks/sqlalchemy/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from databricks.sqlalchemy.base import DatabricksDialect -from databricks.sqlalchemy._types import TINYINT, TIMESTAMP, TIMESTAMP_NTZ - -__all__ = ["TINYINT", "TIMESTAMP", "TIMESTAMP_NTZ"] diff --git a/src/databricks/sqlalchemy/_ddl.py b/src/databricks/sqlalchemy/_ddl.py deleted file mode 100644 index d5d0bf87a..000000000 --- a/src/databricks/sqlalchemy/_ddl.py +++ /dev/null @@ -1,100 +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.append("COMMENT " + comment) - - post.append("TBLPROPERTIES('delta.feature.allowColumnDefaults' = 'enabled')") - return "\n".join(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 6d38e1e60..000000000 --- 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 5fc14a70e..000000000 --- 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 9148de7f2..000000000 --- a/src/databricks/sqlalchemy/base.py +++ /dev/null @@ -1,436 +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 - supports_native_boolean: bool = True - - 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/requirements.py b/src/databricks/sqlalchemy/requirements.py deleted file mode 100644 index 5c70c0296..000000000 --- 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 ab89d17db..000000000 --- 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 2f3e7a7db..000000000 --- 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 6e470f601..000000000 --- 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 4dbc5ec21..000000000 --- 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 c1f81205a..000000000 --- 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 ea43e8d35..000000000 --- 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 a1f58fa6b..000000000 --- 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 3cdae0360..000000000 --- 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 2b40a4320..000000000 --- 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 eca1cf55c..000000000 --- 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/conftest.py b/src/databricks/sqlalchemy/test_local/conftest.py deleted file mode 100644 index c8b350bee..000000000 --- a/src/databricks/sqlalchemy/test_local/conftest.py +++ /dev/null @@ -1,44 +0,0 @@ -import os -import pytest - - -@pytest.fixture(scope="session") -def host(): - return os.getenv("DATABRICKS_SERVER_HOSTNAME") - - -@pytest.fixture(scope="session") -def http_path(): - return os.getenv("DATABRICKS_HTTP_PATH") - - -@pytest.fixture(scope="session") -def access_token(): - return os.getenv("DATABRICKS_TOKEN") - - -@pytest.fixture(scope="session") -def ingestion_user(): - return os.getenv("DATABRICKS_USER") - - -@pytest.fixture(scope="session") -def catalog(): - return os.getenv("DATABRICKS_CATALOG") - - -@pytest.fixture(scope="session") -def schema(): - return os.getenv("DATABRICKS_SCHEMA", "default") - - -@pytest.fixture(scope="session", autouse=True) -def connection_details(host, http_path, access_token, ingestion_user, catalog, schema): - return { - "host": host, - "http_path": http_path, - "access_token": access_token, - "ingestion_user": ingestion_user, - "catalog": catalog, - "schema": schema, - } diff --git a/src/databricks/sqlalchemy/test_local/e2e/MOCK_DATA.xlsx b/src/databricks/sqlalchemy/test_local/e2e/MOCK_DATA.xlsx deleted file mode 100644 index e080689a9..000000000 Binary files a/src/databricks/sqlalchemy/test_local/e2e/MOCK_DATA.xlsx and /dev/null differ diff --git a/src/databricks/sqlalchemy/test_local/e2e/test_basic.py b/src/databricks/sqlalchemy/test_local/e2e/test_basic.py deleted file mode 100644 index ce0b5d894..000000000 --- a/src/databricks/sqlalchemy/test_local/e2e/test_basic.py +++ /dev/null @@ -1,543 +0,0 @@ -import datetime -import decimal -from typing import Tuple, Union, List -from unittest import skipIf - -import pytest -from sqlalchemy import ( - Column, - MetaData, - Table, - Text, - create_engine, - insert, - select, - text, -) -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, Integer, String - -try: - from sqlalchemy.orm import declarative_base -except ImportError: - from sqlalchemy.ext.declarative import declarative_base - - -USER_AGENT_TOKEN = "PySQL e2e Tests" - - -def sqlalchemy_1_3(): - import sqlalchemy - - return sqlalchemy.__version__.startswith("1.3") - - -def version_agnostic_select(object_to_select, *args, **kwargs): - """ - SQLAlchemy==1.3.x requires arguments to select() to be a Python list - - https://docs.sqlalchemy.org/en/20/changelog/migration_14.html#orm-query-is-internally-unified-with-select-update-delete-2-0-style-execution-available - """ - - if sqlalchemy_1_3(): - return select([object_to_select], *args, **kwargs) - else: - return select(object_to_select, *args, **kwargs) - - -def version_agnostic_connect_arguments(connection_details) -> Tuple[str, dict]: - HOST = connection_details["host"] - HTTP_PATH = connection_details["http_path"] - ACCESS_TOKEN = connection_details["access_token"] - CATALOG = connection_details["catalog"] - SCHEMA = connection_details["schema"] - - ua_connect_args = {"_user_agent_entry": USER_AGENT_TOKEN} - - if sqlalchemy_1_3(): - conn_string = f"databricks://token:{ACCESS_TOKEN}@{HOST}" - connect_args = { - **ua_connect_args, - "http_path": HTTP_PATH, - "server_hostname": HOST, - "catalog": CATALOG, - "schema": SCHEMA, - } - - return conn_string, connect_args - else: - return ( - f"databricks://token:{ACCESS_TOKEN}@{HOST}?http_path={HTTP_PATH}&catalog={CATALOG}&schema={SCHEMA}", - ua_connect_args, - ) - - -@pytest.fixture -def db_engine(connection_details) -> Engine: - conn_string, connect_args = version_agnostic_connect_arguments(connection_details) - 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(connection_details) -> Engine: - details = connection_details.copy() - details["catalog"] = "samples" - details["schema"] = "nyctaxi" - conn_string, connect_args = version_agnostic_connect_arguments(details) - return create_engine(conn_string, connect_args=connect_args) - - -@pytest.fixture() -def base(db_engine): - return declarative_base() - - -@pytest.fixture() -def session(db_engine): - return Session(db_engine) - - -@pytest.fixture() -def metadata_obj(db_engine): - return MetaData() - - -def test_can_connect(db_engine): - simple_query = "SELECT 1" - result = run_query(db_engine, simple_query) - assert len(result) == 1 - - -def test_connect_args(db_engine): - """Verify that extra connect args passed to sqlalchemy.create_engine are passed to DBAPI - - This will most commonly happen when partners supply a user agent entry - """ - - conn = db_engine.connect() - connection_headers = conn.connection.thrift_backend._transport._headers - user_agent = connection_headers["User-Agent"] - - expected = f"(sqlalchemy + {USER_AGENT_TOKEN})" - assert expected in user_agent - - -@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 = "default" - try: - df = pd.read_excel( - "src/databricks/sqlalchemy/test_local/e2e/demo_data/MOCK_DATA.xlsx" - ) - df.to_sql( - "mock_data", - db_engine, - schema=SCHEMA, - index=False, - method="multi", - if_exists="replace", - ) - - df_after = pd.read_sql_table("mock_data", db_engine, schema=SCHEMA) - assert len(df) == len(df_after) - except Exception as e: - raise e - finally: - db_engine.execute("DROP TABLE mock_data") - - -def test_create_table_not_null(db_engine, metadata_obj: MetaData): - table_name = "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")) - - SampleTable = Table( - table_name, - metadata_obj, - Column("name", String(255)), - Column("episodes", Integer), - Column("some_bool", BOOLEAN, nullable=False), - ) - - metadata_obj.create_all(db_engine) - - columns = db_engine.dialect.get_columns( - connection=db_engine.connect(), table_name=table_name - ) - - name_column_description = columns[0] - some_bool_column_description = columns[2] - - 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) - - -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 - - table_name = "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")) - - names = ["Bim", "Miki", "Sarah", "Ira"] - - SampleTable = Table( - table_name, metadata_obj, Column("name", String(255)), Column("number", Integer) - ) - - rows = [ - {"name": names[i % 3], "number": random.choice(range(64))} - 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)) - - with db_engine.begin() as conn: - rows = conn.execute(version_agnostic_select(SampleTable)).fetchall() - - assert len(rows) == num_to_insert - - -def test_create_insert_drop_table_core(base, db_engine, metadata_obj: MetaData): - """ """ - - SampleTable = Table( - "PySQLTest_{}".format(datetime.datetime.utcnow().strftime("%s")), - metadata_obj, - Column("name", String(255)), - Column("episodes", Integer), - Column("some_bool", BOOLEAN), - Column("dollars", DECIMAL(10, 2)), - ) - - metadata_obj.create_all(db_engine) - - insert_stmt = insert(SampleTable).values( - name="Bim Adewunmi", episodes=6, some_bool=True, dollars=decimal.Decimal(125) - ) - - with db_engine.connect() as conn: - conn.execute(insert_stmt) - - select_stmt = version_agnostic_select(SampleTable) - with db_engine.begin() as conn: - resp = conn.execute(select_stmt) - - result = resp.fetchall() - - assert len(result) == 1 - - metadata_obj.drop_all(db_engine) - - -# ORM tests are made following this tutorial -# https://docs.sqlalchemy.org/en/14/orm/quickstart.html - - -@skipIf(False, "Unity catalog must be supported") -def test_create_insert_drop_table_orm(db_engine): - """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): - __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) - - Base.metadata.create_all(db_engine) - - 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() - - stmt = version_agnostic_select(SampleObject).where( - SampleObject.name.in_(["Bim Adewunmi", "Miki Meek"]) - ) - - if sqlalchemy_1_3(): - output = [i for i in session.execute(stmt)] - else: - output = [i for i in session.scalars(stmt)] - - assert len(output) == 2 - - Base.metadata.drop_all(db_engine) - - -def test_dialect_type_mappings(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, - Column("string_example", String(255)), - Column("integer_example", Integer), - Column("boolean_example", BOOLEAN), - Column("decimal_example", DECIMAL(10, 2)), - Column("date_example", Date), - ) - - string_example = "" - integer_example = 100 - boolean_example = True - decimal_example = decimal.Decimal(125) - date_example = datetime.date(2013, 1, 1) - - metadata_obj.create_all(db_engine) - - insert_stmt = insert(SampleTable).values( - string_example=string_example, - integer_example=integer_example, - boolean_example=boolean_example, - decimal_example=decimal_example, - date_example=date_example, - ) - - with db_engine.connect() as conn: - conn.execute(insert_stmt) - - select_stmt = version_agnostic_select(SampleTable) - with db_engine.begin() as conn: - resp = conn.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 - - metadata_obj.drop_all(db_engine) - - -def test_inspector_smoke_test(samples_engine: Engine): - """It does not appear that 3L namespace is supported here""" - - schema, table = "nyctaxi", "trips" - - try: - inspector = Inspector.from_engine(samples_engine) - except Exception as e: - assert False, f"Could not build inspector: {e}" - - # Expect six columns - columns = inspector.get_columns(table, schema=schema) - - # Expect zero views, but the method should return - views = inspector.get_view_names(schema=schema) - - assert ( - len(columns) == 6 - ), "Dialect did not find the expected number of columns in samples.nyctaxi.trips" - 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 is not None, "get_table_names did not succeed" - - -def test_has_table_across_schemas( - db_engine: Engine, samples_engine: Engine, catalog: str, schema: str -): - """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 - """ - - 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") - - # 2) Check for table within another schema in the same catalog - assert samples_engine.dialect.has_table( - connection=conn, table_name="customer", schema="tpch" - ) - - # 3) Check for a table within a different catalog - # 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);")) - - try: - # Verify that this table is not found in the samples catalog - assert not samples_engine.dialect.has_table( - connection=conn, table_name="test_has_table" - ) - # Verify that this table is found in a separate catalog - assert samples_engine.dialect.has_table( - connection=conn, - table_name="test_has_table", - schema=schema, - catalog=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, connection_details: dict): - HOST = connection_details["host"] - HTTP_PATH = connection_details["http_path"] - ACCESS_TOKEN = connection_details["access_token"] - CATALOG = connection_details["catalog"] - SCHEMA = connection_details["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" 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 f596dffa6..000000000 --- a/src/databricks/sqlalchemy/test_local/test_ddl.py +++ /dev/null @@ -1,96 +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" in output - assert "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 c8ab443d0..000000000 --- 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("tschema", [None, "some_schema"]) -def test_build_fk_dict(tschema): - 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=tschema) - - assert result == { - "name": "some_fk_name", - "constrained_columns": ["parent_user_id"], - "referred_schema": tschema, - "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 b91217edb..000000000 --- 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/large_queries_mixin.py b/tests/e2e/common/large_queries_mixin.py index 41ef029bb..7255ee095 100644 --- a/tests/e2e/common/large_queries_mixin.py +++ b/tests/e2e/common/large_queries_mixin.py @@ -5,113 +5,40 @@ log = logging.getLogger(__name__) -class LargeQueriesMixin: +def fetch_rows(test_case, cursor, row_count, fetchmany_size): """ - This mixin expects to be mixed with a CursorTest-like class + A generator for rows. Fetches until the end or up to 5 minutes. """ - - def fetch_rows(self, cursor, row_count, fetchmany_size): - """ - A generator for rows. Fetches until the end or up to 5 minutes. - """ - # TODO: Remove fetchmany_size when we have fixed the performance issues with fetchone - # in the Python client - max_fetch_time = 5 * 60 # Fetch for at most 5 minutes - - rows = self.get_some_rows(cursor, fetchmany_size) - start_time = time.time() - n = 0 - while rows: - for row in rows: - n += 1 - yield row - if time.time() - start_time >= max_fetch_time: - log.warning("Fetching rows timed out") - break - rows = self.get_some_rows(cursor, fetchmany_size) - if not rows: - # Read all the rows, row_count should match - self.assertEqual(n, row_count) - - num_fetches = max(math.ceil(n / 10000), 1) - latency_ms = int((time.time() - start_time) * 1000 / num_fetches), 1 - print( - "Fetched {} rows with an avg latency of {} per fetch, ".format( - n, latency_ms - ) - + "assuming 10K fetch size." + max_fetch_time = 5 * 60 # Fetch for at most 5 minutes + + rows = _get_some_rows(cursor, fetchmany_size) + start_time = time.time() + n = 0 + while rows: + for row in rows: + n += 1 + yield row + if time.time() - start_time >= max_fetch_time: + log.warning("Fetching rows timed out") + break + rows = _get_some_rows(cursor, fetchmany_size) + if not rows: + # Read all the rows, row_count should match + test_case.assertEqual(n, row_count) + + num_fetches = max(math.ceil(n / 10000), 1) + latency_ms = int((time.time() - start_time) * 1000 / num_fetches), 1 + print( + "Fetched {} rows with an avg latency of {} per fetch, ".format( + n, latency_ms ) + + "assuming 10K fetch size." + ) - def test_query_with_large_wide_result_set(self): - resultSize = 300 * 1000 * 1000 # 300 MB - width = 8192 # B - rows = resultSize // width - cols = width // 36 - - # Set the fetchmany_size to get 10MB of data a go - fetchmany_size = 10 * 1024 * 1024 // width - # This is used by PyHive tests to determine the buffer size - self.arraysize = 1000 - with self.cursor() as cursor: - for lz4_compression in [False, True]: - cursor.connection.lz4_compression = lz4_compression - uuids = ", ".join(["uuid() uuid{}".format(i) for i in range(cols)]) - cursor.execute( - "SELECT id, {uuids} FROM RANGE({rows})".format( - uuids=uuids, rows=rows - ) - ) - assert lz4_compression == cursor.active_result_set.lz4_compressed - for row_id, row in enumerate( - self.fetch_rows(cursor, rows, fetchmany_size) - ): - assert row[0] == row_id # Verify no rows are dropped in the middle. - assert len(row[1]) == 36 - - def test_query_with_large_narrow_result_set(self): - resultSize = 300 * 1000 * 1000 # 300 MB - width = 8 # sizeof(long) - rows = resultSize / width - - # Set the fetchmany_size to get 10MB of data a go - fetchmany_size = 10 * 1024 * 1024 // width - # This is used by PyHive tests to determine the buffer size - self.arraysize = 10000000 - with self.cursor() as cursor: - cursor.execute("SELECT * FROM RANGE({rows})".format(rows=rows)) - for row_id, row in enumerate(self.fetch_rows(cursor, rows, fetchmany_size)): - assert row[0] == row_id - - def test_long_running_query(self): - """Incrementally increase query size until it takes at least 5 minutes, - and asserts that the query completes successfully. - """ - minutes = 60 - min_duration = 5 * minutes - - duration = -1 - scale0 = 10000 - scale_factor = 1 - with self.cursor() as cursor: - while duration < min_duration: - assert scale_factor < 512, "Detected infinite loop" - start = time.time() - - cursor.execute( - """SELECT count(*) - FROM RANGE({scale}) x - JOIN RANGE({scale0}) y - ON from_unixtime(x.id * y.id, "yyyy-MM-dd") LIKE "%not%a%date%" - """.format( - scale=scale_factor * scale0, scale0=scale0 - ) - ) - - (n,) = cursor.fetchone() - assert n == 0 - duration = time.time() - start - current_fraction = duration / min_duration - print("Took {} s with scale factor={}".format(duration, scale_factor)) - # Extrapolate linearly to reach 5 min and add 50% padding to push over the limit - scale_factor = math.ceil(1.5 * scale_factor / current_fraction) +def _get_some_rows(cursor, fetchmany_size): + row = cursor.fetchone() + if row: + return [row] + else: + return None diff --git a/tests/e2e/common/retry_test_mixins.py b/tests/e2e/common/retry_test_mixins.py index 942955cab..80822ba47 100755 --- a/tests/e2e/common/retry_test_mixins.py +++ b/tests/e2e/common/retry_test_mixins.py @@ -2,6 +2,7 @@ import time from typing import Optional, List from unittest.mock import MagicMock, PropertyMock, patch +import io import pytest from urllib3.exceptions import MaxRetryError @@ -17,17 +18,32 @@ class Client429ResponseMixin: - def test_client_should_retry_automatically_when_getting_429(self): - with self.cursor() as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_client_should_retry_automatically_when_getting_429(self, extra_params): + with self.cursor(extra_params) as cursor: for _ in range(10): cursor.execute("SELECT 1") rows = cursor.fetchall() self.assertEqual(len(rows), 1) self.assertEqual(rows[0][0], 1) - def test_client_should_not_retry_429_if_RateLimitRetry_is_0(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_client_should_not_retry_429_if_RateLimitRetry_is_0(self, extra_params): with pytest.raises(self.error_type) as cm: - with self.cursor(self.conf_to_disable_rate_limit_retries) as cursor: + extra_params = {**extra_params, **self.conf_to_disable_rate_limit_retries} + with self.cursor(extra_params) as cursor: for _ in range(10): cursor.execute("SELECT 1") rows = cursor.fetchall() @@ -46,34 +62,108 @@ def test_client_should_not_retry_429_if_RateLimitRetry_is_0(self): class Client503ResponseMixin: - def test_wait_cluster_startup(self): - with self.cursor() as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_wait_cluster_startup(self, extra_params): + with self.cursor(extra_params) as cursor: cursor.execute("SELECT 1") cursor.fetchall() - def _test_retry_disabled_with_message(self, error_msg_substring, exception_type): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def _test_retry_disabled_with_message( + self, error_msg_substring, exception_type, extra_params + ): with pytest.raises(exception_type) as cm: - with self.connection(self.conf_to_disable_temporarily_unavailable_retries): + with self.connection( + self.conf_to_disable_temporarily_unavailable_retries, extra_params + ): pass assert error_msg_substring in str(cm.exception) +class SimpleHttpResponse: + """A simple HTTP response mock that works with both urllib3 v1.x and v2.x""" + + def __init__(self, status: int, headers: dict, redirect_location: Optional[str] = None): + # Import the correct HTTP message type that urllib3 v1.x expects + try: + from http.client import HTTPMessage + except ImportError: + from httplib import HTTPMessage + + self.status = status + # Create proper HTTPMessage for urllib3 v1.x compatibility + self.headers = HTTPMessage() + for key, value in headers.items(): + self.headers[key] = str(value) + self.msg = self.headers # For urllib3~=1.0.0 compatibility + self.reason = "Mocked Response" + self.version = 11 + self.length = 0 + self.length_remaining = 0 + self._redirect_location = redirect_location + self._body = b"" + self._fp = io.BytesIO(self._body) + self._url = "https://example.com" + + def get_redirect_location(self, *args, **kwargs): + """Return the redirect location or False""" + return False if self._redirect_location is None else self._redirect_location + + def read(self, amt=None): + """Mock read method for file-like behavior""" + return self._body + + def close(self): + """Mock close method""" + pass + + def drain_conn(self): + """Mock drain_conn method for urllib3 v2.x""" + pass + + def isclosed(self): + """Mock isclosed method for urllib3 v1.x""" + return False + + def release_conn(self): + """Mock release_conn method for thrift HTTP client""" + pass + + @property + def data(self): + """Mock data property for urllib3 v2.x""" + return self._body + + @property + def url(self): + """Mock url property""" + return self._url + + @url.setter + def url(self, value): + """Mock url setter""" + self._url = value + + @contextmanager def mocked_server_response( status: int = 200, headers: dict = {}, redirect_location: Optional[str] = None ): - """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 - - # `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 - ) + """Context manager for patching urllib3 responses with version compatibility""" + + mock_response = SimpleHttpResponse(status, headers, redirect_location) with patch("urllib3.connectionpool.HTTPSConnectionPool._get_conn") as getconn_mock: getconn_mock.return_value.getresponse.return_value = mock_response @@ -94,18 +184,14 @@ def mock_sequential_server_responses(responses: List[dict]): - redirect_location: str """ - mock_responses = [] - - # Each resp should have these members: - - for resp in responses: - _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_responses = [ + SimpleHttpResponse( + status=resp["status"], + headers=resp["headers"], + redirect_location=resp["redirect_location"] ) - mock_responses.append(_mock) + for resp in responses + ] with patch("urllib3.connectionpool.HTTPSConnectionPool._get_conn") as getconn_mock: getconn_mock.return_value.getresponse.side_effect = mock_responses @@ -121,13 +207,23 @@ class PySQLRetryTestsMixin: # For testing purposes _retry_policy = { "_retry_delay_min": 0.1, - "_retry_delay_max": 5, + "_retry_delay_max": 3, "_retry_stop_after_attempts_count": 5, - "_retry_stop_after_attempts_duration": 10, + "_retry_stop_after_attempts_duration": 30, "_retry_delay_default": 0.5, } - def test_retry_urllib3_settings_are_honored(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + @patch("databricks.sql.telemetry.telemetry_client.TelemetryClient._send_telemetry") + def test_retry_urllib3_settings_are_honored( + self, mock_send_telemetry, extra_params + ): """Databricks overrides some of urllib3's configuration. This tests confirms that what configuration we DON'T override is preserved in urllib3's internals """ @@ -135,7 +231,7 @@ def test_retry_urllib3_settings_are_honored(self): urllib3_config = {"connect": 10, "read": 11, "redirect": 12} rp = DatabricksRetryPolicy( delay_min=0.1, - delay_max=10.0, + delay_max=3, stop_after_attempts_count=10, stop_after_attempts_duration=10.0, delay_default=1.0, @@ -147,71 +243,113 @@ def test_retry_urllib3_settings_are_honored(self): assert rp.read == 11 assert rp.redirect == 12 - def test_oserror_retries(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + @patch("databricks.sql.telemetry.telemetry_client.TelemetryClient._send_telemetry") + def test_oserror_retries(self, mock_send_telemetry, extra_params): """If a network error occurs during make_request, the request is retried according to policy""" with patch( "urllib3.connectionpool.HTTPSConnectionPool._validate_conn", ) as mock_validate_conn: mock_validate_conn.side_effect = OSError("Some arbitrary network error") with pytest.raises(MaxRetryError) as cm: - with self.connection(extra_params=self._retry_policy) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: pass assert mock_validate_conn.call_count == 6 - def test_retry_max_count_not_exceeded(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + @patch("databricks.sql.telemetry.telemetry_client.TelemetryClient._send_telemetry") + def test_retry_max_count_not_exceeded(self, mock_send_telemetry, extra_params): """GIVEN the max_attempts_count is 5 WHEN the server sends nothing but 429 responses THEN the connector issues six request (original plus five retries) before raising an exception """ - with mocked_server_response(status=404) as mock_obj: + with mocked_server_response(status=429, headers={"Retry-After": "0"}) as mock_obj: with pytest.raises(MaxRetryError) as cm: - with self.connection(extra_params=self._retry_policy) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: pass assert mock_obj.return_value.getresponse.call_count == 6 - def test_retry_exponential_backoff(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + @patch("databricks.sql.telemetry.telemetry_client.TelemetryClient._send_telemetry") + def test_retry_exponential_backoff(self, mock_send_telemetry, extra_params): """GIVEN the retry policy is configured for reasonable exponential backoff WHEN the server sends nothing but 429 responses with retry-afters - THEN the connector will use those retry-afters values as delay + THEN the connector will use those retry-afters values as floor """ retry_policy = self._retry_policy.copy() retry_policy["_retry_delay_min"] = 1 time_start = time.time() with mocked_server_response( - status=429, headers={"Retry-After": "3"} + status=429, headers={"Retry-After": "8"} ) as mock_obj: with pytest.raises(RequestError) as cm: - with self.connection(extra_params=retry_policy) as conn: + extra_params = {**extra_params, **retry_policy} + with self.connection(extra_params=extra_params) as conn: pass duration = time.time() - time_start assert isinstance(cm.value.args[1], MaxRetryDurationError) # With setting delay_min to 1, the expected retry delays should be: - # 3, 3, 3, 3 + # 8, 8, 8, 8 # The first 3 retries are allowed, the 4th retry puts the total duration over the limit - # of 10 seconds + # of 30 seconds assert mock_obj.return_value.getresponse.call_count == 4 - assert duration > 6 + assert duration > 24 - # Should be less than 7, but this is a safe margin for CI/CD slowness - assert duration < 10 + # Should be less than 26, but this is a safe margin for CI/CD slowness + assert duration < 30 - def test_retry_max_duration_not_exceeded(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_max_duration_not_exceeded(self, extra_params): """GIVEN the max attempt duration of 10 seconds WHEN the server sends a Retry-After header of 60 seconds THEN the connector raises a MaxRetryDurationError """ with mocked_server_response(status=429, headers={"Retry-After": "60"}): with pytest.raises(RequestError) as cm: - with self.connection(extra_params=self._retry_policy) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: pass assert isinstance(cm.value.args[1], MaxRetryDurationError) - def test_retry_abort_non_recoverable_error(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_abort_non_recoverable_error(self, extra_params): """GIVEN the server returns a code 501 WHEN the connector receives this response THEN nothing is retried and an exception is raised @@ -220,16 +358,25 @@ def test_retry_abort_non_recoverable_error(self): # Code 501 is a Not Implemented error with mocked_server_response(status=501): with pytest.raises(RequestError) as cm: - with self.connection(extra_params=self._retry_policy) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: pass assert isinstance(cm.value.args[1], NonRecoverableNetworkError) - def test_retry_abort_unsafe_execute_statement_retry_condition(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_abort_unsafe_execute_statement_retry_condition(self, extra_params): """GIVEN the server sends a code other than 429 or 503 WHEN the connector sent an ExecuteStatement command THEN nothing is retried because it's idempotent """ - with self.connection(extra_params=self._retry_policy) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: with conn.cursor() as cursor: # Code 502 is a Bad Gateway, which we commonly see in production under heavy load with mocked_server_response(status=502): @@ -237,7 +384,14 @@ def test_retry_abort_unsafe_execute_statement_retry_condition(self): cursor.execute("Not a real query") assert isinstance(cm.value.args[1], UnsafeToRetryError) - def test_retry_dangerous_codes(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_dangerous_codes(self, extra_params): """GIVEN the server sends a dangerous code and the user forced this to be retryable WHEN the connector sent an ExecuteStatement command THEN the command is retried @@ -245,7 +399,7 @@ def test_retry_dangerous_codes(self): # These http codes are not retried by default # For some applications, idempotency is not important so we give users a way to force retries anyway - DANGEROUS_CODES = [502, 504, 400] + DANGEROUS_CODES = [502, 504] additional_settings = { "_retry_dangerous_codes": DANGEROUS_CODES, @@ -253,7 +407,8 @@ def test_retry_dangerous_codes(self): } # Prove that these codes are not retried by default - with self.connection(extra_params={**self._retry_policy}) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: with conn.cursor() as cursor: for dangerous_code in DANGEROUS_CODES: with mocked_server_response(status=dangerous_code): @@ -263,7 +418,7 @@ def test_retry_dangerous_codes(self): # Prove that these codes are retried if forced by the user with self.connection( - extra_params={**self._retry_policy, **additional_settings} + extra_params={**extra_params, **self._retry_policy, **additional_settings} ) as conn: with conn.cursor() as cursor: for dangerous_code in DANGEROUS_CODES: @@ -271,7 +426,14 @@ def test_retry_dangerous_codes(self): with pytest.raises(MaxRetryError) as cm: cursor.execute("Not a real query") - def test_retry_safe_execute_statement_retry_condition(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_safe_execute_statement_retry_condition(self, extra_params): """GIVEN the server sends either code 429 or 503 WHEN the connector sent an ExecuteStatement command THEN the request is retried because these are idempotent @@ -283,7 +445,11 @@ def test_retry_safe_execute_statement_retry_condition(self): ] with self.connection( - extra_params={**self._retry_policy, "_retry_stop_after_attempts_count": 1} + extra_params={ + **extra_params, + **self._retry_policy, + "_retry_stop_after_attempts_count": 1, + } ) as conn: with conn.cursor() as cursor: # Code 502 is a Bad Gateway, which we commonly see in production under heavy load @@ -292,104 +458,150 @@ def test_retry_safe_execute_statement_retry_condition(self): cursor.execute("This query never reaches the server") assert mock_obj.return_value.getresponse.call_count == 2 - def test_retry_abort_close_session_on_404(self, caplog): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_abort_close_session_on_404(self, extra_params, caplog): """GIVEN the connector sends a CloseSession command - WHEN server sends a 404 (which is normally retried) - THEN nothing is retried because 404 means the session already closed + WHEN server sends a 404 (which is not retried since commit 41b28159) + THEN nothing is retried because 404 is globally non-retryable """ - # 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 + # With the idempotency-based retry refactor, 404 is now globally non-retryable + # regardless of command type. The close() method catches RequestError and proceeds. responses = [ - {"status": 502, "headers": {"Retry-After": "1"}, "redirect_location": None}, {"status": 404, "headers": {}, "redirect_location": None}, ] - with self.connection(extra_params={**self._retry_policy}) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: with mock_sequential_server_responses(responses): + # Should not raise an exception, the error is caught internally conn.close() - assert "Session was closed by a prior request" in caplog.text - def test_retry_abort_close_operation_on_404(self, caplog): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_abort_close_operation_on_404(self, extra_params, caplog): """GIVEN the connector sends a CancelOperation command - WHEN server sends a 404 (which is normally retried) - THEN nothing is retried because 404 means the operation was already canceled + WHEN server sends a 404 (which is not retried since commit 41b28159) + THEN nothing is retried because 404 is globally non-retryable """ - # 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 + # With the idempotency-based retry refactor, 404 is now globally non-retryable + # regardless of command type. The close() method catches RequestError and proceeds. responses = [ - {"status": 502, "headers": {"Retry-After": "1"}, "redirect_location": None}, {"status": 404, "headers": {}, "redirect_location": None}, ] - with self.connection(extra_params={**self._retry_policy}) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: with conn.cursor() as curs: with patch( - "databricks.sql.utils.ExecuteResponse.has_been_closed_server_side", + "databricks.sql.backend.types.ExecuteResponse.has_been_closed_server_side", new_callable=PropertyMock, return_value=False, ): # This call guarantees we have an open cursor at the server curs.execute("SELECT 1") with mock_sequential_server_responses(responses): + # Should not raise an exception, the error is caught internally curs.close() - assert ( - "Operation was canceled by a prior request" in caplog.text - ) - def test_retry_max_redirects_raises_too_many_redirects_exception(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + @patch("databricks.sql.telemetry.telemetry_client.TelemetryClient._send_telemetry") + def test_3xx_redirect_codes_are_not_retried( + self, mock_send_telemetry, extra_params + ): """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 + WHEN the DatabricksRetryPolicy receives a 302 redirect + THEN the connector does not retry since 3xx codes are not retried per policy """ - max_redirects, expected_call_count = 1, 2 + max_redirects, expected_call_count = 1, 1 - # Code 302 is a redirect + # Code 302 is a redirect, but 3xx codes are not retried per policy + # Note: We don't set redirect_location because that would cause urllib3 v2.x + # to follow redirects internally, bypassing our retry policy test with mocked_server_response( - status=302, redirect_location="/foo.bar" + status=302, redirect_location=None ) as mock_obj: - with pytest.raises(MaxRetryError) as cm: + with pytest.raises(RequestError): # Should get RequestError, not MaxRetryError with self.connection( extra_params={ + **extra_params, **self._retry_policy, "_retry_max_redirects": max_redirects, } ): pass - assert "too many redirects" == str(cm.value.reason) - # Total call count should be 2 (original + 1 retry) + # Total call count should be 1 (original only, no retries for 3xx codes) assert mock_obj.return_value.getresponse.call_count == expected_call_count - def test_retry_max_redirects_unset_doesnt_redirect_forever(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + @patch("databricks.sql.telemetry.telemetry_client.TelemetryClient._send_telemetry") + def test_3xx_codes_not_retried_regardless_of_max_redirects_setting( + self, mock_send_telemetry, extra_params + ): """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 + WHEN the DatabricksRetryPolicy receives a 302 redirect + THEN the connector does not retry since 3xx codes are not retried per policy - This test effectively guarantees that regardless of _retry_max_redirects, - _stop_after_attempts_count is enforced. + This test confirms that 3xx codes (including redirects) are not retried + according to the DatabricksRetryPolicy regardless of redirect settings. """ - # Code 302 is a redirect + # Code 302 is a redirect, but 3xx codes are not retried per policy + # Note: We don't set redirect_location because that would cause urllib3 v2.x + # to follow redirects internally, bypassing our retry policy test with mocked_server_response( - status=302, redirect_location="/foo.bar/" + status=302, redirect_location=None ) as mock_obj: - with pytest.raises(MaxRetryError) as cm: + with pytest.raises(RequestError): # Should get RequestError, not MaxRetryError with self.connection( extra_params={ + **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 + # Total call count should be 1 (original only, no retries for 3xx codes) + assert mock_obj.return_value.getresponse.call_count == 1 - 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 + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_3xx_codes_stop_request_immediately_no_retry_attempts( + self, extra_params + ): + # Since 3xx codes are not retried per policy, we only ever see the first 302 response responses = [ {"status": 302, "headers": {}, "redirect_location": "/foo.bar"}, - {"status": 500, "headers": {}, "redirect_location": None}, + {"status": 500, "headers": {}, "redirect_location": None}, # Never reached ] additional_settings = { @@ -400,17 +612,31 @@ def test_retry_max_redirects_is_bounded_by_stop_after_attempts_count(self): with pytest.raises(RequestError) as cm: with mock_sequential_server_responses(responses): with self.connection( - extra_params={**self._retry_policy, **additional_settings} + extra_params={ + **extra_params, + **self._retry_policy, + **additional_settings, + } ): pass - # The error should be the result of the 500, not because of too many requests. + # The error should be the result of the 302, since 3xx codes are not retried 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, caplog): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_max_redirects_exceeds_max_attempts_count_warns_user( + self, extra_params, caplog + ): with self.connection( extra_params={ + **extra_params, **self._retry_policy, **{ "_retry_max_redirects": 100, @@ -420,15 +646,33 @@ def test_retry_max_redirects_exceeds_max_attempts_count_warns_user(self, caplog) ): assert "it will have no affect!" in caplog.text - def test_retry_legacy_behavior_warns_user(self, caplog): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_retry_legacy_behavior_warns_user(self, extra_params, caplog): with self.connection( - extra_params={**self._retry_policy, "_enable_v3_retries": False} + extra_params={ + **extra_params, + **self._retry_policy, + "_enable_v3_retries": False, + } ): assert ( "Legacy retry behavior is enabled for this connection." in caplog.text ) - def test_403_not_retried(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_403_not_retried(self, extra_params): """GIVEN the server returns a code 403 WHEN the connector receives this response THEN nothing is retried and an exception is raised @@ -437,11 +681,19 @@ def test_403_not_retried(self): # Code 403 is a Forbidden error with mocked_server_response(status=403): with pytest.raises(RequestError) as cm: - with self.connection(extra_params=self._retry_policy) as conn: + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params) as conn: pass assert isinstance(cm.value.args[1], NonRecoverableNetworkError) - def test_401_not_retried(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_401_not_retried(self, extra_params): """GIVEN the server returns a code 401 WHEN the connector receives this response THEN nothing is retried and an exception is raised @@ -450,6 +702,7 @@ def test_401_not_retried(self): # Code 401 is an Unauthorized error with mocked_server_response(status=401): with pytest.raises(RequestError) as cm: - with self.connection(extra_params=self._retry_policy): + extra_params = {**extra_params, **self._retry_policy} + with self.connection(extra_params=extra_params): pass assert isinstance(cm.value.args[1], NonRecoverableNetworkError) diff --git a/tests/e2e/common/staging_ingestion_tests.py b/tests/e2e/common/staging_ingestion_tests.py index 008055e33..a88f55238 100644 --- a/tests/e2e/common/staging_ingestion_tests.py +++ b/tests/e2e/common/staging_ingestion_tests.py @@ -46,7 +46,7 @@ def test_staging_ingestion_life_cycle(self, ingestion_user): ) as conn: cursor = conn.cursor() - query = f"PUT '{temp_path}' INTO 'stage://tmp/{ingestion_user}/tmp/11/15/file1.csv' OVERWRITE" + query = f"PUT '{temp_path}' INTO 'stage://tmp/{ingestion_user}/tmp/11/16/file1.csv' OVERWRITE" cursor.execute(query) # GET should succeed @@ -57,7 +57,7 @@ def test_staging_ingestion_life_cycle(self, ingestion_user): extra_params={"staging_allowed_local_path": new_temp_path} ) as conn: cursor = conn.cursor() - query = f"GET 'stage://tmp/{ingestion_user}/tmp/11/15/file1.csv' TO '{new_temp_path}'" + query = f"GET 'stage://tmp/{ingestion_user}/tmp/11/16/file1.csv' TO '{new_temp_path}'" cursor.execute(query) with open(new_fh, "rb") as fp: @@ -67,9 +67,14 @@ def test_staging_ingestion_life_cycle(self, ingestion_user): # REMOVE should succeed - remove_query = f"REMOVE 'stage://tmp/{ingestion_user}/tmp/11/15/file1.csv'" - - with self.connection(extra_params={"staging_allowed_local_path": "/"}) as conn: + remove_query = f"REMOVE 'stage://tmp/{ingestion_user}/tmp/11/16/file1.csv'" + # Use minimal retry settings to fail fast for staging operations + extra_params = { + "staging_allowed_local_path": "/", + "_retry_stop_after_attempts_count": 1, + "_retry_delay_max": 10, + } + with self.connection(extra_params=extra_params) as conn: cursor = conn.cursor() cursor.execute(remove_query) @@ -79,7 +84,7 @@ def test_staging_ingestion_life_cycle(self, ingestion_user): Error, match="Staging operation over HTTP was unsuccessful: 404" ): cursor = conn.cursor() - query = f"GET 'stage://tmp/{ingestion_user}/tmp/11/15/file1.csv' TO '{new_temp_path}'" + query = f"GET 'stage://tmp/{ingestion_user}/tmp/11/16/file1.csv' TO '{new_temp_path}'" cursor.execute(query) os.remove(temp_path) diff --git a/tests/e2e/common/streaming_put_tests.py b/tests/e2e/common/streaming_put_tests.py new file mode 100644 index 000000000..83da10fd3 --- /dev/null +++ b/tests/e2e/common/streaming_put_tests.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +""" +E2E tests for streaming PUT operations. +""" + +import io +import logging +import pytest + +logger = logging.getLogger(__name__) + + +class PySQLStreamingPutTestSuiteMixin: + """Test suite for streaming PUT operations.""" + + def test_streaming_put_basic(self, catalog, schema): + """Test basic streaming PUT functionality.""" + + # Create test data + test_data = b"Hello, streaming world! This is test data." + filename = "streaming_put_test.txt" + file_path = f"/Volumes/{catalog}/{schema}/e2etests/{filename}" + + try: + with self.connection() as conn: + with conn.cursor() as cursor: + self._cleanup_test_file(file_path) + + with io.BytesIO(test_data) as stream: + cursor.execute( + f"PUT '__input_stream__' INTO '{file_path}'", + input_stream=stream + ) + + # Verify file exists + cursor.execute(f"LIST '/Volumes/{catalog}/{schema}/e2etests/'") + files = cursor.fetchall() + + # Check if our file is in the list + file_paths = [row[0] for row in files] + assert file_path in file_paths, f"File {file_path} not found in {file_paths}" + finally: + self._cleanup_test_file(file_path) + + def test_streaming_put_missing_stream(self, catalog, schema): + """Test that missing stream raises appropriate error.""" + + with self.connection() as conn: + with conn.cursor() as cursor: + # Test without providing stream + with pytest.raises(Exception): # Should fail + cursor.execute( + f"PUT '__input_stream__' INTO '/Volumes/{catalog}/{schema}/e2etests/test.txt'" + # Note: No input_stream parameter + ) + + def _cleanup_test_file(self, file_path): + """Clean up a test file if it exists.""" + try: + with self.connection(extra_params={"staging_allowed_local_path": "/"}) as conn: + with conn.cursor() as cursor: + cursor.execute(f"REMOVE '{file_path}'") + logger.info("Successfully cleaned up test file: %s", file_path) + except Exception as e: + logger.error("Cleanup failed for %s: %s", file_path, e) \ No newline at end of file diff --git a/tests/e2e/common/uc_volume_tests.py b/tests/e2e/common/uc_volume_tests.py index 72e2f5020..5b4086f91 100644 --- a/tests/e2e/common/uc_volume_tests.py +++ b/tests/e2e/common/uc_volume_tests.py @@ -68,7 +68,13 @@ def test_uc_volume_life_cycle(self, catalog, schema): remove_query = f"REMOVE '/Volumes/{catalog}/{schema}/e2etests/file1.csv'" - with self.connection(extra_params={"staging_allowed_local_path": "/"}) as conn: + # Use minimal retry settings to fail fast + extra_params = { + "staging_allowed_local_path": "/", + "_retry_stop_after_attempts_count": 1, + "_retry_delay_max": 10, + } + with self.connection(extra_params=extra_params) as conn: cursor = conn.cursor() cursor.execute(remove_query) diff --git a/tests/e2e/test_circuit_breaker.py b/tests/e2e/test_circuit_breaker.py new file mode 100644 index 000000000..f9df0f377 --- /dev/null +++ b/tests/e2e/test_circuit_breaker.py @@ -0,0 +1,269 @@ +""" +E2E tests for circuit breaker functionality in telemetry. + +This test suite verifies: +1. Circuit breaker opens after rate limit failures (429/503) +2. Circuit breaker blocks subsequent calls while open +3. Circuit breaker does not trigger for non-rate-limit errors +4. Circuit breaker can be disabled via configuration flag +5. Circuit breaker closes after reset timeout + +Run with: + pytest tests/e2e/test_circuit_breaker.py -v -s +""" + +import time +from unittest.mock import patch, MagicMock + +import pytest +from pybreaker import STATE_OPEN, STATE_CLOSED, STATE_HALF_OPEN +from urllib3 import HTTPResponse + +import databricks.sql as sql +from databricks.sql.telemetry.circuit_breaker_manager import CircuitBreakerManager + + +def wait_for_circuit_state(circuit_breaker, expected_states, timeout=5): + """ + Wait for circuit breaker to reach one of the expected states with polling. + + Args: + circuit_breaker: The circuit breaker instance to monitor + expected_states: List of acceptable states + (STATE_OPEN, STATE_CLOSED, STATE_HALF_OPEN) + timeout: Maximum time to wait in seconds + + Returns: + True if state reached, False if timeout + + Examples: + # Single state - pass list with one element + wait_for_circuit_state(cb, [STATE_OPEN]) + + # Multiple states + wait_for_circuit_state(cb, [STATE_CLOSED, STATE_HALF_OPEN]) + """ + start = time.time() + while time.time() - start < timeout: + if circuit_breaker.current_state in expected_states: + return True + time.sleep(0.1) # Poll every 100ms + return False + + +@pytest.fixture(autouse=True) +def aggressive_circuit_breaker_config(): + """ + Configure circuit breaker to be aggressive for faster testing. + Opens after 2 failures instead of 20, with 5 second timeout. + """ + from databricks.sql.telemetry import circuit_breaker_manager + + original_minimum_calls = circuit_breaker_manager.MINIMUM_CALLS + original_reset_timeout = circuit_breaker_manager.RESET_TIMEOUT + + circuit_breaker_manager.MINIMUM_CALLS = 2 + circuit_breaker_manager.RESET_TIMEOUT = 5 + + CircuitBreakerManager._instances.clear() + + yield + + circuit_breaker_manager.MINIMUM_CALLS = original_minimum_calls + circuit_breaker_manager.RESET_TIMEOUT = original_reset_timeout + CircuitBreakerManager._instances.clear() + + +class TestCircuitBreakerTelemetry: + """Tests for circuit breaker functionality with telemetry""" + + @pytest.fixture(autouse=True) + def get_details(self, connection_details): + """Get connection details from pytest fixture""" + self.arguments = connection_details.copy() + + def create_mock_response(self, status_code): + """Helper to create mock HTTP response.""" + response = MagicMock(spec=HTTPResponse) + response.status = status_code + response.data = { + 429: b"Too Many Requests", + 503: b"Service Unavailable", + 500: b"Internal Server Error", + }.get(status_code, b"Response") + return response + + @pytest.mark.parametrize( + "status_code,should_trigger", + [ + (429, True), + (503, True), + (500, False), + ], + ) + def test_circuit_breaker_triggers_for_rate_limit_codes( + self, status_code, should_trigger + ): + """ + Verify circuit breaker opens for rate-limit codes (429/503) but not others (500). + """ + request_count = {"count": 0} + + def mock_request(*args, **kwargs): + request_count["count"] += 1 + return self.create_mock_response(status_code) + + with patch( + "databricks.sql.telemetry.telemetry_push_client.TelemetryPushClient.request", + side_effect=mock_request, + ): + with sql.connect( + server_hostname=self.arguments["host"], + http_path=self.arguments["http_path"], + access_token=self.arguments.get("access_token"), + force_enable_telemetry=True, + telemetry_batch_size=1, + _telemetry_circuit_breaker_enabled=True, + ) as conn: + circuit_breaker = CircuitBreakerManager.get_circuit_breaker( + self.arguments["host"] + ) + + assert circuit_breaker.current_state == STATE_CLOSED + + cursor = conn.cursor() + + # Execute queries to trigger telemetry + for i in range(1, 6): + cursor.execute(f"SELECT {i}") + cursor.fetchone() + time.sleep(0.5) + + if should_trigger: + # Wait for circuit to open (async telemetry may take time) + assert wait_for_circuit_state( + circuit_breaker, [STATE_OPEN], timeout=5 + ), f"Circuit didn't open within 5s, state: {circuit_breaker.current_state}" + + # Circuit should be OPEN after rate-limit failures + assert circuit_breaker.current_state == STATE_OPEN + assert circuit_breaker.fail_counter >= 2 # At least 2 failures + + # Track requests before another query + requests_before = request_count["count"] + cursor.execute("SELECT 99") + cursor.fetchone() + time.sleep(1) + + # No new telemetry requests (circuit is open) + assert request_count["count"] == requests_before + else: + # Circuit should remain CLOSED for non-rate-limit errors + assert circuit_breaker.current_state == STATE_CLOSED + assert circuit_breaker.fail_counter == 0 + assert request_count["count"] >= 5 + + def test_circuit_breaker_disabled_allows_all_calls(self): + """ + Verify that when circuit breaker is disabled, all calls go through + even with rate limit errors. + """ + request_count = {"count": 0} + + def mock_rate_limited_request(*args, **kwargs): + request_count["count"] += 1 + return self.create_mock_response(429) + + with patch( + "databricks.sql.telemetry.telemetry_push_client.TelemetryPushClient.request", + side_effect=mock_rate_limited_request, + ): + with sql.connect( + server_hostname=self.arguments["host"], + http_path=self.arguments["http_path"], + access_token=self.arguments.get("access_token"), + force_enable_telemetry=True, + telemetry_batch_size=1, + _telemetry_circuit_breaker_enabled=False, # Disabled + ) as conn: + cursor = conn.cursor() + + for i in range(5): + cursor.execute(f"SELECT {i}") + cursor.fetchone() + time.sleep(0.3) + + assert request_count["count"] >= 5 + + def test_circuit_breaker_recovers_after_reset_timeout(self): + """ + Verify circuit breaker transitions to HALF_OPEN after reset timeout + and eventually CLOSES if requests succeed. + """ + request_count = {"count": 0} + fail_requests = {"enabled": True} + + def mock_conditional_request(*args, **kwargs): + request_count["count"] += 1 + status = 429 if fail_requests["enabled"] else 200 + return self.create_mock_response(status) + + with patch( + "databricks.sql.telemetry.telemetry_push_client.TelemetryPushClient.request", + side_effect=mock_conditional_request, + ): + with sql.connect( + server_hostname=self.arguments["host"], + http_path=self.arguments["http_path"], + access_token=self.arguments.get("access_token"), + force_enable_telemetry=True, + telemetry_batch_size=1, + _telemetry_circuit_breaker_enabled=True, + ) as conn: + circuit_breaker = CircuitBreakerManager.get_circuit_breaker( + self.arguments["host"] + ) + + cursor = conn.cursor() + + # Trigger failures to open circuit + cursor.execute("SELECT 1") + cursor.fetchone() + time.sleep(1) + + cursor.execute("SELECT 2") + cursor.fetchone() + time.sleep(2) + + # Wait for circuit to open + assert wait_for_circuit_state( + circuit_breaker, [STATE_OPEN], timeout=5 + ), f"Circuit didn't open, state: {circuit_breaker.current_state}" + + # Wait for reset timeout (5 seconds in test) + time.sleep(6) + + # Now make requests succeed + fail_requests["enabled"] = False + + # Execute query to trigger HALF_OPEN state + cursor.execute("SELECT 3") + cursor.fetchone() + + # Wait for circuit to start recovering + assert wait_for_circuit_state( + circuit_breaker, [STATE_HALF_OPEN, STATE_CLOSED], timeout=5 + ), f"Circuit didn't recover, state: {circuit_breaker.current_state}" + + # Execute more queries to fully recover + cursor.execute("SELECT 4") + cursor.fetchone() + + # Wait for full recovery + assert wait_for_circuit_state( + circuit_breaker, [STATE_CLOSED, STATE_HALF_OPEN], timeout=5 + ), f"Circuit didn't fully recover, state: {circuit_breaker.current_state}" + + +if __name__ == "__main__": + pytest.main([__file__, "-v", "-s"]) diff --git a/tests/e2e/test_complex_types.py b/tests/e2e/test_complex_types.py index 446a6b50a..d075a5670 100644 --- a/tests/e2e/test_complex_types.py +++ b/tests/e2e/test_complex_types.py @@ -1,5 +1,7 @@ import pytest from numpy import ndarray +from typing import Sequence +from uuid import uuid4 from tests.e2e.test_driver import PySQLPytestTestCase @@ -9,55 +11,83 @@ class TestComplexTypes(PySQLPytestTestCase): def table_fixture(self, connection_details): self.arguments = connection_details.copy() """A pytest fixture that creates a table with a complex type, inserts a record, yields, and then drops the table""" + + table_name = f"pysql_test_complex_types_table_{str(uuid4()).replace('-', '_')}" + self.table_name = table_name with self.cursor() as cursor: # Create the table cursor.execute( - """ - CREATE TABLE IF NOT EXISTS pysql_test_complex_types_table ( + f""" + CREATE TABLE IF NOT EXISTS {table_name} ( array_col ARRAY, map_col MAP, - struct_col STRUCT - ) + struct_col STRUCT, + array_array_col ARRAY>, + array_map_col ARRAY>, + map_array_col MAP> + ) USING DELTA """ ) # Insert a record cursor.execute( - """ - INSERT INTO pysql_test_complex_types_table + f""" + INSERT INTO {table_name} VALUES ( ARRAY('a', 'b', 'c'), MAP('a', 1, 'b', 2, 'c', 3), - NAMED_STRUCT('field1', 'a', 'field2', 1) + NAMED_STRUCT('field1', 'a', 'field2', 1), + ARRAY(ARRAY('a','b','c')), + ARRAY(MAP('a', 1, 'b', 2, 'c', 3)), + MAP('a', ARRAY('a', 'b', 'c'), 'b', ARRAY('d', 'e')) ) """ ) - yield - # Clean up the table after the test - cursor.execute("DROP TABLE IF EXISTS pysql_test_complex_types_table") + try: + yield table_name + finally: + # Clean up the table after the test + cursor.execute(f"DROP TABLE IF EXISTS {table_name}") @pytest.mark.parametrize( "field,expected_type", - [("array_col", ndarray), ("map_col", list), ("struct_col", dict)], + [ + ("array_col", ndarray), + ("map_col", list), + ("struct_col", dict), + ("array_array_col", ndarray), + ("array_map_col", ndarray), + ("map_array_col", list), + ], ) 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" + f"SELECT * FROM {table_fixture} LIMIT 1" ).fetchone() assert isinstance(result[field], expected_type) - @pytest.mark.parametrize("field", [("array_col"), ("map_col"), ("struct_col")]) + @pytest.mark.parametrize( + "field", + [ + ("array_col"), + ("map_col"), + ("struct_col"), + ("array_array_col"), + ("array_map_col"), + ("map_array_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" + f"SELECT * FROM {table_fixture} LIMIT 1" ).fetchone() assert isinstance(result[field], str) diff --git a/tests/e2e/test_concurrent_telemetry.py b/tests/e2e/test_concurrent_telemetry.py new file mode 100644 index 000000000..6a317cbfa --- /dev/null +++ b/tests/e2e/test_concurrent_telemetry.py @@ -0,0 +1,223 @@ +from concurrent.futures import wait +import random +import threading +import time +from unittest.mock import patch +import pytest +import json + +from databricks.sql.telemetry.models.enums import StatementType +from databricks.sql.telemetry.telemetry_client import ( + TelemetryClient, + TelemetryClientFactory, +) +from tests.e2e.test_driver import PySQLPytestTestCase + + +def run_in_threads(target, num_threads, pass_index=False): + """Helper to run target function in multiple threads.""" + threads = [ + threading.Thread(target=target, args=(i,) if pass_index else ()) + for i in range(num_threads) + ] + for t in threads: + t.start() + for t in threads: + t.join() + + +@pytest.mark.serial +@pytest.mark.xdist_group(name="serial_telemetry") +class TestE2ETelemetry(PySQLPytestTestCase): + @pytest.fixture(autouse=True) + def telemetry_setup_teardown(self): + """ + This fixture ensures the TelemetryClientFactory is in a clean state + before each test and shuts it down afterward. Using a fixture makes + this robust and automatic. + """ + # Clean up BEFORE test starts to ensure no leftover state from previous tests + # Use wait=True to ensure all pending telemetry from previous tests completes + # This prevents those events from being captured by this test's mock + if TelemetryClientFactory._executor: + TelemetryClientFactory._executor.shutdown(wait=True) # WAIT for pending telemetry + TelemetryClientFactory._executor = None + TelemetryClientFactory._stop_flush_thread() + TelemetryClientFactory._flush_event.clear() # Clear the event flag + TelemetryClientFactory._clients.clear() + TelemetryClientFactory._initialized = False + + try: + yield + finally: + # Clean up AFTER test ends + # Use wait=True to ensure this test's telemetry completes before next test starts + if TelemetryClientFactory._executor: + TelemetryClientFactory._executor.shutdown(wait=True) # WAIT for this test's telemetry + TelemetryClientFactory._executor = None + TelemetryClientFactory._stop_flush_thread() + TelemetryClientFactory._flush_event.clear() # Clear the event flag + TelemetryClientFactory._clients.clear() + TelemetryClientFactory._initialized = False + + def test_concurrent_queries_sends_telemetry(self): + """ + An E2E test where concurrent threads execute real queries against + the staging endpoint, while we capture and verify the generated telemetry. + """ + # Extra flush right before test starts to clear any events that accumulated + # between fixture cleanup and now (e.g., from other tests on same worker) + if TelemetryClientFactory._executor: + TelemetryClientFactory._executor.shutdown(wait=True) + TelemetryClientFactory._executor = None + TelemetryClientFactory._clients.clear() + TelemetryClientFactory._initialized = False + + num_threads = 30 + capture_lock = threading.Lock() + captured_telemetry = [] + captured_session_ids = [] + captured_statement_ids = [] + captured_futures = [] + + original_send_telemetry = TelemetryClient._send_telemetry + original_callback = TelemetryClient._telemetry_request_callback + + def send_telemetry_wrapper(self_client, events): + with capture_lock: + captured_telemetry.extend(events) + original_send_telemetry(self_client, events) + + def callback_wrapper(self_client, future, sent_count): + """ + Wraps the original callback to capture the server's response + or any exceptions from the async network call. + """ + with capture_lock: + captured_futures.append(future) + original_callback(self_client, future, sent_count) + + with patch.object( + TelemetryClient, "_send_telemetry", send_telemetry_wrapper + ), patch.object( + TelemetryClient, "_telemetry_request_callback", callback_wrapper + ): + + def execute_query_worker(thread_id): + """Each thread creates a connection and executes a query.""" + + time.sleep(random.uniform(0, 0.05)) + + with self.connection( + extra_params={"force_enable_telemetry": True} + ) as conn: + # Capture the session ID from the connection before executing the query + session_id_hex = conn.get_session_id_hex() + with capture_lock: + captured_session_ids.append(session_id_hex) + + with conn.cursor() as cursor: + cursor.execute(f"SELECT {thread_id}") + # Capture the statement ID after executing the query + statement_id = cursor.query_id + with capture_lock: + captured_statement_ids.append(statement_id) + cursor.fetchall() + + # Run the workers concurrently + run_in_threads(execute_query_worker, num_threads, pass_index=True) + + timeout_seconds = 60 + start_time = time.time() + expected_event_count = num_threads + + while ( + len(captured_futures) < expected_event_count + and time.time() - start_time < timeout_seconds + ): + time.sleep(0.1) + + done, not_done = wait(captured_futures, timeout=timeout_seconds) + assert not not_done + + captured_exceptions = [] + captured_responses = [] + for future in done: + try: + response = future.result() + # Check status using urllib3 method (response.status instead of response.raise_for_status()) + if response.status >= 400: + raise Exception(f"HTTP {response.status}: {getattr(response, 'reason', 'Unknown')}") + # Parse JSON using urllib3 method (response.data.decode() instead of response.json()) + response_data = json.loads(response.data.decode()) if response.data else {} + captured_responses.append(response_data) + except Exception as e: + captured_exceptions.append(e) + + assert not captured_exceptions + assert len(captured_responses) > 0 + + total_successful_events = 0 + for response in captured_responses: + assert "errors" not in response or not response["errors"] + if "numProtoSuccess" in response: + total_successful_events += response["numProtoSuccess"] + + assert total_successful_events == num_threads * 2 + + assert ( + len(captured_telemetry) == num_threads * 2 + ) # 2 events per thread (initial_telemetry_log, latency_log (execute)) + assert len(captured_session_ids) == num_threads # One session ID per thread + assert ( + len(captured_statement_ids) == num_threads + ) # One statement ID per thread (per query) + + # Separate initial logs from latency logs + initial_logs = [ + e + for e in captured_telemetry + if e.entry.sql_driver_log.operation_latency_ms is None + and e.entry.sql_driver_log.driver_connection_params is not None + and e.entry.sql_driver_log.system_configuration is not None + ] + latency_logs = [ + e + for e in captured_telemetry + if e.entry.sql_driver_log.operation_latency_ms is not None + and e.entry.sql_driver_log.sql_statement_id is not None + and e.entry.sql_driver_log.sql_operation.statement_type + == StatementType.QUERY + ] + + # Verify counts + assert len(initial_logs) == num_threads + assert len(latency_logs) == num_threads + + # Verify that telemetry events contain the exact session IDs we captured from connections + telemetry_session_ids = set() + for event in captured_telemetry: + session_id = event.entry.sql_driver_log.session_id + assert session_id is not None + telemetry_session_ids.add(session_id) + + captured_session_ids_set = set(captured_session_ids) + assert telemetry_session_ids == captured_session_ids_set + assert len(captured_session_ids_set) == num_threads + + # Verify that telemetry latency logs contain the exact statement IDs we captured from cursors + telemetry_statement_ids = set() + for event in latency_logs: + statement_id = event.entry.sql_driver_log.sql_statement_id + assert statement_id is not None + telemetry_statement_ids.add(statement_id) + + captured_statement_ids_set = set(captured_statement_ids) + assert telemetry_statement_ids == captured_statement_ids_set + assert len(captured_statement_ids_set) == num_threads + + # Verify that each latency log has a statement ID from our captured set + for event in latency_logs: + log = event.entry.sql_driver_log + assert log.sql_statement_id in captured_statement_ids + assert log.session_id in captured_session_ids diff --git a/tests/e2e/test_driver.py b/tests/e2e/test_driver.py index 2f0881cda..45b56ae08 100644 --- a/tests/e2e/test_driver.py +++ b/tests/e2e/test_driver.py @@ -30,6 +30,7 @@ OperationalError, RequestError, ) +from databricks.sql.backend.types import CommandState from tests.e2e.common.predicates import ( pysql_has_version, pysql_supports_arrow, @@ -38,7 +39,7 @@ ) from databricks.sql.thrift_api.TCLIService import ttypes from tests.e2e.common.core_tests import CoreTestMixin, SmokeTestMixin -from tests.e2e.common.large_queries_mixin import LargeQueriesMixin +from tests.e2e.common.large_queries_mixin import fetch_rows from tests.e2e.common.timestamp_tests import TimestampTestsMixin from tests.e2e.common.decimal_tests import DecimalTestsMixin from tests.e2e.common.retry_test_mixins import ( @@ -49,6 +50,7 @@ from tests.e2e.common.retry_test_mixins import PySQLRetryTestsMixin from tests.e2e.common.uc_volume_tests import PySQLUCVolumeTestSuiteMixin +from tests.e2e.common.streaming_put_tests import PySQLStreamingPutTestSuiteMixin from databricks.sql.exc import SessionAlreadyClosedError @@ -59,12 +61,14 @@ unsafe_logger.addHandler(logging.FileHandler("./tests-unsafe.log")) # manually decorate DecimalTestsMixin to need arrow support -for name in loader.getTestCaseNames(DecimalTestsMixin, "test_"): - fn = getattr(DecimalTestsMixin, name) - decorated = skipUnless(pysql_supports_arrow(), "Decimal tests need arrow support")( - fn - ) - setattr(DecimalTestsMixin, name, decorated) +test_loader = loader.TestLoader() +for name in test_loader.getTestCaseNames(DecimalTestsMixin): + if name.startswith("test_"): + fn = getattr(DecimalTestsMixin, name) + decorated = skipUnless(pysql_supports_arrow(), "Decimal tests need arrow support")( + fn + ) + setattr(DecimalTestsMixin, name, decorated) class PySQLPytestTestCase: @@ -112,10 +116,12 @@ def connection(self, extra_params=()): conn.close() @contextmanager - def cursor(self, extra_params=()): + def cursor(self, extra_params=(), extra_cursor_params=()): with self.connection(extra_params) as conn: cursor = conn.cursor( - arraysize=self.arraysize, buffer_size_bytes=self.buffer_size_bytes + arraysize=self.arraysize, + buffer_size_bytes=self.buffer_size_bytes, + **dict(extra_cursor_params), ) try: yield cursor @@ -132,24 +138,89 @@ def assertEqualRowValues(self, actual, expected): assert act[i] == exp[i] -class TestPySQLLargeQueriesSuite(PySQLPytestTestCase, LargeQueriesMixin): - def get_some_rows(self, cursor, fetchmany_size): - row = cursor.fetchone() - if row: - return [row] - else: - return None +class TestPySQLLargeWideResultSet(PySQLPytestTestCase): + @pytest.mark.parametrize("extra_params", [{}, {"use_sea": True}]) + @pytest.mark.parametrize("lz4_compression", [False, True]) + def test_query_with_large_wide_result_set(self, extra_params, lz4_compression): + resultSize = 100 * 1000 * 1000 # 100 MB + width = 8192 # B + rows = resultSize // width + cols = width // 36 + fetchmany_size = 10 * 1024 * 1024 // width + self.arraysize = 1000 + with self.cursor(extra_params) as cursor: + cursor.connection.lz4_compression = lz4_compression + uuids = ", ".join(["uuid() uuid{}".format(i) for i in range(cols)]) + cursor.execute( + "SELECT id, {uuids} FROM RANGE({rows})".format( + uuids=uuids, rows=rows + ) + ) + assert lz4_compression == cursor.active_result_set.lz4_compressed + for row_id, row in enumerate( + fetch_rows(self, cursor, rows, fetchmany_size) + ): + assert row[0] == row_id + assert len(row[1]) == 36 + + +class TestPySQLLargeNarrowResultSet(PySQLPytestTestCase): + @pytest.mark.parametrize("extra_params", [{}, {"use_sea": True}]) + def test_query_with_large_narrow_result_set(self, extra_params): + resultSize = 100 * 1000 * 1000 # 100 MB + width = 8 # sizeof(long) + rows = resultSize / width + fetchmany_size = 10 * 1024 * 1024 // width + self.arraysize = 10000000 + with self.cursor(extra_params) as cursor: + cursor.execute("SELECT * FROM RANGE({rows})".format(rows=rows)) + for row_id, row in enumerate( + fetch_rows(self, cursor, rows, fetchmany_size) + ): + assert row[0] == row_id + + +class TestPySQLLongRunningQuery(PySQLPytestTestCase): + @pytest.mark.parametrize("extra_params", [{}, {"use_sea": True}]) + def test_long_running_query(self, extra_params): + """Incrementally increase query size until it takes at least 1 minute, + and asserts that the query completes successfully. + """ + import math + + minutes = 60 + min_duration = 1 * minutes + duration = -1 + scale0 = 10000 + scale_factor = 50 + with self.cursor(extra_params) as cursor: + while duration < min_duration: + assert scale_factor < 4096, "Detected infinite loop" + start = time.time() + cursor.execute( + """SELECT count(*) + FROM RANGE({scale}) x + JOIN RANGE({scale0}) y + ON from_unixtime(x.id * y.id, "yyyy-MM-dd") LIKE "%not%a%date%" + """.format( + scale=scale_factor * scale0, scale0=scale0 + ) + ) + (n,) = cursor.fetchone() + assert n == 0 + duration = time.time() - start + current_fraction = duration / min_duration + print("Took {} s with scale factor={}".format(duration, scale_factor)) + scale_factor = math.ceil(1.5 * scale_factor / current_fraction) + +class TestPySQLCloudFetch(PySQLPytestTestCase): @skipUnless(pysql_supports_arrow(), "needs arrow support") @pytest.mark.skip("This test requires a previously uploaded data set") def test_cloud_fetch(self): - # This test can take several minutes to run limits = [100000, 300000] threads = [10, 25] self.arraysize = 100000 - # This test requires a large table with many rows to properly initiate cloud fetch. - # e2-dogfood host > hive_metastore catalog > main schema has such a table called store_sales. - # If this table is deleted or this test is run on a different host, a different table may need to be used. base_query = "SELECT * FROM store_sales WHERE ss_sold_date_sk = 2452234 " for num_limit, num_threads, lz4_compression in itertools.product( limits, threads, [True, False] @@ -177,19 +248,25 @@ def test_cloud_fetch(self): for i in range(len(cf_result)): assert cf_result[i] == noop_result[i] - def test_execute_async(self): - def isExecuting(operation_state): - return not operation_state or operation_state in [ - ttypes.TOperationState.RUNNING_STATE, - ttypes.TOperationState.PENDING_STATE, - ] + +class TestPySQLAsyncQueriesSuite(PySQLPytestTestCase): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + }, + ], + ) + def test_execute_async__long_running(self, extra_params): long_running_query = "SELECT COUNT(*) FROM RANGE(10000 * 16) x JOIN RANGE(10000) y ON FROM_UNIXTIME(x.id * y.id, 'yyyy-MM-dd') LIKE '%not%a%date%'" - with self.cursor() as cursor: + with self.cursor(extra_params) as cursor: cursor.execute_async(long_running_query) ## Polling after every POLLING_INTERVAL seconds - while isExecuting(cursor.get_query_state()): + while cursor.is_query_pending(): time.sleep(self.POLLING_INTERVAL) log.info("Polling the status in test_execute_async") @@ -198,6 +275,75 @@ def isExecuting(operation_state): assert result[0].asDict() == {"count(1)": 0} + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + ], + ) + def test_execute_async__small_result(self, extra_params): + small_result_query = "SELECT 1" + + with self.cursor(extra_params) as cursor: + cursor.execute_async(small_result_query) + + ## Fake sleep for 5 secs + time.sleep(5) + + ## Polling after every POLLING_INTERVAL seconds + while cursor.is_query_pending(): + time.sleep(self.POLLING_INTERVAL) + log.info("Polling the status in test_execute_async") + + cursor.get_async_execution_result() + result = cursor.fetchall() + + assert result[0].asDict() == {"1": 1} + + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + }, + ], + ) + def test_execute_async__large_result(self, extra_params): + x_dimension = 1000 + y_dimension = 1000 + large_result_query = f""" + SELECT + x.id AS x_id, + y.id AS y_id, + FROM_UNIXTIME(x.id * y.id, 'yyyy-MM-dd') AS date + FROM + RANGE({x_dimension}) x + JOIN + RANGE({y_dimension}) y + """ + + with self.cursor(extra_params) as cursor: + cursor.execute_async(large_result_query) + + ## Fake sleep for 5 secs + time.sleep(5) + + ## Polling after every POLLING_INTERVAL seconds + while cursor.is_query_pending(): + time.sleep(self.POLLING_INTERVAL) + log.info("Polling the status in test_execute_async") + + cursor.get_async_execution_result() + result = cursor.fetchall() + + assert len(result) == x_dimension * y_dimension + # Exclude Retry tests because they require specific setups, and LargeQueries too slow for core # tests @@ -210,6 +356,7 @@ class TestPySQLCoreSuite( PySQLStagingIngestionTestSuiteMixin, PySQLRetryTestsMixin, PySQLUCVolumeTestSuiteMixin, + PySQLStreamingPutTestSuiteMixin, ): validate_row_value_type = True validate_result = True @@ -281,8 +428,22 @@ def test_incorrect_query_throws_exception(self): cursor.execute("CREATE TABLE IF NOT EXISTS TABLE table_234234234") assert "table_234234234" in str(cm.value) - def test_create_table_will_return_empty_result_set(self): - with self.cursor({}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_create_table_will_return_empty_result_set(self, extra_params): + with self.cursor(extra_params) as cursor: table_name = "table_{uuid}".format(uuid=str(uuid4()).replace("-", "_")) try: cursor.execute( @@ -480,10 +641,24 @@ def test_get_catalogs(self): ] @skipUnless(pysql_supports_arrow(), "arrow test need arrow support") - def test_get_arrow(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_get_arrow(self, extra_params): # These tests are quite light weight as the arrow fetch methods are used internally # by everything else - with self.cursor({}) as cursor: + with self.cursor(extra_params) as cursor: cursor.execute("SELECT * FROM range(10)") table_1 = cursor.fetchmany_arrow(1).to_pydict() assert table_1 == OrderedDict([("id", [0])]) @@ -491,9 +666,20 @@ def test_get_arrow(self): table_2 = cursor.fetchall_arrow().to_pydict() assert table_2 == OrderedDict([("id", [1, 2, 3, 4, 5, 6, 7, 8, 9])]) - def test_unicode(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + ], + ) + def test_unicode(self, extra_params): unicode_str = "数据砖" - with self.cursor({}) as cursor: + with self.cursor(extra_params) as cursor: cursor.execute("SELECT '{}'".format(unicode_str)) results = cursor.fetchall() assert len(results) == 1 and len(results[0]) == 1 @@ -531,8 +717,22 @@ def execute_really_long_query(): assert len(cursor.fetchall()) == 3 @skipIf(pysql_has_version("<", "2"), "requires pysql v2") - def test_can_execute_command_after_failure(self): - with self.cursor({}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_can_execute_command_after_failure(self, extra_params): + with self.cursor(extra_params) as cursor: with pytest.raises(DatabaseError): cursor.execute("this is a sytnax error") @@ -542,8 +742,22 @@ def test_can_execute_command_after_failure(self): self.assertEqualRowValues(res, [[1]]) @skipIf(pysql_has_version("<", "2"), "requires pysql v2") - def test_can_execute_command_after_success(self): - with self.cursor({}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_can_execute_command_after_success(self, extra_params): + with self.cursor(extra_params) as cursor: cursor.execute("SELECT 1;") cursor.execute("SELECT 2;") @@ -555,8 +769,22 @@ def generate_multi_row_query(self): return query @skipIf(pysql_has_version("<", "2"), "requires pysql v2") - def test_fetchone(self): - with self.cursor({}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_fetchone(self, extra_params): + with self.cursor(extra_params) as cursor: query = self.generate_multi_row_query() cursor.execute(query) @@ -567,8 +795,19 @@ def test_fetchone(self): assert cursor.fetchone() == None @skipIf(pysql_has_version("<", "2"), "requires pysql v2") - def test_fetchall(self): - with self.cursor({}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + ], + ) + def test_fetchall(self, extra_params): + with self.cursor(extra_params) as cursor: query = self.generate_multi_row_query() cursor.execute(query) @@ -577,8 +816,22 @@ def test_fetchall(self): assert cursor.fetchone() == None @skipIf(pysql_has_version("<", "2"), "requires pysql v2") - def test_fetchmany_when_stride_fits(self): - with self.cursor({}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_fetchmany_when_stride_fits(self, extra_params): + with self.cursor(extra_params) as cursor: query = "SELECT * FROM range(4)" cursor.execute(query) @@ -586,8 +839,22 @@ def test_fetchmany_when_stride_fits(self): self.assertEqualRowValues(cursor.fetchmany(2), [[2], [3]]) @skipIf(pysql_has_version("<", "2"), "requires pysql v2") - def test_fetchmany_in_excess(self): - with self.cursor({}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_fetchmany_in_excess(self, extra_params): + with self.cursor(extra_params) as cursor: query = "SELECT * FROM range(4)" cursor.execute(query) @@ -595,8 +862,22 @@ def test_fetchmany_in_excess(self): self.assertEqualRowValues(cursor.fetchmany(3), [[3]]) @skipIf(pysql_has_version("<", "2"), "requires pysql v2") - def test_iterator_api(self): - with self.cursor({}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_iterator_api(self, extra_params): + with self.cursor(extra_params) as cursor: query = "SELECT * FROM range(4)" cursor.execute(query) @@ -669,8 +950,24 @@ def test_timestamps_arrow(self): ), "timestamp {} did not match {}".format(timestamp, expected) @skipUnless(pysql_supports_arrow(), "arrow test needs arrow support") - def test_multi_timestamps_arrow(self): - with self.cursor({"session_configuration": {"ansi_mode": False}}) as cursor: + @pytest.mark.parametrize( + "extra_params", + [ + {}, + { + "use_sea": True, + "use_cloud_fetch": False, + "enable_query_result_lz4_compression": False, + }, + { + "use_sea": True, + }, + ], + ) + def test_multi_timestamps_arrow(self, extra_params): + with self.cursor( + {"session_configuration": {"ansi_mode": False, "query_tags": "test:multi-timestamps,driver:python"}, **extra_params} + ) as cursor: query, expected = self.multi_query() expected = [ [self.maybe_add_timezone_to_timestamp(ts) for ts in row] @@ -755,47 +1052,66 @@ def test_decimal_not_returned_as_strings_arrow(self): decimal_type = arrow_df.field(0).type assert pyarrow.types.is_decimal(decimal_type) - def test_close_connection_closes_cursors(self): - - from databricks.sql.thrift_api.TCLIService import ttypes + @skipUnless(pysql_supports_arrow(), "arrow test needs arrow support") + def test_catalogs_returns_arrow_table(self): + with self.cursor() as cursor: + cursor.catalogs() + results = cursor.fetchall_arrow() + assert isinstance(results, pyarrow.Table) + + def test_row_limit_with_larger_result(self): + """Test that row_limit properly constrains results when query would return more rows""" + row_limit = 1000 + with self.cursor(extra_cursor_params={"row_limit": row_limit}) as cursor: + # Execute a query that returns more than row_limit rows + cursor.execute("SELECT * FROM range(2000)") + rows = cursor.fetchall() - with self.connection() as conn: - cursor = conn.cursor() - cursor.execute( - "SELECT id, id `id2`, id `id3` FROM RANGE(1000000) order by RANDOM()" - ) - ars = cursor.active_result_set + # Check if the number of rows is limited to row_limit + assert len(rows) == row_limit, f"Expected {row_limit} rows, got {len(rows)}" - # We must manually run this check because thrift_backend always forces `has_been_closed_server_side` to True + def test_row_limit_with_smaller_result(self): + """Test that row_limit doesn't affect results when query returns fewer rows than limit""" + row_limit = 100 + expected_rows = 50 + with self.cursor(extra_cursor_params={"row_limit": row_limit}) as cursor: + # Execute a query that returns fewer than row_limit rows + cursor.execute(f"SELECT * FROM range({expected_rows})") + rows = cursor.fetchall() - # Cursor op state should be open before connection is closed - status_request = ttypes.TGetOperationStatusReq( - operationHandle=ars.command_id, getProgressUpdate=False - ) - op_status_at_server = ars.thrift_backend._client.GetOperationStatus( - status_request - ) + # Check if all rows are returned (not limited by row_limit) assert ( - op_status_at_server.operationState - != ttypes.TOperationState.CLOSED_STATE - ) + len(rows) == expected_rows + ), f"Expected {expected_rows} rows, got {len(rows)}" - conn.close() - - # When connection closes, any cursor operations should no longer exist at the server - with pytest.raises(SessionAlreadyClosedError) as cm: - op_status_at_server = ars.thrift_backend._client.GetOperationStatus( - status_request - ) - - def test_closing_a_closed_connection_doesnt_fail(self, caplog): - caplog.set_level(logging.DEBUG) - # Second .close() call is when this context manager exits - with self.connection() as conn: - # First .close() call is explicit here - conn.close() + @skipUnless(pysql_supports_arrow(), "arrow test needs arrow support") + def test_row_limit_with_arrow_larger_result(self): + """Test that row_limit properly constrains arrow results when query would return more rows""" + row_limit = 800 + with self.cursor(extra_cursor_params={"row_limit": row_limit}) as cursor: + # Execute a query that returns more than row_limit rows + cursor.execute("SELECT * FROM range(1500)") + arrow_table = cursor.fetchall_arrow() + + # Check if the number of rows in the arrow table is limited to row_limit + assert ( + arrow_table.num_rows == row_limit + ), f"Expected {row_limit} rows, got {arrow_table.num_rows}" - assert "Session appears to have been closed already" in caplog.text + @skipUnless(pysql_supports_arrow(), "arrow test needs arrow support") + def test_row_limit_with_arrow_smaller_result(self): + """Test that row_limit doesn't affect arrow results when query returns fewer rows than limit""" + row_limit = 200 + expected_rows = 100 + with self.cursor(extra_cursor_params={"row_limit": row_limit}) as cursor: + # Execute a query that returns fewer than row_limit rows + cursor.execute(f"SELECT * FROM range({expected_rows})") + arrow_table = cursor.fetchall_arrow() + + # Check if all rows are returned (not limited by row_limit) + assert ( + arrow_table.num_rows == expected_rows + ), f"Expected {expected_rows} rows, got {arrow_table.num_rows}" # use a RetrySuite to encapsulate these tests which we'll typically want to run together; however keep diff --git a/tests/e2e/test_parameterized_queries.py b/tests/e2e/test_parameterized_queries.py index d346ad5c6..7370eea93 100644 --- a/tests/e2e/test_parameterized_queries.py +++ b/tests/e2e/test_parameterized_queries.py @@ -4,9 +4,13 @@ from enum import Enum from typing import Dict, List, Type, Union from unittest.mock import patch +from uuid import uuid4 +import time +import numpy as np import pytest import pytz +from numpy.random.mtrand import Sequence from databricks.sql.parameters.native import ( BigIntegerParameter, @@ -26,6 +30,8 @@ TimestampParameter, TinyIntParameter, VoidParameter, + ArrayParameter, + MapParameter, ) from tests.e2e.test_driver import PySQLPytestTestCase @@ -50,6 +56,8 @@ class Primitive(Enum): DOUBLE = 3.14 FLOAT = 3.15 SMALLINT = 51 + ARRAYS = ["a", "b", "c"] + MAPS = {"a": 1, "b": 2, "c": 3} class PrimitiveExtra(Enum): @@ -103,27 +111,18 @@ class TestParameterizedQueries(PySQLPytestTestCase): Primitive.BOOL: "boolean_col", Primitive.DATE: "date_col", Primitive.TIMESTAMP: "timestamp_col", + Primitive.ARRAYS: "array_col", + Primitive.MAPS: "map_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, connection_details): - self.arguments = connection_details.copy() - """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 ( + def _create_inline_table(self, table_name): + """Create the inline test table with all necessary columns""" + query = f""" + CREATE TABLE IF NOT EXISTS {table_name} ( null_col INT, int_col INT, bigint_col BIGINT, @@ -134,7 +133,11 @@ def inline_table(self, connection_details): string_col STRING, boolean_col BOOLEAN, date_col DATE, - timestamp_col TIMESTAMP + timestamp_col TIMESTAMP, + array_col ARRAY, + map_col MAP, + array_map_col ARRAY>, + map_array_col MAP> ) USING DELTA """ @@ -142,6 +145,24 @@ def inline_table(self, connection_details): with conn.cursor() as cursor: cursor.execute(query) + @pytest.fixture(scope="class") + def inline_table(self, connection_details): + self.arguments = connection_details.copy() + """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. + """ + + # Generate unique table name to avoid conflicts in parallel execution + table_name = f"pysql_e2e_inline_param_test_table_{str(uuid4()).replace('-', '_')}" + self.inline_table_name = table_name + self._create_inline_table(table_name) + @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.""" @@ -155,7 +176,7 @@ def patch_server_supports_native_params(self, supports_native_params: bool = Tru finally: pass - def _inline_roundtrip(self, params: dict, paramstyle: ParamStyle): + def _inline_roundtrip(self, params: dict, paramstyle: ParamStyle, target_column): """This INSERT, SELECT, DELETE dance is necessary because simply selecting ``` "SELECT %(param)s" @@ -166,18 +187,25 @@ def _inline_roundtrip(self, params: dict, paramstyle: ParamStyle): :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" + if not hasattr(self, 'inline_table_name'): + table_name = f"pysql_e2e_inline_param_test_table_{str(uuid4()).replace('-', '_')}" + self.inline_table_name = table_name + self._create_inline_table(table_name) + + table_name = self.inline_table_name + INSERT_QUERY = f"INSERT INTO {table_name} (`{target_column}`) VALUES (%(p)s)" + SELECT_QUERY = f"SELECT {target_column} `col` FROM {table_name} LIMIT 1" + DELETE_QUERY = f"DELETE FROM {table_name}" 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) + try: + with conn.cursor() as cursor: + cursor.execute(INSERT_QUERY, parameters=params) + with conn.cursor() as cursor: + to_return = cursor.execute(SELECT_QUERY).fetchone() + finally: + with conn.cursor() as cursor: + cursor.execute(DELETE_QUERY) return to_return @@ -212,7 +240,11 @@ def _get_one_result( 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) + return self._inline_roundtrip( + params, + paramstyle=ParamStyle.PYFORMAT, + target_column=self._get_inline_table_column(params.get("p")), + ) elif approach == ParameterApproach.NATIVE: # native mode can use either ParamStyle.NAMED or ParamStyle.PYFORMAT # native mode can use either ParameterStructure.NAMED or ParameterStructure.POSITIONAL @@ -229,10 +261,73 @@ def _eq(self, actual, expected: Primitive): If primitive is Primitive.DOUBLE than an extra quantize step is performed before making the assertion. """ + actual_parsed = actual + expected_parsed = expected.value + if expected in (Primitive.DOUBLE, Primitive.FLOAT): - return self._quantize(actual) == self._quantize(expected.value) + actual_parsed = self._quantize(actual) + expected_parsed = self._quantize(expected.value) + elif expected == Primitive.ARRAYS: + actual_parsed = actual.tolist() + elif expected == Primitive.MAPS: + expected_parsed = list(expected.value.items()) + + return actual_parsed == expected_parsed + + def _parse_to_common_type(self, value): + """ + Function to convert the :value passed into a common python datatype for comparison + + Convertion fyi + MAP Datatype on server is returned as a list of tuples + Ex: + {"a":1,"b":2} -> [("a",1),("b",2)] + + ARRAY Datatype on server is returned as a numpy array + Ex: + ["a","b","c"] -> np.array(["a","b","c"],dtype=object) - return actual == expected.value + Primitive datatype on server is returned as a numpy primitive + Ex: + 1 -> np.int64(1) + 2 -> np.int32(2) + """ + if value is None: + return None + elif isinstance(value, (Sequence, np.ndarray)) and not isinstance( + value, (str, bytes) + ): + return tuple(value) + elif isinstance(value, dict): + return tuple(value.items()) + elif isinstance(value, np.generic): + return value.item() + else: + return value + + def _recursive_compare(self, actual, expected): + """ + Function to compare the :actual and :expected values, recursively checks and ensures that all the data matches till the leaf level + + Note: Complex datatype like MAP is not returned as a dictionary but as a list of tuples + """ + actual_parsed = self._parse_to_common_type(actual) + expected_parsed = self._parse_to_common_type(expected) + + # Check if types are the same + if type(actual_parsed) != type(expected_parsed): + return False + + # Handle lists or tuples + if isinstance(actual_parsed, (list, tuple)): + if len(actual_parsed) != len(expected_parsed): + return False + return all( + self._recursive_compare(o1, o2) + for o1, o2 in zip(actual_parsed, expected_parsed) + ) + + return actual_parsed == expected_parsed @pytest.mark.parametrize("primitive", Primitive) @pytest.mark.parametrize( @@ -278,6 +373,8 @@ def test_primitive_single( (Primitive.SMALLINT, SmallIntParameter), (PrimitiveExtra.TIMESTAMP_NTZ, TimestampNTZParameter), (PrimitiveExtra.TINYINT, TinyIntParameter), + (Primitive.ARRAYS, ArrayParameter), + (Primitive.MAPS, MapParameter), ], ) def test_dbsqlparameter_single( @@ -361,6 +458,58 @@ def test_readme_example(self): assert len(result) == 10 assert result[0].p == "foo" + @pytest.mark.parametrize( + "col_name,data", + [ + ("array_map_col", [{"a": 1, "b": 2}, {"c": 3, "d": 4}]), + ("map_array_col", {1: ["a", "b"], 2: ["c", "d"]}), + ], + ) + def test_inline_recursive_complex_type(self, col_name, data): + params = {"p": data} + result = self._inline_roundtrip( + params=params, paramstyle=ParamStyle.PYFORMAT, target_column=col_name + ) + assert self._recursive_compare(result.col, data) + + @pytest.mark.parametrize( + "description,data", + [ + ("ARRAY>", [{"a": 1, "b": 2}, {"c": 3, "d": 4}]), + ("MAP>", {1: ["a", "b"], 2: ["c", "d"]}), + ("ARRAY>", [[1, 2, 3], [1, 2, 3]]), + ( + "ARRAY>>", + [[[1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3]]], + ), + ( + "MAP>", + {"a": {"b": "c", "d": "e"}, "f": {"g": "h", "i": "j"}}, + ), + ], + ) + @pytest.mark.parametrize( + "paramstyle,parameter_structure", + [ + (ParamStyle.NONE, ParameterStructure.POSITIONAL), + (ParamStyle.PYFORMAT, ParameterStructure.NAMED), + (ParamStyle.NAMED, ParameterStructure.NAMED), + ], + ) + def test_native_recursive_complex_type( + self, description, data, paramstyle, parameter_structure + ): + if paramstyle == ParamStyle.NONE: + params = [data] + else: + params = {"p": data} + result = self._native_roundtrip( + parameters=params, + paramstyle=paramstyle, + parameter_structure=parameter_structure, + ) + assert self._recursive_compare(result.col, data) + class TestInlineParameterSyntax(PySQLPytestTestCase): """The inline parameter approach uses pyformat markers""" diff --git a/tests/e2e/test_telemetry_e2e.py b/tests/e2e/test_telemetry_e2e.py new file mode 100644 index 000000000..83c2dbf81 --- /dev/null +++ b/tests/e2e/test_telemetry_e2e.py @@ -0,0 +1,376 @@ +""" +E2E test for telemetry - verifies telemetry behavior with different scenarios +""" +import time +import threading +import logging +from contextlib import contextmanager +from unittest.mock import patch +import pytest +from concurrent.futures import wait + +import databricks.sql as sql +from databricks.sql.telemetry.telemetry_client import ( + TelemetryClient, + TelemetryClientFactory, +) + +log = logging.getLogger(__name__) + + +class TelemetryTestBase: + """Simplified test base class for telemetry e2e tests""" + + @pytest.fixture(autouse=True) + def get_details(self, connection_details): + self.arguments = connection_details.copy() + + def connection_params(self): + return { + "server_hostname": self.arguments["host"], + "http_path": self.arguments["http_path"], + "access_token": self.arguments.get("access_token"), + } + + @contextmanager + def connection(self, extra_params=()): + connection_params = dict(self.connection_params(), **dict(extra_params)) + log.info("Connecting with args: {}".format(connection_params)) + conn = sql.connect(**connection_params) + try: + yield conn + finally: + conn.close() + + +@pytest.mark.serial +@pytest.mark.xdist_group(name="serial_telemetry") +class TestTelemetryE2E(TelemetryTestBase): + """E2E tests for telemetry scenarios - must run serially due to shared host-level telemetry client""" + + @pytest.fixture(autouse=True) + def telemetry_setup_teardown(self): + """Clean up telemetry client state before and after each test""" + # Clean up BEFORE test starts + # Use wait=True to ensure all pending telemetry from previous tests completes + if TelemetryClientFactory._executor: + TelemetryClientFactory._executor.shutdown(wait=True) # WAIT for pending telemetry + TelemetryClientFactory._executor = None + TelemetryClientFactory._stop_flush_thread() + TelemetryClientFactory._flush_event.clear() # Clear the event flag + TelemetryClientFactory._clients.clear() + TelemetryClientFactory._initialized = False + + # Clear feature flags cache before test starts + from databricks.sql.common.feature_flag import FeatureFlagsContextFactory + with FeatureFlagsContextFactory._lock: + FeatureFlagsContextFactory._context_map.clear() + if FeatureFlagsContextFactory._executor: + FeatureFlagsContextFactory._executor.shutdown(wait=False) + FeatureFlagsContextFactory._executor = None + + try: + yield + finally: + # Clean up AFTER test ends + # Use wait=True to ensure this test's telemetry completes + if TelemetryClientFactory._executor: + TelemetryClientFactory._executor.shutdown(wait=True) # WAIT for this test's telemetry + TelemetryClientFactory._executor = None + TelemetryClientFactory._stop_flush_thread() + TelemetryClientFactory._flush_event.clear() # Clear the event flag + TelemetryClientFactory._clients.clear() + TelemetryClientFactory._initialized = False + + # Clear feature flags cache after test ends + with FeatureFlagsContextFactory._lock: + FeatureFlagsContextFactory._context_map.clear() + if FeatureFlagsContextFactory._executor: + FeatureFlagsContextFactory._executor.shutdown(wait=False) + FeatureFlagsContextFactory._executor = None + + @pytest.fixture + def telemetry_interceptors(self): + """Setup reusable telemetry interceptors as a fixture""" + capture_lock = threading.Lock() + captured_events = [] + captured_futures = [] + + original_export = TelemetryClient._export_event + original_callback = TelemetryClient._telemetry_request_callback + + def export_wrapper(self_client, event): + with capture_lock: + captured_events.append(event) + return original_export(self_client, event) + + def callback_wrapper(self_client, future, sent_count): + with capture_lock: + captured_futures.append(future) + original_callback(self_client, future, sent_count) + + return captured_events, captured_futures, export_wrapper, callback_wrapper + + # ==================== ASSERTION HELPERS ==================== + + def assert_system_config(self, event): + """Assert system configuration fields""" + sys_config = event.entry.sql_driver_log.system_configuration + assert sys_config is not None + + # Check all required fields are non-empty + for field in ['driver_name', 'driver_version', 'os_name', 'os_version', + 'os_arch', 'runtime_name', 'runtime_version', 'runtime_vendor', + 'locale_name', 'char_set_encoding']: + value = getattr(sys_config, field) + assert value and len(value) > 0, f"{field} should not be None or empty" + + assert sys_config.driver_name == "Databricks SQL Python Connector" + + def assert_connection_params(self, event, expected_http_path=None): + """Assert connection parameters""" + conn_params = event.entry.sql_driver_log.driver_connection_params + assert conn_params is not None + assert conn_params.http_path + assert conn_params.host_info is not None + assert conn_params.auth_mech is not None + + if expected_http_path: + assert conn_params.http_path == expected_http_path + + if conn_params.socket_timeout is not None: + assert conn_params.socket_timeout > 0 + + def assert_statement_execution(self, event): + """Assert statement execution details""" + sql_op = event.entry.sql_driver_log.sql_operation + assert sql_op is not None + assert sql_op.statement_type is not None + assert sql_op.execution_result is not None + assert hasattr(sql_op, "retry_count") + + if sql_op.retry_count is not None: + assert sql_op.retry_count >= 0 + + latency = event.entry.sql_driver_log.operation_latency_ms + assert latency is not None and latency >= 0 + + def assert_error_info(self, event, expected_error_name=None): + """Assert error information""" + error_info = event.entry.sql_driver_log.error_info + assert error_info is not None + assert error_info.error_name and len(error_info.error_name) > 0 + assert error_info.stack_trace and len(error_info.stack_trace) > 0 + + if expected_error_name: + assert error_info.error_name == expected_error_name + + def verify_events(self, captured_events, captured_futures, expected_count): + """Common verification for event count and HTTP responses""" + if expected_count == 0: + assert len(captured_events) == 0, f"Expected 0 events, got {len(captured_events)}" + assert len(captured_futures) == 0, f"Expected 0 responses, got {len(captured_futures)}" + else: + assert len(captured_events) == expected_count, \ + f"Expected {expected_count} events, got {len(captured_events)}" + + time.sleep(2) + done, _ = wait(captured_futures, timeout=10) + assert len(done) == expected_count, \ + f"Expected {expected_count} responses, got {len(done)}" + + for future in done: + response = future.result() + assert 200 <= response.status < 300 + + # Assert common fields for all events + for event in captured_events: + self.assert_system_config(event) + self.assert_connection_params(event, self.arguments["http_path"]) + + # ==================== PARAMETERIZED TESTS ==================== + + @pytest.mark.parametrize("enable_telemetry,force_enable,expected_count,test_id", [ + (True, False, 2, "enable_on_force_off"), + (False, True, 2, "enable_off_force_on"), + (False, False, 0, "both_off"), + (None, None, 2, "default_behavior"), + ]) + def test_telemetry_flags(self, telemetry_interceptors, enable_telemetry, + force_enable, expected_count, test_id): + """Test telemetry behavior with different flag combinations""" + captured_events, captured_futures, export_wrapper, callback_wrapper = \ + telemetry_interceptors + + with patch.object(TelemetryClient, "_export_event", export_wrapper), \ + patch.object(TelemetryClient, "_telemetry_request_callback", callback_wrapper): + + extra_params = {"telemetry_batch_size": 1} + if enable_telemetry is not None: + extra_params["enable_telemetry"] = enable_telemetry + if force_enable is not None: + extra_params["force_enable_telemetry"] = force_enable + + with self.connection(extra_params=extra_params) as conn: + with conn.cursor() as cursor: + cursor.execute("SELECT 1") + cursor.fetchone() + + # Give time for async telemetry submission after connection closes + time.sleep(0.5) + self.verify_events(captured_events, captured_futures, expected_count) + + # Assert statement execution on latency event (if events exist) + if expected_count > 0: + self.assert_statement_execution(captured_events[-1]) + + @pytest.mark.parametrize("query,expected_error", [ + ("SELECT * FROM WHERE INVALID SYNTAX 12345", "ServerOperationError"), + ("SELECT * FROM non_existent_table_xyz_12345", None), + ]) + def test_sql_errors(self, telemetry_interceptors, query, expected_error): + """Test telemetry captures error information for different SQL errors""" + captured_events, captured_futures, export_wrapper, callback_wrapper = \ + telemetry_interceptors + + with patch.object(TelemetryClient, "_export_event", export_wrapper), \ + patch.object(TelemetryClient, "_telemetry_request_callback", callback_wrapper): + + with self.connection(extra_params={ + "force_enable_telemetry": True, + "telemetry_batch_size": 1, + }) as conn: + with conn.cursor() as cursor: + with pytest.raises(Exception): + cursor.execute(query) + cursor.fetchone() + + time.sleep(2) + wait(captured_futures, timeout=10) + + assert len(captured_events) >= 1 + + # Find event with error_info + error_event = next((e for e in captured_events + if e.entry.sql_driver_log.error_info), None) + assert error_event is not None + + self.assert_system_config(error_event) + self.assert_connection_params(error_event, self.arguments["http_path"]) + self.assert_error_info(error_event, expected_error) + + def test_metadata_operation(self, telemetry_interceptors): + """Test telemetry for metadata operations (getCatalogs)""" + captured_events, captured_futures, export_wrapper, callback_wrapper = \ + telemetry_interceptors + + with patch.object(TelemetryClient, "_export_event", export_wrapper), \ + patch.object(TelemetryClient, "_telemetry_request_callback", callback_wrapper): + + with self.connection(extra_params={ + "force_enable_telemetry": True, + "telemetry_batch_size": 1, + }) as conn: + with conn.cursor() as cursor: + catalogs = cursor.catalogs() + catalogs.fetchall() + + time.sleep(2) + wait(captured_futures, timeout=10) + + assert len(captured_events) >= 1 + for event in captured_events: + self.assert_system_config(event) + self.assert_connection_params(event, self.arguments["http_path"]) + + def test_direct_results(self, telemetry_interceptors): + """Test telemetry with direct results (use_cloud_fetch=False)""" + captured_events, captured_futures, export_wrapper, callback_wrapper = \ + telemetry_interceptors + + with patch.object(TelemetryClient, "_export_event", export_wrapper), \ + patch.object(TelemetryClient, "_telemetry_request_callback", callback_wrapper): + + with self.connection(extra_params={ + "force_enable_telemetry": True, + "telemetry_batch_size": 1, + "use_cloud_fetch": False, + }) as conn: + with conn.cursor() as cursor: + cursor.execute("SELECT 100") + result = cursor.fetchall() + assert len(result) == 1 and result[0][0] == 100 + + time.sleep(2) + wait(captured_futures, timeout=10) + + assert len(captured_events) >= 2 + for event in captured_events: + self.assert_system_config(event) + self.assert_connection_params(event, self.arguments["http_path"]) + + self.assert_statement_execution(captured_events[-1]) + + @pytest.mark.parametrize("close_type", [ + "context_manager", + "explicit_cursor", + "explicit_connection", + "implicit_fetchall", + ]) + def test_cloudfetch_with_different_close_patterns(self, telemetry_interceptors, + close_type): + """Test telemetry with cloud fetch using different resource closing patterns""" + captured_events, captured_futures, export_wrapper, callback_wrapper = \ + telemetry_interceptors + + with patch.object(TelemetryClient, "_export_event", export_wrapper), \ + patch.object(TelemetryClient, "_telemetry_request_callback", callback_wrapper): + + if close_type == "explicit_connection": + # Test explicit connection close + conn = sql.connect( + **self.connection_params(), + force_enable_telemetry=True, + telemetry_batch_size=1, + use_cloud_fetch=True, + ) + cursor = conn.cursor() + cursor.execute("SELECT * FROM range(1000)") + result = cursor.fetchall() + assert len(result) == 1000 + conn.close() + else: + # Other patterns use connection context manager + with self.connection(extra_params={ + "force_enable_telemetry": True, + "telemetry_batch_size": 1, + "use_cloud_fetch": True, + }) as conn: + if close_type == "context_manager": + with conn.cursor() as cursor: + cursor.execute("SELECT * FROM range(1000)") + result = cursor.fetchall() + assert len(result) == 1000 + + elif close_type == "explicit_cursor": + cursor = conn.cursor() + cursor.execute("SELECT * FROM range(1000)") + result = cursor.fetchall() + assert len(result) == 1000 + cursor.close() + + elif close_type == "implicit_fetchall": + cursor = conn.cursor() + cursor.execute("SELECT * FROM range(1000)") + result = cursor.fetchall() + assert len(result) == 1000 + + time.sleep(2) + wait(captured_futures, timeout=10) + + assert len(captured_events) >= 2 + for event in captured_events: + self.assert_system_config(event) + self.assert_connection_params(event, self.arguments["http_path"]) + + self.assert_statement_execution(captured_events[-1]) diff --git a/tests/e2e/test_transactions.py b/tests/e2e/test_transactions.py new file mode 100644 index 000000000..4fb7918b9 --- /dev/null +++ b/tests/e2e/test_transactions.py @@ -0,0 +1,772 @@ +""" +End-to-end integration tests for Multi-Statement Transaction (MST) APIs. + +Tests driver behavior for MST across: +- Basic correctness (commit/rollback/isolation/multi-table) +- API-specific (autocommit, isolation level, error handling) +- Metadata RPCs inside transactions (non-transactional freshness) +- SQL statements blocked by MSTCheckRule (SHOW, DESCRIBE, information_schema) +- Execute variants (executemany) + +Parallelisation: +- Each test uses its own unique table (derived from test name) to allow + parallel execution with pytest-xdist. +- Tests requiring multiple concurrent connections to the same table are + tagged with xdist_group so the concurrent connections within a single + test don't conflict with other tests on different workers. + +Requirements: +- DBSQL warehouse that supports Multi-Statement Transactions (MST) +- Env vars: DATABRICKS_SERVER_HOSTNAME, DATABRICKS_HTTP_PATH, + DATABRICKS_TOKEN, DATABRICKS_CATALOG, DATABRICKS_SCHEMA +""" + +import logging +import os +import re +import uuid + +import pytest + +import databricks.sql as sql + +logger = logging.getLogger(__name__) + + +def _unique_table_name(request): + """Derive a unique Delta table name from the test node id.""" + node_id = request.node.name + sanitized = re.sub(r"[^a-z0-9_]", "_", node_id.lower()) + return f"mst_pysql_{sanitized}"[:80] + + +def _unique_table_name_raw(suffix): + """Non-fixture unique table name helper for extra tables within a test.""" + return f"mst_pysql_{suffix}_{uuid.uuid4().hex[:8]}" + + +@pytest.fixture +def mst_conn_params(connection_details): + """Connection parameters with MST enabled.""" + return { + "server_hostname": connection_details["host"], + "http_path": connection_details["http_path"], + "access_token": connection_details.get("access_token"), + "ignore_transactions": False, + } + + +@pytest.fixture +def mst_catalog(connection_details): + return connection_details.get("catalog") or os.getenv("DATABRICKS_CATALOG") or "main" + + +@pytest.fixture +def mst_schema(connection_details): + return connection_details.get("schema") or os.getenv("DATABRICKS_SCHEMA") or "default" + + +@pytest.fixture +def mst_table(request, mst_conn_params, mst_catalog, mst_schema): + """Create a fresh Delta table for the test and drop it afterwards. + + Yields (fq_table_name, table_name). The table is unique per test so tests + can run in parallel without stepping on each other. + """ + table_name = _unique_table_name(request) + fq_table = f"{mst_catalog}.{mst_schema}.{table_name}" + + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"DROP TABLE IF EXISTS {fq_table}") + cursor.execute( + f"CREATE TABLE {fq_table} (id INT, value STRING) USING DELTA " + f"TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported')" + ) + + yield fq_table, table_name + + try: + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"DROP TABLE IF EXISTS {fq_table}") + except Exception as e: + logger.warning(f"Failed to drop {fq_table}: {e}") + + +def _get_row_count(mst_conn_params, fq_table): + """Count rows from a fresh connection (avoids in-txn caching).""" + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"SELECT COUNT(*) FROM {fq_table}") + return cursor.fetchone()[0] + + +def _get_ids(mst_conn_params, fq_table): + """Return the set of ids from a fresh connection.""" + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"SELECT id FROM {fq_table}") + return {row[0] for row in cursor.fetchall()} + + +# ==================== A. BASIC CORRECTNESS ==================== + + +class TestMstCorrectness: + """Core MST correctness: commit, rollback, isolation, multi-table.""" + + def test_commit_single_insert(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'committed')") + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table) == 1 + + def test_commit_multiple_inserts(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'a')") + cursor.execute(f"INSERT INTO {fq_table} VALUES (2, 'b')") + cursor.execute(f"INSERT INTO {fq_table} VALUES (3, 'c')") + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table) == 3 + + def test_rollback_single_insert(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'rolled_back')") + conn.rollback() + + assert _get_row_count(mst_conn_params, fq_table) == 0 + + def test_sequential_transactions(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'txn1')") + conn.commit() + + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (2, 'txn2')") + conn.rollback() + + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (3, 'txn3')") + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table) == 2 + + def test_auto_start_after_commit(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'txn1')") + conn.commit() + + # Second INSERT auto-starts a new transaction + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (2, 'txn2')") + conn.rollback() + + assert _get_ids(mst_conn_params, fq_table) == {1} + + def test_auto_start_after_rollback(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'txn1')") + conn.rollback() + + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (2, 'txn2')") + conn.commit() + + assert _get_ids(mst_conn_params, fq_table) == {2} + + def test_update_in_transaction(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'original')") + + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"UPDATE {fq_table} SET value = 'updated' WHERE id = 1") + conn.commit() + + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"SELECT value FROM {fq_table} WHERE id = 1") + assert cursor.fetchone()[0] == "updated" + + def test_delete_in_transaction(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'a')") + cursor.execute(f"INSERT INTO {fq_table} VALUES (2, 'b')") + + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"DELETE FROM {fq_table} WHERE id = 1") + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table) == 1 + + def test_multi_table_commit(self, mst_conn_params, mst_table, mst_catalog, mst_schema): + fq_table1, _ = mst_table + fq_table2 = f"{mst_catalog}.{mst_schema}.{_unique_table_name_raw('multi_commit_t2')}" + + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2}") + cursor.execute( + f"CREATE TABLE {fq_table2} (id INT, value STRING) USING DELTA " + f"TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported')" + ) + try: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table1} VALUES (1, 't1')") + cursor.execute(f"INSERT INTO {fq_table2} VALUES (1, 't2')") + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table1) == 1 + assert _get_row_count(mst_conn_params, fq_table2) == 1 + finally: + conn.autocommit = True + with conn.cursor() as cursor: + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2}") + + def test_multi_table_rollback(self, mst_conn_params, mst_table, mst_catalog, mst_schema): + fq_table1, _ = mst_table + fq_table2 = f"{mst_catalog}.{mst_schema}.{_unique_table_name_raw('multi_rb_t2')}" + + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2}") + cursor.execute( + f"CREATE TABLE {fq_table2} (id INT, value STRING) USING DELTA " + f"TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported')" + ) + try: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table1} VALUES (1, 't1')") + cursor.execute(f"INSERT INTO {fq_table2} VALUES (1, 't2')") + conn.rollback() + + assert _get_row_count(mst_conn_params, fq_table1) == 0 + assert _get_row_count(mst_conn_params, fq_table2) == 0 + finally: + conn.autocommit = True + with conn.cursor() as cursor: + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2}") + + def test_multi_table_atomicity(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'should_rollback')") + with pytest.raises(Exception): + cursor.execute( + "INSERT INTO nonexistent_table_xyz_xyz VALUES (1, 'fail')" + ) + conn.rollback() + + assert _get_row_count(mst_conn_params, fq_table) == 0 + + @pytest.mark.xdist_group(name="mst_repeatable_reads") + def test_repeatable_reads(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'initial')") + + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"SELECT value FROM {fq_table} WHERE id = 1") + first_read = cursor.fetchone()[0] + + # External connection modifies data + with sql.connect(**mst_conn_params) as ext_conn: + with ext_conn.cursor() as ext_cursor: + ext_cursor.execute( + f"UPDATE {fq_table} SET value = 'modified' WHERE id = 1" + ) + + # Re-read in same txn — should see original value + with conn.cursor() as cursor: + cursor.execute(f"SELECT value FROM {fq_table} WHERE id = 1") + second_read = cursor.fetchone()[0] + + assert first_read == second_read, "Repeatable read: value should not change" + conn.rollback() + + @pytest.mark.xdist_group(name="mst_write_conflict") + def test_write_conflict_single_table(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as setup_conn: + with setup_conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'initial')") + + conn1 = sql.connect(**mst_conn_params) + conn2 = sql.connect(**mst_conn_params) + try: + conn1.autocommit = False + conn2.autocommit = False + + with conn1.cursor() as c1: + c1.execute(f"UPDATE {fq_table} SET value = 'conn1' WHERE id = 1") + with conn2.cursor() as c2: + c2.execute(f"UPDATE {fq_table} SET value = 'conn2' WHERE id = 1") + + conn1.commit() + with pytest.raises(Exception): + conn2.commit() + finally: + try: + conn1.close() + except Exception: + pass + try: + conn2.close() + except Exception: + pass + + def test_read_only_transaction(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'existing')") + + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"SELECT COUNT(*) FROM {fq_table}") + assert cursor.fetchone()[0] == 1 + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table) == 1 + + def test_rollback_after_query_failure(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'before_error')") + with pytest.raises(Exception): + cursor.execute("SELECT * FROM nonexistent_xyz_xyz") + conn.rollback() + + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (2, 'after_recovery')") + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table) == 1 + + def test_multiple_cursors_in_txn(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as c1: + c1.execute(f"INSERT INTO {fq_table} VALUES (1, 'c1')") + with conn.cursor() as c2: + c2.execute(f"INSERT INTO {fq_table} VALUES (2, 'c2')") + with conn.cursor() as c3: + c3.execute(f"INSERT INTO {fq_table} VALUES (3, 'c3')") + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table) == 3 + + def test_parameterized_insert(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute( + f"INSERT INTO {fq_table} VALUES (%(id)s, %(value)s)", + {"id": 1, "value": "parameterized"}, + ) + conn.commit() + + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"SELECT value FROM {fq_table} WHERE id = 1") + assert cursor.fetchone()[0] == "parameterized" + + def test_empty_transaction_rollback(self, mst_conn_params, mst_table): + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + # Rollback with no DML should not raise + conn.rollback() + + def test_close_connection_implicit_rollback(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + conn = sql.connect(**mst_conn_params) + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'pending')") + conn.close() + + assert _get_row_count(mst_conn_params, fq_table) == 0 + + +# ==================== B. API-SPECIFIC TESTS ==================== + + +class TestMstApi: + """DB-API-specific tests: autocommit, isolation, error handling.""" + + def test_default_autocommit_is_true(self, mst_conn_params): + with sql.connect(**mst_conn_params) as conn: + assert conn.autocommit is True + + def test_set_autocommit_false(self, mst_conn_params): + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + assert conn.autocommit is False + + def test_commit_without_active_txn_throws(self, mst_conn_params): + with sql.connect(**mst_conn_params) as conn: + with pytest.raises(Exception, match=r"NO_ACTIVE_TRANSACTION"): + conn.commit() + + def test_set_autocommit_during_active_txn_throws( + self, mst_conn_params, mst_table + ): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'active_txn')") + with pytest.raises(Exception): + conn.autocommit = True + conn.rollback() + + def test_supported_isolation_level(self, mst_conn_params): + with sql.connect(**mst_conn_params) as conn: + conn.set_transaction_isolation("REPEATABLE_READ") + assert conn.get_transaction_isolation() == "REPEATABLE_READ" + + def test_unsupported_isolation_level_rejected(self, mst_conn_params): + with sql.connect(**mst_conn_params) as conn: + for level in ["READ_UNCOMMITTED", "READ_COMMITTED", "SERIALIZABLE"]: + with pytest.raises(Exception): + conn.set_transaction_isolation(level) + + +# ==================== C. METADATA RPCs ==================== + + +class TestMstMetadata: + """Metadata RPCs inside active transactions. + + Python uses Thrift RPCs for cursor.columns, cursor.tables, etc. These + RPCs bypass MST context and return non-transactional data — they see + concurrent DDL changes that the transaction shouldn't see. + """ + + def test_cursor_columns_in_mst( + self, mst_conn_params, mst_table, mst_catalog, mst_schema + ): + fq_table, table_name = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'test')") + cursor.columns( + catalog_name=mst_catalog, schema_name=mst_schema, table_name=table_name + ) + columns = cursor.fetchall() + assert len(columns) > 0 + conn.rollback() + + def test_cursor_tables_in_mst( + self, mst_conn_params, mst_table, mst_catalog, mst_schema + ): + fq_table, table_name = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'test')") + cursor.tables( + catalog_name=mst_catalog, schema_name=mst_schema, table_name=table_name + ) + tables = cursor.fetchall() + assert len(tables) > 0 + conn.rollback() + + def test_cursor_schemas_in_mst(self, mst_conn_params, mst_table, mst_catalog): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'test')") + cursor.schemas(catalog_name=mst_catalog) + schemas = cursor.fetchall() + assert len(schemas) > 0 + conn.rollback() + + def test_cursor_catalogs_in_mst(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'test')") + cursor.catalogs() + catalogs = cursor.fetchall() + assert len(catalogs) > 0 + conn.rollback() + + @pytest.mark.xdist_group(name="mst_freshness_columns") + def test_cursor_columns_non_transactional_after_concurrent_ddl( + self, mst_conn_params, mst_table, mst_catalog, mst_schema + ): + """Thrift cursor.columns() bypasses MST — sees concurrent ALTER TABLE.""" + fq_table, table_name = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'test')") + cursor.columns( + catalog_name=mst_catalog, schema_name=mst_schema, table_name=table_name + ) + before_cols = {row[3].lower() for row in cursor.fetchall()} + + # External connection alters schema + with sql.connect(**mst_conn_params) as ext_conn: + with ext_conn.cursor() as ext_cursor: + ext_cursor.execute( + f"ALTER TABLE {fq_table} ADD COLUMN new_col STRING" + ) + + # Re-read columns in same txn — Thrift RPC bypasses txn isolation, + # so new_col IS visible (proves non-transactional behavior) + with conn.cursor() as cursor: + cursor.columns( + catalog_name=mst_catalog, schema_name=mst_schema, table_name=table_name + ) + after_cols = {row[3].lower() for row in cursor.fetchall()} + + assert "new_col" in after_cols, ( + "Thrift cursor.columns() should see concurrent DDL " + "(non-transactional behavior)" + ) + assert before_cols != after_cols + conn.rollback() + + @pytest.mark.xdist_group(name="mst_freshness_tables") + def test_cursor_tables_non_transactional_after_concurrent_create( + self, mst_conn_params, mst_table, mst_catalog, mst_schema + ): + """Thrift cursor.tables() bypasses MST — sees concurrent CREATE TABLE.""" + fq_table, _ = mst_table + new_table_name = _unique_table_name_raw("freshness_new_tbl") + fq_new_table = f"{mst_catalog}.{mst_schema}.{new_table_name}" + + try: + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'test')") + cursor.tables( + catalog_name=mst_catalog, + schema_name=mst_schema, + table_name=new_table_name, + ) + assert len(cursor.fetchall()) == 0 + + # External connection creates the table + with sql.connect(**mst_conn_params) as ext_conn: + with ext_conn.cursor() as ext_cursor: + ext_cursor.execute( + f"CREATE TABLE {fq_new_table} (id INT) USING DELTA " + f"TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported')" + ) + + # Re-read in same txn — should see the new table + with conn.cursor() as cursor: + cursor.tables( + catalog_name=mst_catalog, + schema_name=mst_schema, + table_name=new_table_name, + ) + assert len(cursor.fetchall()) > 0, ( + "Thrift cursor.tables() should see concurrent CREATE TABLE " + "(non-transactional behavior)" + ) + conn.rollback() + finally: + try: + with sql.connect(**mst_conn_params) as conn: + with conn.cursor() as cursor: + cursor.execute(f"DROP TABLE IF EXISTS {fq_new_table}") + except Exception as e: + logger.warning(f"Failed to drop {fq_new_table}: {e}") + + +# ==================== D. BLOCKED SQL (MSTCheckRule) ==================== + + +class TestMstBlockedSql: + """SQL introspection statements inside active transactions. + + The server restricts MST to an allowlist enforced by MSTCheckRule. The + TRANSACTION_NOT_SUPPORTED.COMMAND error originally advertised only: + "Only SELECT / INSERT / MERGE / UPDATE / DELETE / DESCRIBE TABLE are supported." + + The server has since broadened the allowlist to include SHOW COLUMNS + (ShowDeltaTableColumnsCommand), observed on current DBSQL warehouses. + + Blocked (throw + abort txn): + - SHOW TABLES, SHOW SCHEMAS, SHOW CATALOGS, SHOW FUNCTIONS + - DESCRIBE QUERY, DESCRIBE TABLE EXTENDED + - SELECT FROM information_schema + + Allowed: + - DESCRIBE TABLE (basic form) + - SHOW COLUMNS + """ + + def _assert_blocked_and_txn_aborted(self, mst_conn_params, fq_table, blocked_sql): + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'before_blocked')") + + with pytest.raises(Exception): + cursor.execute(blocked_sql) + + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table} VALUES (2, 'after_blocked')" + ) + try: + conn.rollback() + except Exception: + pass + + def _assert_not_blocked(self, mst_conn_params, fq_table, allowed_sql): + """Assert the SQL succeeds and returns rows inside an active txn.""" + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.execute(f"INSERT INTO {fq_table} VALUES (1, 'before')") + cursor.execute(allowed_sql) + rows = cursor.fetchall() + assert len(rows) > 0 + conn.rollback() + + def test_show_tables_blocked(self, mst_conn_params, mst_table, mst_catalog, mst_schema): + fq_table, _ = mst_table + self._assert_blocked_and_txn_aborted( + mst_conn_params, fq_table, f"SHOW TABLES IN {mst_catalog}.{mst_schema}" + ) + + def test_show_schemas_blocked(self, mst_conn_params, mst_table, mst_catalog): + fq_table, _ = mst_table + self._assert_blocked_and_txn_aborted( + mst_conn_params, fq_table, f"SHOW SCHEMAS IN {mst_catalog}" + ) + + def test_show_catalogs_blocked(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + self._assert_blocked_and_txn_aborted( + mst_conn_params, fq_table, "SHOW CATALOGS" + ) + + def test_show_functions_blocked(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + self._assert_blocked_and_txn_aborted( + mst_conn_params, fq_table, "SHOW FUNCTIONS" + ) + + def test_describe_table_extended_blocked(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + self._assert_blocked_and_txn_aborted( + mst_conn_params, fq_table, f"DESCRIBE TABLE EXTENDED {fq_table}" + ) + + def test_information_schema_blocked(self, mst_conn_params, mst_table, mst_catalog): + fq_table, _ = mst_table + self._assert_blocked_and_txn_aborted( + mst_conn_params, + fq_table, + f"SELECT * FROM {mst_catalog}.information_schema.columns LIMIT 1", + ) + + def test_show_columns_not_blocked(self, mst_conn_params, mst_table): + """SHOW COLUMNS succeeds in MST — allowed by the server's MSTCheckRule allowlist.""" + fq_table, _ = mst_table + self._assert_not_blocked( + mst_conn_params, fq_table, f"SHOW COLUMNS IN {fq_table}" + ) + + def test_describe_query_blocked(self, mst_conn_params, mst_table): + """DESCRIBE QUERY is blocked in MST (DescribeQueryCommand).""" + fq_table, _ = mst_table + self._assert_blocked_and_txn_aborted( + mst_conn_params, + fq_table, + f"DESCRIBE QUERY SELECT * FROM {fq_table}", + ) + + # DESCRIBE TABLE is explicitly listed as an allowed command in the server's + # TRANSACTION_NOT_SUPPORTED.COMMAND error message: + # "Only SELECT / INSERT / MERGE / UPDATE / DELETE / DESCRIBE TABLE are supported." + def test_describe_table_not_blocked(self, mst_conn_params, mst_table): + """DESCRIBE TABLE succeeds in MST — explicitly allowed by the server.""" + fq_table, _ = mst_table + self._assert_not_blocked( + mst_conn_params, fq_table, f"DESCRIBE TABLE {fq_table}" + ) + + +# ==================== E. EXECUTE VARIANTS ==================== + + +class TestMstExecuteVariants: + """Execute method variants (executemany) inside MST.""" + + def test_executemany_in_txn(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.executemany( + f"INSERT INTO {fq_table} VALUES (%(id)s, %(value)s)", + [ + {"id": 1, "value": "a"}, + {"id": 2, "value": "b"}, + {"id": 3, "value": "c"}, + ], + ) + conn.commit() + + assert _get_row_count(mst_conn_params, fq_table) == 3 + + def test_executemany_rollback_in_txn(self, mst_conn_params, mst_table): + fq_table, _ = mst_table + with sql.connect(**mst_conn_params) as conn: + conn.autocommit = False + with conn.cursor() as cursor: + cursor.executemany( + f"INSERT INTO {fq_table} VALUES (%(id)s, %(value)s)", + [{"id": 1, "value": "a"}, {"id": 2, "value": "b"}], + ) + conn.rollback() + + assert _get_row_count(mst_conn_params, fq_table) == 0 diff --git a/tests/e2e/test_variant_types.py b/tests/e2e/test_variant_types.py new file mode 100644 index 000000000..14be3aa3d --- /dev/null +++ b/tests/e2e/test_variant_types.py @@ -0,0 +1,92 @@ +import pytest +from datetime import datetime +import json +from uuid import uuid4 + +try: + import pyarrow +except ImportError: + pyarrow = None + +from tests.e2e.test_driver import PySQLPytestTestCase +from tests.e2e.common.predicates import pysql_supports_arrow + + +@pytest.mark.skipif(not pysql_supports_arrow(), reason="Requires arrow support") +class TestVariantTypes(PySQLPytestTestCase): + """Tests for the proper detection and handling of VARIANT type columns""" + + @pytest.fixture(scope="class") + def variant_table(self, connection_details): + """A pytest fixture that creates a test table and cleans up after tests""" + self.arguments = connection_details.copy() + table_name = f"pysql_test_variant_types_table_{str(uuid4()).replace('-', '_')}" + + with self.cursor() as cursor: + try: + # Create the table with variant columns + cursor.execute( + f""" + CREATE TABLE IF NOT EXISTS {table_name} ( + id INTEGER, + variant_col VARIANT, + regular_string_col STRING + ) + """ + ) + + # Insert test records with different variant values + cursor.execute( + f""" + INSERT INTO {table_name} + VALUES + (1, PARSE_JSON('{{\"name\": \"John\", \"age\": 30}}'), 'regular string'), + (2, PARSE_JSON('[1, 2, 3, 4]'), 'another string') + """ + ) + yield table_name + finally: + cursor.execute(f"DROP TABLE IF EXISTS {table_name}") + + def test_variant_type_detection(self, variant_table): + """Test that VARIANT type columns are properly detected in schema""" + with self.cursor() as cursor: + cursor.execute(f"SELECT * FROM {variant_table} LIMIT 0") + + # Verify column types in description + assert ( + cursor.description[0][1] == "int" + ), "Integer column type not correctly identified" + assert ( + cursor.description[1][1] == "variant" + ), "VARIANT column type not correctly identified" + assert ( + cursor.description[2][1] == "string" + ), "String column type not correctly identified" + + def test_variant_data_retrieval(self, variant_table): + """Test that VARIANT data is properly retrieved and can be accessed as JSON""" + with self.cursor() as cursor: + cursor.execute(f"SELECT * FROM {variant_table} ORDER BY id") + rows = cursor.fetchall() + + # First row should have a JSON object + json_obj = rows[0][1] + assert isinstance( + json_obj, str + ), "VARIANT column should be returned as string" + + parsed = json.loads(json_obj) + assert parsed.get("name") == "John" + assert parsed.get("age") == 30 + + # Second row should have a JSON array + json_array = rows[1][1] + assert isinstance( + json_array, str + ), "VARIANT array should be returned as string" + + # Parsing to verify it's valid JSON array + parsed_array = json.loads(json_array) + assert isinstance(parsed_array, list) + assert parsed_array == [1, 2, 3, 4] diff --git a/tests/unit/test_agent_detection.py b/tests/unit/test_agent_detection.py new file mode 100644 index 000000000..0be404a1d --- /dev/null +++ b/tests/unit/test_agent_detection.py @@ -0,0 +1,51 @@ +import pytest +from databricks.sql.common.agent import detect, KNOWN_AGENTS + + +class TestAgentDetection: + def test_detects_single_agent_claude_code(self): + assert detect({"CLAUDECODE": "1"}) == "claude-code" + + def test_detects_single_agent_cursor(self): + assert detect({"CURSOR_AGENT": "1"}) == "cursor" + + def test_detects_single_agent_gemini_cli(self): + assert detect({"GEMINI_CLI": "1"}) == "gemini-cli" + + def test_detects_single_agent_cline(self): + assert detect({"CLINE_ACTIVE": "1"}) == "cline" + + def test_detects_single_agent_codex(self): + assert detect({"CODEX_CI": "1"}) == "codex" + + def test_detects_single_agent_opencode(self): + assert detect({"OPENCODE": "1"}) == "opencode" + + def test_detects_single_agent_antigravity(self): + assert detect({"ANTIGRAVITY_AGENT": "1"}) == "antigravity" + + def test_returns_empty_when_no_agent_detected(self): + assert detect({}) == "" + + def test_returns_empty_when_multiple_agents_detected(self): + assert detect({"CLAUDECODE": "1", "CURSOR_AGENT": "1"}) == "" + + def test_ignores_empty_env_var_values(self): + assert detect({"CLAUDECODE": ""}) == "" + + def test_all_known_agents_are_covered(self): + for env_var, product in KNOWN_AGENTS: + assert detect({env_var: "1"}) == product, ( + f"Agent with env var {env_var} should be detected as {product}" + ) + + def test_defaults_to_os_environ(self, monkeypatch): + monkeypatch.delenv("CLAUDECODE", raising=False) + monkeypatch.delenv("CURSOR_AGENT", raising=False) + monkeypatch.delenv("GEMINI_CLI", raising=False) + monkeypatch.delenv("CLINE_ACTIVE", raising=False) + monkeypatch.delenv("CODEX_CI", raising=False) + monkeypatch.delenv("OPENCODE", raising=False) + monkeypatch.delenv("ANTIGRAVITY_AGENT", raising=False) + # With all agent vars cleared, detect() should return empty + assert detect() == "" diff --git a/tests/unit/test_arrow_queue.py b/tests/unit/test_arrow_queue.py index b3dff45f4..6c195bf10 100644 --- a/tests/unit/test_arrow_queue.py +++ b/tests/unit/test_arrow_queue.py @@ -1,10 +1,14 @@ import unittest +import pytest -import pyarrow as pa - +try: + import pyarrow as pa +except ImportError: + pa = None from databricks.sql.utils import ArrowQueue +@pytest.mark.skipif(pa is None, reason="PyArrow is not installed") class ArrowQueueSuite(unittest.TestCase): @staticmethod def make_arrow_table(batch): diff --git a/tests/unit/test_auth.py b/tests/unit/test_auth.py index d5b06bbf5..d1b941208 100644 --- a/tests/unit/test_auth.py +++ b/tests/unit/test_auth.py @@ -1,20 +1,23 @@ import unittest import pytest -from typing import Optional -from unittest.mock import patch - +from unittest.mock import patch, MagicMock +import jwt from databricks.sql.auth.auth import ( AccessTokenAuthProvider, AuthProvider, ExternalAuthProvider, AuthType, ) +import time from databricks.sql.auth.auth import ( get_python_sql_connector_auth_provider, PYSQL_OAUTH_CLIENT_ID, ) -from databricks.sql.auth.oauth import OAuthManager -from databricks.sql.auth.authenticators import DatabricksOAuthProvider +from databricks.sql.auth.oauth import OAuthManager, Token, ClientCredentialsTokenSource +from databricks.sql.auth.authenticators import ( + DatabricksOAuthProvider, + AzureServicePrincipalCredentialProvider, +) from databricks.sql.auth.endpoint import ( CloudType, InHouseOAuthEndpointCollection, @@ -22,6 +25,7 @@ ) from databricks.sql.auth.authenticators import CredentialsProvider, HeaderFactory from databricks.sql.experimental.oauth_persistence import OAuthPersistenceCache +import json class Auth(unittest.TestCase): @@ -94,12 +98,14 @@ def test_oauth_auth_provider(self, mock_get_tokens, mock_check_and_refresh): ) in params: with self.subTest(cloud_type.value): oauth_persistence = OAuthPersistenceCache() + mock_http_client = MagicMock() auth_provider = DatabricksOAuthProvider( hostname=host, oauth_persistence=oauth_persistence, redirect_port_range=[8020], client_id=client_id, scopes=scopes, + http_client=mock_http_client, auth_type=AuthType.AZURE_OAUTH.value if use_azure_auth else AuthType.DATABRICKS_OAUTH.value, @@ -138,7 +144,8 @@ def __call__(self, *args, **kwargs) -> HeaderFactory: def test_get_python_sql_connector_auth_provider_access_token(self): hostname = "moderakh-test.cloud.databricks.com" kwargs = {"access_token": "dpi123"} - auth_provider = get_python_sql_connector_auth_provider(hostname, **kwargs) + mock_http_client = MagicMock() + auth_provider = get_python_sql_connector_auth_provider(hostname, mock_http_client, **kwargs) self.assertTrue(type(auth_provider).__name__, "AccessTokenAuthProvider") headers = {} @@ -155,8 +162,11 @@ def __call__(self, *args, **kwargs) -> HeaderFactory: hostname = "moderakh-test.cloud.databricks.com" kwargs = {"credentials_provider": MyProvider()} - auth_provider = get_python_sql_connector_auth_provider(hostname, **kwargs) - self.assertTrue(type(auth_provider).__name__, "ExternalAuthProvider") + mock_http_client = MagicMock() + auth_provider = get_python_sql_connector_auth_provider(hostname, mock_http_client, **kwargs) + + self.assertEqual(type(auth_provider).__name__, "TokenFederationProvider") + self.assertEqual(type(auth_provider.external_provider).__name__, "ExternalAuthProvider") headers = {} auth_provider.add_headers(headers) @@ -170,7 +180,8 @@ def test_get_python_sql_connector_auth_provider_noop(self): "_tls_client_cert_file": tls_client_cert_file, "_use_cert_as_auth": use_cert_as_auth, } - auth_provider = get_python_sql_connector_auth_provider(hostname, **kwargs) + mock_http_client = MagicMock() + auth_provider = get_python_sql_connector_auth_provider(hostname, mock_http_client, **kwargs) self.assertTrue(type(auth_provider).__name__, "CredentialProvider") def test_get_python_sql_connector_basic_auth(self): @@ -178,8 +189,9 @@ def test_get_python_sql_connector_basic_auth(self): "username": "username", "password": "password", } + mock_http_client = MagicMock() with self.assertRaises(ValueError) as e: - get_python_sql_connector_auth_provider("foo.cloud.databricks.com", **kwargs) + get_python_sql_connector_auth_provider("foo.cloud.databricks.com", mock_http_client, **kwargs) self.assertIn( "Username/password authentication is no longer supported", str(e.exception) ) @@ -187,6 +199,131 @@ def test_get_python_sql_connector_basic_auth(self): @patch.object(DatabricksOAuthProvider, "_initial_get_token") def test_get_python_sql_connector_default_auth(self, mock__initial_get_token): hostname = "foo.cloud.databricks.com" - auth_provider = get_python_sql_connector_auth_provider(hostname) - self.assertTrue(type(auth_provider).__name__, "DatabricksOAuthProvider") - self.assertTrue(auth_provider._client_id, PYSQL_OAUTH_CLIENT_ID) + mock_http_client = MagicMock() + auth_provider = get_python_sql_connector_auth_provider(hostname, mock_http_client) + + self.assertEqual(type(auth_provider).__name__, "TokenFederationProvider") + self.assertEqual(type(auth_provider.external_provider).__name__, "DatabricksOAuthProvider") + + self.assertEqual(auth_provider.external_provider._client_id, PYSQL_OAUTH_CLIENT_ID) + + +class TestClientCredentialsTokenSource: + @pytest.fixture + def indefinite_token(self): + secret_key = "mysecret" + expires_in_100_years = int(time.time()) + (100 * 365 * 24 * 60 * 60) + + payload = {"sub": "user123", "role": "admin", "exp": expires_in_100_years} + + access_token = jwt.encode(payload, secret_key, algorithm="HS256") + return Token(access_token, "Bearer", "refresh_token") + + @pytest.fixture + def http_response(self): + def status_response(response_status_code): + mock_response = MagicMock() + mock_response.status_code = response_status_code + mock_response.json.return_value = { + "access_token": "abc123", + "token_type": "Bearer", + "refresh_token": None, + } + return mock_response + + return status_response + + @pytest.fixture + def token_source(self): + mock_http_client = MagicMock() + return ClientCredentialsTokenSource( + token_url="https://token_url.com", + client_id="client_id", + client_secret="client_secret", + http_client=mock_http_client, + ) + + def test_no_token_refresh__when_token_is_not_expired( + self, token_source, indefinite_token + ): + with patch.object(token_source, "refresh") as mock_get_token: + mock_get_token.return_value = indefinite_token + + # Mulitple calls for token + token1 = token_source.get_token() + token2 = token_source.get_token() + token3 = token_source.get_token() + + assert token1 == token2 == token3 + assert token1.access_token == indefinite_token.access_token + assert token1.token_type == indefinite_token.token_type + assert token1.refresh_token == indefinite_token.refresh_token + + # should refresh only once as token is not expired + assert mock_get_token.call_count == 1 + + def test_get_token_success(self, token_source, http_response): + mock_http_client = MagicMock() + + with patch.object(token_source, "_http_client", mock_http_client): + # Create a mock response with the expected format + mock_response = MagicMock() + mock_response.status = 200 + mock_response.data.decode.return_value = '{"access_token": "abc123", "token_type": "Bearer", "refresh_token": null}' + + # Mock the request method to return the response directly + mock_http_client.request.return_value = mock_response + + token = token_source.get_token() + + # Assert + assert isinstance(token, Token) + assert token.access_token == "abc123" + assert token.token_type == "Bearer" + assert token.refresh_token is None + + def test_get_token_failure(self, token_source, http_response): + mock_http_client = MagicMock() + + with patch.object(token_source, "_http_client", mock_http_client): + # Create a mock response with error + mock_response = MagicMock() + mock_response.status = 400 + mock_response.data.decode.return_value = "Bad Request" + + # Mock the request method to return the response directly + mock_http_client.request.return_value = mock_response + + with pytest.raises(Exception) as e: + token_source.get_token() + assert "Failed to get token: 400" in str(e.value) + + +class TestAzureServicePrincipalCredentialProvider: + @pytest.fixture + def credential_provider(self): + return AzureServicePrincipalCredentialProvider( + hostname="hostname", + azure_client_id="client_id", + azure_client_secret="client_secret", + http_client=MagicMock(), + azure_tenant_id="tenant_id", + ) + + def test_provider_credentials(self, credential_provider): + + test_token = Token("access_token", "Bearer", "refresh_token") + + with patch.object( + credential_provider, "get_token_source" + ) as mock_get_token_source: + mock_get_token_source.return_value = MagicMock() + mock_get_token_source.return_value.get_token.return_value = test_token + + headers = credential_provider()() + + assert headers["Authorization"] == f"Bearer {test_token.access_token}" + assert ( + headers["X-Databricks-Azure-SP-Management-Token"] + == test_token.access_token + ) diff --git a/tests/unit/test_circuit_breaker_http_client.py b/tests/unit/test_circuit_breaker_http_client.py new file mode 100644 index 000000000..432ca1be3 --- /dev/null +++ b/tests/unit/test_circuit_breaker_http_client.py @@ -0,0 +1,208 @@ +""" +Unit tests for telemetry push client functionality. +""" + +import pytest +from unittest.mock import Mock, patch, MagicMock + +from databricks.sql.telemetry.telemetry_push_client import ( + ITelemetryPushClient, + TelemetryPushClient, + CircuitBreakerTelemetryPushClient, +) +from databricks.sql.common.http import HttpMethod +from pybreaker import CircuitBreakerError + + +class TestTelemetryPushClient: + """Test cases for TelemetryPushClient.""" + + def setup_method(self): + """Set up test fixtures.""" + self.mock_http_client = Mock() + self.client = TelemetryPushClient(self.mock_http_client) + + def test_initialization(self): + """Test client initialization.""" + assert self.client._http_client == self.mock_http_client + + def test_request_delegates_to_http_client(self): + """Test that request delegates to underlying HTTP client.""" + mock_response = Mock() + self.mock_http_client.request.return_value = mock_response + + response = self.client.request(HttpMethod.POST, "https://test.com", {}) + + assert response == mock_response + self.mock_http_client.request.assert_called_once() + + def test_direct_client_has_no_circuit_breaker(self): + """Test that direct client does not have circuit breaker functionality.""" + # Direct client should work without circuit breaker + assert isinstance(self.client, TelemetryPushClient) + + +class TestCircuitBreakerTelemetryPushClient: + """Test cases for CircuitBreakerTelemetryPushClient.""" + + def setup_method(self): + """Set up test fixtures.""" + self.mock_delegate = Mock(spec=ITelemetryPushClient) + self.host = "test-host.example.com" + self.client = CircuitBreakerTelemetryPushClient(self.mock_delegate, self.host) + + def test_initialization(self): + """Test client initialization.""" + assert self.client._delegate == self.mock_delegate + assert self.client._host == self.host + assert self.client._circuit_breaker is not None + + def test_request_enabled_success(self): + """Test successful request when circuit breaker is enabled.""" + mock_response = Mock() + self.mock_delegate.request.return_value = mock_response + + response = self.client.request(HttpMethod.POST, "https://test.com", {}) + + assert response == mock_response + self.mock_delegate.request.assert_called_once() + + def test_request_enabled_circuit_breaker_error(self): + """Test request when circuit breaker is open - should raise CircuitBreakerError.""" + # Mock circuit breaker to raise CircuitBreakerError + with patch.object( + self.client._circuit_breaker, + "call", + side_effect=CircuitBreakerError("Circuit is open"), + ): + # Circuit breaker open should raise (caller handles it) + with pytest.raises(CircuitBreakerError): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + def test_request_enabled_other_error(self): + """Test request when other error occurs - should raise original exception.""" + # Mock delegate to raise a different error (not rate limiting) + self.mock_delegate.request.side_effect = ValueError("Network error") + + # Non-rate-limit errors are unwrapped and raised + with pytest.raises(ValueError, match="Network error"): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + def test_is_circuit_breaker_enabled(self): + """Test checking if circuit breaker is enabled.""" + assert self.client._circuit_breaker is not None + + def test_circuit_breaker_state_logging(self): + """Test that circuit breaker errors are raised (no longer silent).""" + with patch.object( + self.client._circuit_breaker, + "call", + side_effect=CircuitBreakerError("Circuit is open"), + ): + # Should raise CircuitBreakerError (caller handles it) + with pytest.raises(CircuitBreakerError): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + def test_other_error_logging(self): + """Test that other errors are wrapped, logged, then unwrapped and raised.""" + with patch( + "databricks.sql.telemetry.telemetry_push_client.logger" + ) as mock_logger: + self.mock_delegate.request.side_effect = ValueError("Network error") + + # Should raise the original ValueError + with pytest.raises(ValueError, match="Network error"): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + # Check that debug was logged (for wrapping and/or unwrapping) + assert mock_logger.debug.call_count >= 1 + + +class TestCircuitBreakerTelemetryPushClientIntegration: + """Integration tests for CircuitBreakerTelemetryPushClient.""" + + def setup_method(self): + """Set up test fixtures.""" + self.mock_delegate = Mock() + self.host = "test-host.example.com" + + def test_circuit_breaker_opens_after_failures(self): + """Test that circuit breaker opens after repeated failures (429/503 errors).""" + from databricks.sql.telemetry.circuit_breaker_manager import ( + CircuitBreakerManager, + MINIMUM_CALLS, + ) + from databricks.sql.exc import TelemetryRateLimitError + + # Clear any existing state + CircuitBreakerManager._instances.clear() + + client = CircuitBreakerTelemetryPushClient(self.mock_delegate, self.host) + + # Simulate rate limit failures (429) + mock_response = Mock() + mock_response.status = 429 + self.mock_delegate.request.return_value = mock_response + + # All calls should raise TelemetryRateLimitError + # After MINIMUM_CALLS failures, circuit breaker opens + rate_limit_error_count = 0 + circuit_breaker_error_count = 0 + + for i in range(MINIMUM_CALLS + 5): + try: + client.request(HttpMethod.POST, "https://test.com", {}) + except TelemetryRateLimitError: + rate_limit_error_count += 1 + except CircuitBreakerError: + circuit_breaker_error_count += 1 + + # Should have some rate limit errors before circuit opens, then circuit breaker errors + assert rate_limit_error_count >= MINIMUM_CALLS - 1 + assert circuit_breaker_error_count > 0 + + def test_circuit_breaker_recovers_after_success(self): + """Test that circuit breaker recovers after successful calls.""" + from databricks.sql.telemetry.circuit_breaker_manager import ( + CircuitBreakerManager, + MINIMUM_CALLS, + RESET_TIMEOUT, + ) + import time + + # Clear any existing state + CircuitBreakerManager._instances.clear() + + client = CircuitBreakerTelemetryPushClient(self.mock_delegate, self.host) + + # Simulate rate limit failures first (429) + from databricks.sql.exc import TelemetryRateLimitError + from pybreaker import CircuitBreakerError + + mock_rate_limit_response = Mock() + mock_rate_limit_response.status = 429 + self.mock_delegate.request.return_value = mock_rate_limit_response + + # Trigger enough rate limit failures to open circuit + for i in range(MINIMUM_CALLS + 5): + try: + client.request(HttpMethod.POST, "https://test.com", {}) + except (TelemetryRateLimitError, CircuitBreakerError): + pass # Expected - circuit breaker opens after MINIMUM_CALLS failures + + # Circuit should be open now - raises CircuitBreakerError + with pytest.raises(CircuitBreakerError): + client.request(HttpMethod.POST, "https://test.com", {}) + + # Wait for reset timeout + time.sleep(RESET_TIMEOUT + 1.0) + + # Simulate successful calls (200 response) + mock_success_response = Mock() + mock_success_response.status = 200 + self.mock_delegate.request.return_value = mock_success_response + + # Should work again with actual success response + response = client.request(HttpMethod.POST, "https://test.com", {}) + assert response is not None + assert response.status == 200 diff --git a/tests/unit/test_circuit_breaker_manager.py b/tests/unit/test_circuit_breaker_manager.py new file mode 100644 index 000000000..1e02556d9 --- /dev/null +++ b/tests/unit/test_circuit_breaker_manager.py @@ -0,0 +1,160 @@ +""" +Unit tests for circuit breaker manager functionality. +""" + +import pytest +import threading +import time +from unittest.mock import Mock, patch + +from databricks.sql.telemetry.circuit_breaker_manager import ( + CircuitBreakerManager, + MINIMUM_CALLS, + RESET_TIMEOUT, + NAME_PREFIX as CIRCUIT_BREAKER_NAME, +) +from pybreaker import CircuitBreakerError + + +class TestCircuitBreakerManager: + """Test cases for CircuitBreakerManager.""" + + def setup_method(self): + """Set up test fixtures.""" + CircuitBreakerManager._instances.clear() + + def teardown_method(self): + """Clean up after tests.""" + CircuitBreakerManager._instances.clear() + + def test_get_circuit_breaker_creates_instance(self): + """Test getting circuit breaker creates instance with correct config.""" + breaker = CircuitBreakerManager.get_circuit_breaker("test-host") + + assert breaker.name == "telemetry-circuit-breaker-test-host" + assert breaker.fail_max == MINIMUM_CALLS + + def test_get_circuit_breaker_same_host_returns_same_instance(self): + """Test that same host returns same circuit breaker instance.""" + breaker1 = CircuitBreakerManager.get_circuit_breaker("test-host") + breaker2 = CircuitBreakerManager.get_circuit_breaker("test-host") + + assert breaker1 is breaker2 + + def test_get_circuit_breaker_different_hosts_return_different_instances(self): + """Test that different hosts return different circuit breaker instances.""" + breaker1 = CircuitBreakerManager.get_circuit_breaker("host1") + breaker2 = CircuitBreakerManager.get_circuit_breaker("host2") + + assert breaker1 is not breaker2 + assert breaker1.name != breaker2.name + + def test_thread_safety(self): + """Test thread safety of circuit breaker manager.""" + results = [] + + def get_breaker(host): + breaker = CircuitBreakerManager.get_circuit_breaker(host) + results.append(breaker) + + threads = [] + for i in range(10): + thread = threading.Thread(target=get_breaker, args=(f"host{i % 3}",)) + threads.append(thread) + thread.start() + + for thread in threads: + thread.join() + + assert len(results) == 10 + + # All breakers for same host should be same instance + host0_breakers = [b for b in results if b.name.endswith("host0")] + assert all(b is host0_breakers[0] for b in host0_breakers) + + +class TestCircuitBreakerIntegration: + """Integration tests for circuit breaker functionality.""" + + def setup_method(self): + """Set up test fixtures.""" + CircuitBreakerManager._instances.clear() + + def teardown_method(self): + """Clean up after tests.""" + CircuitBreakerManager._instances.clear() + + def test_circuit_breaker_state_transitions(self): + """Test circuit breaker state transitions from closed to open.""" + breaker = CircuitBreakerManager.get_circuit_breaker("test-host") + + assert breaker.current_state == "closed" + + def failing_func(): + raise Exception("Simulated failure") + + # Trigger failures up to the threshold (MINIMUM_CALLS = 20) + for _ in range(MINIMUM_CALLS): + with pytest.raises(Exception): + breaker.call(failing_func) + + # Next call should fail with CircuitBreakerError (circuit is now open) + with pytest.raises(CircuitBreakerError): + breaker.call(failing_func) + + assert breaker.current_state == "open" + + def test_circuit_breaker_recovery(self): + """Test circuit breaker recovery after failures.""" + breaker = CircuitBreakerManager.get_circuit_breaker("test-host") + + def failing_func(): + raise Exception("Simulated failure") + + # Trigger failures up to the threshold + for _ in range(MINIMUM_CALLS): + with pytest.raises(Exception): + breaker.call(failing_func) + + assert breaker.current_state == "open" + + # Wait for reset timeout + time.sleep(RESET_TIMEOUT + 1.0) + + # Try successful call to close circuit breaker + def successful_func(): + return "success" + + try: + result = breaker.call(successful_func) + assert result == "success" + except CircuitBreakerError: + pass # Circuit might still be open, acceptable + + assert breaker.current_state in ["closed", "half-open", "open"] + + @pytest.mark.parametrize("old_state,new_state", [ + ("closed", "open"), + ("open", "half-open"), + ("half-open", "closed"), + ("closed", "half-open"), + ]) + def test_circuit_breaker_state_listener_transitions(self, old_state, new_state): + """Test circuit breaker state listener logs all state transitions.""" + from databricks.sql.telemetry.circuit_breaker_manager import ( + CircuitBreakerStateListener, + ) + + listener = CircuitBreakerStateListener() + mock_cb = Mock() + mock_cb.name = "test-breaker" + + mock_old_state = Mock() + mock_old_state.name = old_state + + mock_new_state = Mock() + mock_new_state.name = new_state + + with patch("databricks.sql.telemetry.circuit_breaker_manager.logger") as mock_logger: + listener.state_change(mock_cb, mock_old_state, mock_new_state) + mock_logger.debug.assert_called() diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index 0ff660d5c..4a8cb0b68 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -13,42 +13,51 @@ TExecuteStatementResp, TOperationHandle, THandleIdentifier, + TOperationState, TOperationType, + TOperationState, ) -from databricks.sql.thrift_backend import ThriftBackend +from databricks.sql.thrift_api.TCLIService import ttypes +from databricks.sql.backend.thrift_backend import ThriftDatabricksClient import databricks.sql import databricks.sql.client as client -from databricks.sql import InterfaceError, DatabaseError, Error, NotSupportedError +from databricks.sql import ( + InterfaceError, + DatabaseError, + Error, + NotSupportedError, + TransactionError, +) from databricks.sql.types import Row +from databricks.sql.result_set import ResultSet, ThriftResultSet +from databricks.sql.backend.types import CommandId, CommandState +from databricks.sql.backend.types import ExecuteResponse from tests.unit.test_fetches import FetchTests from tests.unit.test_thrift_backend import ThriftBackendTestSuite from tests.unit.test_arrow_queue import ArrowQueueSuite -class ThriftBackendMockFactory: +class ThriftDatabricksClientMockFactory: @classmethod def new(cls): - ThriftBackendMock = Mock(spec=ThriftBackend) + ThriftBackendMock = Mock(spec=ThriftDatabricksClient) ThriftBackendMock.return_value = ThriftBackendMock - cls.apply_property_to_mock(ThriftBackendMock, staging_allowed_local_path=None) - MockTExecuteStatementResp = MagicMock(spec=TExecuteStatementResp()) - + mock_result_set = Mock(spec=ThriftResultSet) cls.apply_property_to_mock( - MockTExecuteStatementResp, + mock_result_set, description=None, - arrow_queue=None, is_staging_operation=False, - command_handle=b"\x22", + command_id=None, has_been_closed_server_side=True, has_more_rows=True, lz4_compressed=True, arrow_schema_bytes=b"schema", ) - ThriftBackendMock.execute_command.return_value = MockTExecuteStatementResp + ThriftBackendMock.execute_command.return_value = mock_result_set return ThriftBackendMock @@ -78,113 +87,81 @@ class ClientTestSuite(unittest.TestCase): "server_hostname": "foo", "http_path": "dummy_path", "access_token": "tok", + "enable_telemetry": False, } - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_close_uses_the_correct_session_id(self, mock_client_class): - instance = mock_client_class.return_value + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_closing_connection_closes_commands(self, mock_thrift_client_class): + """Test that closing a connection properly closes commands. - mock_open_session_resp = MagicMock(spec=TOpenSessionResp)() - mock_open_session_resp.sessionHandle.sessionId = b"\x22" - instance.open_session.return_value = mock_open_session_resp + This test verifies that when a connection is closed: + 1. the active result set is marked as closed server-side + 2. The operation state is set to CLOSED + 3. backend.close_command is called only for commands that weren't already closed - 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 - self.assertEqual(close_session_id, b"\x22") - - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_auth_args(self, mock_client_class): - # Test that the following auth args work: - # token = foo, - # token = None, _tls_client_cert_file = something, _use_cert_as_auth = True - connection_args = [ - { - "server_hostname": "foo", - "http_path": None, - "access_token": "tok", - }, - { - "server_hostname": "foo", - "http_path": None, - "_tls_client_cert_file": "something", - "_use_cert_as_auth": True, - "access_token": None, - }, - ] + Args: + mock_thrift_client_class: Mock for ThriftBackend class + """ - for args in connection_args: - connection = databricks.sql.connect(**args) - 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() + for closed in (True, False): + with self.subTest(closed=closed): + # Set initial state based on whether the command is already closed + initial_state = ( + CommandState.CLOSED if closed else CommandState.SUCCEEDED + ) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_http_header_passthrough(self, mock_client_class): - http_headers = [("foo", "bar")] - databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS, http_headers=http_headers) + # Mock the execute response with controlled state + mock_execute_response = Mock(spec=ExecuteResponse) + mock_execute_response.status = initial_state + mock_execute_response.has_been_closed_server_side = closed + mock_execute_response.is_staging_operation = False + mock_execute_response.command_id = Mock(spec=CommandId) + mock_execute_response.description = [] - call_args = mock_client_class.call_args[0][3] - self.assertIn(("foo", "bar"), call_args) + # Mock the backend that will be used + mock_backend = Mock(spec=ThriftDatabricksClient) + mock_backend.staging_allowed_local_path = None + mock_backend.fetch_results.return_value = (Mock(), False, 0) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_tls_arg_passthrough(self, mock_client_class): - databricks.sql.connect( - **self.DUMMY_CONNECTION_ARGS, - _tls_verify_hostname="hostname", - _tls_trusted_ca_file="trusted ca file", - _tls_client_cert_key_file="trusted client cert", - _tls_client_cert_key_password="key password", - ) + # Configure the decorator's mock to return our specific mock_backend + mock_thrift_client_class.return_value = mock_backend - kwargs = mock_client_class.call_args[1] - self.assertEqual(kwargs["_tls_verify_hostname"], "hostname") - self.assertEqual(kwargs["_tls_trusted_ca_file"], "trusted ca file") - self.assertEqual(kwargs["_tls_client_cert_key_file"], "trusted client cert") - self.assertEqual(kwargs["_tls_client_cert_key_password"], "key password") + # Create connection and cursor + connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) + cursor = connection.cursor() - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_useragent_header(self, mock_client_class): - databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) + real_result_set = ThriftResultSet( + connection=connection, + execute_response=mock_execute_response, + thrift_client=mock_backend, + ) - http_headers = mock_client_class.call_args[0][3] - user_agent_header = ( - "User-Agent", - "{}/{}".format(databricks.sql.USER_AGENT_NAME, databricks.sql.__version__), - ) - self.assertIn(user_agent_header, http_headers) + # Mock execute_command to return our real result set + cursor.backend.execute_command = Mock(return_value=real_result_set) - databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS, _user_agent_entry="foobar") - user_agent_header_with_entry = ( - "User-Agent", - "{}/{} ({})".format( - databricks.sql.USER_AGENT_NAME, databricks.sql.__version__, "foobar" - ), - ) - http_headers = mock_client_class.call_args[0][3] - self.assertIn(user_agent_header_with_entry, http_headers) + # Execute a command + cursor.execute("SELECT 1") - @patch("%s.client.ThriftBackend" % PACKAGE_NAME, ThriftBackendMockFactory.new()) - @patch("%s.client.ResultSet" % PACKAGE_NAME) - def test_closing_connection_closes_commands(self, mock_result_set_class): - # Test once with has_been_closed_server side, once without - for closed in (True, False): - with self.subTest(closed=closed): - mock_result_set_class.return_value = Mock() - connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) - cursor = connection.cursor() - cursor.execute("SELECT 1;") + # Close the connection connection.close() - self.assertTrue( - mock_result_set_class.return_value.has_been_closed_server_side - ) - mock_result_set_class.return_value.close.assert_called_once_with() + # Verify the close logic worked: + assert real_result_set.has_been_closed_server_side is True - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + # 2. op_state should always be CLOSED after close() + assert real_result_set.status == CommandState.CLOSED + + # 3. Backend close_command should be called appropriately + if not closed: + # Should have called backend.close_command during the close chain + mock_backend.close_command.assert_called_once_with( + mock_execute_response.command_id + ) + else: + # Should NOT have called backend.close_command (already closed) + mock_backend.close_command.assert_not_called() + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) def test_cant_open_cursor_on_closed_connection(self, mock_client_class): connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) self.assertTrue(connection.open) @@ -194,7 +171,7 @@ def test_cant_open_cursor_on_closed_connection(self, mock_client_class): connection.cursor() self.assertIn("closed", str(cm.exception)) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) @patch("%s.client.Cursor" % PACKAGE_NAME) def test_arraysize_buffer_size_passthrough( self, mock_cursor_class, mock_client_class @@ -209,12 +186,20 @@ def test_arraysize_buffer_size_passthrough( def test_closing_result_set_with_closed_connection_soft_closes_commands(self): mock_connection = Mock() mock_backend = Mock() - result_set = client.ResultSet( + mock_results = Mock() + mock_backend.fetch_results.return_value = (Mock(), False, 0) + + result_set = ThriftResultSet( connection=mock_connection, - thrift_backend=mock_backend, execute_response=Mock(), + thrift_client=mock_backend, ) - mock_connection.open = False + result_set.results = mock_results + + # Setup session mock on the mock_connection + mock_session = Mock() + mock_session.open = False + type(mock_connection).session = PropertyMock(return_value=mock_session) result_set.close() @@ -226,28 +211,37 @@ def test_closing_result_set_hard_closes_commands(self): mock_results_response.has_been_closed_server_side = False mock_connection = Mock() mock_thrift_backend = Mock() - mock_connection.open = True - result_set = client.ResultSet( - mock_connection, mock_results_response, mock_thrift_backend + mock_results = Mock() + # Setup session mock on the mock_connection + mock_session = Mock() + mock_session.open = True + type(mock_connection).session = PropertyMock(return_value=mock_session) + + mock_thrift_backend.fetch_results.return_value = (Mock(), False, 0) + result_set = ThriftResultSet( + mock_connection, + mock_results_response, + mock_thrift_backend, ) + result_set.results = mock_results result_set.close() mock_thrift_backend.close_command.assert_called_once_with( - mock_results_response.command_handle + mock_results_response.command_id ) + mock_results.close.assert_called_once() - @patch("%s.client.ResultSet" % PACKAGE_NAME) - def test_executing_multiple_commands_uses_the_most_recent_command( - self, mock_result_set_class - ): - + def test_executing_multiple_commands_uses_the_most_recent_command(self): mock_result_sets = [Mock(), Mock()] - mock_result_set_class.side_effect = mock_result_sets + # Set is_staging_operation to False to avoid _handle_staging_operation being called + for mock_rs in mock_result_sets: + mock_rs.is_staging_operation = False - cursor = client.Cursor( - connection=Mock(), thrift_backend=ThriftBackendMockFactory.new() - ) + mock_backend = ThriftDatabricksClientMockFactory.new() + mock_backend.execute_command.side_effect = mock_result_sets + + cursor = client.Cursor(connection=Mock(), backend=mock_backend) cursor.execute("SELECT 1;") cursor.execute("SELECT 1;") @@ -272,7 +266,10 @@ def test_closed_cursor_doesnt_allow_operations(self): self.assertIn("closed", e.msg) def test_negative_fetch_throws_exception(self): - result_set = client.ResultSet(Mock(), Mock(), Mock()) + mock_backend = Mock() + mock_backend.fetch_results.return_value = (Mock(), False, 0) + + result_set = ThriftResultSet(Mock(), Mock(), mock_backend) with self.assertRaises(ValueError) as e: result_set.fetchmany(-1) @@ -283,21 +280,6 @@ def test_context_manager_closes_cursor(self): cursor.close = mock_close mock_close.assert_called_once_with() - @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 - - 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 - self.assertEqual(close_session_id, b"\x22") - def dict_product(self, dicts): """ Generate cartesion product of values in input dictionary, outputting a dictionary @@ -310,7 +292,7 @@ def dict_product(self, dicts): """ return (dict(zip(dicts.keys(), x)) for x in itertools.product(*dicts.values())) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + @patch("%s.client.ThriftDatabricksClient" % PACKAGE_NAME) def test_get_schemas_parameters_passed_to_thrift_backend(self, mock_thrift_backend): req_args_combinations = self.dict_product( dict( @@ -331,7 +313,7 @@ def test_get_schemas_parameters_passed_to_thrift_backend(self, mock_thrift_backe for k, v in req_args.items(): self.assertEqual(v, call_args[k]) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + @patch("%s.client.ThriftDatabricksClient" % PACKAGE_NAME) def test_get_tables_parameters_passed_to_thrift_backend(self, mock_thrift_backend): req_args_combinations = self.dict_product( dict( @@ -354,7 +336,7 @@ def test_get_tables_parameters_passed_to_thrift_backend(self, mock_thrift_backen for k, v in req_args.items(): self.assertEqual(v, call_args[k]) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + @patch("%s.client.ThriftDatabricksClient" % PACKAGE_NAME) def test_get_columns_parameters_passed_to_thrift_backend(self, mock_thrift_backend): req_args_combinations = self.dict_product( dict( @@ -380,10 +362,10 @@ def test_get_columns_parameters_passed_to_thrift_backend(self, mock_thrift_backe def test_cancel_command_calls_the_backend(self): mock_thrift_backend = Mock() cursor = client.Cursor(Mock(), mock_thrift_backend) - mock_op_handle = Mock() - cursor.active_op_handle = mock_op_handle + mock_command_id = Mock() + cursor.active_command_id = mock_command_id cursor.cancel() - mock_thrift_backend.cancel_command.assert_called_with(mock_op_handle) + mock_thrift_backend.cancel_command.assert_called_with(mock_command_id) @patch("databricks.sql.client.logger") def test_cancel_command_will_issue_warning_for_cancel_with_no_executing_command( @@ -396,21 +378,6 @@ def test_cancel_command_will_issue_warning_for_cancel_with_no_executing_command( self.assertTrue(logger_instance.warning.called) self.assertFalse(mock_thrift_backend.cancel_command.called) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_max_number_of_retries_passthrough(self, mock_client_class): - databricks.sql.connect( - _retry_stop_after_attempts_count=54, **self.DUMMY_CONNECTION_ARGS - ) - - self.assertEqual( - mock_client_class.call_args[1]["_retry_stop_after_attempts_count"], 54 - ) - - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_socket_timeout_passthrough(self, mock_client_class): - databricks.sql.connect(_socket_timeout=234, **self.DUMMY_CONNECTION_ARGS) - self.assertEqual(mock_client_class.call_args[1]["_socket_timeout"], 234) - def test_version_is_canonical(self): version = databricks.sql.__version__ canonical_version_re = ( @@ -419,35 +386,8 @@ def test_version_is_canonical(self): ) self.assertIsNotNone(re.match(canonical_version_re, version)) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_configuration_passthrough(self, mock_client_class): - mock_session_config = Mock() - databricks.sql.connect( - session_configuration=mock_session_config, **self.DUMMY_CONNECTION_ARGS - ) - - self.assertEqual( - mock_client_class.return_value.open_session.call_args[0][0], - mock_session_config, - ) - - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_initial_namespace_passthrough(self, mock_client_class): - mock_cat = Mock() - mock_schem = Mock() - - databricks.sql.connect( - **self.DUMMY_CONNECTION_ARGS, catalog=mock_cat, schema=mock_schem - ) - self.assertEqual( - mock_client_class.return_value.open_session.call_args[0][1], mock_cat - ) - 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 = ThriftDatabricksClientMockFactory.new() cursor = client.Cursor(Mock(), mock_thrift_backend) tests = [ @@ -455,7 +395,7 @@ def test_execute_parameter_passthrough(self): ("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 %(iter)s", "SELECT ARRAY(1,2,3,4,5)", {"iter": [1, 2, 3, 4, 5]}), ( "SELECT %(datetime)s", "SELECT '2022-02-01 10:23:00.000000'", @@ -471,16 +411,17 @@ def test_execute_parameter_passthrough(self): 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 - ): + def test_executemany_parameter_passhthrough_and_uses_last_result_set(self): # 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()) + # Set is_staging_operation to False to avoid _handle_staging_operation being called + for mock_rs in mock_result_set_instances: + mock_rs.is_staging_operation = False + + mock_backend = ThriftDatabricksClientMockFactory.new() + mock_backend.execute_command.side_effect = mock_result_set_instances + + cursor = client.Cursor(Mock(), mock_backend) params = [{"x": None}, {"x": "foo1"}, {"x": "bar2"}] expected_queries = ["SELECT NULL", "SELECT 'foo1'", "SELECT 'bar2'"] @@ -488,13 +429,13 @@ def test_executemany_parameter_passhthrough_and_uses_last_result_set( cursor.executemany("SELECT %(x)s", seq_of_parameters=params) self.assertEqual( - len(mock_thrift_backend.execute_command.call_args_list), + len(mock_backend.execute_command.call_args_list), len(expected_queries), "Expected execute_command to be called the same number of times as params were passed", ) for expected_query, call_args in zip( - expected_queries, mock_thrift_backend.execute_command.call_args_list + expected_queries, mock_backend.execute_command.call_args_list ): self.assertEqual(call_args[1]["operation"], expected_query) @@ -505,11 +446,6 @@ def test_executemany_parameter_passhthrough_and_uses_last_result_set( "last operation", ) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_commit_a_noop(self, mock_thrift_backend_class): - c = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) - c.commit() - def test_setinputsizes_a_noop(self): cursor = client.Cursor(Mock(), Mock()) cursor.setinputsizes(1) @@ -518,14 +454,8 @@ def test_setoutputsizes_a_noop(self): cursor = client.Cursor(Mock(), Mock()) cursor.setoutputsize(1) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) - def test_rollback_not_supported(self, mock_thrift_backend_class): - c = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) - 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) + @patch("%s.client.ThriftDatabricksClient" % PACKAGE_NAME) def test_row_number_respected(self, mock_thrift_backend_class): def make_fake_row_slice(n_rows): mock_slice = Mock() @@ -536,7 +466,6 @@ def make_fake_row_slice(n_rows): mock_aq = Mock() mock_aq.next_n_rows.side_effect = make_fake_row_slice mock_thrift_backend.execute_command.return_value.arrow_queue = mock_aq - mock_thrift_backend.fetch_results.return_value = (mock_aq, True) cursor = client.Cursor(Mock(), mock_thrift_backend) cursor.execute("foo") @@ -550,7 +479,7 @@ def make_fake_row_slice(n_rows): 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) + @patch("%s.client.ThriftDatabricksClient" % PACKAGE_NAME) def test_disable_pandas_respected(self, mock_thrift_backend_class): mock_thrift_backend = mock_thrift_backend_class.return_value mock_table = Mock() @@ -603,24 +532,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 - - databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) - - # not strictly necessary as the refcount is 0, but just to be sure - gc.collect() - - # Check the close session request has an id of x22 - close_session_id = instance.close_session.call_args[0][0].sessionId - self.assertEqual(close_session_id, b"\x22") - - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) def test_cursor_keeps_connection_alive(self, mock_client_class): instance = mock_client_class.return_value @@ -637,19 +549,23 @@ 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.backend.types.ExecuteResponse" % PACKAGE_NAME) @patch("%s.client.Cursor._handle_staging_operation" % PACKAGE_NAME) - @patch("%s.client.ThriftBackend" % PACKAGE_NAME) + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) def test_staging_operation_response_is_handled( - self, mock_client_class, mock_handle_staging_operation, mock_execute_response + 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( + ThriftDatabricksClientMockFactory.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_client = mock_client_class.return_value + mock_client.execute_command.return_value = Mock(is_staging_operation=True) + mock_client_class.return_value = mock_client connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) cursor = connection.cursor() @@ -658,7 +574,10 @@ def test_staging_operation_response_is_handled( mock_handle_staging_operation.call_count == 1 - @patch("%s.client.ThriftBackend" % PACKAGE_NAME, ThriftBackendMockFactory.new()) + @patch( + "%s.session.ThriftDatabricksClient" % PACKAGE_NAME, + ThriftDatabricksClientMockFactory.new(), + ) def test_access_current_query_id(self): operation_id = "EE6A8778-21FC-438B-92D8-96AC51EE3821" @@ -667,21 +586,547 @@ def test_access_current_query_id(self): self.assertIsNone(cursor.query_id) - cursor.active_op_handle = TOperationHandle( - operationId=THandleIdentifier(guid=UUID(operation_id).bytes, secret=0x00), - operationType=TOperationType.EXECUTE_STATEMENT, + cursor.active_command_id = CommandId.from_thrift_handle( + TOperationHandle( + operationId=THandleIdentifier( + guid=UUID(operation_id).bytes, secret=0x00 + ), + operationType=TOperationType.EXECUTE_STATEMENT, + ) ) self.assertEqual(cursor.query_id.upper(), operation_id.upper()) cursor.close() self.assertIsNone(cursor.query_id) + def test_connection_close_handles_cursor_close_exception(self): + """Test that _close handles exceptions from cursor.close() properly.""" + cursors_closed = [] + + def mock_close_with_exception(): + cursors_closed.append(1) + raise Exception("Test error during close") + + cursor1 = Mock() + cursor1.close = mock_close_with_exception + + def mock_close_normal(): + cursors_closed.append(2) + + cursor2 = Mock() + cursor2.close = mock_close_normal + + mock_backend = Mock() + mock_session_handle = Mock() + + try: + for cursor in [cursor1, cursor2]: + try: + cursor.close() + except Exception: + pass + + mock_backend.close_session(mock_session_handle) + except Exception as e: + self.fail(f"Connection close should handle exceptions: {e}") + + self.assertEqual( + cursors_closed, [1, 2], "Both cursors should have close called" + ) + + +class TransactionTestSuite(unittest.TestCase): + """ + Unit tests for transaction control methods (MST support). + """ + + PACKAGE_NAME = "databricks.sql" + DUMMY_CONNECTION_ARGS = { + "server_hostname": "foo", + "http_path": "dummy_path", + "access_token": "tok", + "enable_telemetry": False, + } + + def _setup_mock_session_with_http_client(self, mock_session): + """ + Helper to configure a mock session with HTTP client mocks. + This prevents feature flag network requests during Connection initialization. + """ + mock_session.host = "foo" + + # Mock HTTP client to prevent feature flag network requests + mock_http_client = Mock() + mock_session.http_client = mock_http_client + + # Mock feature flag response to prevent blocking HTTP calls + mock_ff_response = Mock() + mock_ff_response.status = 200 + mock_ff_response.data = b'{"flags": [], "ttl_seconds": 900}' + mock_http_client.request.return_value = mock_ff_response + + def _create_mock_connection(self, mock_session_class): + """Helper to create a mocked connection for transaction tests.""" + mock_session = Mock() + mock_session.is_open = True + mock_session.guid_hex = "test-session-id" + mock_session.get_autocommit.return_value = True + + self._setup_mock_session_with_http_client(mock_session) + mock_session_class.return_value = mock_session + + # Create connection with ignore_transactions=False to test actual transaction functionality + conn = client.Connection( + ignore_transactions=False, **self.DUMMY_CONNECTION_ARGS + ) + return conn + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_autocommit_getter_returns_cached_value(self, mock_session_class): + """Test that autocommit property returns cached session value by default.""" + conn = self._create_mock_connection(mock_session_class) + + # Get autocommit (should use cached value) + result = conn.autocommit + + conn.session.get_autocommit.assert_called_once() + self.assertTrue(result) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_autocommit_setter_executes_sql(self, mock_session_class): + """Test that setting autocommit executes SET AUTOCOMMIT command.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + with patch.object(conn, "cursor", return_value=mock_cursor): + conn.autocommit = False + + # Verify SQL was executed + mock_cursor.execute.assert_called_once_with("SET AUTOCOMMIT = FALSE") + mock_cursor.close.assert_called_once() + + conn.session.set_autocommit.assert_called_once_with(False) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_autocommit_setter_with_true_value(self, mock_session_class): + """Test setting autocommit to True.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + with patch.object(conn, "cursor", return_value=mock_cursor): + conn.autocommit = True + + mock_cursor.execute.assert_called_once_with("SET AUTOCOMMIT = TRUE") + conn.session.set_autocommit.assert_called_once_with(True) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_autocommit_setter_wraps_database_error(self, mock_session_class): + """Test that autocommit setter wraps DatabaseError in TransactionError.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + server_error = DatabaseError( + "AUTOCOMMIT_SET_DURING_ACTIVE_TRANSACTION", + context={"sql_state": "25000"}, + host_url="test-host", + ) + mock_cursor.execute.side_effect = server_error + + with patch.object(conn, "cursor", return_value=mock_cursor): + with self.assertRaises(TransactionError) as ctx: + conn.autocommit = False + + self.assertIn("Failed to set autocommit", str(ctx.exception)) + self.assertEqual(ctx.exception.context["operation"], "set_autocommit") + self.assertEqual(ctx.exception.context["autocommit_value"], False) + + mock_cursor.close.assert_called_once() + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_autocommit_setter_preserves_exception_chain(self, mock_session_class): + """Test that exception chaining is preserved.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + original_error = DatabaseError("Original error", host_url="test-host") + mock_cursor.execute.side_effect = original_error + + with patch.object(conn, "cursor", return_value=mock_cursor): + with self.assertRaises(TransactionError) as ctx: + conn.autocommit = False + + self.assertEqual(ctx.exception.__cause__, original_error) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_commit_executes_sql(self, mock_session_class): + """Test that commit() executes COMMIT command.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + with patch.object(conn, "cursor", return_value=mock_cursor): + conn.commit() + + mock_cursor.execute.assert_called_once_with("COMMIT") + mock_cursor.close.assert_called_once() + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_commit_wraps_database_error(self, mock_session_class): + """Test that commit() wraps DatabaseError in TransactionError.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + server_error = DatabaseError( + "MULTI_STATEMENT_TRANSACTION_NO_ACTIVE_TRANSACTION", + context={"sql_state": "25000"}, + host_url="test-host", + ) + mock_cursor.execute.side_effect = server_error + + with patch.object(conn, "cursor", return_value=mock_cursor): + with self.assertRaises(TransactionError) as ctx: + conn.commit() + + self.assertIn("Failed to commit", str(ctx.exception)) + self.assertEqual(ctx.exception.context["operation"], "commit") + mock_cursor.close.assert_called_once() + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_commit_on_closed_connection_raises_interface_error( + self, mock_session_class + ): + """Test that commit() on closed connection raises InterfaceError.""" + conn = self._create_mock_connection(mock_session_class) + conn.session.is_open = False + + with self.assertRaises(InterfaceError) as ctx: + conn.commit() + + self.assertIn("Cannot commit on closed connection", str(ctx.exception)) + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_rollback_executes_sql(self, mock_session_class): + """Test that rollback() executes ROLLBACK command.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + with patch.object(conn, "cursor", return_value=mock_cursor): + conn.rollback() + + mock_cursor.execute.assert_called_once_with("ROLLBACK") + mock_cursor.close.assert_called_once() + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_rollback_wraps_database_error(self, mock_session_class): + """Test that rollback() wraps DatabaseError in TransactionError.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + server_error = DatabaseError( + "Unexpected rollback error", + context={"sql_state": "HY000"}, + host_url="test-host", + ) + mock_cursor.execute.side_effect = server_error + + with patch.object(conn, "cursor", return_value=mock_cursor): + with self.assertRaises(TransactionError) as ctx: + conn.rollback() + + self.assertIn("Failed to rollback", str(ctx.exception)) + self.assertEqual(ctx.exception.context["operation"], "rollback") + mock_cursor.close.assert_called_once() + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_rollback_on_closed_connection_raises_interface_error( + self, mock_session_class + ): + """Test that rollback() on closed connection raises InterfaceError.""" + conn = self._create_mock_connection(mock_session_class) + conn.session.is_open = False + + with self.assertRaises(InterfaceError) as ctx: + conn.rollback() + + self.assertIn("Cannot rollback on closed connection", str(ctx.exception)) + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_get_transaction_isolation_returns_repeatable_read( + self, mock_session_class + ): + """Test that get_transaction_isolation() returns REPEATABLE_READ.""" + conn = self._create_mock_connection(mock_session_class) + + result = conn.get_transaction_isolation() + + self.assertEqual(result, "REPEATABLE_READ") + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_get_transaction_isolation_on_closed_connection_raises_interface_error( + self, mock_session_class + ): + """Test that get_transaction_isolation() on closed connection raises InterfaceError.""" + conn = self._create_mock_connection(mock_session_class) + conn.session.is_open = False + + with self.assertRaises(InterfaceError) as ctx: + conn.get_transaction_isolation() + + self.assertIn( + "Cannot get transaction isolation on closed connection", str(ctx.exception) + ) + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_set_transaction_isolation_accepts_repeatable_read( + self, mock_session_class + ): + """Test that set_transaction_isolation() accepts REPEATABLE_READ.""" + conn = self._create_mock_connection(mock_session_class) + + # Should not raise + conn.set_transaction_isolation("REPEATABLE_READ") + conn.set_transaction_isolation("REPEATABLE READ") # With space + conn.set_transaction_isolation("repeatable_read") # Lowercase with underscore + conn.set_transaction_isolation("repeatable read") # Lowercase with space + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_set_transaction_isolation_rejects_other_levels(self, mock_session_class): + """Test that set_transaction_isolation() rejects non-REPEATABLE_READ levels.""" + conn = self._create_mock_connection(mock_session_class) + + with self.assertRaises(NotSupportedError) as ctx: + conn.set_transaction_isolation("READ_COMMITTED") + + self.assertIn("not supported", str(ctx.exception)) + self.assertIn("READ_COMMITTED", str(ctx.exception)) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_set_transaction_isolation_on_closed_connection_raises_interface_error( + self, mock_session_class + ): + """Test that set_transaction_isolation() on closed connection raises InterfaceError.""" + conn = self._create_mock_connection(mock_session_class) + conn.session.is_open = False + + with self.assertRaises(InterfaceError) as ctx: + conn.set_transaction_isolation("REPEATABLE_READ") + + self.assertIn( + "Cannot set transaction isolation on closed connection", str(ctx.exception) + ) + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_fetch_autocommit_from_server_queries_server(self, mock_session_class): + """Test that fetch_autocommit_from_server=True queries server.""" + # Create connection with fetch_autocommit_from_server=True + mock_session = Mock() + mock_session.is_open = True + mock_session.guid_hex = "test-session-id" + + self._setup_mock_session_with_http_client(mock_session) + mock_session_class.return_value = mock_session + + conn = client.Connection( + fetch_autocommit_from_server=True, + ignore_transactions=False, + **self.DUMMY_CONNECTION_ARGS, + ) + + mock_cursor = Mock() + mock_row = Mock() + mock_row.__getitem__ = Mock(return_value="true") + mock_cursor.fetchone.return_value = mock_row + + with patch.object(conn, "cursor", return_value=mock_cursor): + result = conn.autocommit + + mock_cursor.execute.assert_called_once_with("SET AUTOCOMMIT") + mock_cursor.fetchone.assert_called_once() + mock_cursor.close.assert_called_once() + + conn.session.set_autocommit.assert_called_once_with(True) + + self.assertTrue(result) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_fetch_autocommit_from_server_handles_false_value(self, mock_session_class): + """Test that fetch_autocommit_from_server correctly parses false value.""" + mock_session = Mock() + mock_session.is_open = True + mock_session.guid_hex = "test-session-id" + + self._setup_mock_session_with_http_client(mock_session) + mock_session_class.return_value = mock_session + + conn = client.Connection( + fetch_autocommit_from_server=True, + ignore_transactions=False, + **self.DUMMY_CONNECTION_ARGS, + ) + + mock_cursor = Mock() + mock_row = Mock() + mock_row.__getitem__ = Mock(return_value="false") + mock_cursor.fetchone.return_value = mock_row + + with patch.object(conn, "cursor", return_value=mock_cursor): + result = conn.autocommit + + conn.session.set_autocommit.assert_called_once_with(False) + self.assertFalse(result) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_fetch_autocommit_from_server_raises_on_no_result(self, mock_session_class): + """Test that fetch_autocommit_from_server raises error when no result.""" + mock_session = Mock() + mock_session.is_open = True + mock_session.guid_hex = "test-session-id" + + self._setup_mock_session_with_http_client(mock_session) + mock_session_class.return_value = mock_session + + conn = client.Connection( + fetch_autocommit_from_server=True, + ignore_transactions=False, + **self.DUMMY_CONNECTION_ARGS, + ) + + mock_cursor = Mock() + mock_cursor.fetchone.return_value = None + + with patch.object(conn, "cursor", return_value=mock_cursor): + with self.assertRaises(TransactionError) as ctx: + _ = conn.autocommit + + self.assertIn("No result returned", str(ctx.exception)) + mock_cursor.close.assert_called_once() + + conn.close() + + # ==================== IGNORE_TRANSACTIONS TESTS ==================== + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_commit_is_noop_when_ignore_transactions_true(self, mock_session_class): + """Test that commit() is a no-op when ignore_transactions=True.""" + + mock_session = Mock() + mock_session.is_open = True + mock_session.guid_hex = "test-session-id" + + self._setup_mock_session_with_http_client(mock_session) + mock_session_class.return_value = mock_session + + # Create connection with ignore_transactions=True (default) + conn = client.Connection(**self.DUMMY_CONNECTION_ARGS) + + # Verify ignore_transactions is True by default + self.assertTrue(conn.ignore_transactions) + + mock_cursor = Mock() + with patch.object(conn, "cursor", return_value=mock_cursor): + # Call commit - should be no-op + conn.commit() + + # Verify that execute was NOT called (no-op) + mock_cursor.execute.assert_not_called() + mock_cursor.close.assert_not_called() + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_rollback_raises_not_supported_when_ignore_transactions_true( + self, mock_session_class + ): + """Test that rollback() raises NotSupportedError when ignore_transactions=True.""" + + mock_session = Mock() + mock_session.is_open = True + mock_session.guid_hex = "test-session-id" + + self._setup_mock_session_with_http_client(mock_session) + mock_session_class.return_value = mock_session + + # Create connection with ignore_transactions=True (default) + conn = client.Connection(**self.DUMMY_CONNECTION_ARGS) + + # Verify ignore_transactions is True by default + self.assertTrue(conn.ignore_transactions) + + # Call rollback - should raise NotSupportedError + with self.assertRaises(NotSupportedError) as ctx: + conn.rollback() + + self.assertIn("Transactions are not supported", str(ctx.exception)) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_autocommit_setter_is_noop_when_ignore_transactions_true( + self, mock_session_class + ): + """Test that autocommit setter is a no-op when ignore_transactions=True.""" + + mock_session = Mock() + mock_session.is_open = True + mock_session.guid_hex = "test-session-id" + + self._setup_mock_session_with_http_client(mock_session) + mock_session_class.return_value = mock_session + + # Create connection with ignore_transactions=True (default) + conn = client.Connection(**self.DUMMY_CONNECTION_ARGS) + + # Verify ignore_transactions is True by default + self.assertTrue(conn.ignore_transactions) + + mock_cursor = Mock() + with patch.object(conn, "cursor", return_value=mock_cursor): + # Set autocommit - should be no-op + conn.autocommit = False + + # Verify that execute was NOT called (no-op) + mock_cursor.execute.assert_not_called() + mock_cursor.close.assert_not_called() + + # Session set_autocommit should also not be called + conn.session.set_autocommit.assert_not_called() + + conn.close() + if __name__ == "__main__": suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__]) loader = unittest.TestLoader() test_classes = [ ClientTestSuite, + TransactionTestSuite, FetchTests, ThriftBackendTestSuite, ArrowQueueSuite, diff --git a/tests/unit/test_cloud_fetch_queue.py b/tests/unit/test_cloud_fetch_queue.py index 01d8a79b9..97bb99ad9 100644 --- a/tests/unit/test_cloud_fetch_queue.py +++ b/tests/unit/test_cloud_fetch_queue.py @@ -1,13 +1,43 @@ -import pyarrow +try: + import pyarrow +except ImportError: + pyarrow = None import unittest -from unittest.mock import MagicMock, patch +import pytest +from unittest.mock import MagicMock, patch, Mock from databricks.sql.thrift_api.TCLIService.ttypes import TSparkArrowResultLink import databricks.sql.utils as utils from databricks.sql.types import SSLOptions +@pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") class CloudFetchQueueSuite(unittest.TestCase): + def create_queue(self, schema_bytes=None, result_links=None, description=None, **kwargs): + """Helper method to create ThriftCloudFetchQueue with sensible defaults""" + # Set up defaults for commonly used parameters + defaults = { + 'max_download_threads': 10, + 'ssl_options': SSLOptions(), + 'session_id_hex': Mock(), + 'statement_id': Mock(), + 'chunk_id': 0, + 'start_row_offset': 0, + 'lz4_compressed': True, + } + + # Override defaults with any provided kwargs + defaults.update(kwargs) + + mock_http_client = MagicMock() + return utils.ThriftCloudFetchQueue( + schema_bytes=schema_bytes or MagicMock(), + result_links=result_links or [], + description=description or [], + http_client=mock_http_client, + **defaults + ) + def create_result_link( self, file_link: str = "fileLink", @@ -47,18 +77,13 @@ def get_schema_bytes(): return sink.getvalue().to_pybytes() @patch( - "databricks.sql.utils.CloudFetchQueue._create_next_table", + "databricks.sql.utils.ThriftCloudFetchQueue._create_next_table", return_value=[None, None], ) def test_initializer_adds_links(self, mock_create_next_table): schema_bytes = MagicMock() result_links = self.create_result_links(10) - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=result_links, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, result_links=result_links) assert len(queue.download_manager._pending_links) == 10 assert len(queue.download_manager._download_tasks) == 0 @@ -66,13 +91,7 @@ def test_initializer_adds_links(self, mock_create_next_table): def test_initializer_no_links_to_add(self): schema_bytes = MagicMock() - result_links = [] - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=result_links, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, result_links=[]) assert len(queue.download_manager._pending_links) == 0 assert len(queue.download_manager._download_tasks) == 0 @@ -83,12 +102,7 @@ def test_initializer_no_links_to_add(self): return_value=None, ) def test_create_next_table_no_download(self, mock_get_next_downloaded_file): - queue = utils.CloudFetchQueue( - MagicMock(), - result_links=[], - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=MagicMock(), result_links=[]) assert queue._create_next_table() is None mock_get_next_downloaded_file.assert_called_with(0) @@ -103,13 +117,7 @@ def test_initializer_create_next_table_success( ): mock_create_arrow_table.return_value = self.make_arrow_table() schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) expected_result = self.make_arrow_table() mock_get_next_downloaded_file.assert_called_with(0) @@ -124,17 +132,11 @@ def test_initializer_create_next_table_success( assert table.num_rows == 4 assert queue.start_row_index == 8 - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table") + @patch("databricks.sql.utils.ThriftCloudFetchQueue._create_next_table") def test_next_n_rows_0_rows(self, mock_create_next_table): mock_create_next_table.return_value = self.make_arrow_table() schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table == self.make_arrow_table() assert queue.table.num_rows == 4 assert queue.table_row_index == 0 @@ -142,19 +144,12 @@ def test_next_n_rows_0_rows(self, mock_create_next_table): result = queue.next_n_rows(0) assert result.num_rows == 0 assert queue.table_row_index == 0 - assert result == self.make_arrow_table()[0:0] - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table") + @patch("databricks.sql.utils.ThriftCloudFetchQueue._create_next_table") def test_next_n_rows_partial_table(self, mock_create_next_table): mock_create_next_table.return_value = self.make_arrow_table() schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table == self.make_arrow_table() assert queue.table.num_rows == 4 assert queue.table_row_index == 0 @@ -164,17 +159,11 @@ def test_next_n_rows_partial_table(self, mock_create_next_table): assert queue.table_row_index == 3 assert result == self.make_arrow_table()[:3] - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table") + @patch("databricks.sql.utils.ThriftCloudFetchQueue._create_next_table") def test_next_n_rows_more_than_one_table(self, mock_create_next_table): mock_create_next_table.return_value = self.make_arrow_table() schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table == self.make_arrow_table() assert queue.table.num_rows == 4 assert queue.table_row_index == 0 @@ -185,21 +174,15 @@ def test_next_n_rows_more_than_one_table(self, mock_create_next_table): assert ( result == pyarrow.concat_tables( - [self.make_arrow_table(), self.make_arrow_table()] + [self.make_arrow_table(), self.make_arrow_table()],promote_options="default" )[:7] ) - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table") + @patch("databricks.sql.utils.ThriftCloudFetchQueue._create_next_table") def test_next_n_rows_only_one_table_returned(self, mock_create_next_table): mock_create_next_table.side_effect = [self.make_arrow_table(), None] schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table == self.make_arrow_table() assert queue.table.num_rows == 4 assert queue.table_row_index == 0 @@ -208,34 +191,26 @@ def test_next_n_rows_only_one_table_returned(self, mock_create_next_table): assert result.num_rows == 4 assert result == self.make_arrow_table() - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table", return_value=None) + @patch( + "databricks.sql.utils.ThriftCloudFetchQueue._create_next_table", + return_value=None, + ) def test_next_n_rows_empty_table(self, mock_create_next_table): schema_bytes = self.get_schema_bytes() - description = MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + # Create description that matches the 4-column schema + description = [("col0", "uint32"), ("col1", "uint32"), ("col2", "uint32"), ("col3", "uint32")] + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table is None result = queue.next_n_rows(100) mock_create_next_table.assert_called() assert result == pyarrow.ipc.open_stream(bytearray(schema_bytes)).read_all() - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table") + @patch("databricks.sql.utils.ThriftCloudFetchQueue._create_next_table") def test_remaining_rows_empty_table_fully_returned(self, mock_create_next_table): mock_create_next_table.side_effect = [self.make_arrow_table(), None, 0] schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table == self.make_arrow_table() assert queue.table.num_rows == 4 queue.table_row_index = 4 @@ -244,17 +219,11 @@ def test_remaining_rows_empty_table_fully_returned(self, mock_create_next_table) assert result.num_rows == 0 assert result == self.make_arrow_table()[0:0] - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table") + @patch("databricks.sql.utils.ThriftCloudFetchQueue._create_next_table") def test_remaining_rows_partial_table_fully_returned(self, mock_create_next_table): mock_create_next_table.side_effect = [self.make_arrow_table(), None] schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table == self.make_arrow_table() assert queue.table.num_rows == 4 queue.table_row_index = 2 @@ -263,17 +232,11 @@ def test_remaining_rows_partial_table_fully_returned(self, mock_create_next_tabl assert result.num_rows == 2 assert result == self.make_arrow_table()[2:] - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table") + @patch("databricks.sql.utils.ThriftCloudFetchQueue._create_next_table") def test_remaining_rows_one_table_fully_returned(self, mock_create_next_table): mock_create_next_table.side_effect = [self.make_arrow_table(), None] schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table == self.make_arrow_table() assert queue.table.num_rows == 4 assert queue.table_row_index == 0 @@ -282,7 +245,7 @@ def test_remaining_rows_one_table_fully_returned(self, mock_create_next_table): assert result.num_rows == 4 assert result == self.make_arrow_table() - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table") + @patch("databricks.sql.utils.ThriftCloudFetchQueue._create_next_table") def test_remaining_rows_multiple_tables_fully_returned( self, mock_create_next_table ): @@ -292,13 +255,7 @@ def test_remaining_rows_multiple_tables_fully_returned( None, ] schema_bytes, description = MagicMock(), MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table == self.make_arrow_table() assert queue.table.num_rows == 4 queue.table_row_index = 3 @@ -309,21 +266,19 @@ def test_remaining_rows_multiple_tables_fully_returned( assert ( result == pyarrow.concat_tables( - [self.make_arrow_table(), self.make_arrow_table()] + [self.make_arrow_table(), self.make_arrow_table()], promote_options="default" )[3:] ) - @patch("databricks.sql.utils.CloudFetchQueue._create_next_table", return_value=None) + @patch( + "databricks.sql.utils.ThriftCloudFetchQueue._create_next_table", + return_value=None, + ) def test_remaining_rows_empty_table(self, mock_create_next_table): schema_bytes = self.get_schema_bytes() - description = MagicMock() - queue = utils.CloudFetchQueue( - schema_bytes, - result_links=[], - description=description, - max_download_threads=10, - ssl_options=SSLOptions(), - ) + # Create description that matches the 4-column schema + description = [("col0", "uint32"), ("col1", "uint32"), ("col2", "uint32"), ("col3", "uint32")] + queue = self.create_queue(schema_bytes=schema_bytes, description=description) assert queue.table is None result = queue.remaining_rows() diff --git a/tests/unit/test_download_manager.py b/tests/unit/test_download_manager.py index 64edbdebe..1c77226a9 100644 --- a/tests/unit/test_download_manager.py +++ b/tests/unit/test_download_manager.py @@ -1,5 +1,5 @@ import unittest -from unittest.mock import patch, MagicMock +from unittest.mock import patch, MagicMock, Mock import databricks.sql.cloudfetch.download_manager as download_manager from databricks.sql.types import SSLOptions @@ -14,11 +14,16 @@ class DownloadManagerTests(unittest.TestCase): def create_download_manager( self, links, max_download_threads=10, lz4_compressed=True ): + mock_http_client = MagicMock() return download_manager.ResultFileDownloadManager( links, max_download_threads, lz4_compressed, ssl_options=SSLOptions(), + session_id_hex=Mock(), + statement_id=Mock(), + chunk_id=0, + http_client=mock_http_client, ) def create_result_link( diff --git a/tests/unit/test_downloader.py b/tests/unit/test_downloader.py index 2a3b715b5..00b1b849a 100644 --- a/tests/unit/test_downloader.py +++ b/tests/unit/test_downloader.py @@ -1,6 +1,5 @@ import unittest -from unittest.mock import Mock, patch, MagicMock - +from unittest.mock import patch, MagicMock, Mock import requests import databricks.sql.cloudfetch.downloader as downloader @@ -8,11 +7,13 @@ from databricks.sql.types import SSLOptions -def create_response(**kwargs) -> requests.Response: - result = requests.Response() +def create_mock_response(**kwargs): + """Create a mock response object for testing""" + mock_response = MagicMock() for k, v in kwargs.items(): - setattr(result, k, v) - return result + setattr(mock_response, k, v) + mock_response.close = Mock() + return mock_response class DownloaderTests(unittest.TestCase): @@ -20,14 +21,45 @@ class DownloaderTests(unittest.TestCase): Unit tests for checking downloader logic. """ + def _setup_mock_http_response(self, mock_http_client, status=200, data=b""): + """Helper method to setup mock HTTP client with response context manager.""" + mock_response = MagicMock() + mock_response.status = status + mock_response.data = data + mock_context_manager = MagicMock() + mock_context_manager.__enter__.return_value = mock_response + mock_context_manager.__exit__.return_value = None + mock_http_client.request_context.return_value = mock_context_manager + return mock_response + + def _setup_time_mock_for_download(self, mock_time, end_time): + """Helper to setup time mock that handles logging system calls.""" + call_count = [0] + + def time_side_effect(): + call_count[0] += 1 + if call_count[0] <= 2: # First two calls (validation, start_time) + return 1000 + else: # All subsequent calls (logging, duration calculation) + return end_time + + mock_time.side_effect = time_side_effect + @patch("time.time", return_value=1000) def test_run_link_expired(self, mock_time): + mock_http_client = MagicMock() settings = Mock() result_link = Mock() # Already expired result_link.expiryTime = 999 d = downloader.ResultSetDownloadHandler( - settings, result_link, ssl_options=SSLOptions() + settings, + result_link, + ssl_options=SSLOptions(), + chunk_id=0, + session_id_hex=Mock(), + statement_id=Mock(), + http_client=mock_http_client, ) with self.assertRaises(Error) as context: @@ -38,12 +70,19 @@ def test_run_link_expired(self, mock_time): @patch("time.time", return_value=1000) def test_run_link_past_expiry_buffer(self, mock_time): + mock_http_client = MagicMock() settings = Mock(link_expiry_buffer_secs=5) result_link = Mock() # Within the expiry buffer time result_link.expiryTime = 1004 d = downloader.ResultSetDownloadHandler( - settings, result_link, ssl_options=SSLOptions() + settings, + result_link, + ssl_options=SSLOptions(), + chunk_id=0, + session_id_hex=Mock(), + statement_id=Mock(), + http_client=mock_http_client, ) with self.assertRaises(Error) as context: @@ -52,91 +91,134 @@ def test_run_link_past_expiry_buffer(self, mock_time): mock_time.assert_called_once() - @patch("requests.Session", return_value=MagicMock(get=MagicMock(return_value=None))) @patch("time.time", return_value=1000) - def test_run_get_response_not_ok(self, mock_time, mock_session): - mock_session.return_value.get.return_value = create_response(status_code=404) - + def test_run_get_response_not_ok(self, mock_time): + mock_http_client = MagicMock() settings = Mock(link_expiry_buffer_secs=0, download_timeout=0) settings.download_timeout = 0 settings.use_proxy = False result_link = Mock(expiryTime=1001) + # Setup mock HTTP response using helper method + self._setup_mock_http_response(mock_http_client, status=404, data=b"1234") + d = downloader.ResultSetDownloadHandler( - settings, result_link, ssl_options=SSLOptions() + settings, + result_link, + ssl_options=SSLOptions(), + chunk_id=0, + session_id_hex=Mock(), + statement_id=Mock(), + http_client=mock_http_client, ) - with self.assertRaises(requests.exceptions.HTTPError) as context: + with self.assertRaises(Exception) as context: d.run() self.assertTrue("404" in str(context.exception)) - @patch("requests.Session", return_value=MagicMock(get=MagicMock(return_value=None))) - @patch("time.time", return_value=1000) - def test_run_uncompressed_successful(self, mock_time, mock_session): - file_bytes = b"1234567890" * 10 - mock_session.return_value.get.return_value = create_response( - status_code=200, _content=file_bytes - ) + @patch("time.time") + def test_run_uncompressed_successful(self, mock_time): + self._setup_time_mock_for_download(mock_time, 1000.5) + mock_http_client = MagicMock() + file_bytes = b"1234567890" * 10 settings = Mock(link_expiry_buffer_secs=0, download_timeout=0, use_proxy=False) settings.is_lz4_compressed = False - result_link = Mock(bytesNum=100, expiryTime=1001) - - d = downloader.ResultSetDownloadHandler( - settings, result_link, ssl_options=SSLOptions() - ) - file = d.run() - - assert file.file_bytes == b"1234567890" * 10 - - @patch( - "requests.Session", - return_value=MagicMock(get=MagicMock(return_value=MagicMock(ok=True))), - ) - @patch("time.time", return_value=1000) - def test_run_compressed_successful(self, mock_time, mock_session): + settings.min_cloudfetch_download_speed = 1.0 + result_link = Mock(expiryTime=1001, bytesNum=len(file_bytes)) + result_link.fileLink = "https://s3.amazonaws.com/bucket/file.arrow?token=xyz789" + + # Setup mock HTTP response using helper method + self._setup_mock_http_response(mock_http_client, status=200, data=file_bytes) + + # Patch the log metrics method to avoid division by zero + with patch.object(downloader.ResultSetDownloadHandler, '_log_download_metrics'): + d = downloader.ResultSetDownloadHandler( + settings, + result_link, + ssl_options=SSLOptions(), + chunk_id=0, + session_id_hex=Mock(), + statement_id=Mock(), + http_client=mock_http_client, + ) + file = d.run() + self.assertEqual(file.file_bytes, file_bytes) + self.assertEqual(file.start_row_offset, result_link.startRowOffset) + self.assertEqual(file.row_count, result_link.rowCount) + + @patch("time.time") + def test_run_compressed_successful(self, mock_time): + self._setup_time_mock_for_download(mock_time, 1000.2) + + mock_http_client = MagicMock() file_bytes = b"1234567890" * 10 compressed_bytes = b'\x04"M\x18h@d\x00\x00\x00\x00\x00\x00\x00#\x14\x00\x00\x00\xaf1234567890\n\x00BP67890\x00\x00\x00\x00' - mock_session.return_value.get.return_value = create_response( - status_code=200, _content=compressed_bytes - ) - settings = Mock(link_expiry_buffer_secs=0, download_timeout=0, use_proxy=False) settings.is_lz4_compressed = True - result_link = Mock(bytesNum=100, expiryTime=1001) + settings.min_cloudfetch_download_speed = 1.0 + result_link = Mock(expiryTime=1001, bytesNum=len(file_bytes)) + result_link.fileLink = "https://s3.amazonaws.com/bucket/file.arrow?token=xyz789" + + # Setup mock HTTP response using helper method + self._setup_mock_http_response(mock_http_client, status=200, data=compressed_bytes) + + # Mock the decompression method and log metrics to avoid issues + with patch.object(downloader.ResultSetDownloadHandler, '_decompress_data', return_value=file_bytes), \ + patch.object(downloader.ResultSetDownloadHandler, '_log_download_metrics'): + d = downloader.ResultSetDownloadHandler( + settings, + result_link, + ssl_options=SSLOptions(), + chunk_id=0, + session_id_hex=Mock(), + statement_id=Mock(), + http_client=mock_http_client, + ) + file = d.run() + self.assertEqual(file.file_bytes, file_bytes) + self.assertEqual(file.start_row_offset, result_link.startRowOffset) + self.assertEqual(file.row_count, result_link.rowCount) - d = downloader.ResultSetDownloadHandler( - settings, result_link, ssl_options=SSLOptions() - ) - file = d.run() - - assert file.file_bytes == b"1234567890" * 10 - - @patch("requests.Session.get", side_effect=ConnectionError("foo")) @patch("time.time", return_value=1000) - def test_download_connection_error(self, mock_time, mock_session): + def test_download_connection_error(self, mock_time): + mock_http_client = MagicMock() settings = Mock( link_expiry_buffer_secs=0, use_proxy=False, is_lz4_compressed=True ) result_link = Mock(bytesNum=100, expiryTime=1001) - mock_session.return_value.get.return_value.content = b'\x04"M\x18h@d\x00\x00\x00\x00\x00\x00\x00#\x14\x00\x00\x00\xaf1234567890\n\x00BP67890\x00\x00\x00\x00' + + mock_http_client.request_context.side_effect = ConnectionError("foo") d = downloader.ResultSetDownloadHandler( - settings, result_link, ssl_options=SSLOptions() + settings, + result_link, + ssl_options=SSLOptions(), + chunk_id=0, + session_id_hex=Mock(), + statement_id=Mock(), + http_client=mock_http_client, ) with self.assertRaises(ConnectionError): d.run() - @patch("requests.Session.get", side_effect=TimeoutError("foo")) @patch("time.time", return_value=1000) - def test_download_timeout(self, mock_time, mock_session): + def test_download_timeout(self, mock_time): + mock_http_client = MagicMock() settings = Mock( link_expiry_buffer_secs=0, use_proxy=False, is_lz4_compressed=True ) result_link = Mock(bytesNum=100, expiryTime=1001) - mock_session.return_value.get.return_value.content = b'\x04"M\x18h@d\x00\x00\x00\x00\x00\x00\x00#\x14\x00\x00\x00\xaf1234567890\n\x00BP67890\x00\x00\x00\x00' + + mock_http_client.request_context.side_effect = TimeoutError("foo") d = downloader.ResultSetDownloadHandler( - settings, result_link, ssl_options=SSLOptions() + settings, + result_link, + ssl_options=SSLOptions(), + chunk_id=0, + session_id_hex=Mock(), + statement_id=Mock(), + http_client=mock_http_client, ) with self.assertRaises(TimeoutError): d.run() diff --git a/tests/unit/test_fetches.py b/tests/unit/test_fetches.py index 89cedcfae..7a0706838 100644 --- a/tests/unit/test_fetches.py +++ b/tests/unit/test_fetches.py @@ -1,12 +1,20 @@ import unittest +import pytest from unittest.mock import Mock -import pyarrow as pa +try: + import pyarrow as pa +except ImportError: + pa = None import databricks.sql.client as client -from databricks.sql.utils import ExecuteResponse, ArrowQueue +from databricks.sql.backend.types import ExecuteResponse +from databricks.sql.utils import ArrowQueue +from databricks.sql.backend.thrift_backend import ThriftDatabricksClient +from databricks.sql.result_set import ThriftResultSet +@pytest.mark.skipif(pa is None, reason="PyArrow is not installed") class FetchTests(unittest.TestCase): """ Unit tests for checking the fetch logic. @@ -32,26 +40,30 @@ def make_dummy_result_set_from_initial_results(initial_results): # If the initial results have been set, then we should never try and fetch more schema, arrow_table = FetchTests.make_arrow_table(initial_results) arrow_queue = ArrowQueue(arrow_table, len(initial_results), 0) - rs = client.ResultSet( + + # Create a mock backend that will return the queue when _fill_results_buffer is called + mock_thrift_backend = Mock(spec=ThriftDatabricksClient) + mock_thrift_backend.fetch_results.return_value = (arrow_queue, False, 0) + + num_cols = len(initial_results[0]) if initial_results else 0 + description = [ + (f"col{col_id}", "integer", None, None, None, None, None) + for col_id in range(num_cols) + ] + + rs = ThriftResultSet( connection=Mock(), - thrift_backend=None, execute_response=ExecuteResponse( + command_id=None, status=None, has_been_closed_server_side=True, - has_more_rows=False, - description=Mock(), - lz4_compressed=Mock(), - command_handle=None, - arrow_queue=arrow_queue, - arrow_schema_bytes=schema.serialize().to_pybytes(), + description=description, + lz4_compressed=True, is_staging_operation=False, ), + thrift_client=mock_thrift_backend, + t_row_set=None, ) - num_cols = len(initial_results[0]) if initial_results else 0 - rs.description = [ - (f"col{col_id}", "integer", None, None, None, None, None) - for col_id in range(num_cols) - ] return rs @staticmethod @@ -59,7 +71,7 @@ def make_dummy_result_set_from_batch_list(batch_list): batch_index = 0 def fetch_results( - op_handle, + command_id, max_rows, max_bytes, expected_row_start_offset, @@ -67,34 +79,34 @@ def fetch_results( arrow_schema_bytes, description, use_cloud_fetch=True, + chunk_id=0, ): nonlocal batch_index results = FetchTests.make_arrow_queue(batch_list[batch_index]) batch_index += 1 - return results, batch_index < len(batch_list) + return results, batch_index < len(batch_list), 0 - mock_thrift_backend = Mock() + mock_thrift_backend = Mock(spec=ThriftDatabricksClient) mock_thrift_backend.fetch_results = fetch_results num_cols = len(batch_list[0][0]) if batch_list and batch_list[0] else 0 - rs = client.ResultSet( + description = [ + (f"col{col_id}", "integer", None, None, None, None, None) + for col_id in range(num_cols) + ] + + rs = ThriftResultSet( connection=Mock(), - thrift_backend=mock_thrift_backend, execute_response=ExecuteResponse( + command_id=None, status=None, has_been_closed_server_side=False, - has_more_rows=True, - description=[ - (f"col{col_id}", "integer", None, None, None, None, None) - for col_id in range(num_cols) - ], - lz4_compressed=Mock(), - command_handle=None, - arrow_queue=None, - arrow_schema_bytes=None, + description=description, + lz4_compressed=True, is_staging_operation=False, ), + thrift_client=mock_thrift_backend, ) return rs diff --git a/tests/unit/test_fetches_bench.py b/tests/unit/test_fetches_bench.py index 9382c3b3c..1d485ea61 100644 --- a/tests/unit/test_fetches_bench.py +++ b/tests/unit/test_fetches_bench.py @@ -1,15 +1,20 @@ import unittest from unittest.mock import Mock -import pyarrow as pa +try: + import pyarrow as pa +except ImportError: + pa = None import uuid import time import pytest import databricks.sql.client as client -from databricks.sql.utils import ExecuteResponse, ArrowQueue +from databricks.sql.backend.types import ExecuteResponse +from databricks.sql.utils import ArrowQueue +@pytest.mark.skipif(pa is None, reason="PyArrow is not installed") class FetchBenchmarkTests(unittest.TestCase): """ Micro benchmark test for Arrow result handling. @@ -27,15 +32,14 @@ def make_dummy_result_set_from_initial_results(arrow_table): arrow_queue = ArrowQueue(arrow_table, arrow_table.num_rows, 0) rs = client.ResultSet( connection=None, - thrift_backend=None, + backend=None, execute_response=ExecuteResponse( status=None, has_been_closed_server_side=True, has_more_rows=False, description=Mock(), - command_handle=None, - arrow_queue=arrow_queue, - arrow_schema=arrow_table.schema, + command_id=None, + arrow_schema_bytes=arrow_table.schema, ), ) rs.description = [ diff --git a/tests/unit/test_filters.py b/tests/unit/test_filters.py new file mode 100644 index 000000000..4efe51f3e --- /dev/null +++ b/tests/unit/test_filters.py @@ -0,0 +1,157 @@ +""" +Tests for the ResultSetFilter class. +""" + +import unittest +from unittest.mock import MagicMock, patch + +from databricks.sql.backend.sea.utils.filters import ResultSetFilter + + +class TestResultSetFilter(unittest.TestCase): + """Tests for the ResultSetFilter class.""" + + def setUp(self): + """Set up test fixtures.""" + # Create a mock SeaResultSet + self.mock_sea_result_set = MagicMock() + + # Set up the remaining_rows method on the results attribute + self.mock_sea_result_set.results = MagicMock() + self.mock_sea_result_set.results.remaining_rows.return_value = [ + ["catalog1", "schema1", "table1", "owner1", "2023-01-01", "TABLE", ""], + ["catalog1", "schema1", "table2", "owner1", "2023-01-01", "VIEW", ""], + [ + "catalog1", + "schema1", + "table3", + "owner1", + "2023-01-01", + "SYSTEM TABLE", + "", + ], + [ + "catalog1", + "schema1", + "table4", + "owner1", + "2023-01-01", + "EXTERNAL TABLE", + "", + ], + ] + + # Set up the connection and other required attributes + self.mock_sea_result_set.connection = MagicMock() + self.mock_sea_result_set.backend = MagicMock() + self.mock_sea_result_set.buffer_size_bytes = 1000 + self.mock_sea_result_set.arraysize = 100 + self.mock_sea_result_set.statement_id = "test-statement-id" + self.mock_sea_result_set.lz4_compressed = False + + # Create a mock CommandId + from databricks.sql.backend.types import CommandId, BackendType + + mock_command_id = CommandId(BackendType.SEA, "test-statement-id") + self.mock_sea_result_set.command_id = mock_command_id + + self.mock_sea_result_set.status = MagicMock() + self.mock_sea_result_set.description = [ + ("catalog_name", "string", None, None, None, None, True), + ("schema_name", "string", None, None, None, None, True), + ("table_name", "string", None, None, None, None, True), + ("owner", "string", None, None, None, None, True), + ("creation_time", "string", None, None, None, None, True), + ("table_type", "string", None, None, None, None, True), + ("remarks", "string", None, None, None, None, True), + ] + self.mock_sea_result_set.has_been_closed_server_side = False + self.mock_sea_result_set._arrow_schema_bytes = None + + def test__filter_json_result_set(self): + """Test filtering by column values with various options.""" + # Case 1: Case-sensitive filtering + allowed_values = ["table1", "table3"] + + with patch( + "databricks.sql.backend.sea.utils.filters.isinstance", return_value=True + ): + with patch( + "databricks.sql.backend.sea.result_set.SeaResultSet" + ) as mock_sea_result_set_class: + mock_instance = MagicMock() + mock_sea_result_set_class.return_value = mock_instance + + # Call _filter_json_result_set on the table_name column (index 2) + result = ResultSetFilter._filter_json_result_set( + self.mock_sea_result_set, 2, allowed_values, case_sensitive=True + ) + + # Verify the filter was applied correctly + mock_sea_result_set_class.assert_called_once() + + # Check the filtered data passed to the constructor + args, kwargs = mock_sea_result_set_class.call_args + result_data = kwargs.get("result_data") + self.assertIsNotNone(result_data) + self.assertEqual(len(result_data.data), 2) + self.assertIn(result_data.data[0][2], allowed_values) + self.assertIn(result_data.data[1][2], allowed_values) + + # Case 2: Case-insensitive filtering + mock_sea_result_set_class.reset_mock() + with patch( + "databricks.sql.backend.sea.utils.filters.isinstance", return_value=True + ): + with patch( + "databricks.sql.backend.sea.result_set.SeaResultSet" + ) as mock_sea_result_set_class: + mock_instance = MagicMock() + mock_sea_result_set_class.return_value = mock_instance + + # Call _filter_json_result_set with case-insensitive matching + result = ResultSetFilter._filter_json_result_set( + self.mock_sea_result_set, + 2, + ["TABLE1", "TABLE3"], + case_sensitive=False, + ) + mock_sea_result_set_class.assert_called_once() + + def test_filter_tables_by_type(self): + """Test filtering tables by type with various options.""" + # Case 1: Specific table types + table_types = ["TABLE", "VIEW"] + + # Mock results as JsonQueue (not CloudFetchQueue or ArrowQueue) + from databricks.sql.backend.sea.queue import JsonQueue + + self.mock_sea_result_set.results = JsonQueue([]) + + with patch.object(ResultSetFilter, "_filter_json_result_set") as mock_filter: + ResultSetFilter.filter_tables_by_type(self.mock_sea_result_set, table_types) + args, kwargs = mock_filter.call_args + self.assertEqual(args[0], self.mock_sea_result_set) + self.assertEqual(kwargs.get("column_index"), 5) # Table type column index + self.assertEqual(kwargs.get("allowed_values"), table_types) + self.assertEqual(kwargs.get("case_sensitive"), True) + + # Case 2: Default table types (None or empty list) + with patch.object(ResultSetFilter, "_filter_json_result_set") as mock_filter: + # Test with None + ResultSetFilter.filter_tables_by_type(self.mock_sea_result_set, None) + args, kwargs = mock_filter.call_args + self.assertEqual( + kwargs.get("allowed_values"), ["TABLE", "VIEW", "SYSTEM TABLE"] + ) + + # Test with empty list + ResultSetFilter.filter_tables_by_type(self.mock_sea_result_set, []) + args, kwargs = mock_filter.call_args + self.assertEqual( + kwargs.get("allowed_values"), ["TABLE", "VIEW", "SYSTEM TABLE"] + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/unit/test_param_escaper.py b/tests/unit/test_param_escaper.py index 925fcea58..9b6b9c246 100644 --- a/tests/unit/test_param_escaper.py +++ b/tests/unit/test_param_escaper.py @@ -120,24 +120,38 @@ def test_escape_date(self): 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]) == "ARRAY(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]) == "ARRAY(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')" + == "ARRAY('his','name','was','robert','palmer')" ) def test_escape_sequence_sequence_of_strings(self): - # This is not valid SQL. INPUT = [["his", "name"], ["was", "robert"], ["palmer"]] - OUTPUT = "(('his','name'),('was','robert'),('palmer'))" + OUTPUT = "ARRAY(ARRAY('his','name'),ARRAY('was','robert'),ARRAY('palmer'))" assert pe.escape_sequence(INPUT) == OUTPUT + def test_escape_map_string_int(self): + INPUT = {"a": 1, "b": 2} + OUTPUT = "MAP('a',1,'b',2)" + assert pe.escape_mapping(INPUT) == OUTPUT + + def test_escape_map_string_sequence_of_floats(self): + INPUT = {"a": [1.1, 2.2, 3.3], "b": [4.4, 5.5, 6.6]} + OUTPUT = "MAP('a',ARRAY(1.1,2.2,3.3),'b',ARRAY(4.4,5.5,6.6))" + assert pe.escape_mapping(INPUT) == OUTPUT + + def test_escape_sequence_of_map_int_string(self): + INPUT = [{1: "a", 2: "foo"}, {3: "b", 4: "bar"}] + OUTPUT = "ARRAY(MAP(1,'a',2,'foo'),MAP(3,'b',4,'bar'))" + assert pe.escape_sequence(INPUT) == OUTPUT + class TestFullQueryEscaping(object): def test_simple(self): diff --git a/tests/unit/test_parameters.py b/tests/unit/test_parameters.py index eec921e4d..0588eb499 100644 --- a/tests/unit/test_parameters.py +++ b/tests/unit/test_parameters.py @@ -21,10 +21,15 @@ TimestampParameter, TinyIntParameter, VoidParameter, + MapParameter, + ArrayParameter, ) +from databricks.sql.backend.types import SessionId from databricks.sql.parameters.native import ( TDbsqlParameter, + TSparkParameter, TSparkParameterValue, + TSparkParameterValueArg, dbsql_parameter_from_primitive, ) from databricks.sql.thrift_api.TCLIService import ttypes @@ -42,7 +47,10 @@ class TestSessionHandleChecks(object): ( TOpenSessionResp( serverProtocolVersion=ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V7, - sessionHandle=TSessionHandle(1, None), + sessionHandle=TSessionHandle( + sessionId=ttypes.THandleIdentifier(guid=0x36, secret=0x37), + serverProtocolVersion=None, + ), ), ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V7, ), @@ -51,7 +59,8 @@ class TestSessionHandleChecks(object): TOpenSessionResp( serverProtocolVersion=ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V7, sessionHandle=TSessionHandle( - 1, ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8 + sessionId=ttypes.THandleIdentifier(guid=0x36, secret=0x37), + serverProtocolVersion=ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8, ), ), ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V8, @@ -112,6 +121,8 @@ class Primitive(Enum): DOUBLE = 3.14 FLOAT = 3.15 SMALLINT = 51 + ARRAY = [1, 2, 3] + MAP = {"a": 1, "b": 2} class TestDbsqlParameter: @@ -131,6 +142,8 @@ class TestDbsqlParameter: (TimestampParameter, Primitive.TIMESTAMP, "TIMESTAMP"), (TimestampNTZParameter, Primitive.TIMESTAMP, "TIMESTAMP_NTZ"), (TinyIntParameter, Primitive.INT, "TINYINT"), + (MapParameter, Primitive.MAP, "MAP"), + (ArrayParameter, Primitive.ARRAY, "ARRAY"), ), ) def test_cast_expression( @@ -166,6 +179,99 @@ def test_tspark_param_value(self, t: TDbsqlParameter, prim): else: assert output == TSparkParameterValue(stringValue=str(prim.value)) + @pytest.mark.parametrize( + "base_type,input,expected_output", + [ + ( + ArrayParameter, + [1, 2, 3], + TSparkParameter( + ordinal=True, + name=None, + type="ARRAY", + value=None, + arguments=[ + TSparkParameterValueArg(type="INT", value="1", arguments=None), + TSparkParameterValueArg(type="INT", value="2", arguments=None), + TSparkParameterValueArg(type="INT", value="3", arguments=None), + ], + ), + ), + ( + MapParameter, + {"a": 1, "b": 2}, + TSparkParameter( + ordinal=True, + name=None, + type="MAP", + value=None, + arguments=[ + TSparkParameterValueArg( + type="STRING", value="a", arguments=None + ), + TSparkParameterValueArg(type="INT", value="1", arguments=None), + TSparkParameterValueArg( + type="STRING", value="b", arguments=None + ), + TSparkParameterValueArg(type="INT", value="2", arguments=None), + ], + ), + ), + ( + ArrayParameter, + [{"a": 1, "b": 2}, {"c": 3, "d": 4}], + TSparkParameter( + ordinal=True, + name=None, + type="ARRAY", + value=None, + arguments=[ + TSparkParameterValueArg( + type="MAP", + value=None, + arguments=[ + TSparkParameterValueArg( + type="STRING", value="a", arguments=None + ), + TSparkParameterValueArg( + type="INT", value="1", arguments=None + ), + TSparkParameterValueArg( + type="STRING", value="b", arguments=None + ), + TSparkParameterValueArg( + type="INT", value="2", arguments=None + ), + ], + ), + TSparkParameterValueArg( + type="MAP", + value=None, + arguments=[ + TSparkParameterValueArg( + type="STRING", value="c", arguments=None + ), + TSparkParameterValueArg( + type="INT", value="3", arguments=None + ), + TSparkParameterValueArg( + type="STRING", value="d", arguments=None + ), + TSparkParameterValueArg( + type="INT", value="4", arguments=None + ), + ], + ), + ], + ), + ), + ], + ) + def test_complex_type_tspark_param(self, base_type, input, expected_output): + p = base_type(input) + tsp = p.as_tspark_param() + assert tsp == expected_output + def test_tspark_param_named(self): p = dbsql_parameter_from_primitive(Primitive.INT.value, name="p") tsp = p.as_tspark_param(named=True) @@ -189,15 +295,18 @@ def test_tspark_param_ordinal(self): (BigIntegerParameter, Primitive.BIGINT), (BooleanParameter, Primitive.BOOL), (DateParameter, Primitive.DATE), - (FloatParameter, Primitive.FLOAT), + (DoubleParameter, Primitive.DOUBLE), + (DoubleParameter, Primitive.FLOAT), (VoidParameter, Primitive.NONE), (TimestampParameter, Primitive.TIMESTAMP), + (MapParameter, Primitive.MAP), + (ArrayParameter, Primitive.ARRAY), ), ) def test_inference(self, _type: TDbsqlParameter, prim: Primitive): """This method only tests inferrable types. - Not tested are TinyIntParameter, SmallIntParameter DoubleParameter and TimestampNTZParameter + Not tested are TinyIntParameter, SmallIntParameter, FloatParameter and TimestampNTZParameter """ inferred_type = dbsql_parameter_from_primitive(prim.value) diff --git a/tests/unit/test_retry.py b/tests/unit/test_retry.py index 1e18e1f43..0d01d8675 100644 --- a/tests/unit/test_retry.py +++ b/tests/unit/test_retry.py @@ -34,8 +34,11 @@ def test_sleep__no_retry_after(self, t_mock, retry_policy, error_history): retry_policy.history = [error_history, error_history] retry_policy.sleep(HTTPResponse(status=503)) - expected_backoff_time = self.calculate_backoff_time( - 0, retry_policy.delay_min, retry_policy.delay_max + expected_backoff_time = max( + self.calculate_backoff_time( + 0, retry_policy.delay_min, retry_policy.delay_max + ), + retry_policy.delay_max, ) t_mock.assert_called_with(expected_backoff_time) @@ -54,8 +57,11 @@ def test_sleep__no_retry_after_header__multiple_retries(self, t_mock, retry_poli expected_backoff_times = [] for attempt in range(num_attempts): expected_backoff_times.append( - self.calculate_backoff_time( - attempt, retry_policy.delay_min, retry_policy.delay_max + max( + self.calculate_backoff_time( + attempt, retry_policy.delay_min, retry_policy.delay_max + ), + retry_policy.delay_max, ) ) @@ -78,9 +84,14 @@ def test_excessive_retry_attempts_error(self, t_mock, retry_policy): # Internally urllib3 calls the increment function generating a new instance for every retry retry_policy = retry_policy.increment() - @patch("time.sleep") - def test_sleep__retry_after_present(self, t_mock, retry_policy, error_history): + def test_404_does_not_retry_for_any_command_type(self, retry_policy): + """Test that 404 never retries for any CommandType""" retry_policy._retry_start_time = time.time() - retry_policy.history = [error_history, error_history, error_history] - retry_policy.sleep(HTTPResponse(status=503, headers={"Retry-After": "3"})) - t_mock.assert_called_with(3) + + # Test for each CommandType + for command_type in CommandType: + retry_policy.command_type = command_type + should_retry, msg = retry_policy.should_retry("POST", 404) + + assert should_retry is False, f"404 should not retry for {command_type}" + assert "404" in msg or "NOT_FOUND" in msg diff --git a/tests/unit/test_sea_backend.py b/tests/unit/test_sea_backend.py new file mode 100644 index 000000000..24a5e8242 --- /dev/null +++ b/tests/unit/test_sea_backend.py @@ -0,0 +1,1185 @@ +""" +Tests for the SEA (Statement Execution API) backend implementation. + +This module contains tests for the SeaDatabricksClient class, which implements +the Databricks SQL connector's SEA backend functionality. +""" + +import pytest +from unittest.mock import patch, MagicMock, Mock + +from databricks.sql.backend.sea.backend import ( + SeaDatabricksClient, + _filter_session_configuration, +) +from databricks.sql.backend.sea.models.base import ServiceError, StatementStatus +from databricks.sql.backend.types import SessionId, CommandId, CommandState, BackendType +from databricks.sql.parameters.native import IntegerParameter, TDbsqlParameter +from databricks.sql.thrift_api.TCLIService import ttypes +from databricks.sql.types import SSLOptions +from databricks.sql.auth.authenticators import AuthProvider +from databricks.sql.exc import ( + Error, + NotSupportedError, + ProgrammingError, + ServerOperationError, + DatabaseError, +) + + +class TestSeaBackend: + """Test suite for the SeaDatabricksClient class.""" + + @pytest.fixture + def mock_http_client(self): + """Create a mock HTTP client.""" + with patch( + "databricks.sql.backend.sea.backend.SeaHttpClient" + ) as mock_client_class: + mock_client = mock_client_class.return_value + yield mock_client + + @pytest.fixture + def sea_client(self, mock_http_client): + """Create a SeaDatabricksClient instance with mocked dependencies.""" + server_hostname = "test-server.databricks.com" + port = 443 + http_path = "/sql/warehouses/abc123" + http_headers = [("header1", "value1"), ("header2", "value2")] + auth_provider = AuthProvider() + ssl_options = SSLOptions() + + client = SeaDatabricksClient( + server_hostname=server_hostname, + port=port, + http_path=http_path, + http_headers=http_headers, + auth_provider=auth_provider, + ssl_options=ssl_options, + use_cloud_fetch=False, + ) + + return client + + @pytest.fixture + def sea_client_cloud_fetch(self, mock_http_client): + """Create a SeaDatabricksClient instance with cloud fetch enabled.""" + server_hostname = "test-server.databricks.com" + port = 443 + http_path = "/sql/warehouses/abc123" + http_headers = [("header1", "value1"), ("header2", "value2")] + auth_provider = AuthProvider() + ssl_options = SSLOptions() + + client = SeaDatabricksClient( + server_hostname=server_hostname, + port=port, + http_path=http_path, + http_headers=http_headers, + auth_provider=auth_provider, + ssl_options=ssl_options, + use_cloud_fetch=True, + ) + + return client + + @pytest.fixture + def sea_session_id(self): + """Create a SEA session ID.""" + return SessionId.from_sea_session_id("test-session-123") + + @pytest.fixture + def sea_command_id(self): + """Create a SEA command ID.""" + return CommandId.from_sea_statement_id("test-statement-123") + + @pytest.fixture + def mock_cursor(self): + """Create a mock cursor.""" + cursor = Mock() + cursor.active_command_id = None + cursor.buffer_size_bytes = 1000 + cursor.arraysize = 100 + return cursor + + @pytest.fixture + def thrift_session_id(self): + """Create a Thrift session ID (not SEA).""" + mock_thrift_handle = MagicMock() + mock_thrift_handle.sessionId.guid = b"guid" + mock_thrift_handle.sessionId.secret = b"secret" + return SessionId.from_thrift_handle(mock_thrift_handle) + + @pytest.fixture + def thrift_command_id(self): + """Create a Thrift command ID (not SEA).""" + mock_thrift_operation_handle = MagicMock() + mock_thrift_operation_handle.operationId.guid = b"guid" + mock_thrift_operation_handle.operationId.secret = b"secret" + return CommandId.from_thrift_handle(mock_thrift_operation_handle) + + def test_initialization(self, mock_http_client): + """Test client initialization and warehouse ID extraction.""" + # Test with warehouses format + client1 = SeaDatabricksClient( + server_hostname="test-server.databricks.com", + port=443, + http_path="/sql/warehouses/abc123", + http_headers=[], + auth_provider=AuthProvider(), + ssl_options=SSLOptions(), + ) + assert client1.warehouse_id == "abc123" + assert client1.max_download_threads == 10 # Default value + + # Test with endpoints format + client2 = SeaDatabricksClient( + server_hostname="test-server.databricks.com", + port=443, + http_path="/sql/endpoints/def456", + http_headers=[], + auth_provider=AuthProvider(), + ssl_options=SSLOptions(), + ) + assert client2.warehouse_id == "def456" + + # Test with SPOG query param ?o= in http_path + client_spog = SeaDatabricksClient( + server_hostname="test-server.databricks.com", + port=443, + http_path="/sql/1.0/warehouses/abc123?o=6051921418418893", + http_headers=[], + auth_provider=AuthProvider(), + ssl_options=SSLOptions(), + ) + assert client_spog.warehouse_id == "abc123" + + # Test with SPOG query param on endpoints path + client_spog_ep = SeaDatabricksClient( + server_hostname="test-server.databricks.com", + port=443, + http_path="/sql/1.0/endpoints/def456?o=6051921418418893", + http_headers=[], + auth_provider=AuthProvider(), + ssl_options=SSLOptions(), + ) + assert client_spog_ep.warehouse_id == "def456" + + # Test with multiple query params + client_spog_multi = SeaDatabricksClient( + server_hostname="test-server.databricks.com", + port=443, + http_path="/sql/1.0/warehouses/abc123?o=123&extra=val", + http_headers=[], + auth_provider=AuthProvider(), + ssl_options=SSLOptions(), + ) + assert client_spog_multi.warehouse_id == "abc123" + + # Test with custom max_download_threads + client3 = SeaDatabricksClient( + server_hostname="test-server.databricks.com", + port=443, + http_path="/sql/warehouses/abc123", + http_headers=[], + auth_provider=AuthProvider(), + ssl_options=SSLOptions(), + max_download_threads=5, + ) + assert client3.max_download_threads == 5 + + # Test with invalid HTTP path + with pytest.raises(ValueError) as excinfo: + SeaDatabricksClient( + server_hostname="test-server.databricks.com", + port=443, + http_path="/invalid/path", + http_headers=[], + auth_provider=AuthProvider(), + ssl_options=SSLOptions(), + ) + assert "Could not extract warehouse ID" in str(excinfo.value) + + def test_session_management(self, sea_client, mock_http_client, thrift_session_id): + """Test session management methods.""" + # Test open_session with minimal parameters + mock_http_client._make_request.return_value = {"session_id": "test-session-123"} + session_id = sea_client.open_session(None, None, None) + assert isinstance(session_id, SessionId) + assert session_id.backend_type == BackendType.SEA + assert session_id.guid == "test-session-123" + mock_http_client._make_request.assert_called_with( + method="POST", path=sea_client.SESSION_PATH, data={"warehouse_id": "abc123"} + ) + + # Test open_session with all parameters + mock_http_client.reset_mock() + mock_http_client._make_request.return_value = {"session_id": "test-session-456"} + session_config = { + "ANSI_MODE": "FALSE", # Supported parameter + "STATEMENT_TIMEOUT": "3600", # Supported parameter + "QUERY_TAGS": "team:marketing,dashboard:abc123", # Supported parameter + "unsupported_param": "value", # Unsupported parameter + } + catalog = "test_catalog" + schema = "test_schema" + session_id = sea_client.open_session(session_config, catalog, schema) + assert session_id.guid == "test-session-456" + expected_data = { + "warehouse_id": "abc123", + "session_confs": { + "ansi_mode": "FALSE", + "statement_timeout": "3600", + "query_tags": "team:marketing,dashboard:abc123", + }, + "catalog": catalog, + "schema": schema, + } + mock_http_client._make_request.assert_called_with( + method="POST", path=sea_client.SESSION_PATH, data=expected_data + ) + + # Test open_session error handling + mock_http_client.reset_mock() + mock_http_client._make_request.return_value = {} + with pytest.raises(Error) as excinfo: + sea_client.open_session(None, None, None) + assert "Failed to create session" in str(excinfo.value) + + # Test close_session with valid ID + mock_http_client.reset_mock() + session_id = SessionId.from_sea_session_id("test-session-789") + sea_client.close_session(session_id) + mock_http_client._make_request.assert_called_with( + method="DELETE", + path=sea_client.SESSION_PATH_WITH_ID.format("test-session-789"), + data={"session_id": "test-session-789", "warehouse_id": "abc123"}, + ) + + # Test close_session with invalid ID type + with pytest.raises(ValueError) as excinfo: + sea_client.close_session(thrift_session_id) + assert "Not a valid SEA session ID" in str(excinfo.value) + + def test_command_execution_sync( + self, sea_client, mock_http_client, mock_cursor, sea_session_id + ): + """Test synchronous command execution.""" + # Test synchronous execution + execute_response = { + "statement_id": "test-statement-123", + "status": {"state": "SUCCEEDED"}, + "manifest": { + "schema": [ + { + "name": "col1", + "type_name": "STRING", + "type_text": "string", + "nullable": True, + } + ], + "total_row_count": 1, + "total_byte_count": 100, + }, + "result": {"data": [["value1"]]}, + } + mock_http_client._make_request.return_value = execute_response + + with patch.object( + sea_client, "_response_to_result_set", return_value="mock_result_set" + ) as mock_get_result: + result = sea_client.execute_command( + operation="SELECT 1", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert result == "mock_result_set" + + # Test with invalid session ID + with pytest.raises(ValueError) as excinfo: + mock_thrift_handle = MagicMock() + mock_thrift_handle.sessionId.guid = b"guid" + mock_thrift_handle.sessionId.secret = b"secret" + thrift_session_id = SessionId.from_thrift_handle(mock_thrift_handle) + + sea_client.execute_command( + operation="SELECT 1", + session_id=thrift_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert "Not a valid SEA session ID" in str(excinfo.value) + + def test_command_execution_async( + self, sea_client, mock_http_client, mock_cursor, sea_session_id + ): + """Test asynchronous command execution.""" + # Test asynchronous execution + execute_response = { + "statement_id": "test-statement-456", + "status": {"state": "PENDING"}, + } + mock_http_client._make_request.return_value = execute_response + + result = sea_client.execute_command( + operation="SELECT 1", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=True, + enforce_embedded_schema_correctness=False, + ) + assert result is None + assert isinstance(mock_cursor.active_command_id, CommandId) + assert mock_cursor.active_command_id.guid == "test-statement-456" + + def test_command_execution_advanced( + self, sea_client, mock_http_client, mock_cursor, sea_session_id + ): + """Test advanced command execution scenarios.""" + # Test with polling + initial_response = { + "statement_id": "test-statement-789", + "status": {"state": "RUNNING"}, + } + poll_response = { + "statement_id": "test-statement-789", + "status": {"state": "SUCCEEDED"}, + "manifest": {"schema": [], "total_row_count": 0, "total_byte_count": 0}, + "result": {"data": []}, + } + mock_http_client._make_request.side_effect = [initial_response, poll_response] + + with patch.object( + sea_client, "_response_to_result_set", return_value="mock_result_set" + ) as mock_get_result: + with patch("time.sleep"): + result = sea_client.execute_command( + operation="SELECT * FROM large_table", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert result == "mock_result_set" + + # Test with parameters + mock_http_client.reset_mock() + mock_http_client._make_request.side_effect = None # Reset side_effect + execute_response = { + "statement_id": "test-statement-123", + "status": {"state": "SUCCEEDED"}, + } + mock_http_client._make_request.return_value = execute_response + dbsql_param = IntegerParameter(name="param1", value=1) + param = dbsql_param.as_tspark_param(named=True) + + with patch.object(sea_client, "_response_to_result_set"): + sea_client.execute_command( + operation="SELECT * FROM table WHERE col = :param1", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[param], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + args, kwargs = mock_http_client._make_request.call_args + assert "parameters" in kwargs["data"] + assert len(kwargs["data"]["parameters"]) == 1 + assert kwargs["data"]["parameters"][0]["name"] == "param1" + assert kwargs["data"]["parameters"][0]["value"] == "1" + assert kwargs["data"]["parameters"][0]["type"] == "INT" + + # Test execution failure + mock_http_client.reset_mock() + error_response = { + "statement_id": "test-statement-123", + "status": { + "state": "FAILED", + "error": { + "message": "Syntax error in SQL", + "error_code": "SYNTAX_ERROR", + }, + }, + } + mock_http_client._make_request.return_value = error_response + + with patch("time.sleep"): + with patch.object( + sea_client, "get_query_state", return_value=CommandState.FAILED + ): + with pytest.raises(Error) as excinfo: + sea_client.execute_command( + operation="SELECT * FROM nonexistent_table", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert "Command failed" in str(excinfo.value) + + def _execute_response(self): + return { + "statement_id": "test-statement-123", + "status": {"state": "SUCCEEDED"}, + "manifest": {"schema": [], "total_row_count": 0, "total_byte_count": 0}, + "result": {"data": []}, + } + + def _run_execute_command(self, sea_client, sea_session_id, mock_cursor, **kwargs): + """Helper to invoke execute_command with default args.""" + return sea_client.execute_command( + operation="SELECT 1", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + **kwargs, + ) + + def test_execute_command_query_tags_string_values( + self, sea_client, mock_http_client, mock_cursor, sea_session_id + ): + """query_tags with string values are included in the request payload.""" + mock_http_client._make_request.return_value = self._execute_response() + with patch.object(sea_client, "_response_to_result_set"): + self._run_execute_command( + sea_client, + sea_session_id, + mock_cursor, + query_tags={"env": "prod", "team": "data"}, + ) + _, kwargs = mock_http_client._make_request.call_args + assert kwargs["data"]["query_tags"] == [ + {"key": "env", "value": "prod"}, + {"key": "team", "value": "data"}, + ] + + def test_execute_command_query_tags_none_value( + self, sea_client, mock_http_client, mock_cursor, sea_session_id + ): + """query_tags with a None value omit the value field (key-only tag).""" + mock_http_client._make_request.return_value = self._execute_response() + with patch.object(sea_client, "_response_to_result_set"): + self._run_execute_command( + sea_client, + sea_session_id, + mock_cursor, + query_tags={"env": "prod", "team": None}, + ) + _, kwargs = mock_http_client._make_request.call_args + assert kwargs["data"]["query_tags"] == [ + {"key": "env", "value": "prod"}, + {"key": "team", "value": None}, + ] + + def test_execute_command_no_query_tags_omitted( + self, sea_client, mock_http_client, mock_cursor, sea_session_id + ): + """query_tags field is absent from the request when not provided.""" + mock_http_client._make_request.return_value = self._execute_response() + with patch.object(sea_client, "_response_to_result_set"): + self._run_execute_command(sea_client, sea_session_id, mock_cursor) + _, kwargs = mock_http_client._make_request.call_args + assert "query_tags" not in kwargs["data"] + + def test_execute_command_empty_query_tags_omitted( + self, sea_client, mock_http_client, mock_cursor, sea_session_id + ): + """Empty query_tags dict is treated as absent — field omitted from request.""" + mock_http_client._make_request.return_value = self._execute_response() + with patch.object(sea_client, "_response_to_result_set"): + self._run_execute_command( + sea_client, sea_session_id, mock_cursor, query_tags={} + ) + _, kwargs = mock_http_client._make_request.call_args + assert "query_tags" not in kwargs["data"] + + def test_execute_command_async_query_tags( + self, sea_client, mock_http_client, mock_cursor, sea_session_id + ): + """query_tags are included in async execute requests (execute_async path).""" + mock_http_client._make_request.return_value = { + "statement_id": "test-statement-async", + "status": {"state": "PENDING"}, + } + sea_client.execute_command( + operation="SELECT 1", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=True, + enforce_embedded_schema_correctness=False, + query_tags={"job": "nightly-etl"}, + ) + _, kwargs = mock_http_client._make_request.call_args + assert kwargs["data"]["query_tags"] == [{"key": "job", "value": "nightly-etl"}] + + def test_command_management( + self, + sea_client, + mock_http_client, + sea_command_id, + thrift_command_id, + mock_cursor, + ): + """Test command management methods.""" + # Test cancel_command + mock_http_client._make_request.return_value = {} + sea_client.cancel_command(sea_command_id) + mock_http_client._make_request.assert_called_with( + method="POST", + path=sea_client.CANCEL_STATEMENT_PATH_WITH_ID.format("test-statement-123"), + data={"statement_id": "test-statement-123"}, + ) + + # Test cancel_command with invalid ID + with pytest.raises(ValueError) as excinfo: + sea_client.cancel_command(thrift_command_id) + assert "Not a valid SEA command ID" in str(excinfo.value) + + # Test close_command + mock_http_client.reset_mock() + sea_client.close_command(sea_command_id) + mock_http_client._make_request.assert_called_with( + method="DELETE", + path=sea_client.STATEMENT_PATH_WITH_ID.format("test-statement-123"), + data={"statement_id": "test-statement-123"}, + ) + + # Test close_command with invalid ID + with pytest.raises(ValueError) as excinfo: + sea_client.close_command(thrift_command_id) + assert "Not a valid SEA command ID" in str(excinfo.value) + + # Test get_query_state + mock_http_client.reset_mock() + mock_http_client._make_request.return_value = { + "statement_id": "test-statement-123", + "status": {"state": "RUNNING"}, + } + state = sea_client.get_query_state(sea_command_id) + assert state == CommandState.RUNNING + mock_http_client._make_request.assert_called_with( + method="GET", + path=sea_client.STATEMENT_PATH_WITH_ID.format("test-statement-123"), + data={"statement_id": "test-statement-123"}, + ) + + # Test get_query_state with invalid ID + with pytest.raises(ValueError) as excinfo: + sea_client.get_query_state(thrift_command_id) + assert "Not a valid SEA command ID" in str(excinfo.value) + + # Test get_execution_result + mock_http_client.reset_mock() + sea_response = { + "statement_id": "test-statement-123", + "status": {"state": "SUCCEEDED"}, + "manifest": { + "format": "JSON_ARRAY", + "schema": { + "column_count": 1, + "columns": [ + { + "name": "test_value", + "type_text": "INT", + "type_name": "INT", + "position": 0, + } + ], + }, + "total_chunk_count": 1, + "chunks": [{"chunk_index": 0, "row_offset": 0, "row_count": 1}], + "total_row_count": 1, + "truncated": False, + }, + "result": { + "chunk_index": 0, + "row_offset": 0, + "row_count": 1, + "data_array": [["1"]], + }, + } + mock_http_client._make_request.return_value = sea_response + result = sea_client.get_execution_result(sea_command_id, mock_cursor) + assert result.command_id.to_sea_statement_id() == "test-statement-123" + assert result.status == CommandState.SUCCEEDED + + # Test get_execution_result with invalid ID + with pytest.raises(ValueError) as excinfo: + sea_client.get_execution_result(thrift_command_id, mock_cursor) + assert "Not a valid SEA command ID" in str(excinfo.value) + + def test_check_command_state(self, sea_client, sea_command_id): + """Test _check_command_not_in_failed_or_closed_state method.""" + # Test with RUNNING state (should not raise) + sea_client._check_command_not_in_failed_or_closed_state( + StatementStatus(state=CommandState.RUNNING), sea_command_id + ) + + # Test with SUCCEEDED state (should not raise) + sea_client._check_command_not_in_failed_or_closed_state( + StatementStatus(state=CommandState.SUCCEEDED), sea_command_id + ) + + # Test with CLOSED state (should raise DatabaseError) + with pytest.raises(DatabaseError) as excinfo: + sea_client._check_command_not_in_failed_or_closed_state( + StatementStatus(state=CommandState.CLOSED), sea_command_id + ) + assert "Command test-statement-123 unexpectedly closed server side" in str( + excinfo.value + ) + + # Test with FAILED state (should raise ServerOperationError) + with pytest.raises(ServerOperationError) as excinfo: + sea_client._check_command_not_in_failed_or_closed_state( + StatementStatus( + state=CommandState.FAILED, + error=ServiceError(message="Test error", error_code="TEST_ERROR"), + ), + sea_command_id, + ) + assert "Command failed" in str(excinfo.value) + + def test_extract_description_from_manifest(self, sea_client): + """Test _extract_description_from_manifest.""" + manifest_obj = MagicMock() + manifest_obj.schema = { + "columns": [ + { + "name": "col1", + "type_name": "STRING", + "type_precision": 10, + "type_scale": 2, + }, + { + "name": "col2", + "type_name": "INT", + "nullable": False, + }, + ] + } + + description = sea_client._extract_description_from_manifest(manifest_obj) + assert description is not None + assert len(description) == 2 + assert description[0][0] == "col1" # name + assert description[0][1] == "string" # type_code + assert description[0][4] == 10 # precision + assert description[0][5] == 2 # scale + assert description[0][6] is None # null_ok + assert description[1][0] == "col2" # name + assert description[1][1] == "int" # type_code + assert description[1][6] is None # null_ok + + def test_extract_description_from_manifest_with_type_normalization( + self, sea_client + ): + """Test _extract_description_from_manifest with SEA to Thrift type normalization.""" + manifest_obj = MagicMock() + manifest_obj.schema = { + "columns": [ + { + "name": "byte_col", + "type_name": "BYTE", + }, + { + "name": "short_col", + "type_name": "SHORT", + }, + { + "name": "long_col", + "type_name": "LONG", + }, + { + "name": "interval_ym_col", + "type_name": "INTERVAL", + "type_interval_type": "YEAR TO MONTH", + }, + { + "name": "interval_dt_col", + "type_name": "INTERVAL", + "type_interval_type": "DAY TO SECOND", + }, + { + "name": "interval_default_col", + "type_name": "INTERVAL", + # No type_interval_type field + }, + ] + } + + description = sea_client._extract_description_from_manifest(manifest_obj) + assert description is not None + assert len(description) == 6 + + # Check normalized types + assert description[0][0] == "byte_col" + assert description[0][1] == "tinyint" # BYTE -> tinyint + + assert description[1][0] == "short_col" + assert description[1][1] == "smallint" # SHORT -> smallint + + assert description[2][0] == "long_col" + assert description[2][1] == "bigint" # LONG -> bigint + + assert description[3][0] == "interval_ym_col" + assert description[3][1] == "interval_year_month" # INTERVAL with YEAR/MONTH + + assert description[4][0] == "interval_dt_col" + assert description[4][1] == "interval_day_time" # INTERVAL with DAY/TIME + + assert description[5][0] == "interval_default_col" + assert description[5][1] == "interval" # INTERVAL without subtype + + def test_filter_session_configuration(self): + """Test that _filter_session_configuration converts all values to strings.""" + session_config = { + "ANSI_MODE": True, + "statement_timeout": 3600, + "TIMEZONE": "UTC", + "enable_photon": False, + "MAX_FILE_PARTITION_BYTES": 128.5, + "QUERY_TAGS": "team:engineering,project:data-pipeline", + "unsupported_param": "value", + "ANOTHER_UNSUPPORTED": 42, + } + + result = _filter_session_configuration(session_config) + + # Verify result is not None + assert result is not None + + # Verify all returned values are strings + for key, value in result.items(): + assert isinstance( + value, str + ), f"Value for key '{key}' is not a string: {type(value)}" + + # Verify specific conversions + expected_result = { + "ansi_mode": "True", # boolean True -> "True", key lowercased + "statement_timeout": "3600", # int -> "3600", key lowercased + "timezone": "UTC", # string -> "UTC", key lowercased + "enable_photon": "False", # boolean False -> "False", key lowercased + "max_file_partition_bytes": "128.5", # float -> "128.5", key lowercased + "query_tags": "team:engineering,project:data-pipeline", + } + + assert result == expected_result + + # Test with None input + assert _filter_session_configuration(None) == {} + + # Test with only unsupported parameters + unsupported_config = { + "unsupported_param1": "value1", + "unsupported_param2": 123, + } + result = _filter_session_configuration(unsupported_config) + assert result == {} + + # Test case insensitivity for keys + case_insensitive_config = { + "ansi_mode": "false", # lowercase key + "STATEMENT_TIMEOUT": 7200, # uppercase key + "TiMeZoNe": "America/New_York", # mixed case key + "QueRy_TaGs": "team:marketing,test:case-insensitive", + } + result = _filter_session_configuration(case_insensitive_config) + expected_case_result = { + "ansi_mode": "false", + "statement_timeout": "7200", + "timezone": "America/New_York", + "query_tags": "team:marketing,test:case-insensitive", + } + assert result == expected_case_result + + # Verify all values are strings in case insensitive test + for key, value in result.items(): + assert isinstance( + value, str + ), f"Value for key '{key}' is not a string: {type(value)}" + + def test_results_message_to_execute_response_is_staging_operation(self, sea_client): + """Test that is_staging_operation is correctly set from manifest.is_volume_operation.""" + # Test when is_volume_operation is True + response = MagicMock() + response.statement_id = "test-statement-123" + response.status.state = CommandState.SUCCEEDED + response.manifest.is_volume_operation = True + response.manifest.result_compression = "NONE" + response.manifest.format = "JSON_ARRAY" + + # Mock the _extract_description_from_manifest method to return None + with patch.object( + sea_client, "_extract_description_from_manifest", return_value=None + ): + result = sea_client._results_message_to_execute_response(response) + assert result.is_staging_operation is True + + # Test when is_volume_operation is False + response.manifest.is_volume_operation = False + with patch.object( + sea_client, "_extract_description_from_manifest", return_value=None + ): + result = sea_client._results_message_to_execute_response(response) + assert result.is_staging_operation is False + + def test_get_catalogs(self, sea_client, sea_session_id, mock_cursor): + """Test the get_catalogs method.""" + # Mock the execute_command method + mock_result_set = Mock() + with patch.object( + sea_client, "execute_command", return_value=mock_result_set + ) as mock_execute: + # Call get_catalogs + result = sea_client.get_catalogs( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + ) + + # Verify execute_command was called with the correct parameters + mock_execute.assert_called_once_with( + operation="SHOW CATALOGS", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + + # Verify the result is correct + assert result == mock_result_set + + def test_get_schemas(self, sea_client, sea_session_id, mock_cursor): + """Test the get_schemas method with various parameter combinations.""" + # Mock the execute_command method + mock_result_set = Mock() + with patch.object( + sea_client, "execute_command", return_value=mock_result_set + ) as mock_execute: + # Case 1: With catalog name only + result = sea_client.get_schemas( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="test_catalog", + ) + + mock_execute.assert_called_with( + operation="SHOW SCHEMAS IN test_catalog", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + + # Case 2: With catalog and schema names + result = sea_client.get_schemas( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="test_catalog", + schema_name="test_schema", + ) + + mock_execute.assert_called_with( + operation="SHOW SCHEMAS IN test_catalog LIKE 'test_schema'", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + + # Case 3: Without catalog name (should raise ValueError) + with pytest.raises(DatabaseError) as excinfo: + sea_client.get_schemas( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + ) + assert "Catalog name is required for get_schemas" in str(excinfo.value) + + def test_get_tables(self, sea_client, sea_session_id, mock_cursor): + """Test the get_tables method with various parameter combinations.""" + # Mock the execute_command method + from databricks.sql.backend.sea.result_set import SeaResultSet + + mock_result_set = Mock(spec=SeaResultSet) + + with patch.object( + sea_client, "execute_command", return_value=mock_result_set + ) as mock_execute: + # Mock the filter_tables_by_type method + with patch( + "databricks.sql.backend.sea.utils.filters.ResultSetFilter.filter_tables_by_type", + return_value=mock_result_set, + ) as mock_filter: + # Case 1: With catalog name only + result = sea_client.get_tables( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="test_catalog", + ) + + mock_execute.assert_called_with( + operation="SHOW TABLES IN CATALOG test_catalog", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + mock_filter.assert_called_with(mock_result_set, None) + + # Case 2: With all parameters + table_types = ["TABLE", "VIEW"] + result = sea_client.get_tables( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="test_catalog", + schema_name="test_schema", + table_name="test_table", + table_types=table_types, + ) + + mock_execute.assert_called_with( + operation="SHOW TABLES IN CATALOG test_catalog SCHEMA LIKE 'test_schema' LIKE 'test_table'", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + mock_filter.assert_called_with(mock_result_set, table_types) + + # Case 3: With wildcard catalog + result = sea_client.get_tables( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="*", + ) + + mock_execute.assert_called_with( + operation="SHOW TABLES IN ALL CATALOGS", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + + def test_get_columns(self, sea_client, sea_session_id, mock_cursor): + """Test the get_columns method with various parameter combinations.""" + # Mock the execute_command method + mock_result_set = Mock() + with patch.object( + sea_client, "execute_command", return_value=mock_result_set + ) as mock_execute: + # Case 1: With catalog name only + result = sea_client.get_columns( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="test_catalog", + ) + + mock_execute.assert_called_with( + operation="SHOW COLUMNS IN CATALOG test_catalog", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + + # Case 2: With all parameters + result = sea_client.get_columns( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="test_catalog", + schema_name="test_schema", + table_name="test_table", + column_name="test_column", + ) + + mock_execute.assert_called_with( + operation="SHOW COLUMNS IN CATALOG test_catalog SCHEMA LIKE 'test_schema' TABLE LIKE 'test_table' LIKE 'test_column'", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=False, + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + + # Case 3: Without catalog name (should raise ValueError) + with pytest.raises(DatabaseError) as excinfo: + sea_client.get_columns( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + ) + assert "Catalog name is required for get_columns" in str(excinfo.value) + + def test_get_tables_with_cloud_fetch( + self, sea_client_cloud_fetch, sea_session_id, mock_cursor + ): + """Test the get_tables method with cloud fetch enabled.""" + # Mock the execute_command method and ResultSetFilter + mock_result_set = Mock() + + with patch.object( + sea_client_cloud_fetch, "execute_command", return_value=mock_result_set + ) as mock_execute: + with patch( + "databricks.sql.backend.sea.utils.filters.ResultSetFilter" + ) as mock_filter: + mock_filter.filter_tables_by_type.return_value = mock_result_set + + # Call get_tables + result = sea_client_cloud_fetch.get_tables( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="test_catalog", + ) + + # Verify execute_command was called with use_cloud_fetch=True + mock_execute.assert_called_with( + operation="SHOW TABLES IN CATALOG test_catalog", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=True, # Should use True since client was created with use_cloud_fetch=True + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert result == mock_result_set + + def test_get_schemas_with_cloud_fetch( + self, sea_client_cloud_fetch, sea_session_id, mock_cursor + ): + """Test the get_schemas method with cloud fetch enabled.""" + # Mock the execute_command method + mock_result_set = Mock() + with patch.object( + sea_client_cloud_fetch, "execute_command", return_value=mock_result_set + ) as mock_execute: + # Test with catalog name + result = sea_client_cloud_fetch.get_schemas( + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + cursor=mock_cursor, + catalog_name="test_catalog", + ) + + mock_execute.assert_called_with( + operation="SHOW SCHEMAS IN test_catalog", + session_id=sea_session_id, + max_rows=100, + max_bytes=1000, + lz4_compression=False, + cursor=mock_cursor, + use_cloud_fetch=True, # Should use True since client was created with use_cloud_fetch=True + parameters=[], + async_op=False, + enforce_embedded_schema_correctness=False, + ) + assert result == mock_result_set diff --git a/tests/unit/test_sea_conversion.py b/tests/unit/test_sea_conversion.py new file mode 100644 index 000000000..234cca868 --- /dev/null +++ b/tests/unit/test_sea_conversion.py @@ -0,0 +1,149 @@ +""" +Tests for the conversion module in the SEA backend. + +This module contains tests for the SqlType and SqlTypeConverter classes. +""" + +import pytest +import datetime +import decimal +from unittest.mock import Mock, patch + +from databricks.sql.backend.sea.utils.conversion import SqlType, SqlTypeConverter + + +class TestSqlTypeConverter: + """Test suite for the SqlTypeConverter class.""" + + def test_convert_numeric_types(self): + """Test converting numeric types.""" + # Test integer types + assert SqlTypeConverter.convert_value("123", SqlType.TINYINT, None) == 123 + assert SqlTypeConverter.convert_value("456", SqlType.SMALLINT, None) == 456 + assert SqlTypeConverter.convert_value("789", SqlType.INT, None) == 789 + assert ( + SqlTypeConverter.convert_value("1234567890", SqlType.BIGINT, None) + == 1234567890 + ) + + # Test floating point types + assert SqlTypeConverter.convert_value("123.45", SqlType.FLOAT, None) == 123.45 + assert SqlTypeConverter.convert_value("678.90", SqlType.DOUBLE, None) == 678.90 + + # Test decimal type + decimal_value = SqlTypeConverter.convert_value("123.45", SqlType.DECIMAL, None) + assert isinstance(decimal_value, decimal.Decimal) + assert decimal_value == decimal.Decimal("123.45") + + # Test decimal with precision and scale + decimal_value = SqlTypeConverter.convert_value( + "123.45", SqlType.DECIMAL, None, precision=5, scale=2 + ) + assert isinstance(decimal_value, decimal.Decimal) + assert decimal_value == decimal.Decimal("123.45") + + # Test invalid numeric input + result = SqlTypeConverter.convert_value("not_a_number", SqlType.INT, None) + assert result == "not_a_number" # Returns original value on error + + def test_convert_boolean_type(self): + """Test converting boolean types.""" + # True values + assert SqlTypeConverter.convert_value("true", SqlType.BOOLEAN, None) is True + assert SqlTypeConverter.convert_value("True", SqlType.BOOLEAN, None) is True + assert SqlTypeConverter.convert_value("t", SqlType.BOOLEAN, None) is True + assert SqlTypeConverter.convert_value("1", SqlType.BOOLEAN, None) is True + assert SqlTypeConverter.convert_value("yes", SqlType.BOOLEAN, None) is True + assert SqlTypeConverter.convert_value("y", SqlType.BOOLEAN, None) is True + + # False values + assert SqlTypeConverter.convert_value("false", SqlType.BOOLEAN, None) is False + assert SqlTypeConverter.convert_value("False", SqlType.BOOLEAN, None) is False + assert SqlTypeConverter.convert_value("f", SqlType.BOOLEAN, None) is False + assert SqlTypeConverter.convert_value("0", SqlType.BOOLEAN, None) is False + assert SqlTypeConverter.convert_value("no", SqlType.BOOLEAN, None) is False + assert SqlTypeConverter.convert_value("n", SqlType.BOOLEAN, None) is False + + def test_convert_datetime_types(self): + """Test converting datetime types.""" + # Test date type + date_value = SqlTypeConverter.convert_value("2023-01-15", SqlType.DATE, None) + assert isinstance(date_value, datetime.date) + assert date_value == datetime.date(2023, 1, 15) + + # Test timestamp type + timestamp_value = SqlTypeConverter.convert_value( + "2023-01-15T12:30:45", SqlType.TIMESTAMP, None + ) + assert isinstance(timestamp_value, datetime.datetime) + assert timestamp_value.year == 2023 + assert timestamp_value.month == 1 + assert timestamp_value.day == 15 + assert timestamp_value.hour == 12 + assert timestamp_value.minute == 30 + assert timestamp_value.second == 45 + + # Test interval types (currently return as string) + interval_ym_value = SqlTypeConverter.convert_value( + "1-6", SqlType.INTERVAL_YEAR_MONTH, None + ) + assert interval_ym_value == "1-6" + + interval_dt_value = SqlTypeConverter.convert_value( + "1 day 2 hours", SqlType.INTERVAL_DAY_TIME, None + ) + assert interval_dt_value == "1 day 2 hours" + + # Test invalid date input + result = SqlTypeConverter.convert_value("not_a_date", SqlType.DATE, None) + assert result == "not_a_date" # Returns original value on error + + def test_convert_string_types(self): + """Test converting string types.""" + # String types don't need conversion, they should be returned as-is + assert ( + SqlTypeConverter.convert_value("test string", SqlType.STRING, None) + == "test string" + ) + assert ( + SqlTypeConverter.convert_value("test char", SqlType.CHAR, None) + == "test char" + ) + assert ( + SqlTypeConverter.convert_value("test varchar", SqlType.VARCHAR, None) + == "test varchar" + ) + + def test_convert_binary_type(self): + """Test converting binary type.""" + # Test valid hex string + binary_value = SqlTypeConverter.convert_value( + "48656C6C6F", SqlType.BINARY, None + ) + assert isinstance(binary_value, bytes) + assert binary_value == b"Hello" + + # Test invalid binary input + result = SqlTypeConverter.convert_value("not_hex", SqlType.BINARY, None) + assert result == "not_hex" # Returns original value on error + + def test_convert_unsupported_type(self): + """Test converting an unsupported type.""" + # Should return the original value + assert ( + SqlTypeConverter.convert_value("test", "unsupported_type", None) == "test" + ) + + # Complex types should return as-is (not yet implemented in TYPE_MAPPING) + assert ( + SqlTypeConverter.convert_value("complex_value", SqlType.ARRAY, None) + == "complex_value" + ) + assert ( + SqlTypeConverter.convert_value("complex_value", SqlType.MAP, None) + == "complex_value" + ) + assert ( + SqlTypeConverter.convert_value("complex_value", SqlType.STRUCT, None) + == "complex_value" + ) diff --git a/tests/unit/test_sea_http_client.py b/tests/unit/test_sea_http_client.py new file mode 100644 index 000000000..5100a5cb0 --- /dev/null +++ b/tests/unit/test_sea_http_client.py @@ -0,0 +1,235 @@ +import json +import unittest +from unittest.mock import patch, Mock, MagicMock +import pytest + +from databricks.sql.backend.sea.utils.http_client import SeaHttpClient +from databricks.sql.auth.retry import CommandType +from databricks.sql.auth.authenticators import AuthProvider +from databricks.sql.types import SSLOptions +from databricks.sql.exc import RequestError + + +class TestSeaHttpClient: + @pytest.fixture + def mock_auth_provider(self): + auth_provider = Mock(spec=AuthProvider) + auth_provider.add_headers = Mock(return_value=None) + return auth_provider + + @pytest.fixture + def ssl_options(self): + return SSLOptions( + tls_verify=True, + tls_trusted_ca_file=None, + tls_client_cert_file=None, + tls_client_cert_key_file=None, + tls_client_cert_key_password=None, + ) + + @pytest.fixture + def sea_http_client(self, mock_auth_provider, ssl_options): + with patch( + "databricks.sql.backend.sea.utils.http_client.HTTPSConnectionPool" + ) as mock_pool: + client = SeaHttpClient( + server_hostname="test-server.databricks.com", + port=443, + http_path="/sql/1.0/warehouses/abc123", + http_headers=[("User-Agent", "test-agent")], + auth_provider=mock_auth_provider, + ssl_options=ssl_options, + ) + # Replace the real pool with a mock + client._pool = Mock() + return client + + @pytest.mark.parametrize( + "server_hostname,port,expected_base_url", + [ + # Basic hostname without protocol + ("myserver.com", 443, "https://myserver.com:443"), + # Hostname with trailing slash + ("myserver.com/", 443, "https://myserver.com:443"), + # Hostname with https:// protocol + ("https://myserver.com", 443, "https://myserver.com:443"), + # Hostname with http:// protocol (preserved as-is) + ("http://myserver.com", 443, "http://myserver.com:443"), + # Hostname with protocol and trailing slash + ("https://myserver.com/", 443, "https://myserver.com:443"), + # Custom port + ("myserver.com", 8080, "https://myserver.com:8080"), + # Protocol with custom port + ("https://myserver.com", 8080, "https://myserver.com:8080"), + ], + ) + def test_base_url_construction( + self, server_hostname, port, expected_base_url, mock_auth_provider, ssl_options + ): + """Test that base_url is constructed correctly from various hostname inputs.""" + with patch("databricks.sql.backend.sea.utils.http_client.HTTPSConnectionPool"): + client = SeaHttpClient( + server_hostname=server_hostname, + port=port, + http_path="/sql/1.0/warehouses/test", + http_headers=[], + auth_provider=mock_auth_provider, + ssl_options=ssl_options, + ) + assert client.base_url == expected_base_url + + def test_get_command_type_from_path(self, sea_http_client): + """Test the _get_command_type_from_path method with various paths and methods.""" + # Test statement execution + assert ( + sea_http_client._get_command_type_from_path("/statements", "POST") + == CommandType.EXECUTE_STATEMENT + ) + + # Test statement cancellation + assert ( + sea_http_client._get_command_type_from_path( + "/statements/123/cancel", "POST" + ) + == CommandType.OTHER + ) + + # Test statement deletion (close operation) + assert ( + sea_http_client._get_command_type_from_path("/statements/123", "DELETE") + == CommandType.CLOSE_OPERATION + ) + + # Test get statement status + assert ( + sea_http_client._get_command_type_from_path("/statements/123", "GET") + == CommandType.GET_OPERATION_STATUS + ) + + # Test session close + assert ( + sea_http_client._get_command_type_from_path("/sessions/456", "DELETE") + == CommandType.CLOSE_SESSION + ) + + # Test other paths + assert ( + sea_http_client._get_command_type_from_path("/other/endpoint", "GET") + == CommandType.OTHER + ) + assert ( + sea_http_client._get_command_type_from_path("/other/endpoint", "POST") + == CommandType.OTHER + ) + + @patch( + "databricks.sql.backend.sea.utils.http_client.SeaHttpClient._get_auth_headers" + ) + def test_make_request_success(self, mock_get_auth_headers, sea_http_client): + """Test successful _make_request calls.""" + # Setup mock response + mock_response = Mock() + mock_response.status = 200 + # Mock response.data.decode() to return a valid JSON string + mock_response.data.decode.return_value = '{"result": "success"}' + mock_response.__enter__ = Mock(return_value=mock_response) + mock_response.__exit__ = Mock(return_value=None) + + # Setup mock auth headers + mock_get_auth_headers.return_value = {"Authorization": "Bearer test-token"} + + # Configure the pool's request method to return our mock response + sea_http_client._pool.request.return_value = mock_response + + # Test GET request without data + result = sea_http_client._make_request("GET", "/test/path") + + # Verify the request was made correctly + sea_http_client._pool.request.assert_called_with( + method="GET", + url="/test/path", + body=b"", + headers={ + "Content-Type": "application/json", + "User-Agent": "test-agent", + "Authorization": "Bearer test-token", + }, + preload_content=False, + retries=sea_http_client.retry_policy, + ) + + # Check the result + assert result == {"result": "success"} + + # Test POST request with data + test_data = {"query": "SELECT * FROM test"} + result = sea_http_client._make_request("POST", "/statements", test_data) + + # Verify the request was made with the correct body + expected_body = json.dumps(test_data).encode("utf-8") + sea_http_client._pool.request.assert_called_with( + method="POST", + url="/statements", + body=expected_body, + headers={ + "Content-Type": "application/json", + "User-Agent": "test-agent", + "Authorization": "Bearer test-token", + "Content-Length": str(len(expected_body)), + }, + preload_content=False, + retries=sea_http_client.retry_policy, + ) + + @patch( + "databricks.sql.backend.sea.utils.http_client.SeaHttpClient._get_auth_headers" + ) + def test_make_request_error_response(self, mock_get_auth_headers, sea_http_client): + """Test _make_request with error HTTP status.""" + # Setup mock response with error status + mock_response = Mock() + mock_response.status = 400 + mock_response.__enter__ = Mock(return_value=mock_response) + mock_response.__exit__ = Mock(return_value=None) + + # Setup mock auth headers + mock_get_auth_headers.return_value = {"Authorization": "Bearer test-token"} + + # Configure the pool's request method to return our mock response + sea_http_client._pool.request.return_value = mock_response + + # Test request with error response + with pytest.raises(Exception) as excinfo: + sea_http_client._make_request("GET", "/test/path") + + assert "SEA HTTP request failed with status 400" in str(excinfo.value) + + @patch( + "databricks.sql.backend.sea.utils.http_client.SeaHttpClient._get_auth_headers" + ) + def test_make_request_connection_error( + self, mock_get_auth_headers, sea_http_client + ): + """Test _make_request with connection error.""" + # Setup mock auth headers + mock_get_auth_headers.return_value = {"Authorization": "Bearer test-token"} + + # Configure the pool's request to raise an exception + sea_http_client._pool.request.side_effect = Exception("Connection error") + + # Test request with connection error + with pytest.raises(RequestError) as excinfo: + sea_http_client._make_request("GET", "/test/path") + + assert "Error during request to server" in str(excinfo.value) + + def test_make_request_no_pool(self, sea_http_client): + """Test _make_request when pool is not initialized.""" + # Set pool to None to simulate uninitialized pool + sea_http_client._pool = None + + # Test request with no pool + with pytest.raises(RequestError) as excinfo: + sea_http_client._make_request("GET", "/test/path") + + assert "Connection pool not initialized" in str(excinfo.value) diff --git a/tests/unit/test_sea_queue.py b/tests/unit/test_sea_queue.py new file mode 100644 index 000000000..6471cb4fd --- /dev/null +++ b/tests/unit/test_sea_queue.py @@ -0,0 +1,735 @@ +""" +Tests for SEA-related queue classes. + +This module contains tests for the JsonQueue, SeaResultSetQueueFactory, and SeaCloudFetchQueue classes. +It also tests the Hybrid disposition which can create either ArrowQueue or SeaCloudFetchQueue based on +whether attachment is set. +""" + +import pytest +from unittest.mock import Mock, patch, MagicMock + +from databricks.sql.backend.sea.queue import ( + JsonQueue, + LinkFetcher, + SeaResultSetQueueFactory, + SeaCloudFetchQueue, +) +from databricks.sql.backend.sea.models.base import ( + ResultData, + ResultManifest, + ExternalLink, +) +from databricks.sql.backend.sea.utils.constants import ResultFormat +from databricks.sql.exc import ProgrammingError, ServerOperationError +from databricks.sql.types import SSLOptions +from databricks.sql.utils import ArrowQueue +import threading +import time + + +class TestJsonQueue: + """Test suite for the JsonQueue class.""" + + @pytest.fixture + def sample_data(self): + """Create sample data for testing.""" + return [ + ["value1", 1, True], + ["value2", 2, False], + ["value3", 3, True], + ["value4", 4, False], + ["value5", 5, True], + ] + + def test_init(self, sample_data): + """Test initialization of JsonQueue.""" + queue = JsonQueue(sample_data) + assert queue.data_array == sample_data + assert queue.cur_row_index == 0 + assert queue.num_rows == len(sample_data) + + def test_init_with_none(self): + """Test initialization with None data.""" + queue = JsonQueue(None) + assert queue.data_array == [] + assert queue.cur_row_index == 0 + assert queue.num_rows == 0 + + def test_next_n_rows_partial(self, sample_data): + """Test fetching a subset of rows.""" + queue = JsonQueue(sample_data) + result = queue.next_n_rows(2) + assert result == sample_data[:2] + assert queue.cur_row_index == 2 + + def test_next_n_rows_all(self, sample_data): + """Test fetching all rows.""" + queue = JsonQueue(sample_data) + result = queue.next_n_rows(len(sample_data)) + assert result == sample_data + assert queue.cur_row_index == len(sample_data) + + def test_next_n_rows_more_than_available(self, sample_data): + """Test fetching more rows than available.""" + queue = JsonQueue(sample_data) + result = queue.next_n_rows(len(sample_data) + 10) + assert result == sample_data + assert queue.cur_row_index == len(sample_data) + + def test_next_n_rows_zero(self, sample_data): + """Test fetching zero rows.""" + queue = JsonQueue(sample_data) + result = queue.next_n_rows(0) + assert result == [] + assert queue.cur_row_index == 0 + + def test_remaining_rows(self, sample_data): + """Test fetching all remaining rows.""" + queue = JsonQueue(sample_data) + + # Fetch some rows first + queue.next_n_rows(2) + + # Now fetch remaining + result = queue.remaining_rows() + assert result == sample_data[2:] + assert queue.cur_row_index == len(sample_data) + + def test_remaining_rows_all(self, sample_data): + """Test fetching all remaining rows from the start.""" + queue = JsonQueue(sample_data) + result = queue.remaining_rows() + assert result == sample_data + assert queue.cur_row_index == len(sample_data) + + def test_remaining_rows_empty(self, sample_data): + """Test fetching remaining rows when none are left.""" + queue = JsonQueue(sample_data) + + # Fetch all rows first + queue.next_n_rows(len(sample_data)) + + # Now fetch remaining (should be empty) + result = queue.remaining_rows() + assert result == [] + assert queue.cur_row_index == len(sample_data) + + +class TestSeaResultSetQueueFactory: + """Test suite for the SeaResultSetQueueFactory class.""" + + @pytest.fixture + def json_manifest(self): + """Create a JSON manifest for testing.""" + return ResultManifest( + format=ResultFormat.JSON_ARRAY.value, + schema={}, + total_row_count=5, + total_byte_count=1000, + total_chunk_count=1, + ) + + @pytest.fixture + def arrow_manifest(self): + """Create an Arrow manifest for testing.""" + return ResultManifest( + format=ResultFormat.ARROW_STREAM.value, + schema={}, + total_row_count=5, + total_byte_count=1000, + total_chunk_count=1, + ) + + @pytest.fixture + def invalid_manifest(self): + """Create an invalid manifest for testing.""" + return ResultManifest( + format="INVALID_FORMAT", + schema={}, + total_row_count=5, + total_byte_count=1000, + total_chunk_count=1, + ) + + @pytest.fixture + def sample_data(self): + """Create sample result data.""" + return [ + ["value1", "1", "true"], + ["value2", "2", "false"], + ] + + @pytest.fixture + def ssl_options(self): + """Create SSL options for testing.""" + return SSLOptions(tls_verify=True) + + @pytest.fixture + def mock_sea_client(self): + """Create a mock SEA client.""" + client = Mock() + client.max_download_threads = 10 + return client + + @pytest.fixture + def description(self): + """Create column descriptions.""" + return [ + ("col1", "string", None, None, None, None, None), + ("col2", "int", None, None, None, None, None), + ("col3", "boolean", None, None, None, None, None), + ] + + def test_build_queue_json_array(self, json_manifest, sample_data): + """Test building a JSON array queue.""" + result_data = ResultData(data=sample_data) + mock_http_client = MagicMock() + + queue = SeaResultSetQueueFactory.build_queue( + result_data=result_data, + manifest=json_manifest, + statement_id="test-statement", + ssl_options=SSLOptions(), + description=[], + max_download_threads=10, + sea_client=Mock(), + lz4_compressed=False, + http_client=mock_http_client, + ) + + assert isinstance(queue, JsonQueue) + assert queue.data_array == sample_data + + def test_build_queue_arrow_stream( + self, arrow_manifest, ssl_options, mock_sea_client, description + ): + """Test building an Arrow stream queue.""" + external_links = [ + ExternalLink( + external_link="https://example.com/data/chunk0", + expiration="2025-07-03T05:51:18.118009", + row_count=100, + byte_count=1024, + row_offset=0, + chunk_index=0, + next_chunk_index=1, + http_headers={"Authorization": "Bearer token123"}, + ) + ] + result_data = ResultData(data=None, external_links=external_links) + + mock_http_client = MagicMock() + + with patch( + "databricks.sql.backend.sea.queue.ResultFileDownloadManager" + ), patch.object(SeaCloudFetchQueue, "_create_next_table", return_value=None): + queue = SeaResultSetQueueFactory.build_queue( + result_data=result_data, + manifest=arrow_manifest, + statement_id="test-statement", + ssl_options=ssl_options, + description=description, + max_download_threads=10, + sea_client=mock_sea_client, + lz4_compressed=False, + http_client=mock_http_client, + ) + + assert isinstance(queue, SeaCloudFetchQueue) + + def test_build_queue_invalid_format(self, invalid_manifest): + """Test building a queue with invalid format.""" + result_data = ResultData(data=[]) + mock_http_client = MagicMock() + + with pytest.raises(ProgrammingError, match="Invalid result format"): + SeaResultSetQueueFactory.build_queue( + result_data=result_data, + manifest=invalid_manifest, + statement_id="test-statement", + ssl_options=SSLOptions(), + description=[], + max_download_threads=10, + sea_client=Mock(), + lz4_compressed=False, + http_client=mock_http_client, + ) + + +class TestSeaCloudFetchQueue: + """Test suite for the SeaCloudFetchQueue class.""" + + @pytest.fixture + def ssl_options(self): + """Create SSL options for testing.""" + return SSLOptions(tls_verify=True) + + @pytest.fixture + def mock_sea_client(self): + """Create a mock SEA client.""" + client = Mock() + client.max_download_threads = 10 + return client + + @pytest.fixture + def description(self): + """Create column descriptions.""" + return [ + ("col1", "string", None, None, None, None, None), + ("col2", "int", None, None, None, None, None), + ("col3", "boolean", None, None, None, None, None), + ] + + @pytest.fixture + def sample_external_link(self): + """Create a sample external link.""" + return ExternalLink( + external_link="https://example.com/data/chunk0", + expiration="2025-07-03T05:51:18.118009", + row_count=100, + byte_count=1024, + row_offset=0, + chunk_index=0, + next_chunk_index=1, + http_headers={"Authorization": "Bearer token123"}, + ) + + @pytest.fixture + def sample_external_link_no_headers(self): + """Create a sample external link without headers.""" + return ExternalLink( + external_link="https://example.com/data/chunk0", + expiration="2025-07-03T05:51:18.118009", + row_count=100, + byte_count=1024, + row_offset=0, + chunk_index=0, + next_chunk_index=1, + http_headers=None, + ) + + def test_convert_to_thrift_link(self, sample_external_link): + """Test conversion of ExternalLink to TSparkArrowResultLink.""" + # Call the method directly + result = LinkFetcher._convert_to_thrift_link(sample_external_link) + + # Verify the conversion + assert result.fileLink == sample_external_link.external_link + assert result.rowCount == sample_external_link.row_count + assert result.bytesNum == sample_external_link.byte_count + assert result.startRowOffset == sample_external_link.row_offset + assert result.httpHeaders == sample_external_link.http_headers + + def test_convert_to_thrift_link_no_headers(self, sample_external_link_no_headers): + """Test conversion of ExternalLink with no headers to TSparkArrowResultLink.""" + # Call the method directly + result = LinkFetcher._convert_to_thrift_link(sample_external_link_no_headers) + + # Verify the conversion + assert result.fileLink == sample_external_link_no_headers.external_link + assert result.rowCount == sample_external_link_no_headers.row_count + assert result.bytesNum == sample_external_link_no_headers.byte_count + assert result.startRowOffset == sample_external_link_no_headers.row_offset + assert result.httpHeaders == {} + + @patch("databricks.sql.backend.sea.queue.ResultFileDownloadManager") + @patch("databricks.sql.backend.sea.queue.logger") + def test_init_with_valid_initial_link( + self, + mock_logger, + mock_download_manager_class, + mock_sea_client, + ssl_options, + description, + sample_external_link, + ): + """Test initialization with valid initial link.""" + # Create a queue with valid initial link + mock_http_client = MagicMock() + with patch.object(SeaCloudFetchQueue, "_create_next_table", return_value=None): + queue = SeaCloudFetchQueue( + result_data=ResultData(external_links=[sample_external_link]), + max_download_threads=5, + ssl_options=ssl_options, + sea_client=mock_sea_client, + statement_id="test-statement-123", + total_chunk_count=1, + lz4_compressed=False, + description=description, + http_client=mock_http_client, + ) + + # Verify attributes + assert queue._current_chunk_index == 0 + assert queue.link_fetcher is not None + + @patch("databricks.sql.backend.sea.queue.ResultFileDownloadManager") + @patch("databricks.sql.backend.sea.queue.logger") + def test_init_no_initial_links( + self, + mock_logger, + mock_download_manager_class, + mock_sea_client, + ssl_options, + description, + ): + """Test initialization with no initial links.""" + # Create a queue with empty initial links + mock_http_client = MagicMock() + queue = SeaCloudFetchQueue( + result_data=ResultData(external_links=[]), + max_download_threads=5, + ssl_options=ssl_options, + sea_client=mock_sea_client, + statement_id="test-statement-123", + total_chunk_count=0, + lz4_compressed=False, + description=description, + http_client=mock_http_client, + ) + assert queue.table is None + + @patch("databricks.sql.backend.sea.queue.logger") + def test_create_next_table_success(self, mock_logger): + """Test _create_next_table with successful table creation.""" + # Create a queue instance without initializing + queue = Mock(spec=SeaCloudFetchQueue) + queue._current_chunk_index = 0 + queue.download_manager = Mock() + queue.link_fetcher = Mock() + + # Mock the dependencies + mock_table = Mock() + mock_chunk_link = Mock() + queue.link_fetcher.get_chunk_link = Mock(return_value=mock_chunk_link) + queue._create_table_at_offset = Mock(return_value=mock_table) + + # Call the method directly + SeaCloudFetchQueue._create_next_table(queue) + + # Verify the chunk index was incremented + assert queue._current_chunk_index == 1 + + # Verify the chunk link was retrieved + queue.link_fetcher.get_chunk_link.assert_called_once_with(0) + + # Verify the table was created from the link + queue._create_table_at_offset.assert_called_once_with( + mock_chunk_link.row_offset + ) + + +class TestHybridDisposition: + """Test suite for the Hybrid disposition handling in SeaResultSetQueueFactory.""" + + @pytest.fixture + def arrow_manifest(self): + """Create an Arrow manifest for testing.""" + return ResultManifest( + format=ResultFormat.ARROW_STREAM.value, + schema={}, + total_row_count=5, + total_byte_count=1000, + total_chunk_count=1, + ) + + @pytest.fixture + def description(self): + """Create column descriptions.""" + return [ + ("col1", "string", None, None, None, None, None), + ("col2", "int", None, None, None, None, None), + ("col3", "boolean", None, None, None, None, None), + ] + + @pytest.fixture + def ssl_options(self): + """Create SSL options for testing.""" + return SSLOptions(tls_verify=True) + + @pytest.fixture + def mock_sea_client(self): + """Create a mock SEA client.""" + client = Mock() + client.max_download_threads = 10 + return client + + @patch("databricks.sql.backend.sea.queue.create_arrow_table_from_arrow_file") + def test_hybrid_disposition_with_attachment( + self, + mock_create_table, + arrow_manifest, + description, + ssl_options, + mock_sea_client, + ): + """Test that ArrowQueue is created when attachment is present.""" + # Create mock arrow table + mock_arrow_table = Mock() + mock_arrow_table.num_rows = 5 + mock_create_table.return_value = mock_arrow_table + + # Create result data with attachment + attachment_data = b"mock_arrow_data" + result_data = ResultData(attachment=attachment_data) + mock_http_client = MagicMock() + # Build queue + queue = SeaResultSetQueueFactory.build_queue( + result_data=result_data, + manifest=arrow_manifest, + statement_id="test-statement", + ssl_options=ssl_options, + description=description, + max_download_threads=10, + sea_client=mock_sea_client, + lz4_compressed=False, + http_client=mock_http_client, + ) + + # Verify ArrowQueue was created + assert isinstance(queue, ArrowQueue) + mock_create_table.assert_called_once_with(attachment_data, description) + + @patch("databricks.sql.backend.sea.queue.ResultFileDownloadManager") + @patch.object(SeaCloudFetchQueue, "_create_next_table", return_value=None) + def test_hybrid_disposition_with_external_links( + self, + mock_create_table, + mock_download_manager, + arrow_manifest, + description, + ssl_options, + mock_sea_client, + ): + """Test that SeaCloudFetchQueue is created when attachment is None but external links are present.""" + # Create external links + external_links = [ + ExternalLink( + external_link="https://example.com/data/chunk0", + expiration="2025-07-03T05:51:18.118009", + row_count=100, + byte_count=1024, + row_offset=0, + chunk_index=0, + next_chunk_index=1, + http_headers={"Authorization": "Bearer token123"}, + ) + ] + + # Create result data with external links but no attachment + result_data = ResultData(external_links=external_links, attachment=None) + + # Build queue + mock_http_client = MagicMock() + queue = SeaResultSetQueueFactory.build_queue( + result_data=result_data, + manifest=arrow_manifest, + statement_id="test-statement", + ssl_options=ssl_options, + description=description, + max_download_threads=10, + sea_client=mock_sea_client, + lz4_compressed=False, + http_client=mock_http_client, + ) + + # Verify SeaCloudFetchQueue was created + assert isinstance(queue, SeaCloudFetchQueue) + mock_create_table.assert_called_once() + + @patch("databricks.sql.backend.sea.queue.ResultSetDownloadHandler._decompress_data") + @patch("databricks.sql.backend.sea.queue.create_arrow_table_from_arrow_file") + def test_hybrid_disposition_with_compressed_attachment( + self, + mock_create_table, + mock_decompress, + arrow_manifest, + description, + ssl_options, + mock_sea_client, + ): + """Test that ArrowQueue is created with decompressed data when attachment is present and lz4_compressed is True.""" + # Create mock arrow table + mock_arrow_table = Mock() + mock_arrow_table.num_rows = 5 + mock_create_table.return_value = mock_arrow_table + + # Setup decompression mock + compressed_data = b"compressed_data" + decompressed_data = b"decompressed_data" + mock_decompress.return_value = decompressed_data + + # Create result data with attachment + result_data = ResultData(attachment=compressed_data) + mock_http_client = MagicMock() + # Build queue with lz4_compressed=True + queue = SeaResultSetQueueFactory.build_queue( + result_data=result_data, + manifest=arrow_manifest, + statement_id="test-statement", + ssl_options=ssl_options, + description=description, + max_download_threads=10, + sea_client=mock_sea_client, + lz4_compressed=True, + http_client=mock_http_client, + ) + + # Verify ArrowQueue was created with decompressed data + assert isinstance(queue, ArrowQueue) + mock_decompress.assert_called_once_with(compressed_data) + mock_create_table.assert_called_once_with(decompressed_data, description) + + +class TestLinkFetcher: + """Unit tests for the LinkFetcher helper class.""" + + @pytest.fixture + def sample_links(self): + """Provide a pair of ExternalLink objects forming two sequential chunks.""" + link0 = ExternalLink( + external_link="https://example.com/data/chunk0", + expiration="2030-01-01T00:00:00.000000", + row_count=100, + byte_count=1024, + row_offset=0, + chunk_index=0, + next_chunk_index=1, + http_headers={"Authorization": "Bearer token0"}, + ) + + link1 = ExternalLink( + external_link="https://example.com/data/chunk1", + expiration="2030-01-01T00:00:00.000000", + row_count=100, + byte_count=1024, + row_offset=100, + chunk_index=1, + next_chunk_index=None, + http_headers={"Authorization": "Bearer token1"}, + ) + + return link0, link1 + + def _create_fetcher( + self, + initial_links, + backend_mock=None, + download_manager_mock=None, + total_chunk_count=10, + ): + """Helper to create a LinkFetcher instance with supplied mocks.""" + if backend_mock is None: + backend_mock = Mock() + if download_manager_mock is None: + download_manager_mock = Mock() + + return ( + LinkFetcher( + download_manager=download_manager_mock, + backend=backend_mock, + statement_id="statement-123", + initial_links=list(initial_links), + total_chunk_count=total_chunk_count, + ), + backend_mock, + download_manager_mock, + ) + + def test_add_links_and_get_next_chunk_index(self, sample_links): + """Verify that initial links are stored and next chunk index is computed correctly.""" + link0, link1 = sample_links + + fetcher, _backend, download_manager = self._create_fetcher([link0]) + + # add_link should have been called for the initial link + download_manager.add_link.assert_called_once() + + # Internal mapping should contain the link + assert fetcher.chunk_index_to_link[0] == link0 + + # The next chunk index should be 1 (from link0.next_chunk_index) + assert fetcher._get_next_chunk_index() == 1 + + # Add second link and validate it is present + fetcher._add_links([link1]) + assert fetcher.chunk_index_to_link[1] == link1 + + def test_trigger_next_batch_download_success(self, sample_links): + """Check that _trigger_next_batch_download fetches and stores new links.""" + link0, link1 = sample_links + + backend_mock = Mock() + backend_mock.get_chunk_links = Mock(return_value=[link1]) + + fetcher, backend, download_manager = self._create_fetcher( + [link0], backend_mock=backend_mock + ) + + # Trigger download of the next chunk (index 1) + success = fetcher._trigger_next_batch_download() + + assert success is True + backend.get_chunk_links.assert_called_once_with("statement-123", 1) + assert fetcher.chunk_index_to_link[1] == link1 + # Two calls to add_link: one for initial link, one for new link + assert download_manager.add_link.call_count == 2 + + def test_trigger_next_batch_download_error(self, sample_links): + """Ensure that errors from backend are captured and surfaced.""" + link0, _link1 = sample_links + + backend_mock = Mock() + backend_mock.get_chunk_links.side_effect = ServerOperationError( + "Backend failure" + ) + + fetcher, backend, download_manager = self._create_fetcher( + [link0], backend_mock=backend_mock + ) + + success = fetcher._trigger_next_batch_download() + + assert success is False + assert fetcher._error is not None + + def test_get_chunk_link_waits_until_available(self, sample_links): + """Validate that get_chunk_link blocks until the requested link is available and then returns it.""" + link0, link1 = sample_links + + backend_mock = Mock() + # Configure backend to return link1 when requested for chunk index 1 + backend_mock.get_chunk_links = Mock(return_value=[link1]) + + fetcher, backend, download_manager = self._create_fetcher( + [link0], backend_mock=backend_mock, total_chunk_count=2 + ) + + # Holder to capture the link returned from the background thread + result_container = {} + + def _worker(): + result_container["link"] = fetcher.get_chunk_link(1) + + thread = threading.Thread(target=_worker) + thread.start() + + # Give the thread a brief moment to start and attempt to fetch (and therefore block) + time.sleep(0.1) + + # Trigger the backend fetch which will add link1 and notify waiting threads + fetcher._trigger_next_batch_download() + + thread.join(timeout=2) + + # The thread should have finished and captured link1 + assert result_container.get("link") == link1 + + def test_get_chunk_link_out_of_range_returns_none(self, sample_links): + """Requesting a chunk index >= total_chunk_count should immediately return None.""" + link0, _ = sample_links + + fetcher, _backend, _dm = self._create_fetcher([link0], total_chunk_count=1) + + assert fetcher.get_chunk_link(10) is None diff --git a/tests/unit/test_sea_result_set.py b/tests/unit/test_sea_result_set.py new file mode 100644 index 000000000..1c3e3b5b4 --- /dev/null +++ b/tests/unit/test_sea_result_set.py @@ -0,0 +1,567 @@ +""" +Tests for the SeaResultSet class. + +This module contains tests for the SeaResultSet class, which implements +the result set functionality for the SEA (Statement Execution API) backend. +""" + +import pytest +from unittest.mock import Mock, patch + +try: + import pyarrow +except ImportError: + pyarrow = None + +from databricks.sql.backend.sea.result_set import SeaResultSet, Row +from databricks.sql.backend.sea.queue import JsonQueue +from databricks.sql.backend.sea.utils.constants import ResultFormat +from databricks.sql.backend.types import CommandId, CommandState +from databricks.sql.backend.sea.models.base import ResultData, ResultManifest + + +class TestSeaResultSet: + """Test suite for the SeaResultSet class.""" + + @pytest.fixture + def mock_connection(self): + """Create a mock connection.""" + connection = Mock() + connection.open = True + connection.session = Mock() + connection.session.ssl_options = Mock() + return connection + + @pytest.fixture + def mock_sea_client(self): + """Create a mock SEA client.""" + client = Mock() + client.max_download_threads = 10 + return client + + @pytest.fixture + def execute_response(self): + """Create a sample execute response.""" + mock_response = Mock() + mock_response.command_id = CommandId.from_sea_statement_id("test-statement-123") + mock_response.status = CommandState.SUCCEEDED + mock_response.has_been_closed_server_side = False + mock_response.has_more_rows = False + mock_response.results_queue = None + mock_response.description = [ + ("col1", "string", None, None, None, None, None), + ("col2", "int", None, None, None, None, None), + ("col3", "boolean", None, None, None, None, None), + ] + mock_response.is_staging_operation = False + mock_response.lz4_compressed = False + mock_response.arrow_schema_bytes = None + return mock_response + + @pytest.fixture + def sample_data(self): + """Create sample data for testing.""" + return [ + ["value1", "1", "true"], + ["value2", "2", "false"], + ["value3", "3", "true"], + ["value4", "4", "false"], + ["value5", "5", "true"], + ] + + def _create_empty_manifest(self, format: ResultFormat): + """Create an empty manifest.""" + return ResultManifest( + format=format.value, + schema={}, + total_row_count=-1, + total_byte_count=-1, + total_chunk_count=-1, + ) + + @pytest.fixture + def result_set_with_data( + self, mock_connection, mock_sea_client, execute_response, sample_data + ): + """Create a SeaResultSet with sample data.""" + # Create ResultData with inline data + result_data = ResultData( + data=sample_data, external_links=None, row_count=len(sample_data) + ) + + # Initialize SeaResultSet with result data + with patch( + "databricks.sql.backend.sea.queue.SeaResultSetQueueFactory.build_queue", + return_value=JsonQueue(sample_data), + ): + result_set = SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=result_data, + manifest=self._create_empty_manifest(ResultFormat.JSON_ARRAY), + buffer_size_bytes=1000, + arraysize=100, + ) + + return result_set + + @pytest.fixture + def mock_arrow_queue(self): + """Create a mock Arrow queue.""" + queue = Mock() + if pyarrow is not None: + queue.next_n_rows.return_value = Mock(spec=pyarrow.Table) + queue.next_n_rows.return_value.num_rows = 0 + queue.remaining_rows.return_value = Mock(spec=pyarrow.Table) + queue.remaining_rows.return_value.num_rows = 0 + return queue + + @pytest.fixture + def mock_json_queue(self): + """Create a mock JSON queue.""" + queue = Mock(spec=JsonQueue) + queue.next_n_rows.return_value = [] + queue.remaining_rows.return_value = [] + return queue + + @pytest.fixture + def result_set_with_arrow_queue( + self, mock_connection, mock_sea_client, execute_response, mock_arrow_queue + ): + """Create a SeaResultSet with an Arrow queue.""" + # Create ResultData with external links + result_data = ResultData(data=None, external_links=[], row_count=0) + + # Initialize SeaResultSet with result data + with patch( + "databricks.sql.backend.sea.queue.SeaResultSetQueueFactory.build_queue", + return_value=mock_arrow_queue, + ): + result_set = SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=result_data, + manifest=ResultManifest( + format=ResultFormat.ARROW_STREAM.value, + schema={}, + total_row_count=0, + total_byte_count=0, + total_chunk_count=0, + ), + buffer_size_bytes=1000, + arraysize=100, + ) + + return result_set + + @pytest.fixture + def result_set_with_json_queue( + self, mock_connection, mock_sea_client, execute_response, mock_json_queue + ): + """Create a SeaResultSet with a JSON queue.""" + # Create ResultData with inline data + result_data = ResultData(data=[], external_links=None, row_count=0) + + # Initialize SeaResultSet with result data + with patch( + "databricks.sql.backend.sea.queue.SeaResultSetQueueFactory.build_queue", + return_value=mock_json_queue, + ): + result_set = SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=result_data, + manifest=ResultManifest( + format=ResultFormat.JSON_ARRAY.value, + schema={}, + total_row_count=0, + total_byte_count=0, + total_chunk_count=0, + ), + buffer_size_bytes=1000, + arraysize=100, + ) + + return result_set + + def test_init_with_execute_response( + self, mock_connection, mock_sea_client, execute_response + ): + """Test initializing SeaResultSet with an execute response.""" + with patch( + "databricks.sql.backend.sea.queue.SeaResultSetQueueFactory.build_queue" + ): + result_set = SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=ResultData(data=[]), + manifest=self._create_empty_manifest(ResultFormat.JSON_ARRAY), + buffer_size_bytes=1000, + arraysize=100, + ) + + # Verify basic properties + assert result_set.command_id == execute_response.command_id + assert result_set.status == CommandState.SUCCEEDED + assert result_set.connection == mock_connection + assert result_set.backend == mock_sea_client + assert result_set.buffer_size_bytes == 1000 + assert result_set.arraysize == 100 + assert result_set.description == execute_response.description + + def test_init_with_invalid_command_id( + self, mock_connection, mock_sea_client, execute_response + ): + """Test initializing SeaResultSet with invalid command ID.""" + # Mock the command ID to return None + mock_command_id = Mock() + mock_command_id.to_sea_statement_id.return_value = None + execute_response.command_id = mock_command_id + + with pytest.raises(ValueError, match="Command ID is not a SEA statement ID"): + SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=ResultData(data=[]), + manifest=self._create_empty_manifest(ResultFormat.JSON_ARRAY), + buffer_size_bytes=1000, + arraysize=100, + ) + + def test_close(self, mock_connection, mock_sea_client, execute_response): + """Test closing a result set.""" + with patch( + "databricks.sql.backend.sea.queue.SeaResultSetQueueFactory.build_queue" + ): + result_set = SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=ResultData(data=[]), + manifest=self._create_empty_manifest(ResultFormat.JSON_ARRAY), + buffer_size_bytes=1000, + arraysize=100, + ) + + # Close the result set + result_set.close() + + # Verify the backend's close_command was called + mock_sea_client.close_command.assert_called_once_with(result_set.command_id) + assert result_set.has_been_closed_server_side is True + assert result_set.status == CommandState.CLOSED + + def test_close_when_already_closed_server_side( + self, mock_connection, mock_sea_client, execute_response + ): + """Test closing a result set that has already been closed server-side.""" + with patch( + "databricks.sql.backend.sea.queue.SeaResultSetQueueFactory.build_queue" + ): + result_set = SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=ResultData(data=[]), + manifest=self._create_empty_manifest(ResultFormat.JSON_ARRAY), + buffer_size_bytes=1000, + arraysize=100, + ) + result_set.has_been_closed_server_side = True + + # Close the result set + result_set.close() + + # Verify the backend's close_command was NOT called + mock_sea_client.close_command.assert_not_called() + assert result_set.has_been_closed_server_side is True + assert result_set.status == CommandState.CLOSED + + def test_close_when_connection_closed( + self, mock_connection, mock_sea_client, execute_response + ): + """Test closing a result set when the connection is closed.""" + mock_connection.open = False + with patch( + "databricks.sql.backend.sea.queue.SeaResultSetQueueFactory.build_queue" + ): + result_set = SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=ResultData(data=[]), + manifest=self._create_empty_manifest(ResultFormat.JSON_ARRAY), + buffer_size_bytes=1000, + arraysize=100, + ) + + # Close the result set + result_set.close() + + # Verify the backend's close_command was NOT called + mock_sea_client.close_command.assert_not_called() + assert result_set.has_been_closed_server_side is True + assert result_set.status == CommandState.CLOSED + + def test_convert_json_types(self, result_set_with_data, sample_data): + """Test the _convert_json_types method.""" + # Call _convert_json_types + converted_row = result_set_with_data._convert_json_types(sample_data[0]) + + # Verify the conversion + assert converted_row[0] == "value1" # string stays as string + assert converted_row[1] == 1 # "1" converted to int + assert converted_row[2] is True # "true" converted to boolean + + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_convert_json_to_arrow_table(self, result_set_with_data, sample_data): + """Test the _convert_json_to_arrow_table method.""" + # Call _convert_json_to_arrow_table + result_table = result_set_with_data._convert_json_to_arrow_table(sample_data) + + # Verify the result + assert isinstance(result_table, pyarrow.Table) + assert result_table.num_rows == len(sample_data) + assert result_table.num_columns == 3 + + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_convert_json_to_arrow_table_empty(self, result_set_with_data): + """Test the _convert_json_to_arrow_table method with empty data.""" + # Call _convert_json_to_arrow_table with empty data + result_table = result_set_with_data._convert_json_to_arrow_table([]) + + # Verify the result + assert isinstance(result_table, pyarrow.Table) + assert result_table.num_rows == 0 + + def test_create_json_table(self, result_set_with_data, sample_data): + """Test the _create_json_table method.""" + # Call _create_json_table + result_rows = result_set_with_data._create_json_table(sample_data) + + # Verify the result + assert len(result_rows) == len(sample_data) + assert isinstance(result_rows[0], Row) + assert result_rows[0].col1 == "value1" + assert result_rows[0].col2 == 1 + assert result_rows[0].col3 is True + + def test_fetchmany_json(self, result_set_with_data): + """Test the fetchmany_json method.""" + # Test fetching a subset of rows + result = result_set_with_data.fetchmany_json(2) + assert len(result) == 2 + assert result_set_with_data._next_row_index == 2 + + # Test fetching the next subset + result = result_set_with_data.fetchmany_json(2) + assert len(result) == 2 + assert result_set_with_data._next_row_index == 4 + + # Test fetching more than available + result = result_set_with_data.fetchmany_json(10) + assert len(result) == 1 # Only one row left + assert result_set_with_data._next_row_index == 5 + + def test_fetchmany_json_negative_size(self, result_set_with_data): + """Test the fetchmany_json method with negative size.""" + with pytest.raises( + ValueError, match="size argument for fetchmany is -1 but must be >= 0" + ): + result_set_with_data.fetchmany_json(-1) + + def test_fetchall_json(self, result_set_with_data, sample_data): + """Test the fetchall_json method.""" + # Test fetching all rows + result = result_set_with_data.fetchall_json() + assert result == sample_data + assert result_set_with_data._next_row_index == len(sample_data) + + # Test fetching again (should return empty) + result = result_set_with_data.fetchall_json() + assert result == [] + assert result_set_with_data._next_row_index == len(sample_data) + + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_fetchmany_arrow(self, result_set_with_data, sample_data): + """Test the fetchmany_arrow method.""" + # Test with JSON queue (should convert to Arrow) + result = result_set_with_data.fetchmany_arrow(2) + assert isinstance(result, pyarrow.Table) + assert result.num_rows == 2 + assert result_set_with_data._next_row_index == 2 + + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_fetchmany_arrow_negative_size(self, result_set_with_data): + """Test the fetchmany_arrow method with negative size.""" + with pytest.raises( + ValueError, match="size argument for fetchmany is -1 but must be >= 0" + ): + result_set_with_data.fetchmany_arrow(-1) + + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_fetchall_arrow(self, result_set_with_data, sample_data): + """Test the fetchall_arrow method.""" + # Test with JSON queue (should convert to Arrow) + result = result_set_with_data.fetchall_arrow() + assert isinstance(result, pyarrow.Table) + assert result.num_rows == len(sample_data) + assert result_set_with_data._next_row_index == len(sample_data) + + def test_fetchone(self, result_set_with_data): + """Test the fetchone method.""" + # Test fetching one row at a time + row1 = result_set_with_data.fetchone() + assert isinstance(row1, Row) + assert row1.col1 == "value1" + assert row1.col2 == 1 + assert row1.col3 is True + assert result_set_with_data._next_row_index == 1 + + row2 = result_set_with_data.fetchone() + assert isinstance(row2, Row) + assert row2.col1 == "value2" + assert row2.col2 == 2 + assert row2.col3 is False + assert result_set_with_data._next_row_index == 2 + + # Fetch the rest + result_set_with_data.fetchall() + + # Test fetching when no more rows + row_none = result_set_with_data.fetchone() + assert row_none is None + + def test_fetchmany(self, result_set_with_data): + """Test the fetchmany method.""" + # Test fetching multiple rows + rows = result_set_with_data.fetchmany(2) + assert len(rows) == 2 + assert isinstance(rows[0], Row) + assert rows[0].col1 == "value1" + assert rows[0].col2 == 1 + assert rows[0].col3 is True + assert rows[1].col1 == "value2" + assert rows[1].col2 == 2 + assert rows[1].col3 is False + assert result_set_with_data._next_row_index == 2 + + # Test with invalid size + with pytest.raises( + ValueError, match="size argument for fetchmany is -1 but must be >= 0" + ): + result_set_with_data.fetchmany(-1) + + def test_fetchall(self, result_set_with_data, sample_data): + """Test the fetchall method.""" + # Test fetching all rows + rows = result_set_with_data.fetchall() + assert len(rows) == len(sample_data) + assert isinstance(rows[0], Row) + assert rows[0].col1 == "value1" + assert rows[0].col2 == 1 + assert rows[0].col3 is True + assert result_set_with_data._next_row_index == len(sample_data) + + # Test fetching again (should return empty) + rows = result_set_with_data.fetchall() + assert len(rows) == 0 + + def test_iteration(self, result_set_with_data, sample_data): + """Test iterating over the result set.""" + # Test iteration + rows = list(result_set_with_data) + assert len(rows) == len(sample_data) + assert isinstance(rows[0], Row) + assert rows[0].col1 == "value1" + assert rows[0].col2 == 1 + assert rows[0].col3 is True + + def test_is_staging_operation( + self, mock_connection, mock_sea_client, execute_response + ): + """Test the is_staging_operation property.""" + # Set is_staging_operation to True + execute_response.is_staging_operation = True + + with patch( + "databricks.sql.backend.sea.queue.SeaResultSetQueueFactory.build_queue" + ): + # Create a result set + result_set = SeaResultSet( + connection=mock_connection, + execute_response=execute_response, + sea_client=mock_sea_client, + result_data=ResultData(data=[]), + manifest=self._create_empty_manifest(ResultFormat.JSON_ARRAY), + buffer_size_bytes=1000, + arraysize=100, + ) + + # Test the property + assert result_set.is_staging_operation is True + + # Edge case tests + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_fetchone_empty_arrow_queue(self, result_set_with_arrow_queue): + """Test fetchone with an empty Arrow queue.""" + # Setup _convert_arrow_table to return empty list + result_set_with_arrow_queue._convert_arrow_table = Mock(return_value=[]) + + # Call fetchone + result = result_set_with_arrow_queue.fetchone() + + # Verify result is None + assert result is None + + # Verify _convert_arrow_table was called + result_set_with_arrow_queue._convert_arrow_table.assert_called_once() + + def test_fetchone_empty_json_queue(self, result_set_with_json_queue): + """Test fetchone with an empty JSON queue.""" + # Setup _create_json_table to return empty list + result_set_with_json_queue._create_json_table = Mock(return_value=[]) + + # Call fetchone + result = result_set_with_json_queue.fetchone() + + # Verify result is None + assert result is None + + # Verify _create_json_table was called + result_set_with_json_queue._create_json_table.assert_called_once() + + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_fetchmany_empty_arrow_queue(self, result_set_with_arrow_queue): + """Test fetchmany with an empty Arrow queue.""" + # Setup _convert_arrow_table to return empty list + result_set_with_arrow_queue._convert_arrow_table = Mock(return_value=[]) + + # Call fetchmany + result = result_set_with_arrow_queue.fetchmany(10) + + # Verify result is an empty list + assert result == [] + + # Verify _convert_arrow_table was called + result_set_with_arrow_queue._convert_arrow_table.assert_called_once() + + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_fetchall_empty_arrow_queue(self, result_set_with_arrow_queue): + """Test fetchall with an empty Arrow queue.""" + # Setup _convert_arrow_table to return empty list + result_set_with_arrow_queue._convert_arrow_table = Mock(return_value=[]) + + # Call fetchall + result = result_set_with_arrow_queue.fetchall() + + # Verify result is an empty list + assert result == [] + + # Verify _convert_arrow_table was called + result_set_with_arrow_queue._convert_arrow_table.assert_called_once() diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py new file mode 100644 index 000000000..136c99e53 --- /dev/null +++ b/tests/unit/test_session.py @@ -0,0 +1,272 @@ +import pytest +from unittest.mock import patch, MagicMock, Mock, PropertyMock +import gc + +from databricks.sql.thrift_api.TCLIService.ttypes import ( + TOpenSessionResp, + TSessionHandle, + THandleIdentifier, +) +from databricks.sql.backend.types import SessionId, BackendType +from databricks.sql.session import Session + +import databricks.sql + + +class TestSession: + """ + Unit tests for Session functionality + """ + + PACKAGE_NAME = "databricks.sql" + DUMMY_CONNECTION_ARGS = { + "server_hostname": "foo", + "http_path": "dummy_path", + "access_token": "tok", + "enable_telemetry": False, + } + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_close_uses_the_correct_session_id(self, mock_client_class): + instance = mock_client_class.return_value + + # Create a mock SessionId that will be returned by open_session + mock_session_id = SessionId(BackendType.THRIFT, b"\x22", b"\x33") + instance.open_session.return_value = mock_session_id + + connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) + connection.close() + + # Check that close_session was called with the correct SessionId + close_session_call_args = instance.close_session.call_args[0][0] + assert close_session_call_args.guid == b"\x22" + assert close_session_call_args.secret == b"\x33" + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_auth_args(self, mock_client_class): + # Test that the following auth args work: + # token = foo, + # token = None, _tls_client_cert_file = something, _use_cert_as_auth = True + connection_args = [ + { + "server_hostname": "foo", + "http_path": None, + "access_token": "tok", + "enable_telemetry": False, + }, + { + "server_hostname": "foo", + "http_path": None, + "_tls_client_cert_file": "something", + "_use_cert_as_auth": True, + "access_token": None, + "enable_telemetry": False, + }, + ] + + for args in connection_args: + connection = databricks.sql.connect(**args) + call_kwargs = mock_client_class.call_args[1] + assert args["server_hostname"] == call_kwargs["server_hostname"] + assert args["http_path"] == call_kwargs["http_path"] + connection.close() + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_http_header_passthrough(self, mock_client_class): + http_headers = [("foo", "bar")] + databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS, http_headers=http_headers) + + call_kwargs = mock_client_class.call_args[1] + assert ("foo", "bar") in call_kwargs["http_headers"] + + @patch("%s.client.UnifiedHttpClient" % PACKAGE_NAME) + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_tls_arg_passthrough(self, mock_client_class, mock_http_client): + databricks.sql.connect( + **self.DUMMY_CONNECTION_ARGS, + _tls_verify_hostname="hostname", + _tls_trusted_ca_file="trusted ca file", + _tls_client_cert_key_file="trusted client cert", + _tls_client_cert_key_password="key password", + ) + + kwargs = mock_client_class.call_args[1] + assert kwargs["_tls_verify_hostname"] == "hostname" + assert kwargs["_tls_trusted_ca_file"] == "trusted ca file" + assert kwargs["_tls_client_cert_key_file"] == "trusted client cert" + assert kwargs["_tls_client_cert_key_password"] == "key password" + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_useragent_header(self, mock_client_class): + databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) + + call_kwargs = mock_client_class.call_args[1] + http_headers = call_kwargs["http_headers"] + user_agent_header = ( + "User-Agent", + "{}/{}".format(databricks.sql.USER_AGENT_NAME, databricks.sql.__version__), + ) + assert user_agent_header in http_headers + + databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS, user_agent_entry="foobar") + user_agent_header_with_entry = ( + "User-Agent", + "{}/{} ({})".format( + databricks.sql.USER_AGENT_NAME, databricks.sql.__version__, "foobar" + ), + ) + call_kwargs = mock_client_class.call_args[1] + http_headers = call_kwargs["http_headers"] + assert user_agent_header_with_entry in http_headers + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_context_manager_closes_connection(self, mock_client_class): + instance = mock_client_class.return_value + + # Create a mock SessionId that will be returned by open_session + mock_session_id = SessionId(BackendType.THRIFT, b"\x22", b"\x33") + instance.open_session.return_value = mock_session_id + + with databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) as connection: + pass + + # Check that close_session was called with the correct SessionId + close_session_call_args = instance.close_session.call_args[0][0] + assert close_session_call_args.guid == b"\x22" + assert close_session_call_args.secret == b"\x33" + + connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) + connection.close = Mock() + try: + with pytest.raises(KeyboardInterrupt): + with connection: + raise KeyboardInterrupt("Simulated interrupt") + finally: + connection.close.assert_called() + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_max_number_of_retries_passthrough(self, mock_client_class): + databricks.sql.connect( + _retry_stop_after_attempts_count=54, **self.DUMMY_CONNECTION_ARGS + ) + + assert mock_client_class.call_args[1]["_retry_stop_after_attempts_count"] == 54 + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_socket_timeout_passthrough(self, mock_client_class): + databricks.sql.connect(_socket_timeout=234, **self.DUMMY_CONNECTION_ARGS) + assert mock_client_class.call_args[1]["_socket_timeout"] == 234 + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_configuration_passthrough(self, mock_client_class): + mock_session_config = {"ANSI_MODE": "FALSE", "QUERY_TAGS": "team:engineering,project:data-pipeline"} + databricks.sql.connect( + session_configuration=mock_session_config, **self.DUMMY_CONNECTION_ARGS + ) + + call_kwargs = mock_client_class.return_value.open_session.call_args[1] + assert call_kwargs["session_configuration"] == mock_session_config + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_enable_metric_view_metadata_parameter(self, mock_client_class): + """Test that enable_metric_view_metadata parameter sets the correct session configuration.""" + databricks.sql.connect( + enable_metric_view_metadata=True, **self.DUMMY_CONNECTION_ARGS + ) + + call_kwargs = mock_client_class.return_value.open_session.call_args[1] + expected_config = {"spark.sql.thriftserver.metadata.metricview.enabled": "true"} + assert call_kwargs["session_configuration"] == expected_config + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_initial_namespace_passthrough(self, mock_client_class): + mock_cat = Mock() + mock_schem = Mock() + databricks.sql.connect( + **self.DUMMY_CONNECTION_ARGS, catalog=mock_cat, schema=mock_schem + ) + + call_kwargs = mock_client_class.return_value.open_session.call_args[1] + assert call_kwargs["catalog"] == mock_cat + assert call_kwargs["schema"] == mock_schem + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_finalizer_closes_abandoned_connection(self, mock_client_class): + instance = mock_client_class.return_value + + mock_session_id = SessionId(BackendType.THRIFT, b"\x22", b"\x33") + instance.open_session.return_value = mock_session_id + + databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) + + # not strictly necessary as the refcount is 0, but just to be sure + gc.collect() + + # Check that close_session was called with the correct SessionId + close_session_call_args = instance.close_session.call_args[0][0] + assert close_session_call_args.guid == b"\x22" + assert close_session_call_args.secret == b"\x33" + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_query_tags_dict_sets_session_config(self, mock_client_class): + databricks.sql.connect( + query_tags={"team": "data-eng", "project": "etl"}, + **self.DUMMY_CONNECTION_ARGS, + ) + + call_kwargs = mock_client_class.return_value.open_session.call_args[1] + assert call_kwargs["session_configuration"]["QUERY_TAGS"] == "team:data-eng,project:etl" + + @patch("%s.session.ThriftDatabricksClient" % PACKAGE_NAME) + def test_query_tags_dict_takes_precedence_over_session_config(self, mock_client_class): + databricks.sql.connect( + query_tags={"team": "new-team"}, + session_configuration={"QUERY_TAGS": "team:old-team,other:value"}, + **self.DUMMY_CONNECTION_ARGS, + ) + + call_kwargs = mock_client_class.return_value.open_session.call_args[1] + assert call_kwargs["session_configuration"]["QUERY_TAGS"] == "team:new-team" + + +class TestSpogHeaders: + """Unit tests for SPOG header extraction from http_path.""" + + def test_extracts_org_id_from_query_param(self): + result = Session._extract_spog_headers( + "/sql/1.0/warehouses/abc123?o=6051921418418893", [] + ) + assert result == {"x-databricks-org-id": "6051921418418893"} + + def test_no_query_param_returns_empty(self): + result = Session._extract_spog_headers( + "/sql/1.0/warehouses/abc123", [] + ) + assert result == {} + + def test_no_o_param_returns_empty(self): + result = Session._extract_spog_headers( + "/sql/1.0/warehouses/abc123?other=value", [] + ) + assert result == {} + + def test_empty_http_path_returns_empty(self): + result = Session._extract_spog_headers("", []) + assert result == {} + + def test_none_http_path_returns_empty(self): + result = Session._extract_spog_headers(None, []) + assert result == {} + + def test_explicit_header_takes_precedence(self): + existing = [("x-databricks-org-id", "explicit-value")] + result = Session._extract_spog_headers( + "/sql/1.0/warehouses/abc123?o=6051921418418893", existing + ) + assert result == {} + + def test_multiple_query_params(self): + result = Session._extract_spog_headers( + "/sql/1.0/warehouses/abc123?o=12345&extra=val", [] + ) + assert result == {"x-databricks-org-id": "12345"} diff --git a/tests/unit/test_streaming_put.py b/tests/unit/test_streaming_put.py new file mode 100644 index 000000000..2b9a9e6d6 --- /dev/null +++ b/tests/unit/test_streaming_put.py @@ -0,0 +1,113 @@ +import io +from unittest.mock import patch, Mock, MagicMock + +import pytest + +import databricks.sql.client as client + + +class TestStreamingPut: + """Unit tests for streaming PUT functionality.""" + + @pytest.fixture + def cursor(self): + return client.Cursor(connection=Mock(), backend=Mock()) + + def _setup_mock_staging_put_stream_response(self, mock_backend): + """Helper method to set up mock staging PUT stream response.""" + mock_result_set = Mock() + mock_result_set.is_staging_operation = True + mock_backend.execute_command.return_value = mock_result_set + + mock_row = Mock() + mock_row.operation = "PUT" + mock_row.localFile = "__input_stream__" + mock_row.presignedUrl = "https://example.com/upload" + mock_row.headers = "{}" + mock_result_set.fetchone.return_value = mock_row + + return mock_result_set + + def test_execute_with_valid_stream(self, cursor): + """Test execute method with valid input stream.""" + + # Mock the backend response + self._setup_mock_staging_put_stream_response(cursor.backend) + + # Test with valid stream + test_stream = io.BytesIO(b"test data") + + with patch.object(cursor, "_handle_staging_put_stream") as mock_handler: + cursor.execute( + "PUT '__input_stream__' INTO '/Volumes/test/cat/schema/vol/file.txt'", + input_stream=test_stream, + ) + + # Verify staging handler was called + mock_handler.assert_called_once() + + def test_execute_with_none_stream_for_staging_put(self, cursor): + """Test execute method rejects None stream for streaming PUT operations.""" + + # Mock staging operation response for None case + self._setup_mock_staging_put_stream_response(cursor.backend) + + # None with __input_stream__ raises ProgrammingError + with pytest.raises(client.ProgrammingError) as excinfo: + cursor.execute( + "PUT '__input_stream__' INTO '/Volumes/test/cat/schema/vol/file.txt'", + input_stream=None, + ) + error_msg = str(excinfo.value) + assert "No input stream provided for streaming operation" in error_msg + + def test_handle_staging_put_stream_success(self, cursor): + """Test successful streaming PUT operation.""" + + presigned_url = "https://example.com/upload" + headers = {"Content-Type": "text/plain"} + + with patch.object( + cursor.connection.http_client, "request" + ) as mock_http_request: + mock_response = MagicMock() + mock_response.status = 200 + mock_response.data = b"success" + mock_http_request.return_value = mock_response + + test_stream = io.BytesIO(b"test data") + cursor._handle_staging_put_stream( + presigned_url=presigned_url, stream=test_stream, headers=headers + ) + + # Verify the HTTP client was called correctly + mock_http_request.assert_called_once() + call_args = mock_http_request.call_args + # Check positional arguments: (method, url, body=..., headers=...) + assert call_args[0][0].value == "PUT" # First positional arg is method + assert call_args[0][1] == presigned_url # Second positional arg is url + # Check keyword arguments + assert call_args[1]["body"] == b"test data" + assert call_args[1]["headers"] == headers + + def test_handle_staging_put_stream_http_error(self, cursor): + """Test streaming PUT operation with HTTP error.""" + + presigned_url = "https://example.com/upload" + + with patch.object( + cursor.connection.http_client, "request" + ) as mock_http_request: + mock_response = MagicMock() + mock_response.status = 500 + mock_response.data = b"Internal Server Error" + mock_http_request.return_value = mock_response + + test_stream = io.BytesIO(b"test data") + with pytest.raises(client.OperationalError) as excinfo: + cursor._handle_staging_put_stream( + presigned_url=presigned_url, stream=test_stream + ) + + # Check for the actual error message format + assert "500" in str(excinfo.value) diff --git a/tests/unit/test_telemetry.py b/tests/unit/test_telemetry.py new file mode 100644 index 000000000..86f06aa8a --- /dev/null +++ b/tests/unit/test_telemetry.py @@ -0,0 +1,899 @@ +import uuid +import pytest +from unittest.mock import patch, MagicMock +import json +from dataclasses import asdict + +from databricks.sql.telemetry.telemetry_client import ( + TelemetryClient, + NoopTelemetryClient, + TelemetryClientFactory, + TelemetryHelper, +) +from databricks.sql.common.feature_flag import ( + FeatureFlagsContextFactory, + FeatureFlagsContext, +) +from databricks.sql.telemetry.models.enums import AuthMech, AuthFlow, DatabricksClientType +from databricks.sql.telemetry.models.event import ( + TelemetryEvent, + DriverConnectionParameters, + DriverSystemConfiguration, + SqlExecutionEvent, + DriverErrorInfo, + DriverVolumeOperation, + HostDetails, +) +from databricks.sql.auth.authenticators import ( + AccessTokenAuthProvider, + DatabricksOAuthProvider, + ExternalAuthProvider, +) +from databricks import sql + + +@pytest.fixture +def mock_telemetry_client(): + """Create a mock telemetry client for testing.""" + session_id = str(uuid.uuid4()) + auth_provider = AccessTokenAuthProvider("test-token") + executor = MagicMock() + client_context = MagicMock() + + # Patch the _setup_pool_manager method to avoid SSL file loading + with patch( + "databricks.sql.common.unified_http_client.UnifiedHttpClient._setup_pool_managers" + ): + return TelemetryClient( + telemetry_enabled=True, + session_id_hex=session_id, + auth_provider=auth_provider, + host_url="test-host.com", + executor=executor, + batch_size=TelemetryClientFactory.DEFAULT_BATCH_SIZE, + client_context=client_context, + ) + + +class TestNoopTelemetryClient: + """Tests for NoopTelemetryClient - should do nothing safely.""" + + def test_noop_client_behavior(self): + """Test that NoopTelemetryClient is a singleton and all methods are safe no-ops.""" + # Test singleton behavior + client1 = NoopTelemetryClient() + client2 = NoopTelemetryClient() + assert client1 is client2 + + # Test that all methods can be called without exceptions + client1.export_initial_telemetry_log(MagicMock(), "test-agent") + client1.export_failure_log("TestError", "Test message") + client1.export_latency_log(100, "EXECUTE_STATEMENT", "test-id") + client1.close() + + +class TestTelemetryClient: + """Tests for actual telemetry client functionality and flows.""" + + def test_event_batching_and_flushing_flow(self, mock_telemetry_client): + """Test the complete event batching and flushing flow.""" + client = mock_telemetry_client + client._batch_size = 3 # Small batch for testing + + # Mock the network call + with patch.object(client, "_send_telemetry") as mock_send: + # Add events one by one - should not flush yet + client._export_event("event1") + client._export_event("event2") + mock_send.assert_not_called() + assert client._events_queue.qsize() == 2 + + # Third event should trigger flush + client._export_event("event3") + mock_send.assert_called_once() + assert client._events_queue.qsize() == 0 # Queue cleared after flush + + @patch("databricks.sql.common.unified_http_client.UnifiedHttpClient.request") + def test_network_request_flow(self, mock_http_request, mock_telemetry_client): + """Test the complete network request flow with authentication.""" + # Mock response for unified HTTP client + mock_response = MagicMock() + mock_response.status = 200 + mock_response.status_code = 200 + mock_http_request.return_value = mock_response + + client = mock_telemetry_client + + # Create mock events + mock_events = [MagicMock() for _ in range(2)] + for i, event in enumerate(mock_events): + event.to_json.return_value = f'{{"event": "{i}"}}' + + # Send telemetry + client._send_telemetry(mock_events) + + # Verify request was submitted to executor + client._executor.submit.assert_called_once() + args, kwargs = client._executor.submit.call_args + + # Verify correct function and URL + assert args[0] == client._send_with_unified_client + assert args[1] == "https://test-host.com/telemetry-ext" + assert kwargs["headers"]["Authorization"] == "Bearer test-token" + + # Verify request body structure + request_data = kwargs["data"] + assert '"uploadTime"' in request_data + assert '"protoLogs"' in request_data + + def test_telemetry_logging_flows(self, mock_telemetry_client): + """Test all telemetry logging methods work end-to-end.""" + client = mock_telemetry_client + + with patch.object(client, "_export_event") as mock_export: + # Test initial log + client.export_initial_telemetry_log(MagicMock(), "test-agent") + assert mock_export.call_count == 1 + + # Test failure log + client.export_failure_log("TestError", "Error message") + assert mock_export.call_count == 2 + + # Test latency log + client.export_latency_log(150, "EXECUTE_STATEMENT", "stmt-123") + assert mock_export.call_count == 3 + + def test_error_handling_resilience(self, mock_telemetry_client): + """Test that telemetry errors don't break the client.""" + client = mock_telemetry_client + + # Test that exceptions in telemetry don't propagate + with patch.object(client, "_export_event", side_effect=Exception("Test error")): + # These should not raise exceptions + client.export_initial_telemetry_log(MagicMock(), "test-agent") + client.export_failure_log("TestError", "Error message") + client.export_latency_log(100, "EXECUTE_STATEMENT", "stmt-123") + + # Test executor submission failure + client._executor.submit.side_effect = Exception("Thread pool error") + client._send_telemetry([MagicMock()]) # Should not raise + + +class TestTelemetryHelper: + """Tests for TelemetryHelper utility functions.""" + + def test_system_configuration_caching(self): + """Test that system configuration is cached and contains expected data.""" + config1 = TelemetryHelper.get_driver_system_configuration() + config2 = TelemetryHelper.get_driver_system_configuration() + + # Should be cached (same instance) + assert config1 is config2 + + def test_auth_mechanism_detection(self): + """Test authentication mechanism detection for different providers.""" + test_cases = [ + (AccessTokenAuthProvider("token"), AuthMech.PAT), + (MagicMock(spec=DatabricksOAuthProvider), AuthMech.OAUTH), + (MagicMock(spec=ExternalAuthProvider), AuthMech.OTHER), + (MagicMock(), AuthMech.OTHER), # Unknown provider + (None, None), + ] + + for provider, expected in test_cases: + assert TelemetryHelper.get_auth_mechanism(provider) == expected + + def test_auth_flow_detection(self): + """Test authentication flow detection for OAuth providers.""" + # OAuth with existing tokens + oauth_with_tokens = MagicMock(spec=DatabricksOAuthProvider) + oauth_with_tokens._access_token = "test-access-token" + oauth_with_tokens._refresh_token = "test-refresh-token" + assert ( + TelemetryHelper.get_auth_flow(oauth_with_tokens) + == AuthFlow.TOKEN_PASSTHROUGH + ) + + # Test OAuth with browser-based auth + oauth_with_browser = MagicMock(spec=DatabricksOAuthProvider) + oauth_with_browser._access_token = None + oauth_with_browser._refresh_token = None + oauth_with_browser.oauth_manager = MagicMock() + assert ( + TelemetryHelper.get_auth_flow(oauth_with_browser) + == AuthFlow.BROWSER_BASED_AUTHENTICATION + ) + + # Test non-OAuth provider + pat_auth = AccessTokenAuthProvider("test-token") + assert TelemetryHelper.get_auth_flow(pat_auth) is None + + # Test None auth provider + assert TelemetryHelper.get_auth_flow(None) is None + + +class TestTelemetryFactory: + """Tests for TelemetryClientFactory lifecycle and management.""" + + @pytest.fixture(autouse=True) + def telemetry_system_reset(self): + """Reset telemetry system state before each test.""" + TelemetryClientFactory._clients.clear() + if TelemetryClientFactory._executor: + TelemetryClientFactory._executor.shutdown(wait=True) + TelemetryClientFactory._executor = None + TelemetryClientFactory._initialized = False + yield + TelemetryClientFactory._clients.clear() + if TelemetryClientFactory._executor: + TelemetryClientFactory._executor.shutdown(wait=True) + TelemetryClientFactory._executor = None + TelemetryClientFactory._initialized = False + + def test_client_lifecycle_flow(self): + """Test complete client lifecycle: initialize -> use -> close.""" + session_id_hex = "test-session" + auth_provider = AccessTokenAuthProvider("token") + client_context = MagicMock() + + # Initialize enabled client + with patch( + "databricks.sql.common.unified_http_client.UnifiedHttpClient._setup_pool_managers" + ): + TelemetryClientFactory.initialize_telemetry_client( + telemetry_enabled=True, + session_id_hex=session_id_hex, + auth_provider=auth_provider, + host_url="test-host.com", + batch_size=TelemetryClientFactory.DEFAULT_BATCH_SIZE, + client_context=client_context, + ) + + client = TelemetryClientFactory.get_telemetry_client("test-host.com") + assert isinstance(client, TelemetryClient) + assert client._session_id_hex == session_id_hex + + # Close client + with patch.object(client, "close") as mock_close: + TelemetryClientFactory.close(host_url="test-host.com") + mock_close.assert_called_once() + + # Should get NoopTelemetryClient after close + + def test_disabled_telemetry_creates_noop_client(self): + """Test that disabled telemetry creates NoopTelemetryClient.""" + session_id_hex = "test-session" + client_context = MagicMock() + + TelemetryClientFactory.initialize_telemetry_client( + telemetry_enabled=False, + session_id_hex=session_id_hex, + auth_provider=None, + host_url="test-host.com", + batch_size=TelemetryClientFactory.DEFAULT_BATCH_SIZE, + client_context=client_context, + ) + + client = TelemetryClientFactory.get_telemetry_client("test-host.com") + assert isinstance(client, NoopTelemetryClient) + + def test_factory_error_handling(self): + """Test that factory errors fall back to NoopTelemetryClient.""" + session_id = "test-session" + client_context = MagicMock() + + # Simulate initialization error + with patch( + "databricks.sql.telemetry.telemetry_client.TelemetryClient", + side_effect=Exception("Init error"), + ): + TelemetryClientFactory.initialize_telemetry_client( + telemetry_enabled=True, + session_id_hex=session_id, + auth_provider=AccessTokenAuthProvider("token"), + host_url="test-host.com", + batch_size=TelemetryClientFactory.DEFAULT_BATCH_SIZE, + client_context=client_context, + ) + + # Should fall back to NoopTelemetryClient + client = TelemetryClientFactory.get_telemetry_client("test-host.com") + assert isinstance(client, NoopTelemetryClient) + + def test_factory_shutdown_flow(self): + """Test factory shutdown when last client is removed.""" + session1 = "session-1" + session2 = "session-2" + client_context = MagicMock() + + # Initialize multiple clients + with patch( + "databricks.sql.common.unified_http_client.UnifiedHttpClient._setup_pool_managers" + ): + for session in [session1, session2]: + TelemetryClientFactory.initialize_telemetry_client( + telemetry_enabled=True, + session_id_hex=session, + auth_provider=AccessTokenAuthProvider("token"), + host_url="test-host.com", + batch_size=TelemetryClientFactory.DEFAULT_BATCH_SIZE, + client_context=client_context, + ) + + # Factory should be initialized + assert TelemetryClientFactory._initialized is True + assert TelemetryClientFactory._executor is not None + + # Close first client - factory should stay initialized + TelemetryClientFactory.close(host_url="test-host.com") + assert TelemetryClientFactory._initialized is True + + # Close second client - factory should shut down + TelemetryClientFactory.close(host_url="test-host.com") + assert TelemetryClientFactory._initialized is False + assert TelemetryClientFactory._executor is None + + @patch( + "databricks.sql.telemetry.telemetry_client.TelemetryClient.export_failure_log" + ) + @patch("databricks.sql.client.Session") + def test_connection_failure_sends_correct_telemetry_payload( + self, mock_session, mock_export_failure_log + ): + """ + Verify that a connection failure constructs and sends the correct + telemetry payload via _send_telemetry. + """ + + error_message = "Could not connect to host" + # Set up the mock to create a session instance first, then make open() fail + mock_session_instance = MagicMock() + mock_session_instance.is_open = False # Ensure cleanup is safe + mock_session_instance.open.side_effect = Exception(error_message) + mock_session.return_value = mock_session_instance + + try: + sql.connect(server_hostname="test-host", http_path="/test-path") + except Exception as e: + assert str(e) == error_message + + mock_export_failure_log.assert_called_once() + call_arguments = mock_export_failure_log.call_args + assert call_arguments[0][0] == "Exception" + assert call_arguments[0][1] == error_message + + +@patch("databricks.sql.client.Session") +class TestTelemetryFeatureFlag: + """Tests the interaction between the telemetry feature flag and connection parameters.""" + + def teardown_method(self): + """Clean up telemetry factory state after each test to prevent test pollution.""" + from databricks.sql.common.feature_flag import FeatureFlagsContextFactory + + TelemetryClientFactory._clients.clear() + FeatureFlagsContextFactory._context_map.clear() + + def _mock_ff_response(self, mock_http_request, enabled: bool): + """Helper method to mock feature flag response for unified HTTP client.""" + mock_response = MagicMock() + mock_response.status = 200 + mock_response.status_code = 200 # Compatibility attribute + payload = { + "flags": [ + { + "name": "databricks.partnerplatform.clientConfigsFeatureFlags.enableTelemetryForPythonDriver", + "value": str(enabled).lower(), + } + ], + "ttl_seconds": 3600, + } + mock_response.json.return_value = payload + mock_response.data = json.dumps(payload).encode() + mock_http_request.return_value = mock_response + + @patch("databricks.sql.common.unified_http_client.UnifiedHttpClient.request") + def test_telemetry_enabled_when_flag_is_true(self, mock_http_request, MockSession): + """Telemetry should be ON when enable_telemetry=True and server flag is 'true'.""" + self._mock_ff_response(mock_http_request, enabled=True) + mock_session_instance = MockSession.return_value + mock_session_instance.guid_hex = "test-session-ff-true" + mock_session_instance.host = "test-host" # Set host for telemetry client lookup + mock_session_instance.auth_provider = AccessTokenAuthProvider("token") + mock_session_instance.is_open = ( + False # Connection starts closed for test cleanup + ) + + # Set up mock HTTP client on the session + mock_http_client = MagicMock() + mock_http_client.request = mock_http_request + mock_session_instance.http_client = mock_http_client + + conn = sql.client.Connection( + server_hostname="test", + http_path="test", + access_token="test", + enable_telemetry=True, + ) + + assert conn.telemetry_enabled is True + mock_http_request.assert_called_once() + client = TelemetryClientFactory.get_telemetry_client("test-host") + assert isinstance(client, TelemetryClient) + + @patch("databricks.sql.common.unified_http_client.UnifiedHttpClient.request") + def test_telemetry_disabled_when_flag_is_false( + self, mock_http_request, MockSession + ): + """Telemetry should be OFF when enable_telemetry=True but server flag is 'false'.""" + self._mock_ff_response(mock_http_request, enabled=False) + mock_session_instance = MockSession.return_value + mock_session_instance.guid_hex = "test-session-ff-false" + mock_session_instance.host = "test-host" # Set host for telemetry client lookup + mock_session_instance.auth_provider = AccessTokenAuthProvider("token") + mock_session_instance.is_open = ( + False # Connection starts closed for test cleanup + ) + + # Set up mock HTTP client on the session + mock_http_client = MagicMock() + mock_http_client.request = mock_http_request + mock_session_instance.http_client = mock_http_client + + conn = sql.client.Connection( + server_hostname="test", + http_path="test", + access_token="test", + enable_telemetry=True, + ) + + assert conn.telemetry_enabled is False + mock_http_request.assert_called_once() + client = TelemetryClientFactory.get_telemetry_client("test-host") + assert isinstance(client, NoopTelemetryClient) + + @patch("databricks.sql.common.unified_http_client.UnifiedHttpClient.request") + def test_telemetry_disabled_when_flag_request_fails( + self, mock_http_request, MockSession + ): + """Telemetry should default to OFF if the feature flag network request fails.""" + mock_http_request.side_effect = Exception("Network is down") + mock_session_instance = MockSession.return_value + mock_session_instance.guid_hex = "test-session-ff-fail" + mock_session_instance.host = "test-host" # Set host for telemetry client lookup + mock_session_instance.auth_provider = AccessTokenAuthProvider("token") + mock_session_instance.is_open = ( + False # Connection starts closed for test cleanup + ) + + # Set up mock HTTP client on the session + mock_http_client = MagicMock() + mock_http_client.request = mock_http_request + mock_session_instance.http_client = mock_http_client + + conn = sql.client.Connection( + server_hostname="test", + http_path="test", + access_token="test", + enable_telemetry=True, + ) + + assert conn.telemetry_enabled is False + mock_http_request.assert_called_once() + client = TelemetryClientFactory.get_telemetry_client("test-host") + assert isinstance(client, NoopTelemetryClient) + + +class TestTelemetryEventModels: + """Tests for telemetry event model data structures and JSON serialization.""" + + def test_host_details_serialization(self): + """Test HostDetails model serialization.""" + host = HostDetails(host_url="test-host.com", port=443) + + # Test JSON string generation + json_str = host.to_json() + assert isinstance(json_str, str) + parsed = json.loads(json_str) + assert parsed["host_url"] == "test-host.com" + assert parsed["port"] == 443 + + def test_driver_connection_parameters_all_fields(self): + """Test DriverConnectionParameters with all fields populated.""" + host_info = HostDetails(host_url="workspace.databricks.com", port=443) + proxy_info = HostDetails(host_url="proxy.company.com", port=8080) + cf_proxy_info = HostDetails(host_url="cf-proxy.company.com", port=8080) + + params = DriverConnectionParameters( + http_path="/sql/1.0/warehouses/abc123", + mode=DatabricksClientType.SEA, + host_info=host_info, + auth_mech=AuthMech.OAUTH, + auth_flow=AuthFlow.BROWSER_BASED_AUTHENTICATION, + socket_timeout=30000, + azure_workspace_resource_id="/subscriptions/test/resourceGroups/test", + azure_tenant_id="tenant-123", + use_proxy=True, + use_system_proxy=True, + proxy_host_info=proxy_info, + use_cf_proxy=False, + cf_proxy_host_info=cf_proxy_info, + non_proxy_hosts=["localhost", "127.0.0.1"], + allow_self_signed_support=False, + use_system_trust_store=True, + enable_arrow=True, + enable_direct_results=True, + enable_sea_hybrid_results=True, + http_connection_pool_size=100, + rows_fetched_per_block=100000, + async_poll_interval_millis=2000, + support_many_parameters=True, + enable_complex_datatype_support=True, + allowed_volume_ingestion_paths="/Volumes/catalog/schema/volume", + query_tags="team:engineering,project:telemetry", + ) + + # Serialize to JSON and parse back + json_str = params.to_json() + json_dict = json.loads(json_str) + + # Verify all new fields are in JSON + assert json_dict["http_path"] == "/sql/1.0/warehouses/abc123" + assert json_dict["mode"] == "SEA" + assert json_dict["host_info"]["host_url"] == "workspace.databricks.com" + assert json_dict["auth_mech"] == "OAUTH" + assert json_dict["auth_flow"] == "BROWSER_BASED_AUTHENTICATION" + assert json_dict["socket_timeout"] == 30000 + assert json_dict["azure_workspace_resource_id"] == "/subscriptions/test/resourceGroups/test" + assert json_dict["azure_tenant_id"] == "tenant-123" + assert json_dict["use_proxy"] is True + assert json_dict["use_system_proxy"] is True + assert json_dict["proxy_host_info"]["host_url"] == "proxy.company.com" + assert json_dict["use_cf_proxy"] is False + assert json_dict["cf_proxy_host_info"]["host_url"] == "cf-proxy.company.com" + assert json_dict["non_proxy_hosts"] == ["localhost", "127.0.0.1"] + assert json_dict["allow_self_signed_support"] is False + assert json_dict["use_system_trust_store"] is True + assert json_dict["enable_arrow"] is True + assert json_dict["enable_direct_results"] is True + assert json_dict["enable_sea_hybrid_results"] is True + assert json_dict["http_connection_pool_size"] == 100 + assert json_dict["rows_fetched_per_block"] == 100000 + assert json_dict["async_poll_interval_millis"] == 2000 + assert json_dict["support_many_parameters"] is True + assert json_dict["enable_complex_datatype_support"] is True + assert json_dict["allowed_volume_ingestion_paths"] == "/Volumes/catalog/schema/volume" + assert json_dict["query_tags"] == "team:engineering,project:telemetry" + + def test_driver_connection_parameters_minimal_fields(self): + """Test DriverConnectionParameters with only required fields.""" + host_info = HostDetails(host_url="workspace.databricks.com", port=443) + + params = DriverConnectionParameters( + http_path="/sql/1.0/warehouses/abc123", + mode=DatabricksClientType.THRIFT, + host_info=host_info, + ) + + # Note: to_json() filters out None values, so we need to check asdict for complete structure + json_str = params.to_json() + json_dict = json.loads(json_str) + + # Required fields should be present + assert json_dict["http_path"] == "/sql/1.0/warehouses/abc123" + assert json_dict["mode"] == "THRIFT" + assert json_dict["host_info"]["host_url"] == "workspace.databricks.com" + + # Optional fields with None are filtered out by to_json() + # This is expected behavior - None values are excluded from JSON output + + def test_driver_system_configuration_serialization(self): + """Test DriverSystemConfiguration model serialization.""" + sys_config = DriverSystemConfiguration( + driver_name="Databricks SQL Connector for Python", + driver_version="3.0.0", + runtime_name="CPython", + runtime_version="3.11.0", + runtime_vendor="Python Software Foundation", + os_name="Darwin", + os_version="23.0.0", + os_arch="arm64", + char_set_encoding="utf-8", + locale_name="en_US", + client_app_name="MyApp", + ) + + json_str = sys_config.to_json() + json_dict = json.loads(json_str) + + assert json_dict["driver_name"] == "Databricks SQL Connector for Python" + assert json_dict["driver_version"] == "3.0.0" + assert json_dict["runtime_name"] == "CPython" + assert json_dict["runtime_version"] == "3.11.0" + assert json_dict["runtime_vendor"] == "Python Software Foundation" + assert json_dict["os_name"] == "Darwin" + assert json_dict["os_version"] == "23.0.0" + assert json_dict["os_arch"] == "arm64" + assert json_dict["locale_name"] == "en_US" + assert json_dict["char_set_encoding"] == "utf-8" + assert json_dict["client_app_name"] == "MyApp" + + def test_telemetry_event_complete_serialization(self): + """Test complete TelemetryEvent serialization with all nested objects.""" + host_info = HostDetails(host_url="workspace.databricks.com", port=443) + proxy_info = HostDetails(host_url="proxy.company.com", port=8080) + + connection_params = DriverConnectionParameters( + http_path="/sql/1.0/warehouses/abc123", + mode=DatabricksClientType.SEA, + host_info=host_info, + auth_mech=AuthMech.OAUTH, + use_proxy=True, + proxy_host_info=proxy_info, + enable_arrow=True, + rows_fetched_per_block=100000, + ) + + sys_config = DriverSystemConfiguration( + driver_name="Databricks SQL Connector for Python", + driver_version="3.0.0", + runtime_name="CPython", + runtime_version="3.11.0", + runtime_vendor="Python Software Foundation", + os_name="Darwin", + os_version="23.0.0", + os_arch="arm64", + char_set_encoding="utf-8", + ) + + error_info = DriverErrorInfo( + error_name="ConnectionError", + stack_trace="Traceback...", + ) + + event = TelemetryEvent( + session_id="test-session-123", + sql_statement_id="test-stmt-456", + operation_latency_ms=1500, + auth_type="OAUTH", + system_configuration=sys_config, + driver_connection_params=connection_params, + error_info=error_info, + ) + + # Test JSON serialization + json_str = event.to_json() + assert isinstance(json_str, str) + + # Parse and verify structure + parsed = json.loads(json_str) + assert parsed["session_id"] == "test-session-123" + assert parsed["sql_statement_id"] == "test-stmt-456" + assert parsed["operation_latency_ms"] == 1500 + assert parsed["auth_type"] == "OAUTH" + + # Verify nested objects + assert parsed["system_configuration"]["driver_name"] == "Databricks SQL Connector for Python" + assert parsed["driver_connection_params"]["http_path"] == "/sql/1.0/warehouses/abc123" + assert parsed["driver_connection_params"]["use_proxy"] is True + assert parsed["driver_connection_params"]["proxy_host_info"]["host_url"] == "proxy.company.com" + assert parsed["error_info"]["error_name"] == "ConnectionError" + + def test_json_serialization_excludes_none_values(self): + """Test that JSON serialization properly excludes None values.""" + host_info = HostDetails(host_url="workspace.databricks.com", port=443) + + params = DriverConnectionParameters( + http_path="/sql/1.0/warehouses/abc123", + mode=DatabricksClientType.SEA, + host_info=host_info, + # All optional fields left as None + ) + + json_str = params.to_json() + parsed = json.loads(json_str) + + # Required fields present + assert parsed["http_path"] == "/sql/1.0/warehouses/abc123" + + # None values should be EXCLUDED from JSON (not included as null) + # This is the behavior of JsonSerializableMixin + assert "auth_mech" not in parsed + assert "azure_tenant_id" not in parsed + assert "proxy_host_info" not in parsed + + +@patch("databricks.sql.client.Session") +@patch("databricks.sql.common.unified_http_client.UnifiedHttpClient._setup_pool_managers") +class TestConnectionParameterTelemetry: + """Tests for connection parameter population in telemetry.""" + + def test_connection_with_proxy_populates_telemetry(self, mock_setup_pools, mock_session): + """Test that proxy configuration is captured in telemetry.""" + mock_session_instance = MagicMock() + mock_session_instance.guid_hex = "test-session-proxy" + mock_session_instance.auth_provider = AccessTokenAuthProvider("token") + mock_session_instance.is_open = False + mock_session_instance.use_sea = True + mock_session_instance.port = 443 + mock_session_instance.host = "workspace.databricks.com" + mock_session.return_value = mock_session_instance + + with patch("databricks.sql.telemetry.telemetry_client.TelemetryClient.export_initial_telemetry_log") as mock_export: + conn = sql.connect( + server_hostname="workspace.databricks.com", + http_path="/sql/1.0/warehouses/test", + access_token="test-token", + enable_telemetry=True, + force_enable_telemetry=True, + ) + + # Verify export was called + mock_export.assert_called_once() + call_args = mock_export.call_args + + # Extract driver_connection_params + driver_params = call_args.kwargs.get("driver_connection_params") + assert driver_params is not None + assert isinstance(driver_params, DriverConnectionParameters) + + # Verify fields are populated + assert driver_params.http_path == "/sql/1.0/warehouses/test" + assert driver_params.mode == DatabricksClientType.SEA + assert driver_params.host_info.host_url == "workspace.databricks.com" + assert driver_params.host_info.port == 443 + + def test_connection_with_azure_params_populates_telemetry(self, mock_setup_pools, mock_session): + """Test that Azure-specific parameters are captured in telemetry.""" + mock_session_instance = MagicMock() + mock_session_instance.guid_hex = "test-session-azure" + mock_session_instance.auth_provider = AccessTokenAuthProvider("token") + mock_session_instance.is_open = False + mock_session_instance.use_sea = False + mock_session_instance.port = 443 + mock_session_instance.host = "workspace.azuredatabricks.net" + mock_session.return_value = mock_session_instance + + with patch("databricks.sql.telemetry.telemetry_client.TelemetryClient.export_initial_telemetry_log") as mock_export: + conn = sql.connect( + server_hostname="workspace.azuredatabricks.net", + http_path="/sql/1.0/warehouses/test", + access_token="test-token", + azure_workspace_resource_id="/subscriptions/test/resourceGroups/test", + azure_tenant_id="tenant-123", + enable_telemetry=True, + force_enable_telemetry=True, + ) + + mock_export.assert_called_once() + driver_params = mock_export.call_args.kwargs.get("driver_connection_params") + + # Verify Azure fields + assert driver_params.azure_workspace_resource_id == "/subscriptions/test/resourceGroups/test" + assert driver_params.azure_tenant_id == "tenant-123" + + def test_connection_populates_arrow_and_performance_params(self, mock_setup_pools, mock_session): + """Test that Arrow and performance parameters are captured in telemetry.""" + mock_session_instance = MagicMock() + mock_session_instance.guid_hex = "test-session-perf" + mock_session_instance.auth_provider = AccessTokenAuthProvider("token") + mock_session_instance.is_open = False + mock_session_instance.use_sea = True + mock_session_instance.port = 443 + mock_session_instance.host = "workspace.databricks.com" + mock_session.return_value = mock_session_instance + + with patch("databricks.sql.telemetry.telemetry_client.TelemetryClient.export_initial_telemetry_log") as mock_export: + # Import pyarrow availability check + try: + import pyarrow + arrow_available = True + except ImportError: + arrow_available = False + + conn = sql.connect( + server_hostname="workspace.databricks.com", + http_path="/sql/1.0/warehouses/test", + access_token="test-token", + pool_maxsize=200, + enable_telemetry=True, + force_enable_telemetry=True, + ) + + mock_export.assert_called_once() + driver_params = mock_export.call_args.kwargs.get("driver_connection_params") + + # Verify performance fields + assert driver_params.enable_arrow == arrow_available + assert driver_params.enable_direct_results is True + assert driver_params.http_connection_pool_size == 200 + assert driver_params.rows_fetched_per_block == 100000 # DEFAULT_ARRAY_SIZE + assert driver_params.async_poll_interval_millis == 2000 + assert driver_params.support_many_parameters is True + + def test_cf_proxy_fields_default_to_false_none(self, mock_setup_pools, mock_session): + """Test that CloudFlare proxy fields default to False/None (not yet supported).""" + mock_session_instance = MagicMock() + mock_session_instance.guid_hex = "test-session-cfproxy" + mock_session_instance.auth_provider = AccessTokenAuthProvider("token") + mock_session_instance.is_open = False + mock_session_instance.use_sea = True + mock_session_instance.port = 443 + mock_session_instance.host = "workspace.databricks.com" + mock_session.return_value = mock_session_instance + + with patch("databricks.sql.telemetry.telemetry_client.TelemetryClient.export_initial_telemetry_log") as mock_export: + conn = sql.connect( + server_hostname="workspace.databricks.com", + http_path="/sql/1.0/warehouses/test", + access_token="test-token", + enable_telemetry=True, + force_enable_telemetry=True, + ) + + mock_export.assert_called_once() + driver_params = mock_export.call_args.kwargs.get("driver_connection_params") + + # CF proxy not yet supported - should be False/None + assert driver_params.use_cf_proxy is False + assert driver_params.cf_proxy_host_info is None + + +class TestFeatureFlagsContextFactory: + """Tests for FeatureFlagsContextFactory host-level caching.""" + + @pytest.fixture(autouse=True) + def reset_factory(self): + """Reset factory state before/after each test.""" + FeatureFlagsContextFactory._context_map.clear() + if FeatureFlagsContextFactory._executor: + FeatureFlagsContextFactory._executor.shutdown(wait=False) + FeatureFlagsContextFactory._executor = None + yield + FeatureFlagsContextFactory._context_map.clear() + if FeatureFlagsContextFactory._executor: + FeatureFlagsContextFactory._executor.shutdown(wait=False) + FeatureFlagsContextFactory._executor = None + + @pytest.mark.parametrize( + "hosts,expected_contexts", + [ + (["host1.com", "host1.com"], 1), # Same host shares context + (["host1.com", "host2.com"], 2), # Different hosts get separate contexts + (["host1.com", "host1.com", "host2.com"], 2), # Mixed scenario + ], + ) + def test_host_level_caching(self, hosts, expected_contexts): + """Test that contexts are cached by host correctly.""" + contexts = [] + for host in hosts: + conn = MagicMock() + conn.session.host = host + conn.session.http_client = MagicMock() + contexts.append(FeatureFlagsContextFactory.get_instance(conn)) + + assert len(FeatureFlagsContextFactory._context_map) == expected_contexts + if expected_contexts == 1: + assert all(ctx is contexts[0] for ctx in contexts) + + def test_remove_instance_and_executor_cleanup(self): + """Test removal uses host key and cleans up executor when empty.""" + conn1 = MagicMock() + conn1.session.host = "host1.com" + conn1.session.http_client = MagicMock() + + conn2 = MagicMock() + conn2.session.host = "host2.com" + conn2.session.http_client = MagicMock() + + FeatureFlagsContextFactory.get_instance(conn1) + FeatureFlagsContextFactory.get_instance(conn2) + assert FeatureFlagsContextFactory._executor is not None + + FeatureFlagsContextFactory.remove_instance(conn1) + assert len(FeatureFlagsContextFactory._context_map) == 1 + assert FeatureFlagsContextFactory._executor is not None + + FeatureFlagsContextFactory.remove_instance(conn2) + assert len(FeatureFlagsContextFactory._context_map) == 0 + assert FeatureFlagsContextFactory._executor is None diff --git a/tests/unit/test_telemetry_push_client.py b/tests/unit/test_telemetry_push_client.py new file mode 100644 index 000000000..6555f1d02 --- /dev/null +++ b/tests/unit/test_telemetry_push_client.py @@ -0,0 +1,213 @@ +""" +Unit tests for telemetry push client functionality. +""" + +import pytest +from unittest.mock import Mock, patch + +from databricks.sql.telemetry.telemetry_push_client import ( + ITelemetryPushClient, + TelemetryPushClient, + CircuitBreakerTelemetryPushClient, +) +from databricks.sql.common.http import HttpMethod +from databricks.sql.exc import TelemetryRateLimitError +from pybreaker import CircuitBreakerError + + +class TestTelemetryPushClient: + """Test cases for TelemetryPushClient.""" + + def setup_method(self): + """Set up test fixtures.""" + self.mock_http_client = Mock() + self.client = TelemetryPushClient(self.mock_http_client) + + def test_initialization(self): + """Test client initialization.""" + assert self.client._http_client == self.mock_http_client + + def test_request_delegates_to_http_client(self): + """Test that request delegates to underlying HTTP client.""" + mock_response = Mock() + self.mock_http_client.request.return_value = mock_response + + response = self.client.request(HttpMethod.POST, "https://test.com", {}) + + assert response == mock_response + self.mock_http_client.request.assert_called_once() + + +class TestCircuitBreakerTelemetryPushClient: + """Test cases for CircuitBreakerTelemetryPushClient.""" + + def setup_method(self): + """Set up test fixtures.""" + self.mock_delegate = Mock(spec=ITelemetryPushClient) + self.host = "test-host.example.com" + self.client = CircuitBreakerTelemetryPushClient(self.mock_delegate, self.host) + + def test_initialization(self): + """Test client initialization.""" + assert self.client._delegate == self.mock_delegate + assert self.client._host == self.host + assert self.client._circuit_breaker is not None + + def test_request_success(self): + """Test successful request when circuit breaker is enabled.""" + mock_response = Mock() + self.mock_delegate.request.return_value = mock_response + + response = self.client.request(HttpMethod.POST, "https://test.com", {}) + + assert response == mock_response + self.mock_delegate.request.assert_called_once() + + def test_request_circuit_breaker_open(self): + """Test request when circuit breaker is open raises CircuitBreakerError.""" + with patch.object( + self.client._circuit_breaker, + "call", + side_effect=CircuitBreakerError("Circuit is open"), + ): + with pytest.raises(CircuitBreakerError): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + def test_request_other_error(self): + """Test request when other error occurs raises original exception.""" + self.mock_delegate.request.side_effect = ValueError("Network error") + + with pytest.raises(ValueError, match="Network error"): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + @pytest.mark.parametrize("status_code,expected_error", [ + (429, TelemetryRateLimitError), + (503, TelemetryRateLimitError), + ]) + def test_request_rate_limit_codes(self, status_code, expected_error): + """Test that rate-limit status codes raise TelemetryRateLimitError.""" + mock_response = Mock() + mock_response.status = status_code + self.mock_delegate.request.return_value = mock_response + + with pytest.raises(expected_error): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + def test_request_non_rate_limit_code(self): + """Test that non-rate-limit status codes return response.""" + mock_response = Mock() + mock_response.status = 500 + mock_response.data = b'Server error' + self.mock_delegate.request.return_value = mock_response + + response = self.client.request(HttpMethod.POST, "https://test.com", {}) + assert response is not None + assert response.status == 500 + + def test_rate_limit_error_logging(self): + """Test that rate limit errors are logged with circuit breaker context.""" + with patch("databricks.sql.telemetry.telemetry_push_client.logger") as mock_logger: + mock_response = Mock() + mock_response.status = 429 + self.mock_delegate.request.return_value = mock_response + + with pytest.raises(TelemetryRateLimitError): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + mock_logger.debug.assert_called() + debug_args = mock_logger.debug.call_args[0] + assert "429" in str(debug_args) + assert "circuit breaker" in debug_args[0] + + def test_other_error_logging(self): + """Test that other errors are logged during wrapping/unwrapping.""" + with patch("databricks.sql.telemetry.telemetry_push_client.logger") as mock_logger: + self.mock_delegate.request.side_effect = ValueError("Network error") + + with pytest.raises(ValueError, match="Network error"): + self.client.request(HttpMethod.POST, "https://test.com", {}) + + assert mock_logger.debug.call_count >= 1 + + +class TestCircuitBreakerTelemetryPushClientIntegration: + """Integration tests for CircuitBreakerTelemetryPushClient.""" + + def setup_method(self): + """Set up test fixtures.""" + self.mock_delegate = Mock() + self.host = "test-host.example.com" + from databricks.sql.telemetry.circuit_breaker_manager import CircuitBreakerManager + CircuitBreakerManager._instances.clear() + + def test_circuit_breaker_opens_after_failures(self): + """Test that circuit breaker opens after repeated failures (429/503 errors).""" + from databricks.sql.telemetry.circuit_breaker_manager import ( + CircuitBreakerManager, + MINIMUM_CALLS, + ) + + CircuitBreakerManager._instances.clear() + client = CircuitBreakerTelemetryPushClient(self.mock_delegate, self.host) + + mock_response = Mock() + mock_response.status = 429 + self.mock_delegate.request.return_value = mock_response + + rate_limit_error_count = 0 + circuit_breaker_error_count = 0 + + for _ in range(MINIMUM_CALLS + 5): + try: + client.request(HttpMethod.POST, "https://test.com", {}) + except TelemetryRateLimitError: + rate_limit_error_count += 1 + except CircuitBreakerError: + circuit_breaker_error_count += 1 + + assert rate_limit_error_count >= MINIMUM_CALLS - 1 + assert circuit_breaker_error_count > 0 + + def test_circuit_breaker_recovers_after_success(self): + """Test that circuit breaker recovers after successful calls.""" + import time + from databricks.sql.telemetry.circuit_breaker_manager import ( + CircuitBreakerManager, + MINIMUM_CALLS, + RESET_TIMEOUT, + ) + + CircuitBreakerManager._instances.clear() + client = CircuitBreakerTelemetryPushClient(self.mock_delegate, self.host) + + # Trigger failures + mock_rate_limit_response = Mock() + mock_rate_limit_response.status = 429 + self.mock_delegate.request.return_value = mock_rate_limit_response + + for _ in range(MINIMUM_CALLS + 5): + try: + client.request(HttpMethod.POST, "https://test.com", {}) + except (TelemetryRateLimitError, CircuitBreakerError): + pass + + # Circuit should be open + with pytest.raises(CircuitBreakerError): + client.request(HttpMethod.POST, "https://test.com", {}) + + # Wait for reset timeout + time.sleep(RESET_TIMEOUT + 1.0) + + # Simulate success + mock_success_response = Mock() + mock_success_response.status = 200 + self.mock_delegate.request.return_value = mock_success_response + + response = client.request(HttpMethod.POST, "https://test.com", {}) + assert response is not None + assert response.status == 200 + + def test_urllib3_import_fallback(self): + """Test that the urllib3 import fallback works correctly.""" + from databricks.sql.telemetry.telemetry_push_client import BaseHTTPResponse + assert BaseHTTPResponse is not None diff --git a/tests/unit/test_telemetry_request_error_handling.py b/tests/unit/test_telemetry_request_error_handling.py new file mode 100644 index 000000000..aa31f6628 --- /dev/null +++ b/tests/unit/test_telemetry_request_error_handling.py @@ -0,0 +1,96 @@ +""" +Unit tests specifically for telemetry_push_client RequestError handling +with http-code context extraction for rate limiting detection. +""" + +import pytest +from unittest.mock import Mock + +from databricks.sql.telemetry.telemetry_push_client import ( + CircuitBreakerTelemetryPushClient, + TelemetryPushClient, +) +from databricks.sql.common.http import HttpMethod +from databricks.sql.exc import RequestError, TelemetryRateLimitError +from databricks.sql.telemetry.circuit_breaker_manager import CircuitBreakerManager + + +class TestTelemetryPushClientRequestErrorHandling: + """Test RequestError handling and http-code context extraction.""" + + @pytest.fixture + def setup_circuit_breaker(self): + """Setup circuit breaker for testing.""" + CircuitBreakerManager._instances.clear() + yield + CircuitBreakerManager._instances.clear() + + @pytest.fixture + def mock_delegate(self): + """Create mock delegate client.""" + return Mock(spec=TelemetryPushClient) + + @pytest.fixture + def client(self, mock_delegate, setup_circuit_breaker): + """Create CircuitBreakerTelemetryPushClient instance.""" + return CircuitBreakerTelemetryPushClient(mock_delegate, "test-host.example.com") + + @pytest.mark.parametrize("status_code", [429, 503]) + def test_request_error_with_rate_limit_codes(self, client, mock_delegate, status_code): + """Test that RequestError with rate-limit codes raises TelemetryRateLimitError.""" + request_error = RequestError("HTTP request failed", context={"http-code": status_code}) + mock_delegate.request.side_effect = request_error + + with pytest.raises(TelemetryRateLimitError): + client.request(HttpMethod.POST, "https://test.com", {}) + + @pytest.mark.parametrize("status_code", [500, 400, 404]) + def test_request_error_with_non_rate_limit_codes(self, client, mock_delegate, status_code): + """Test that RequestError with non-rate-limit codes raises original RequestError.""" + request_error = RequestError("HTTP request failed", context={"http-code": status_code}) + mock_delegate.request.side_effect = request_error + + with pytest.raises(RequestError, match="HTTP request failed"): + client.request(HttpMethod.POST, "https://test.com", {}) + + @pytest.mark.parametrize("context", [{}, None, "429"]) + def test_request_error_with_invalid_context(self, client, mock_delegate, context): + """Test RequestError with invalid/missing context raises original error.""" + request_error = RequestError("HTTP request failed") + if context == "429": + # Edge case: http-code as string instead of int + request_error.context = {"http-code": context} + else: + request_error.context = context + mock_delegate.request.side_effect = request_error + + with pytest.raises(RequestError, match="HTTP request failed"): + client.request(HttpMethod.POST, "https://test.com", {}) + + def test_request_error_missing_context_attribute(self, client, mock_delegate): + """Test RequestError without context attribute raises original error.""" + request_error = RequestError("HTTP request failed") + if hasattr(request_error, "context"): + delattr(request_error, "context") + mock_delegate.request.side_effect = request_error + + with pytest.raises(RequestError, match="HTTP request failed"): + client.request(HttpMethod.POST, "https://test.com", {}) + + def test_http_code_extraction_prioritization(self, client, mock_delegate): + """Test that http-code from RequestError context is correctly extracted.""" + request_error = RequestError( + "HTTP request failed after retries", context={"http-code": 503} + ) + mock_delegate.request.side_effect = request_error + + with pytest.raises(TelemetryRateLimitError): + client.request(HttpMethod.POST, "https://test.com", {}) + + def test_non_request_error_exceptions_raised(self, client, mock_delegate): + """Test that non-RequestError exceptions are wrapped then unwrapped.""" + generic_error = ValueError("Network timeout") + mock_delegate.request.side_effect = generic_error + + with pytest.raises(ValueError, match="Network timeout"): + client.request(HttpMethod.POST, "https://test.com", {}) diff --git a/tests/unit/test_thrift_backend.py b/tests/unit/test_thrift_backend.py index 293467afb..7254b66cb 100644 --- a/tests/unit/test_thrift_backend.py +++ b/tests/unit/test_thrift_backend.py @@ -2,19 +2,24 @@ from decimal import Decimal import itertools import unittest +import pytest from unittest.mock import patch, MagicMock, Mock from ssl import CERT_NONE, CERT_REQUIRED from urllib3 import HTTPSConnectionPool -import pyarrow - +try: + import pyarrow +except ImportError: + pyarrow = None import databricks.sql from databricks.sql import utils from databricks.sql.types import SSLOptions from databricks.sql.thrift_api.TCLIService import ttypes from databricks.sql import * from databricks.sql.auth.authenticators import AuthProvider -from databricks.sql.thrift_backend import ThriftBackend +from databricks.sql.backend.thrift_backend import ThriftDatabricksClient +from databricks.sql.result_set import ResultSet, ThriftResultSet +from databricks.sql.backend.types import CommandId, CommandState, SessionId, BackendType def retry_policy_factory(): @@ -27,6 +32,7 @@ def retry_policy_factory(): } +@pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") class ThriftBackendTestSuite(unittest.TestCase): okay_status = ttypes.TStatus(statusCode=ttypes.TStatusCode.SUCCESS_STATUS) @@ -47,6 +53,7 @@ class ThriftBackendTestSuite(unittest.TestCase): open_session_resp = ttypes.TOpenSessionResp( status=okay_status, serverProtocolVersion=ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V4, + sessionHandle=session_handle, ) metadata_resp = ttypes.TGetResultSetMetadataResp( @@ -69,30 +76,34 @@ def test_make_request_checks_thrift_status_code(self): mock_method = Mock() mock_method.__name__ = "method name" mock_method.return_value = mock_response - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(DatabaseError): thrift_backend.make_request(mock_method, Mock()) def _make_type_desc(self, type): return ttypes.TTypeDesc( - types=[ttypes.TTypeEntry(ttypes.TTAllowedParameterValueEntry(type=type))] + types=[ + ttypes.TTypeEntry(primitiveEntry=ttypes.TPrimitiveTypeEntry(type=type)) + ] ) def _make_fake_thrift_backend(self): - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) thrift_backend._hive_schema_to_arrow_schema = Mock() thrift_backend._hive_schema_to_description = Mock() @@ -120,14 +131,16 @@ def test_hive_schema_to_arrow_schema_preserves_column_names(self): ] t_table_schema = ttypes.TTableSchema(columns) - arrow_schema = ThriftBackend._hive_schema_to_arrow_schema(t_table_schema) + arrow_schema = ThriftDatabricksClient._hive_schema_to_arrow_schema( + t_table_schema + ) self.assertEqual(arrow_schema.field(0).name, "column 1") self.assertEqual(arrow_schema.field(1).name, "column 2") self.assertEqual(arrow_schema.field(2).name, "column 2") self.assertEqual(arrow_schema.field(3).name, "") - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_bad_protocol_versions_are_rejected(self, tcli_service_client_cass): t_http_client_instance = tcli_service_client_cass.return_value bad_protocol_versions = [ @@ -157,7 +170,7 @@ def test_bad_protocol_versions_are_rejected(self, tcli_service_client_cass): "expected server to use a protocol version", str(cm.exception) ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_okay_protocol_versions_succeed(self, tcli_service_client_cass): t_http_client_instance = tcli_service_client_cass.return_value good_protocol_versions = [ @@ -168,7 +181,9 @@ def test_okay_protocol_versions_succeed(self, tcli_service_client_cass): for protocol_version in good_protocol_versions: t_http_client_instance.OpenSession.return_value = ttypes.TOpenSessionResp( - status=self.okay_status, serverProtocolVersion=protocol_version + status=self.okay_status, + serverProtocolVersion=protocol_version, + sessionHandle=self.session_handle, ) thrift_backend = self._make_fake_thrift_backend() @@ -176,13 +191,14 @@ def test_okay_protocol_versions_succeed(self, tcli_service_client_cass): @patch("databricks.sql.auth.thrift_http_client.THttpClient") def test_headers_are_set(self, t_http_client_class): - ThriftBackend( + ThriftDatabricksClient( "foo", 123, "bar", [("header", "value")], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) t_http_client_class.return_value.setCustomHeaders.assert_called_with( {"header": "value"} @@ -190,14 +206,14 @@ def test_headers_are_set(self, t_http_client_class): def test_proxy_headers_are_set(self): - from databricks.sql.auth.thrift_http_client import THttpClient + from databricks.sql.common.http_utils import create_basic_proxy_auth_headers from urllib.parse import urlparse fake_proxy_spec = "https://someuser:somepassword@8.8.8.8:12340" parsed_proxy = urlparse(fake_proxy_spec) try: - result = THttpClient.basic_proxy_auth_headers(parsed_proxy) + result = create_basic_proxy_auth_headers(parsed_proxy) except TypeError as e: assert False @@ -223,13 +239,14 @@ def test_tls_cert_args_are_propagated( mock_ssl_context = mock_ssl_options.create_ssl_context() mock_create_default_context.assert_called_once_with(cafile=mock_trusted_ca_file) - ThriftBackend( + ThriftDatabricksClient( "foo", 123, "bar", [], auth_provider=AuthProvider(), ssl_options=mock_ssl_options, + http_client=MagicMock(), ) mock_ssl_context.load_cert_chain.assert_called_once_with( @@ -309,13 +326,14 @@ def test_tls_no_verify_is_respected( mock_ssl_context = mock_ssl_options.create_ssl_context() mock_create_default_context.assert_called() - ThriftBackend( + ThriftDatabricksClient( "foo", 123, "bar", [], auth_provider=AuthProvider(), ssl_options=mock_ssl_options, + http_client=MagicMock(), ) self.assertFalse(mock_ssl_context.check_hostname) @@ -333,13 +351,14 @@ def test_tls_verify_hostname_is_respected( mock_ssl_context = mock_ssl_options.create_ssl_context() mock_create_default_context.assert_called() - ThriftBackend( + ThriftDatabricksClient( "foo", 123, "bar", [], auth_provider=AuthProvider(), ssl_options=mock_ssl_options, + http_client=MagicMock(), ) self.assertFalse(mock_ssl_context.check_hostname) @@ -350,13 +369,14 @@ def test_tls_verify_hostname_is_respected( @patch("databricks.sql.auth.thrift_http_client.THttpClient") def test_port_and_host_are_respected(self, t_http_client_class): - ThriftBackend( + ThriftDatabricksClient( "hostname", 123, "path_value", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) self.assertEqual( t_http_client_class.call_args[1]["uri_or_host"], @@ -365,13 +385,14 @@ def test_port_and_host_are_respected(self, t_http_client_class): @patch("databricks.sql.auth.thrift_http_client.THttpClient") def test_host_with_https_does_not_duplicate(self, t_http_client_class): - ThriftBackend( + ThriftDatabricksClient( "https://hostname", 123, "path_value", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) self.assertEqual( t_http_client_class.call_args[1]["uri_or_host"], @@ -380,13 +401,14 @@ def test_host_with_https_does_not_duplicate(self, t_http_client_class): @patch("databricks.sql.auth.thrift_http_client.THttpClient") def test_host_with_trailing_backslash_does_not_duplicate(self, t_http_client_class): - ThriftBackend( + ThriftDatabricksClient( "https://hostname/", 123, "path_value", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) self.assertEqual( t_http_client_class.call_args[1]["uri_or_host"], @@ -395,46 +417,50 @@ def test_host_with_trailing_backslash_does_not_duplicate(self, t_http_client_cla @patch("databricks.sql.auth.thrift_http_client.THttpClient") def test_socket_timeout_is_propagated(self, t_http_client_class): - ThriftBackend( + ThriftDatabricksClient( "hostname", 123, "path_value", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), _socket_timeout=129, ) self.assertEqual( t_http_client_class.return_value.setTimeout.call_args[0][0], 129 * 1000 ) - ThriftBackend( + ThriftDatabricksClient( "hostname", 123, "path_value", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), _socket_timeout=0, ) self.assertEqual(t_http_client_class.return_value.setTimeout.call_args[0][0], 0) - ThriftBackend( + ThriftDatabricksClient( "hostname", 123, "path_value", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) self.assertEqual( t_http_client_class.return_value.setTimeout.call_args[0][0], 900 * 1000 ) - ThriftBackend( + ThriftDatabricksClient( "hostname", 123, "path_value", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), _socket_timeout=None, ) self.assertEqual( @@ -461,9 +487,9 @@ def test_non_primitive_types_raise_error(self): t_table_schema = ttypes.TTableSchema(columns) with self.assertRaises(OperationalError): - ThriftBackend._hive_schema_to_arrow_schema(t_table_schema) + ThriftDatabricksClient._hive_schema_to_arrow_schema(t_table_schema) with self.assertRaises(OperationalError): - ThriftBackend._hive_schema_to_description(t_table_schema) + ThriftDatabricksClient._hive_schema_to_description(t_table_schema) def test_hive_schema_to_description_preserves_column_names_and_types(self): # Full coverage of all types is done in integration tests, this is just a @@ -487,7 +513,7 @@ def test_hive_schema_to_description_preserves_column_names_and_types(self): ] t_table_schema = ttypes.TTableSchema(columns) - description = ThriftBackend._hive_schema_to_description(t_table_schema) + description = ThriftDatabricksClient._hive_schema_to_description(t_table_schema) self.assertEqual( description, @@ -506,7 +532,7 @@ def test_hive_schema_to_description_preserves_scale_and_precision(self): typeDesc=ttypes.TTypeDesc( types=[ ttypes.TTypeEntry( - ttypes.TTAllowedParameterValueEntry( + primitiveEntry=ttypes.TPrimitiveTypeEntry( type=ttypes.TTypeId.DECIMAL_TYPE, typeQualifiers=ttypes.TTypeQualifiers( qualifiers={ @@ -526,7 +552,7 @@ def test_hive_schema_to_description_preserves_scale_and_precision(self): ] t_table_schema = ttypes.TTableSchema(columns) - description = ThriftBackend._hive_schema_to_description(t_table_schema) + description = ThriftDatabricksClient._hive_schema_to_description(t_table_schema) self.assertEqual( description, [ @@ -539,13 +565,14 @@ def test_make_request_checks_status_code(self): ttypes.TStatusCode.ERROR_STATUS, ttypes.TStatusCode.INVALID_HANDLE_STATUS, ] - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) for code in error_codes: @@ -582,14 +609,16 @@ def test_handle_execute_response_checks_operation_state_in_direct_results(self): resultSet=None, closeOperation=None, ), + operationHandle=self.operation_handle, ) - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(DatabaseError) as cm: @@ -597,7 +626,8 @@ def test_handle_execute_response_checks_operation_state_in_direct_results(self): self.assertIn("some information about the error", str(cm.exception)) @patch( - "databricks.sql.utils.ResultSetQueueFactory.build_queue", return_value=Mock() + "databricks.sql.utils.ThriftResultSetQueueFactory.build_queue", + return_value=Mock(), ) def test_handle_execute_response_sets_compression_in_direct_results( self, build_queue @@ -610,7 +640,10 @@ def test_handle_execute_response_sets_compression_in_direct_results( status=Mock(), operationHandle=Mock(), directResults=ttypes.TSparkDirectResults( - operationStatus=Mock(), + operationStatus=ttypes.TGetOperationStatusResp( + status=self.okay_status, + operationState=ttypes.TOperationState.FINISHED_STATE, + ), resultSetMetadata=ttypes.TGetResultSetMetadataResp( status=self.okay_status, resultFormat=ttypes.TSparkRowSetType.ARROW_BASED_SET, @@ -622,21 +655,22 @@ def test_handle_execute_response_sets_compression_in_direct_results( closeOperation=None, ), ) - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) - execute_response = thrift_backend._handle_execute_response( + execute_response, _ = thrift_backend._handle_execute_response( t_execute_resp, Mock() ) self.assertEqual(execute_response.lz4_compressed, lz4Compressed) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_handle_execute_response_checks_operation_state_in_polls( self, tcli_service_class ): @@ -666,13 +700,14 @@ def test_handle_execute_response_checks_operation_state_in_polls( ) tcli_service_instance.GetOperationStatus.return_value = op_state_resp - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(DatabaseError) as cm: @@ -680,7 +715,7 @@ def test_handle_execute_response_checks_operation_state_in_polls( if op_state_resp.errorMessage: self.assertIn(op_state_resp.errorMessage, str(cm.exception)) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_get_status_uses_display_message_if_available(self, tcli_service_class): tcli_service_instance = tcli_service_class.return_value @@ -704,21 +739,24 @@ def test_get_status_uses_display_message_if_available(self, tcli_service_class): ) tcli_service_instance.ExecuteStatement.return_value = t_execute_resp - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(DatabaseError) as cm: - thrift_backend.execute_command(Mock(), Mock(), 100, 100, Mock(), Mock()) + thrift_backend.execute_command( + Mock(), Mock(), 100, 100, Mock(), Mock(), Mock() + ) self.assertEqual(display_message, str(cm.exception)) self.assertIn(diagnostic_info, str(cm.exception.message_with_context())) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_direct_results_uses_display_message_if_available(self, tcli_service_class): tcli_service_instance = tcli_service_class.return_value @@ -740,20 +778,24 @@ def test_direct_results_uses_display_message_if_available(self, tcli_service_cla resultSet=None, closeOperation=None, ), + operationHandle=self.operation_handle, ) tcli_service_instance.ExecuteStatement.return_value = t_execute_resp - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(DatabaseError) as cm: - thrift_backend.execute_command(Mock(), Mock(), 100, 100, Mock(), Mock()) + thrift_backend.execute_command( + Mock(), Mock(), 100, 100, Mock(), Mock(), Mock() + ) self.assertEqual(display_message, str(cm.exception)) self.assertIn(diagnostic_info, str(cm.exception.message_with_context())) @@ -770,6 +812,7 @@ def test_handle_execute_response_checks_direct_results_for_error_statuses(self): resultSet=None, closeOperation=None, ), + operationHandle=self.operation_handle, ) resp_2 = resp_type( @@ -782,6 +825,7 @@ def test_handle_execute_response_checks_direct_results_for_error_statuses(self): resultSet=None, closeOperation=None, ), + operationHandle=self.operation_handle, ) resp_3 = resp_type( @@ -792,6 +836,7 @@ def test_handle_execute_response_checks_direct_results_for_error_statuses(self): resultSet=ttypes.TFetchResultsResp(status=self.bad_status), closeOperation=None, ), + operationHandle=self.operation_handle, ) resp_4 = resp_type( @@ -802,26 +847,29 @@ def test_handle_execute_response_checks_direct_results_for_error_statuses(self): resultSet=None, closeOperation=ttypes.TCloseOperationResp(status=self.bad_status), ), + operationHandle=self.operation_handle, ) for error_resp in [resp_1, resp_2, resp_3, resp_4]: with self.subTest(error_resp=error_resp): - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(DatabaseError) as cm: thrift_backend._handle_execute_response(error_resp, Mock()) self.assertIn("this is a bad error", str(cm.exception)) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.ThriftResultSet") + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_handle_execute_response_can_handle_without_direct_results( - self, tcli_service_class + self, tcli_service_class, mock_result_set ): tcli_service_instance = tcli_service_class.return_value @@ -857,20 +905,22 @@ def test_handle_execute_response_can_handle_without_direct_results( op_state_2, op_state_3, ] - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) - results_message_response = thrift_backend._handle_execute_response( - execute_resp, Mock() - ) + ( + execute_response, + _, + ) = thrift_backend._handle_execute_response(execute_resp, Mock()) self.assertEqual( - results_message_response.status, - ttypes.TOperationState.FINISHED_STATE, + execute_response.status, + CommandState.SUCCEEDED, ) def test_handle_execute_response_can_handle_with_direct_results(self): @@ -894,13 +944,14 @@ def test_handle_execute_response_can_handle_with_direct_results(self): operationHandle=self.operation_handle, ) - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) thrift_backend._results_message_to_execute_response = Mock() @@ -911,7 +962,7 @@ def test_handle_execute_response_can_handle_with_direct_results(self): ttypes.TOperationState.FINISHED_STATE, ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_use_arrow_schema_if_available(self, tcli_service_class): tcli_service_instance = tcli_service_class.return_value arrow_schema_mock = MagicMock(name="Arrow schema mock") @@ -933,14 +984,20 @@ def test_use_arrow_schema_if_available(self, tcli_service_class): tcli_service_instance.GetResultSetMetadata.return_value = ( t_get_result_set_metadata_resp ) + tcli_service_instance.GetOperationStatus.return_value = ( + ttypes.TGetOperationStatusResp( + status=self.okay_status, + operationState=ttypes.TOperationState.FINISHED_STATE, + ) + ) thrift_backend = self._make_fake_thrift_backend() - execute_response = thrift_backend._handle_execute_response( + execute_response, _ = thrift_backend._handle_execute_response( t_execute_resp, Mock() ) self.assertEqual(execute_response.arrow_schema_bytes, arrow_schema_mock) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_fall_back_to_hive_schema_if_no_arrow_schema(self, tcli_service_class): tcli_service_instance = tcli_service_class.return_value hive_schema_mock = MagicMock(name="Hive schema mock") @@ -959,8 +1016,14 @@ def test_fall_back_to_hive_schema_if_no_arrow_schema(self, tcli_service_class): ) tcli_service_instance.GetResultSetMetadata.return_value = hive_schema_req + tcli_service_instance.GetOperationStatus.return_value = ( + ttypes.TGetOperationStatusResp( + status=self.okay_status, + operationState=ttypes.TOperationState.FINISHED_STATE, + ) + ) thrift_backend = self._make_fake_thrift_backend() - thrift_backend._handle_execute_response(t_execute_resp, Mock()) + _, _ = thrift_backend._handle_execute_response(t_execute_resp, Mock()) self.assertEqual( hive_schema_mock, @@ -968,9 +1031,10 @@ def test_fall_back_to_hive_schema_if_no_arrow_schema(self, tcli_service_class): ) @patch( - "databricks.sql.utils.ResultSetQueueFactory.build_queue", return_value=Mock() + "databricks.sql.utils.ThriftResultSetQueueFactory.build_queue", + return_value=Mock(), ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_handle_execute_response_reads_has_more_rows_in_direct_results( self, tcli_service_class, build_queue ): @@ -1005,16 +1069,18 @@ def test_handle_execute_response_reads_has_more_rows_in_direct_results( ) thrift_backend = self._make_fake_thrift_backend() - execute_response = thrift_backend._handle_execute_response( - execute_resp, Mock() - ) + ( + execute_response, + has_more_rows_result, + ) = thrift_backend._handle_execute_response(execute_resp, Mock()) - self.assertEqual(has_more_rows, execute_response.has_more_rows) + self.assertEqual(has_more_rows, has_more_rows_result) @patch( - "databricks.sql.utils.ResultSetQueueFactory.build_queue", return_value=Mock() + "databricks.sql.utils.ThriftResultSetQueueFactory.build_queue", + return_value=Mock(), ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_handle_execute_response_reads_has_more_rows_in_result_response( self, tcli_service_class, build_queue ): @@ -1057,19 +1123,20 @@ def test_handle_execute_response_reads_has_more_rows_in_result_response( thrift_backend = self._make_fake_thrift_backend() thrift_backend._handle_execute_response(execute_resp, Mock()) - _, has_more_rows_resp = thrift_backend.fetch_results( - op_handle=Mock(), + _, has_more_rows_resp, _ = thrift_backend.fetch_results( + command_id=Mock(), max_rows=1, max_bytes=1, expected_row_start_offset=0, lz4_compressed=False, arrow_schema_bytes=Mock(), description=Mock(), + chunk_id=0, ) self.assertEqual(has_more_rows, has_more_rows_resp) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_arrow_batches_row_count_are_respected(self, tcli_service_class): # make some semi-real arrow batches and check the number of rows is correct in the queue tcli_service_instance = tcli_service_class.return_value @@ -1102,45 +1169,55 @@ def test_arrow_batches_row_count_are_respected(self, tcli_service_class): .to_pybytes() ) - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) - arrow_queue, has_more_results = thrift_backend.fetch_results( - op_handle=Mock(), + arrow_queue, has_more_results, _ = thrift_backend.fetch_results( + command_id=Mock(), max_rows=1, max_bytes=1, expected_row_start_offset=0, lz4_compressed=False, arrow_schema_bytes=schema, description=MagicMock(), + chunk_id=0, ) self.assertEqual(arrow_queue.n_valid_rows, 15 * 10) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.ThriftResultSet") + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_execute_statement_calls_client_and_handle_execute_response( - self, tcli_service_class + self, tcli_service_class, mock_result_set ): tcli_service_instance = tcli_service_class.return_value response = Mock() tcli_service_instance.ExecuteStatement.return_value = response - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) thrift_backend._handle_execute_response = Mock() + thrift_backend._handle_execute_response.return_value = (Mock(), Mock()) cursor_mock = Mock() - thrift_backend.execute_command("foo", Mock(), 100, 200, Mock(), cursor_mock) + result = thrift_backend.execute_command( + "foo", Mock(), 100, 200, Mock(), cursor_mock, Mock() + ) + # Verify the result is a ResultSet + self.assertEqual(result, mock_result_set.return_value) + # Check call to client req = tcli_service_instance.ExecuteStatement.call_args[0][0] get_direct_results = ttypes.TSparkGetDirectResults(maxRows=100, maxBytes=200) @@ -1151,25 +1228,31 @@ def test_execute_statement_calls_client_and_handle_execute_response( response, cursor_mock ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.ThriftResultSet") + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_get_catalogs_calls_client_and_handle_execute_response( - self, tcli_service_class + self, tcli_service_class, mock_result_set ): tcli_service_instance = tcli_service_class.return_value response = Mock() tcli_service_instance.GetCatalogs.return_value = response - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) thrift_backend._handle_execute_response = Mock() + thrift_backend._handle_execute_response.return_value = (Mock(), Mock()) cursor_mock = Mock() - thrift_backend.get_catalogs(Mock(), 100, 200, cursor_mock) + result = thrift_backend.get_catalogs(Mock(), 100, 200, cursor_mock) + # Verify the result is a ResultSet + self.assertEqual(result, mock_result_set.return_value) + # Check call to client req = tcli_service_instance.GetCatalogs.call_args[0][0] get_direct_results = ttypes.TSparkGetDirectResults(maxRows=100, maxBytes=200) @@ -1179,25 +1262,28 @@ def test_get_catalogs_calls_client_and_handle_execute_response( response, cursor_mock ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.result_set.ThriftResultSet") + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_get_schemas_calls_client_and_handle_execute_response( - self, tcli_service_class + self, tcli_service_class, mock_result_set ): tcli_service_instance = tcli_service_class.return_value response = Mock() tcli_service_instance.GetSchemas.return_value = response - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) thrift_backend._handle_execute_response = Mock() + thrift_backend._handle_execute_response.return_value = (Mock(), Mock()) cursor_mock = Mock() - thrift_backend.get_schemas( + result = thrift_backend.get_schemas( Mock(), 100, 200, @@ -1205,6 +1291,9 @@ def test_get_schemas_calls_client_and_handle_execute_response( catalog_name="catalog_pattern", schema_name="schema_pattern", ) + # Verify the result is a ResultSet + self.assertEqual(result, mock_result_set.return_value) + # Check call to client req = tcli_service_instance.GetSchemas.call_args[0][0] get_direct_results = ttypes.TSparkGetDirectResults(maxRows=100, maxBytes=200) @@ -1216,25 +1305,28 @@ def test_get_schemas_calls_client_and_handle_execute_response( response, cursor_mock ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.result_set.ThriftResultSet") + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_get_tables_calls_client_and_handle_execute_response( - self, tcli_service_class + self, tcli_service_class, mock_result_set ): tcli_service_instance = tcli_service_class.return_value response = Mock() tcli_service_instance.GetTables.return_value = response - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) thrift_backend._handle_execute_response = Mock() + thrift_backend._handle_execute_response.return_value = (Mock(), Mock()) cursor_mock = Mock() - thrift_backend.get_tables( + result = thrift_backend.get_tables( Mock(), 100, 200, @@ -1244,6 +1336,9 @@ def test_get_tables_calls_client_and_handle_execute_response( table_name="table_pattern", table_types=["type1", "type2"], ) + # Verify the result is a ResultSet + self.assertEqual(result, mock_result_set.return_value) + # Check call to client req = tcli_service_instance.GetTables.call_args[0][0] get_direct_results = ttypes.TSparkGetDirectResults(maxRows=100, maxBytes=200) @@ -1257,25 +1352,28 @@ def test_get_tables_calls_client_and_handle_execute_response( response, cursor_mock ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.result_set.ThriftResultSet") + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_get_columns_calls_client_and_handle_execute_response( - self, tcli_service_class + self, tcli_service_class, mock_result_set ): tcli_service_instance = tcli_service_class.return_value response = Mock() tcli_service_instance.GetColumns.return_value = response - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) thrift_backend._handle_execute_response = Mock() + thrift_backend._handle_execute_response.return_value = (Mock(), Mock()) cursor_mock = Mock() - thrift_backend.get_columns( + result = thrift_backend.get_columns( Mock(), 100, 200, @@ -1285,6 +1383,9 @@ def test_get_columns_calls_client_and_handle_execute_response( table_name="table_pattern", column_name="column_pattern", ) + # Verify the result is a ResultSet + self.assertEqual(result, mock_result_set.return_value) + # Check call to client req = tcli_service_instance.GetColumns.call_args[0][0] get_direct_results = ttypes.TSparkGetDirectResults(maxRows=100, maxBytes=200) @@ -1298,57 +1399,62 @@ def test_get_columns_calls_client_and_handle_execute_response( response, cursor_mock ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_open_session_user_provided_session_id_optional(self, tcli_service_class): tcli_service_instance = tcli_service_class.return_value tcli_service_instance.OpenSession.return_value = self.open_session_resp - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) thrift_backend.open_session({}, None, None) self.assertEqual(len(tcli_service_instance.OpenSession.call_args_list), 1) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_op_handle_respected_in_close_command(self, tcli_service_class): tcli_service_instance = tcli_service_class.return_value - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) - thrift_backend.close_command(self.operation_handle) + command_id = CommandId.from_thrift_handle(self.operation_handle) + thrift_backend.close_command(command_id) self.assertEqual( tcli_service_instance.CloseOperation.call_args[0][0].operationHandle, self.operation_handle, ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_session_handle_respected_in_close_session(self, tcli_service_class): tcli_service_instance = tcli_service_class.return_value - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) - thrift_backend.close_session(self.session_handle) + session_id = SessionId.from_thrift_handle(self.session_handle) + thrift_backend.close_session(session_id) self.assertEqual( tcli_service_instance.CloseSession.call_args[0][0].sessionHandle, self.session_handle, ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_non_arrow_non_column_based_set_triggers_exception( self, tcli_service_class ): @@ -1379,36 +1485,44 @@ def test_non_arrow_non_column_based_set_triggers_exception( thrift_backend = self._make_fake_thrift_backend() with self.assertRaises(OperationalError) as cm: - thrift_backend.execute_command("foo", Mock(), 100, 100, Mock(), Mock()) + thrift_backend.execute_command( + "foo", Mock(), 100, 100, Mock(), Mock(), Mock() + ) self.assertIn( "Expected results to be in Arrow or column based format", str(cm.exception) ) def test_create_arrow_table_raises_error_for_unsupported_type(self): t_row_set = ttypes.TRowSet() - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(OperationalError): thrift_backend._create_arrow_table(t_row_set, Mock(), None, Mock()) - @patch("databricks.sql.thrift_backend.convert_arrow_based_set_to_arrow_table") - @patch("databricks.sql.thrift_backend.convert_column_based_set_to_arrow_table") + @patch( + "databricks.sql.backend.thrift_backend.convert_arrow_based_set_to_arrow_table" + ) + @patch( + "databricks.sql.backend.thrift_backend.convert_column_based_set_to_arrow_table" + ) def test_create_arrow_table_calls_correct_conversion_method( self, convert_col_mock, convert_arrow_mock ): - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) convert_arrow_mock.return_value = (MagicMock(), Mock()) convert_col_mock.return_value = (MagicMock(), Mock()) @@ -1437,13 +1551,14 @@ def test_create_arrow_table_calls_correct_conversion_method( def test_convert_arrow_based_set_to_arrow_table( self, open_stream_mock, lz4_decompress_mock ): - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) lz4_decompress_mock.return_value = bytearray("Testing", "utf-8") @@ -1591,17 +1706,18 @@ def test_convert_column_based_set_to_arrow_table_uses_types_from_col_set(self): self.assertEqual(arrow_table.column(2).to_pylist(), [1.15, 2.2, 3.3]) self.assertEqual(arrow_table.column(3).to_pylist(), [b"\x11", b"\x22", b"\x33"]) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_cancel_command_uses_active_op_handle(self, tcli_service_class): tcli_service_instance = tcli_service_class.return_value thrift_backend = self._make_fake_thrift_backend() - active_op_handle_mock = Mock() - thrift_backend.cancel_command(active_op_handle_mock) + # Create a proper CommandId from the existing operation_handle + command_id = CommandId.from_thrift_handle(self.operation_handle) + thrift_backend.cancel_command(command_id) self.assertEqual( tcli_service_instance.CancelOperation.call_args[0][0].operationHandle, - active_op_handle_mock, + self.operation_handle, ) def test_handle_execute_response_sets_active_op_handle(self): @@ -1609,19 +1725,27 @@ def test_handle_execute_response_sets_active_op_handle(self): thrift_backend._check_direct_results_for_error = Mock() thrift_backend._wait_until_command_done = Mock() thrift_backend._results_message_to_execute_response = Mock() + + # Create a mock response with a real operation handle mock_resp = Mock() + mock_resp.operationHandle = ( + self.operation_handle + ) # Use the real operation handle from the test class mock_cursor = Mock() thrift_backend._handle_execute_response(mock_resp, mock_cursor) - self.assertEqual(mock_resp.operationHandle, mock_cursor.active_op_handle) + self.assertEqual( + mock_resp.operationHandle, mock_cursor.active_command_id.to_thrift_handle() + ) @patch("databricks.sql.auth.thrift_http_client.THttpClient") @patch( "databricks.sql.thrift_api.TCLIService.TCLIService.Client.GetOperationStatus" ) @patch( - "databricks.sql.thrift_backend._retry_policy", new_callable=retry_policy_factory + "databricks.sql.backend.thrift_backend._retry_policy", + new_callable=retry_policy_factory, ) def test_make_request_will_retry_GetOperationStatus( self, mock_retry_policy, mock_GetOperationStatus, t_transport_class @@ -1648,13 +1772,14 @@ def test_make_request_will_retry_GetOperationStatus( EXPECTED_RETRIES = 2 - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), _retry_stop_after_attempts_count=EXPECTED_RETRIES, _retry_delay_default=1, ) @@ -1675,7 +1800,7 @@ def test_make_request_will_retry_GetOperationStatus( ) with self.assertLogs( - "databricks.sql.thrift_backend", level=logging.WARNING + "databricks.sql.backend.thrift_backend", level=logging.WARNING ) as cm: with self.assertRaises(RequestError): thrift_backend.make_request(client.GetOperationStatus, req) @@ -1696,7 +1821,8 @@ def test_make_request_will_retry_GetOperationStatus( "databricks.sql.thrift_api.TCLIService.TCLIService.Client.GetOperationStatus" ) @patch( - "databricks.sql.thrift_backend._retry_policy", new_callable=retry_policy_factory + "databricks.sql.backend.thrift_backend._retry_policy", + new_callable=retry_policy_factory, ) def test_make_request_will_retry_GetOperationStatus_for_http_error( self, mock_retry_policy, mock_gos @@ -1725,13 +1851,14 @@ def test_make_request_will_retry_GetOperationStatus_for_http_error( EXPECTED_RETRIES = 2 - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), _retry_stop_after_attempts_count=EXPECTED_RETRIES, _retry_delay_default=1, ) @@ -1757,13 +1884,14 @@ def test_make_request_wont_retry_if_error_code_not_429_or_503( mock_method.__name__ = "method name" mock_method.side_effect = Exception("This method fails") - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(OperationalError) as cm: @@ -1773,7 +1901,8 @@ def test_make_request_wont_retry_if_error_code_not_429_or_503( @patch("databricks.sql.auth.thrift_http_client.THttpClient") @patch( - "databricks.sql.thrift_backend._retry_policy", new_callable=retry_policy_factory + "databricks.sql.backend.thrift_backend._retry_policy", + new_callable=retry_policy_factory, ) def test_make_request_will_retry_stop_after_attempts_count_if_retryable( self, mock_retry_policy, t_transport_class @@ -1785,13 +1914,14 @@ def test_make_request_will_retry_stop_after_attempts_count_if_retryable( mock_method.__name__ = "method name" mock_method.side_effect = Exception("This method fails") - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), _retry_stop_after_attempts_count=14, _retry_delay_max=0, _retry_delay_min=0, @@ -1814,13 +1944,14 @@ def test_make_request_will_read_error_message_headers_if_set( mock_method.__name__ = "method name" mock_method.side_effect = Exception("This method fails") - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) error_headers = [ @@ -1938,13 +2069,14 @@ def test_retry_args_passthrough(self, mock_http_client): "_retry_stop_after_attempts_count": 1, "_retry_stop_after_attempts_duration": 100, } - backend = ThriftBackend( + backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), **retry_delay_args, ) for arg, val in retry_delay_args.items(): @@ -1953,7 +2085,12 @@ def test_retry_args_passthrough(self, mock_http_client): @patch("thrift.transport.THttpClient.THttpClient") def test_retry_args_bounding(self, mock_http_client): retry_delay_test_args_and_expected_values = {} - for k, (_, _, min, max) in databricks.sql.thrift_backend._retry_policy.items(): + for k, ( + _, + _, + min, + max, + ) in databricks.sql.backend.thrift_backend._retry_policy.items(): retry_delay_test_args_and_expected_values[k] = ( (min - 1, min), (max + 1, max), @@ -1964,13 +2101,14 @@ def test_retry_args_bounding(self, mock_http_client): k: v[i][0] for (k, v) in retry_delay_test_args_and_expected_values.items() } - backend = ThriftBackend( + backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), **retry_delay_args, ) retry_delay_expected_vals = { @@ -1980,7 +2118,7 @@ def test_retry_args_bounding(self, mock_http_client): for arg, val in retry_delay_expected_vals.items(): self.assertEqual(getattr(backend, arg), val) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_configuration_passthrough(self, tcli_client_class): tcli_service_instance = tcli_client_class.return_value tcli_service_instance.OpenSession.return_value = self.open_session_resp @@ -1992,31 +2130,33 @@ def test_configuration_passthrough(self, tcli_client_class): "42": "42", } - backend = ThriftBackend( + backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) backend.open_session(mock_config, None, None) open_session_req = tcli_client_class.return_value.OpenSession.call_args[0][0] self.assertEqual(open_session_req.configuration, expected_config) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_cant_set_timestamp_as_string_to_true(self, tcli_client_class): tcli_service_instance = tcli_client_class.return_value tcli_service_instance.OpenSession.return_value = self.open_session_resp mock_config = {"spark.thriftserver.arrowBasedRowSet.timestampAsString": True} - backend = ThriftBackend( + backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(databricks.sql.Error) as cm: @@ -2030,19 +2170,21 @@ def _construct_open_session_with_namespace(self, can_use_multiple_cats, cat, sch serverProtocolVersion=ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V4, canUseMultipleCatalogs=can_use_multiple_cats, initialNamespace=ttypes.TNamespace(catalogName=cat, schemaName=schem), + sessionHandle=self.session_handle, ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_initial_namespace_passthrough_to_open_session(self, tcli_client_class): tcli_service_instance = tcli_client_class.return_value - backend = ThriftBackend( + backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) initial_cat_schem_args = [("cat", None), (None, "schem"), ("cat", "schem")] @@ -2060,39 +2202,41 @@ def test_initial_namespace_passthrough_to_open_session(self, tcli_client_class): self.assertEqual(open_session_req.initialNamespace.catalogName, cat) self.assertEqual(open_session_req.initialNamespace.schemaName, schem) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_can_use_multiple_catalogs_is_set_in_open_session_req( self, tcli_client_class ): tcli_service_instance = tcli_client_class.return_value tcli_service_instance.OpenSession.return_value = self.open_session_resp - backend = ThriftBackend( + backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) backend.open_session({}, None, None) open_session_req = tcli_client_class.return_value.OpenSession.call_args[0][0] self.assertTrue(open_session_req.canUseMultipleCatalogs) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_can_use_multiple_catalogs_is_false_fails_with_initial_catalog( self, tcli_client_class ): tcli_service_instance = tcli_client_class.return_value - backend = ThriftBackend( + backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) # If the initial catalog is set, but server returns canUseMultipleCatalogs=False, we # expect failure. If the initial catalog isn't set, then canUseMultipleCatalogs=False @@ -2120,7 +2264,7 @@ def test_can_use_multiple_catalogs_is_false_fails_with_initial_catalog( ) backend.open_session({}, cat, schem) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) def test_protocol_v3_fails_if_initial_namespace_set(self, tcli_client_class): tcli_service_instance = tcli_client_class.return_value @@ -2129,15 +2273,17 @@ def test_protocol_v3_fails_if_initial_namespace_set(self, tcli_client_class): serverProtocolVersion=ttypes.TProtocolVersion.SPARK_CLI_SERVICE_PROTOCOL_V3, canUseMultipleCatalogs=True, initialNamespace=ttypes.TNamespace(catalogName="cat", schemaName="schem"), + sessionHandle=self.session_handle, ) - backend = ThriftBackend( + backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), ) with self.assertRaises(InvalidServerResponseError) as cm: @@ -2148,12 +2294,23 @@ def test_protocol_v3_fails_if_initial_namespace_set(self, tcli_client_class): str(cm.exception), ) - @patch("databricks.sql.thrift_backend.TCLIService.Client", autospec=True) - @patch("databricks.sql.thrift_backend.ThriftBackend._handle_execute_response") + @patch("databricks.sql.backend.thrift_backend.ThriftResultSet") + @patch("databricks.sql.backend.thrift_backend.TCLIService.Client", autospec=True) + @patch( + "databricks.sql.backend.thrift_backend.ThriftDatabricksClient._handle_execute_response" + ) def test_execute_command_sets_complex_type_fields_correctly( - self, mock_handle_execute_response, tcli_service_class + self, mock_handle_execute_response, tcli_service_class, mock_result_set ): tcli_service_instance = tcli_service_class.return_value + # Set up the mock to return a tuple with two values + mock_execute_response = Mock() + mock_arrow_schema = Mock() + mock_handle_execute_response.return_value = ( + mock_execute_response, + mock_arrow_schema, + ) + # Iterate through each possible combination of native types (True, False and unset) for complex, timestamp, decimals in itertools.product( [True, False, None], [True, False, None], [True, False, None] @@ -2166,16 +2323,19 @@ def test_execute_command_sets_complex_type_fields_correctly( if decimals is not None: complex_arg_types["_use_arrow_native_decimals"] = decimals - thrift_backend = ThriftBackend( + thrift_backend = ThriftDatabricksClient( "foobar", 443, "path", [], auth_provider=AuthProvider(), ssl_options=SSLOptions(), + http_client=MagicMock(), **complex_arg_types, ) - thrift_backend.execute_command(Mock(), Mock(), 100, 100, Mock(), Mock()) + thrift_backend.execute_command( + Mock(), Mock(), 100, 100, Mock(), Mock(), Mock() + ) t_execute_statement_req = tcli_service_instance.ExecuteStatement.call_args[ 0 ][0] @@ -2196,6 +2356,86 @@ def test_execute_command_sets_complex_type_fields_correctly( t_execute_statement_req.useArrowNativeTypes.intervalTypesAsArrow ) + @unittest.skipIf(pyarrow is None, "Requires pyarrow") + def test_col_to_description(self): + test_cases = [ + ("variant_col", {b"Spark:DataType:SqlName": b"VARIANT"}, "variant"), + ("normal_col", {}, "string"), + ("weird_field", {b"Spark:DataType:SqlName": b"Some unexpected value"}, "string"), + ("missing_field", None, "string"), # None field case + ] + + for column_name, field_metadata, expected_type in test_cases: + with self.subTest(column_name=column_name, expected_type=expected_type): + col = ttypes.TColumnDesc( + columnName=column_name, + typeDesc=self._make_type_desc(ttypes.TTypeId.STRING_TYPE), + ) + + field = ( + None + if field_metadata is None + else pyarrow.field(column_name, pyarrow.string(), metadata=field_metadata) + ) + + result = ThriftDatabricksClient._col_to_description(col, field) + + self.assertEqual(result[0], column_name) + self.assertEqual(result[1], expected_type) + self.assertIsNone(result[2]) + self.assertIsNone(result[3]) + self.assertIsNone(result[4]) + self.assertIsNone(result[5]) + self.assertIsNone(result[6]) + + @unittest.skipIf(pyarrow is None, "Requires pyarrow") + def test_hive_schema_to_description(self): + test_cases = [ + ( + [ + ("regular_col", ttypes.TTypeId.STRING_TYPE), + ("variant_col", ttypes.TTypeId.STRING_TYPE), + ], + [ + ("regular_col", {}), + ("variant_col", {b"Spark:DataType:SqlName": b"VARIANT"}), + ], + [("regular_col", "string"), ("variant_col", "variant")], + ), + ( + [("regular_col", ttypes.TTypeId.STRING_TYPE)], + None, # No arrow schema + [("regular_col", "string")], + ), + ] + + for columns, arrow_fields, expected_types in test_cases: + with self.subTest(arrow_fields=arrow_fields is not None): + t_table_schema = ttypes.TTableSchema( + columns=[ + ttypes.TColumnDesc( + columnName=name, typeDesc=self._make_type_desc(col_type) + ) + for name, col_type in columns + ] + ) + + schema_bytes = None + if arrow_fields: + fields = [ + pyarrow.field(name, pyarrow.string(), metadata=metadata) + for name, metadata in arrow_fields + ] + schema_bytes = pyarrow.schema(fields).serialize().to_pybytes() + + description = ThriftDatabricksClient._hive_schema_to_description( + t_table_schema, schema_bytes + ) + + for i, (expected_name, expected_type) in enumerate(expected_types): + self.assertEqual(description[i][0], expected_name) + self.assertEqual(description[i][1], expected_type) + if __name__ == "__main__": unittest.main() diff --git a/tests/unit/test_thrift_field_ids.py b/tests/unit/test_thrift_field_ids.py new file mode 100644 index 000000000..a4bba439d --- /dev/null +++ b/tests/unit/test_thrift_field_ids.py @@ -0,0 +1,102 @@ +import inspect +import pytest + +from databricks.sql.thrift_api.TCLIService import ttypes + + +class TestThriftFieldIds: + """ + Unit test to validate that all Thrift-generated field IDs comply with the maximum limit. + + Field IDs in Thrift must stay below 3329 to avoid conflicts with reserved ranges + and ensure compatibility with various Thrift implementations and protocols. + """ + + MAX_ALLOWED_FIELD_ID = 3329 + + # Known exceptions that exceed the field ID limit + KNOWN_EXCEPTIONS = { + ("TExecuteStatementReq", "enforceEmbeddedSchemaCorrectness"): 3353, + ("TSessionHandle", "serverProtocolVersion"): 3329, + } + + def test_all_thrift_field_ids_are_within_allowed_range(self): + """ + Validates that all field IDs in Thrift-generated classes are within the allowed range. + + This test prevents field ID conflicts and ensures compatibility with different + Thrift implementations and protocols. + """ + violations = [] + + # Get all classes from the ttypes module + for name, obj in inspect.getmembers(ttypes): + if ( + inspect.isclass(obj) + and hasattr(obj, "thrift_spec") + and obj.thrift_spec is not None + ): + + self._check_class_field_ids(obj, name, violations) + + if violations: + error_message = self._build_error_message(violations) + pytest.fail(error_message) + + def _check_class_field_ids(self, cls, class_name, violations): + """ + Checks all field IDs in a Thrift class and reports violations. + + Args: + cls: The Thrift class to check + class_name: Name of the class for error reporting + violations: List to append violation messages to + """ + thrift_spec = cls.thrift_spec + + if not isinstance(thrift_spec, (tuple, list)): + return + + for spec_entry in thrift_spec: + if spec_entry is None: + continue + + # Thrift spec format: (field_id, field_type, field_name, ...) + if isinstance(spec_entry, (tuple, list)) and len(spec_entry) >= 3: + field_id = spec_entry[0] + field_name = spec_entry[2] + + # Skip known exceptions + if (class_name, field_name) in self.KNOWN_EXCEPTIONS: + continue + + if isinstance(field_id, int) and field_id >= self.MAX_ALLOWED_FIELD_ID: + violations.append( + "{} field '{}' has field ID {} (exceeds maximum of {})".format( + class_name, + field_name, + field_id, + self.MAX_ALLOWED_FIELD_ID - 1, + ) + ) + + def _build_error_message(self, violations): + """ + Builds a comprehensive error message for field ID violations. + + Args: + violations: List of violation messages + + Returns: + Formatted error message + """ + error_message = ( + "Found Thrift field IDs that exceed the maximum allowed value of {}.\n" + "This can cause compatibility issues and conflicts with reserved ID ranges.\n" + "Violations found:\n".format(self.MAX_ALLOWED_FIELD_ID - 1) + ) + + for violation in violations: + error_message += " - {}\n".format(violation) + + return error_message diff --git a/tests/unit/test_token_federation.py b/tests/unit/test_token_federation.py new file mode 100644 index 000000000..9c209e894 --- /dev/null +++ b/tests/unit/test_token_federation.py @@ -0,0 +1,342 @@ +import pytest +from unittest.mock import Mock, patch +import json +import jwt +from datetime import datetime, timedelta + +from databricks.sql.auth.token_federation import TokenFederationProvider, Token +from databricks.sql.auth.auth_utils import ( + decode_token, + is_same_host, +) +from databricks.sql.common.url_utils import normalize_host_with_protocol +from databricks.sql.common.http import HttpMethod + + +@pytest.fixture +def mock_http_client(): + """Fixture for mock HTTP client.""" + return Mock() + + +@pytest.fixture +def mock_external_provider(): + """Fixture for mock external provider.""" + return Mock() + + +@pytest.fixture +def token_federation_provider(mock_http_client, mock_external_provider): + """Fixture for TokenFederationProvider.""" + return TokenFederationProvider( + hostname="https://test.databricks.com/", + external_provider=mock_external_provider, + http_client=mock_http_client, + identity_federation_client_id="test-client-id", + ) + + +def create_mock_token_response( + access_token="databricks-token-456", token_type="Bearer", expires_in=3600 +): + """Helper function to create mock token exchange response.""" + mock_response = Mock() + mock_response.data = json.dumps( + { + "access_token": access_token, + "token_type": token_type, + "expires_in": expires_in, + } + ).encode("utf-8") + mock_response.status = 200 + return mock_response + + +def create_jwt_token(issuer="https://test.databricks.com", exp_hours=1, **kwargs): + """Helper function to create JWT tokens for testing.""" + payload = { + "iss": issuer, + "aud": "databricks", + "exp": int((datetime.now() + timedelta(hours=exp_hours)).timestamp()), + **kwargs, + } + return jwt.encode(payload, "secret", algorithm="HS256") + + +class TestTokenFederationProvider: + """Test TokenFederationProvider functionality.""" + + def test_init_requires_http_client(self, mock_external_provider): + """Test that http_client is required.""" + with pytest.raises(ValueError, match="http_client is required"): + TokenFederationProvider( + hostname="test.databricks.com", + external_provider=mock_external_provider, + http_client=None, + ) + + @pytest.mark.parametrize( + "input_hostname,expected", + [ + ("test.databricks.com", "https://test.databricks.com"), + ("https://test.databricks.com", "https://test.databricks.com"), + ("https://test.databricks.com/", "https://test.databricks.com"), + ("test.databricks.com/", "https://test.databricks.com"), + ], + ) + def test_hostname_normalization( + self, input_hostname, expected, mock_http_client, mock_external_provider + ): + """Test hostname normalization during initialization.""" + provider = TokenFederationProvider( + hostname=input_hostname, + external_provider=mock_external_provider, + http_client=mock_http_client, + ) + assert provider.hostname == expected + + @pytest.mark.parametrize( + "auth_header,expected_type,expected_token", + [ + ("Bearer test-token-123", "Bearer", "test-token-123"), + ("Basic dGVzdDp0ZXN0", "Basic", "dGVzdDp0ZXN0"), + ], + ) + def test_extract_token_from_valid_header( + self, token_federation_provider, auth_header, expected_type, expected_token + ): + """Test extraction of token from valid Authorization header.""" + token_type, access_token = token_federation_provider._extract_token_from_header( + auth_header + ) + assert token_type == expected_type + assert access_token == expected_token + + @pytest.mark.parametrize( + "invalid_header", + [ + "Bearer", # Missing token + "", # Empty header + "InvalidFormat", # No space separator + ], + ) + def test_extract_token_from_invalid_header( + self, token_federation_provider, invalid_header + ): + """Test extraction fails for invalid Authorization headers.""" + with pytest.raises(ValueError): + token_federation_provider._extract_token_from_header(invalid_header) + + @pytest.mark.parametrize( + "issuer,hostname,should_exchange", + [ + ( + "https://login.microsoftonline.com/tenant-id/", + "https://test.databricks.com/", + True, + ), + ("https://test.databricks.com", "https://test.databricks.com/", False), + ("https://test.databricks.com:443", "https://test.databricks.com/", False), + ("https://accounts.google.com", "https://test.databricks.com/", True), + ], + ) + def test_should_exchange_token( + self, token_federation_provider, issuer, hostname, should_exchange + ): + """Test token exchange decision based on issuer.""" + token_federation_provider.hostname = hostname + jwt_token = create_jwt_token(issuer=issuer) + + result = token_federation_provider._should_exchange_token(jwt_token) + assert result == should_exchange + + def test_should_exchange_token_invalid_jwt(self, token_federation_provider): + """Test that invalid JWT returns False for exchange.""" + result = token_federation_provider._should_exchange_token("invalid-jwt-token") + assert result is False + + def test_exchange_token_success(self, token_federation_provider, mock_http_client): + """Test successful token exchange.""" + access_token = "external-token-123" + mock_http_client.request.return_value = create_mock_token_response() + + result = token_federation_provider._exchange_token(access_token) + + # Verify result is a Token object + assert isinstance(result, Token) + assert result.access_token == "databricks-token-456" + assert result.token_type == "Bearer" + + # Verify the request + mock_http_client.request.assert_called_once() + call_args = mock_http_client.request.call_args + + # Check method and URL + assert call_args[0][0] == HttpMethod.POST + assert call_args[1]["url"] == "https://test.databricks.com/oidc/v1/token" + + # Check body contains expected parameters + from urllib.parse import parse_qs + + body = call_args[1]["body"] + parsed_body = parse_qs(body) + + assert ( + parsed_body["grant_type"][0] + == "urn:ietf:params:oauth:grant-type:token-exchange" + ) + assert parsed_body["subject_token"][0] == access_token + assert ( + parsed_body["subject_token_type"][0] + == "urn:ietf:params:oauth:token-type:jwt" + ) + assert parsed_body["scope"][0] == "sql" + assert parsed_body["client_id"][0] == "test-client-id" + + def test_exchange_token_failure(self, token_federation_provider, mock_http_client): + """Test token exchange failure handling.""" + mock_response = Mock() + mock_response.data = b'{"error": "invalid_request"}' + mock_response.status = 400 + mock_http_client.request.return_value = mock_response + + with pytest.raises(KeyError): # Will raise KeyError due to missing access_token + token_federation_provider._exchange_token("external-token-123") + + @pytest.mark.parametrize( + "external_issuer,should_exchange", + [ + ("https://login.microsoftonline.com/tenant-id/", True), + ("https://test.databricks.com", False), + ], + ) + def test_add_headers_token_exchange( + self, + token_federation_provider, + mock_external_provider, + mock_http_client, + external_issuer, + should_exchange, + ): + """Test adding headers with and without token exchange.""" + # Setup external provider to return a token + external_token = create_jwt_token(issuer=external_issuer) + mock_external_provider.add_headers = Mock( + side_effect=lambda headers: headers.update( + {"Authorization": f"Bearer {external_token}"} + ) + ) + + if should_exchange: + # Mock successful token exchange + mock_http_client.request.return_value = create_mock_token_response() + expected_token = "databricks-token-456" + else: + expected_token = external_token + + headers = {} + token_federation_provider.add_headers(headers) + + assert headers["Authorization"] == f"Bearer {expected_token}" + + def test_token_caching(self, token_federation_provider, mock_external_provider): + """Test that tokens are cached and reused.""" + external_token = create_jwt_token() + mock_external_provider.add_headers = Mock( + side_effect=lambda headers: headers.update( + {"Authorization": f"Bearer {external_token}"} + ) + ) + + # First call + headers1 = {} + token_federation_provider.add_headers(headers1) + + # Second call - should use cached token + headers2 = {} + token_federation_provider.add_headers(headers2) + + # External provider should only be called once + assert mock_external_provider.add_headers.call_count == 1 + + # Both headers should be the same + assert headers1["Authorization"] == headers2["Authorization"] + + def test_token_cache_expiry( + self, token_federation_provider, mock_external_provider + ): + """Test that expired cached tokens are refreshed.""" + call_count = [0] + + def add_headers_side_effect(headers): + call_count[0] += 1 + token = create_jwt_token( + exp_hours=0.001 if call_count[0] == 1 else 1 + ) # First token expires quickly + headers.update({"Authorization": f"Bearer {token}"}) + + mock_external_provider.add_headers = Mock(side_effect=add_headers_side_effect) + + # First call + headers1 = {} + token_federation_provider.add_headers(headers1) + first_token = headers1["Authorization"].split(" ")[1] + + # Force cache expiry + token_federation_provider._cached_token = Token(first_token) + token_federation_provider._cached_token.expiry_time = ( + datetime.now() - timedelta(seconds=1) + ) + + # Second call - should get new token + headers2 = {} + token_federation_provider.add_headers(headers2) + second_token = headers2["Authorization"].split(" ")[1] + + # External provider should be called twice + assert mock_external_provider.add_headers.call_count == 2 + # Tokens should be different + assert first_token != second_token + + +class TestUtilityFunctions: + """Test utility functions used by TokenFederationProvider.""" + + @pytest.mark.parametrize( + "input_hostname,expected", + [ + ("test.databricks.com", "https://test.databricks.com"), + ("https://test.databricks.com", "https://test.databricks.com"), + ("https://test.databricks.com/", "https://test.databricks.com"), + ("test.databricks.com/", "https://test.databricks.com"), + ], + ) + def test_normalize_hostname(self, input_hostname, expected): + """Test hostname normalization.""" + assert normalize_host_with_protocol(input_hostname) == expected + + @pytest.mark.parametrize( + "url1,url2,expected", + [ + ("https://test.databricks.com", "https://test.databricks.com", True), + ("https://test.databricks.com", "https://test.databricks.com:443", True), + ("https://test1.databricks.com", "https://test2.databricks.com", False), + ("https://login.microsoftonline.com", "https://test.databricks.com", False), + ], + ) + def test_is_same_host(self, url1, url2, expected): + """Test host comparison.""" + assert is_same_host(url1, url2) == expected + + def test_decode_token_valid(self): + """Test decoding a valid JWT token.""" + token = create_jwt_token() + result = decode_token(token) + assert result is not None + assert "iss" in result + assert "exp" in result + + def test_decode_token_invalid(self): + """Test decoding an invalid token.""" + result = decode_token("invalid-token") + assert result is None diff --git a/tests/unit/test_unified_http_client.py b/tests/unit/test_unified_http_client.py new file mode 100644 index 000000000..4e9ce1bbf --- /dev/null +++ b/tests/unit/test_unified_http_client.py @@ -0,0 +1,136 @@ +""" +Unit tests for UnifiedHttpClient, specifically testing MaxRetryError handling +and HTTP status code extraction. +""" + +import pytest +from unittest.mock import Mock, patch +from urllib3.exceptions import MaxRetryError + +from databricks.sql.common.unified_http_client import UnifiedHttpClient +from databricks.sql.common.http import HttpMethod +from databricks.sql.exc import RequestError +from databricks.sql.auth.common import ClientContext +from databricks.sql.types import SSLOptions + + +class TestUnifiedHttpClientMaxRetryError: + """Test MaxRetryError handling and HTTP status code extraction.""" + + @pytest.fixture + def client_context(self): + """Create a minimal ClientContext for testing.""" + context = Mock(spec=ClientContext) + context.hostname = "https://test.databricks.com" + context.ssl_options = SSLOptions( + tls_verify=True, + tls_verify_hostname=True, + tls_trusted_ca_file=None, + tls_client_cert_file=None, + tls_client_cert_key_file=None, + tls_client_cert_key_password=None, + ) + context.socket_timeout = 30 + context.retry_stop_after_attempts_count = 3 + context.retry_delay_min = 1.0 + context.retry_delay_max = 10.0 + context.retry_stop_after_attempts_duration = 300.0 + context.retry_delay_default = 5.0 + context.retry_dangerous_codes = [] + context.proxy_auth_method = None + context.pool_connections = 10 + context.pool_maxsize = 20 + context.user_agent = "test-agent" + return context + + @pytest.fixture + def http_client(self, client_context): + """Create UnifiedHttpClient instance.""" + return UnifiedHttpClient(client_context) + + @pytest.mark.parametrize("status_code,path", [ + (429, "reason.response"), + (503, "reason.response"), + (500, "direct_response"), + ]) + def test_max_retry_error_with_status_codes(self, http_client, status_code, path): + """Test MaxRetryError with various status codes and response paths.""" + mock_pool = Mock() + max_retry_error = MaxRetryError(pool=mock_pool, url="http://test.com") + + if path == "reason.response": + max_retry_error.reason = Mock() + max_retry_error.reason.response = Mock() + max_retry_error.reason.response.status = status_code + else: # direct_response + max_retry_error.response = Mock() + max_retry_error.response.status = status_code + + with patch.object( + http_client._direct_pool_manager, "request", side_effect=max_retry_error + ): + with pytest.raises(RequestError) as exc_info: + http_client.request( + HttpMethod.POST, "http://test.com", headers={"test": "header"} + ) + + error = exc_info.value + assert hasattr(error, "context") + assert "http-code" in error.context + assert error.context["http-code"] == status_code + + @pytest.mark.parametrize("setup_func", [ + lambda e: None, # No setup - error with no attributes + lambda e: setattr(e, "reason", None), # reason=None + lambda e: (setattr(e, "reason", Mock()), setattr(e.reason, "response", None)), # reason.response=None + lambda e: (setattr(e, "reason", Mock()), setattr(e.reason, "response", Mock(spec=[]))), # No status attr + ]) + def test_max_retry_error_missing_status(self, http_client, setup_func): + """Test MaxRetryError without status code (no crash, empty context).""" + mock_pool = Mock() + max_retry_error = MaxRetryError(pool=mock_pool, url="http://test.com") + setup_func(max_retry_error) + + with patch.object( + http_client._direct_pool_manager, "request", side_effect=max_retry_error + ): + with pytest.raises(RequestError) as exc_info: + http_client.request(HttpMethod.GET, "http://test.com") + + error = exc_info.value + assert error.context == {} + + def test_max_retry_error_prefers_reason_response(self, http_client): + """Test that e.reason.response.status is preferred over e.response.status.""" + mock_pool = Mock() + max_retry_error = MaxRetryError(pool=mock_pool, url="http://test.com") + + # Set both structures with different status codes + max_retry_error.reason = Mock() + max_retry_error.reason.response = Mock() + max_retry_error.reason.response.status = 429 # Should use this + + max_retry_error.response = Mock() + max_retry_error.response.status = 500 # Should be ignored + + with patch.object( + http_client._direct_pool_manager, "request", side_effect=max_retry_error + ): + with pytest.raises(RequestError) as exc_info: + http_client.request(HttpMethod.GET, "http://test.com") + + error = exc_info.value + assert error.context["http-code"] == 429 + + def test_generic_exception_no_crash(self, http_client): + """Test that generic exceptions don't crash when checking for status code.""" + generic_error = Exception("Network error") + + with patch.object( + http_client._direct_pool_manager, "request", side_effect=generic_error + ): + with pytest.raises(RequestError) as exc_info: + http_client.request(HttpMethod.POST, "http://test.com") + + error = exc_info.value + assert "HTTP request error" in str(error) diff --git a/tests/unit/test_url_utils.py b/tests/unit/test_url_utils.py new file mode 100644 index 000000000..95f42408d --- /dev/null +++ b/tests/unit/test_url_utils.py @@ -0,0 +1,41 @@ +"""Tests for URL utility functions.""" +import pytest +from databricks.sql.common.url_utils import normalize_host_with_protocol + + +class TestNormalizeHostWithProtocol: + """Tests for normalize_host_with_protocol function.""" + + @pytest.mark.parametrize( + "input_url,expected_output", + [ + ("myserver.com", "https://myserver.com"), # Add https:// + ("https://myserver.com", "https://myserver.com"), # No duplicate + ("http://localhost:8080", "http://localhost:8080"), # Preserve http:// + ("myserver.com:443", "https://myserver.com:443"), # With port + ("myserver.com/", "https://myserver.com"), # Remove trailing slash + ("https://myserver.com///", "https://myserver.com"), # Multiple slashes + ("HTTPS://MyServer.COM", "https://MyServer.COM"), # Case handling + ], + ) + def test_normalize_host_with_protocol(self, input_url, expected_output): + """Test host normalization with various input formats.""" + result = normalize_host_with_protocol(input_url) + assert result == expected_output + + # Additional assertions + assert result.startswith("https://") or result.startswith("http://") + assert not result.endswith("/") + + @pytest.mark.parametrize( + "invalid_host", + [ + None, + "", + " ", # Whitespace only + ], + ) + def test_normalize_host_with_protocol_raises_on_invalid_input(self, invalid_host): + """Test that function raises ValueError for None or empty host.""" + with pytest.raises(ValueError, match="Host cannot be None or empty"): + normalize_host_with_protocol(invalid_host) diff --git a/tests/unit/test_util.py b/tests/unit/test_util.py new file mode 100644 index 000000000..687bdd391 --- /dev/null +++ b/tests/unit/test_util.py @@ -0,0 +1,226 @@ +import decimal +import datetime +from datetime import timezone, timedelta +import pytest +from databricks.sql.utils import ( + convert_to_assigned_datatypes_in_column_table, + ColumnTable, + concat_table_chunks, + serialize_query_tags, +) + +try: + import pyarrow +except ImportError: + pyarrow = None + + +class TestUtils: + def get_column_table_and_description(self): + table_description = [ + ("id", "int", None, None, None, None, None), + ("varchar_column", "string", None, None, None, None, None), + ("boolean_column", "boolean", None, None, None, None, None), + ("integer_column", "int", None, None, None, None, None), + ("bigint_column", "bigint", None, None, None, None, None), + ("smallint_column", "smallint", None, None, None, None, None), + ("tinyint_column", "tinyint", None, None, None, None, None), + ("float_column", "float", None, None, None, None, None), + ("double_column", "double", None, None, None, None, None), + ("decimal_column", "decimal", None, None, 10, 2, None), + ("date_column", "date", None, None, None, None, None), + ("timestamp_column", "timestamp", None, None, None, None, None), + ("timestamp_ntz_column", "timestamp", None, None, None, None, None), + ("timestamp_column_2", "timestamp", None, None, None, None, None), + ("timestamp_column_3", "timestamp", None, None, None, None, None), + ("timestamp_column_4", "timestamp", None, None, None, None, None), + ("timestamp_column_5", "timestamp", None, None, None, None, None), + ("timestamp_column_6", "timestamp", None, None, None, None, None), + ("timestamp_column_7", "timestamp", None, None, None, None, None), + ("binary_column", "binary", None, None, None, None, None), + ("array_column", "array", None, None, None, None, None), + ("map_column", "map", None, None, None, None, None), + ("struct_column", "struct", None, None, None, None, None), + ("variant_column", "string", None, None, None, None, None), + ] + + column_table = [ + (9,), + ("Test Varchar",), + (True,), + (123,), + (9876543210,), + (32000,), + (120,), + (1.23,), + (4.56,), + ("7890.12",), + ("2023-12-31",), + ("2023-12-31 12:30:00",), + ("2023-12-31 12:30:00",), + ("2021-09-30 11:27:35.123",), + ("03/08/2024 02:30:15 PM",), + ("08-Mar-2024 14:30:15",), + ("2024-03-16T14:30:25.123",), + ("2025-03-16T12:30:45+0530",), + ("2025-03-16 12:30:45 +0530",), + (b"\xde\xad\xbe\xef",), + ('["item1","item2"]',), + ('{"key1":"value1","key2":"value2"}',), + ('{"name":"John","age":30}',), + ('"semi-structured data"',), + ] + + return column_table, table_description + + def test_convert_to_assigned_datatypes_in_column_table(self): + column_table, description = self.get_column_table_and_description() + converted_column_table = convert_to_assigned_datatypes_in_column_table( + column_table, description + ) + + # (data , datatype) + expected_convertion = [ + (9, int), + ("Test Varchar", str), + (True, bool), + (123, int), + (9876543210, int), + (32000, int), + (120, int), + (1.23, float), + (4.56, float), + (decimal.Decimal("7890.12"), decimal.Decimal), + (datetime.date(2023, 12, 31), datetime.date), + (datetime.datetime(2023, 12, 31, 12, 30, 0), datetime.datetime), + (datetime.datetime(2023, 12, 31, 12, 30, 0), datetime.datetime), + (datetime.datetime(2021, 9, 30, 11, 27, 35, 123000), datetime.datetime), + (datetime.datetime(2024, 3, 8, 14, 30, 15), datetime.datetime), + (datetime.datetime(2024, 3, 8, 14, 30, 15), datetime.datetime), + (datetime.datetime(2024, 3, 16, 14, 30, 25, 123000), datetime.datetime), + ( + datetime.datetime( + 2025, + 3, + 16, + 12, + 30, + 45, + tzinfo=timezone(timedelta(hours=5, minutes=30)), + ), + datetime.datetime, + ), + ( + datetime.datetime( + 2025, + 3, + 16, + 12, + 30, + 45, + tzinfo=timezone(timedelta(hours=5, minutes=30)), + ), + datetime.datetime, + ), + (b"\xde\xad\xbe\xef", bytes), + ('["item1","item2"]', str), + ('{"key1":"value1","key2":"value2"}', str), + ('{"name":"John","age":30}', str), + ('"semi-structured data"', str), + ] + + for index, entry in enumerate(converted_column_table): + assert entry[0] == expected_convertion[index][0] + assert isinstance(entry[0], expected_convertion[index][1]) + + def test_concat_table_chunks_column_table(self): + column_table1 = ColumnTable([[1, 2], [5, 6]], ["col1", "col2"]) + column_table2 = ColumnTable([[3, 4], [7, 8]], ["col1", "col2"]) + + result_table = concat_table_chunks([column_table1, column_table2]) + + assert result_table.column_table == [[1, 2, 3, 4], [5, 6, 7, 8]] + assert result_table.column_names == ["col1", "col2"] + + @pytest.mark.skipif(pyarrow is None, reason="PyArrow is not installed") + def test_concat_table_chunks_arrow_table(self): + arrow_table1 = pyarrow.Table.from_pydict({"col1": [1, 2], "col2": [5, 6]}) + arrow_table2 = pyarrow.Table.from_pydict({"col1": [3, 4], "col2": [7, 8]}) + + result_table = concat_table_chunks([arrow_table1, arrow_table2]) + assert result_table.column_names == ["col1", "col2"] + assert result_table.column("col1").to_pylist() == [1, 2, 3, 4] + assert result_table.column("col2").to_pylist() == [5, 6, 7, 8] + + def test_concat_table_chunks_empty(self): + result_table = concat_table_chunks([]) + assert result_table == [] + + def test_concat_table_chunks__incorrect_column_names_error(self): + column_table1 = ColumnTable([[1, 2], [5, 6]], ["col1", "col2"]) + column_table2 = ColumnTable([[3, 4], [7, 8]], ["col1", "col3"]) + + with pytest.raises(ValueError): + concat_table_chunks([column_table1, column_table2]) + + def test_serialize_query_tags_basic(self): + """Test basic query tags serialization""" + query_tags = {"team": "data-eng", "application": "etl"} + result = serialize_query_tags(query_tags) + assert result == "team:data-eng,application:etl" + + def test_serialize_query_tags_with_none_value(self): + """Test query tags with None value (should omit colon and value)""" + query_tags = {"key1": "value1", "key2": None, "key3": "value3"} + result = serialize_query_tags(query_tags) + assert result == "key1:value1,key2,key3:value3" + + def test_serialize_query_tags_with_special_chars(self): + """Test query tags with special characters (colon, comma, backslash)""" + query_tags = { + "key1": "value:with:colons", + "key2": "value,with,commas", + "key3": r"value\with\backslashes", + } + result = serialize_query_tags(query_tags) + assert ( + result + == r"key1:value\:with\:colons,key2:value\,with\,commas,key3:value\\with\\backslashes" + ) + + def test_serialize_query_tags_with_mixed_special_chars(self): + """Test query tags with mixed special characters""" + query_tags = {"key1": r"a:b,c\d"} + result = serialize_query_tags(query_tags) + assert result == r"key1:a\:b\,c\\d" + + def test_serialize_query_tags_empty_dict(self): + """Test serialization with empty dictionary""" + query_tags = {} + result = serialize_query_tags(query_tags) + assert result is None + + def test_serialize_query_tags_none(self): + """Test serialization with None input""" + result = serialize_query_tags(None) + assert result is None + + def test_serialize_query_tags_with_special_chars_in_key(self): + """Test query tags with special characters in keys (only backslashes are escaped in keys)""" + query_tags = { + "key:with:colons": "value1", + "key,with,commas": "value2", + r"key\with\backslashes": "value3", + } + result = serialize_query_tags(query_tags) + # Only backslashes are escaped in keys; colons and commas in keys are not escaped + assert ( + result + == r"key:with:colons:value1,key,with,commas:value2,key\\with\\backslashes:value3" + ) + + def test_serialize_query_tags_all_none_values(self): + """Test query tags where all values are None""" + query_tags = {"key1": None, "key2": None, "key3": None} + result = serialize_query_tags(query_tags) + assert result == "key1,key2,key3"