diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 0d074c07b..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. -* @deeksha-db @samikshya-db @jprakash-db @yunbodeng-db @jackyhu-db @benc-db diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml new file mode 100644 index 000000000..5c961757e --- /dev/null +++ b/.github/workflows/code-coverage.yml @@ -0,0 +1,163 @@ +name: Code Coverage + +permissions: + contents: read + +on: [pull_request, workflow_dispatch] + +jobs: + test-with-coverage: + 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@v4 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.ref || github.ref_name }} + repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} + - name: Set up python + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + #---------------------------------------------- + # ----- install system dependencies ----- + #---------------------------------------------- + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev + #---------------------------------------------- + # ----- install & configure poetry ----- + #---------------------------------------------- + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + version: "2.2.1" + 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@v4 + 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 Kerberos system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev + - name: Install library + run: poetry install --no-interaction --all-extras + #---------------------------------------------- + # run parallel tests with coverage + #---------------------------------------------- + - name: Run parallel tests with coverage + continue-on-error: false + run: | + poetry run pytest tests/unit tests/e2e \ + -m "not serial" \ + -n auto \ + --cov=src \ + --cov-report=xml \ + --cov-report=term \ + -v + + #---------------------------------------------- + # run telemetry tests with coverage (isolated) + #---------------------------------------------- + - name: Run telemetry tests with coverage (isolated) + continue-on-error: false + run: | + # Run test_concurrent_telemetry.py separately for isolation + poetry run pytest tests/e2e/test_concurrent_telemetry.py \ + --cov=src \ + --cov-append \ + --cov-report=xml \ + --cov-report=term \ + -v + + #---------------------------------------------- + # check for coverage override + #---------------------------------------------- + - name: Check for coverage override + id: override + run: | + OVERRIDE_COMMENT=$(echo "${{ github.event.pull_request.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 + #---------------------------------------------- + # check coverage percentage + #---------------------------------------------- + - 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 + + # Install xmllint if not available + 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%" + + # Use Python to compare the coverage with 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 + + #---------------------------------------------- + # coverage enforcement summary + #---------------------------------------------- + - name: Coverage enforcement summary + run: | + if [ "${{ steps.override.outputs.override }}" == "true" ]; then + echo "⚠️ Coverage checks bypassed: ${{ steps.override.outputs.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 4889156bf..cc3952920 100644 --- a/.github/workflows/code-quality-checks.yml +++ b/.github/workflows/code-quality-checks.yml @@ -1,17 +1,23 @@ name: Code Quality Checks -on: - push: - branches: - - main - pull_request: - branches: - - main + +on: [pull_request] + jobs: run-unit-tests: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + dependency-version: ["default", "min"] + # Optimize matrix - test min/max on subset of Python versions + 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 @@ -29,6 +35,7 @@ jobs: - name: Install Poetry uses: snok/install-poetry@v1 with: + version: "2.2.1" virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true @@ -41,7 +48,7 @@ jobs: uses: actions/cache@v4 with: path: .venv - key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ matrix.dependency-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} #---------------------------------------------- # install dependencies if cache does not exist #---------------------------------------------- @@ -54,15 +61,47 @@ jobs: - name: Install library run: poetry install --no-interaction #---------------------------------------------- + # override with custom dependency versions + #---------------------------------------------- + - 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 + + #---------------------------------------------- # run test suite #---------------------------------------------- + - 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: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + 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)" + steps: #---------------------------------------------- # check-out repo and set-up python @@ -80,6 +119,7 @@ jobs: - name: Install Poetry uses: snok/install-poetry@v1 with: + version: "2.2.1" virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true @@ -92,7 +132,7 @@ jobs: uses: actions/cache@v4 with: path: .venv-pyarrow - key: venv-pyarrow-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} + key: venv-pyarrow-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ matrix.dependency-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} #---------------------------------------------- # install dependencies if cache does not exist #---------------------------------------------- @@ -102,18 +142,44 @@ jobs: #---------------------------------------------- # install your root project, if required #---------------------------------------------- + - name: Install Kerberos system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev - name: Install library run: poetry install --no-interaction --all-extras #---------------------------------------------- + # override with custom dependency versions + #---------------------------------------------- + - 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 + #---------------------------------------------- # run test suite #---------------------------------------------- + - 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 strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: #---------------------------------------------- # check-out repo and set-up python @@ -131,6 +197,7 @@ jobs: - name: Install Poetry uses: snok/install-poetry@v1 with: + version: "2.2.1" virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true @@ -165,7 +232,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: #---------------------------------------------- # check-out repo and set-up python @@ -183,6 +250,7 @@ jobs: - name: Install Poetry uses: snok/install-poetry@v1 with: + version: "2.2.1" virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true diff --git a/.github/workflows/daily-telemetry-e2e.yml b/.github/workflows/daily-telemetry-e2e.yml new file mode 100644 index 000000000..d60b7f5a9 --- /dev/null +++ b/.github/workflows/daily-telemetry-e2e.yml @@ -0,0 +1,92 @@ +name: Daily Telemetry E2E Tests + +on: + schedule: + - cron: '0 0 * * 0' # Run every Sunday at midnight UTC + + workflow_dispatch: # Allow manual triggering + inputs: + test_pattern: + description: 'Test pattern to run (default: tests/e2e/test_telemetry_e2e.py)' + required: false + default: 'tests/e2e/test_telemetry_e2e.py' + type: string + +jobs: + telemetry-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@v4 + + - name: Set up python + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + #---------------------------------------------- + # ----- install & configure poetry ----- + #---------------------------------------------- + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + version: "2.2.1" + 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@v4 + 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 Kerberos system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev + - name: Install dependencies + run: poetry install --no-interaction --all-extras + + #---------------------------------------------- + # run telemetry E2E tests + #---------------------------------------------- + - name: Run telemetry E2E tests + run: | + TEST_PATTERN="${{ github.event.inputs.test_pattern || 'tests/e2e/test_telemetry_e2e.py' }}" + echo "Running tests: $TEST_PATTERN" + poetry run python -m pytest $TEST_PATTERN -v -s + + #---------------------------------------------- + # upload test results on failure + #---------------------------------------------- + - name: Upload test results on failure + if: failure() + uses: actions/upload-artifact@v4 + with: + name: telemetry-test-results + path: | + .pytest_cache/ + tests-unsafe.log + retention-days: 7 + diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 87eaa79bb..c915ee6c1 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -1,12 +1,13 @@ name: Integration Tests + on: - push: - paths-ignore: - - "**.MD" - - "**.md" + push: + branches: + - main + pull_request: jobs: - run-e2e-tests: + run-non-telemetry-tests: runs-on: ubuntu-latest environment: azure-prod env: @@ -32,6 +33,7 @@ jobs: - name: Install Poetry uses: snok/install-poetry@v1 with: + version: "2.2.1" virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true @@ -48,10 +50,62 @@ jobs: #---------------------------------------------- # install dependencies if cache does not exist #---------------------------------------------- + - name: Install Kerberos system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev - 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 non-telemetry e2e tests + run: | + # Exclude all telemetry tests - they run in separate job for isolation + poetry run python -m pytest tests/e2e \ + --ignore=tests/e2e/test_telemetry_e2e.py \ + --ignore=tests/e2e/test_concurrent_telemetry.py \ + -n auto + + run-telemetry-tests: + runs-on: ubuntu-latest + needs: run-non-telemetry-tests # Run after non-telemetry tests complete + 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@v4 + - name: Set up python + id: setup-python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev + - name: Install Poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v4 + with: + path: .venv + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ github.event.repository.name }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + run: poetry install --no-interaction --all-extras + - name: Run telemetry tests in isolation + run: | + # Run test_concurrent_telemetry.py in isolation with complete process separation + # Use --dist=loadgroup to respect @pytest.mark.xdist_group markers + poetry run python -m pytest tests/e2e/test_concurrent_telemetry.py \ + -n auto --dist=loadgroup -v \ No newline at end of file diff --git a/.github/workflows/publish-manual.yml b/.github/workflows/publish-manual.yml index ecad71a29..2f2a7a4dd 100644 --- a/.github/workflows/publish-manual.yml +++ b/.github/workflows/publish-manual.yml @@ -31,10 +31,19 @@ jobs: - name: Install Poetry uses: snok/install-poetry@v1 # Install Poetry, the Python package manager with: + version: "2.2.1" virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true + #---------------------------------------------- + # Step 3.5: Install Kerberos system dependencies + #---------------------------------------------- + - name: Install Kerberos system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev + # #---------------------------------------------- # # Step 4: Load cached virtual environment (if available) # #---------------------------------------------- diff --git a/.github/workflows/publish-test.yml b/.github/workflows/publish-test.yml index 2e6359a78..97a444e68 100644 --- a/.github/workflows/publish-test.yml +++ b/.github/workflows/publish-test.yml @@ -14,13 +14,14 @@ jobs: id: setup-python uses: actions/setup-python@v5 with: - python-version: 3.9 + python-version: "3.10" #---------------------------------------------- # ----- install & configure poetry ----- #---------------------------------------------- - name: Install Poetry uses: snok/install-poetry@v1 with: + version: "2.2.1" virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true @@ -36,6 +37,10 @@ jobs: #---------------------------------------------- # install dependencies if cache does not exist #---------------------------------------------- + - name: Install Kerberos system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' run: poetry install --no-interaction --no-root @@ -54,11 +59,17 @@ jobs: - name: Update pyproject.toml run: poetry version ${{ steps.version.outputs.major-version }}.${{ steps.version.outputs.minor-version }}.dev$(date +%s) #---------------------------------------------- + # Build the package (before publish action) + #---------------------------------------------- + - name: Build package + run: poetry build + #---------------------------------------------- + # Configure test-pypi repository + #---------------------------------------------- + - name: Configure test-pypi repository + run: poetry config repositories.testpypi https://test.pypi.org/legacy/ + #---------------------------------------------- # 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/" + - name: Publish to test-pypi + run: poetry publish --username __token__ --password ${{ secrets.TEST_PYPI_TOKEN }} --repository testpypi diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index dde6cc2dc..b101f421c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -23,6 +23,7 @@ jobs: - name: Install Poetry uses: snok/install-poetry@v1 with: + version: "2.2.1" virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true @@ -38,6 +39,10 @@ jobs: #---------------------------------------------- # install dependencies if cache does not exist #---------------------------------------------- + - name: Install Kerberos system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libkrb5-dev - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' run: poetry install --no-interaction --no-root @@ -56,9 +61,12 @@ jobs: - name: Update pyproject.toml run: poetry version ${{ steps.version.outputs.current-version }} #---------------------------------------------- - # Attempt push to test-pypi + # Build the package (before publish) #---------------------------------------------- - - name: Build and publish to pypi - uses: JRubics/poetry-publish@v1.10 - with: - pypi_token: ${{ secrets.PROD_PYPI_TOKEN }} + - name: Build package + run: poetry build + #---------------------------------------------- + # Publish to pypi + #---------------------------------------------- + - name: Publish to pypi + run: poetry publish --username __token__ --password ${{ secrets.PROD_PYPI_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e4247dbd..0ba3bb1a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,85 @@ # Release History +# 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) diff --git a/README.md b/README.md index a4c5a1307..047515ba4 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,13 @@ The Databricks SQL Connector for Python allows you to develop Python application 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 @@ -65,6 +67,12 @@ 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`. 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/examples/experimental/tests/__init__.py b/examples/experimental/tests/__init__.py new file mode 100644 index 000000000..e69de29bb 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_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/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 index 1bc396c9d..7d0845a58 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "astroid" @@ -6,6 +6,7 @@ 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.4-py3-none-any.whl", hash = "sha256:413658a61eeca6202a59231abb473f932038fbcbf1666587f66d482083413a25"}, {file = "astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a"}, @@ -20,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"}, @@ -55,17 +57,100 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {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.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false 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"}, @@ -167,6 +252,7 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -181,17 +267,339 @@ 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 = "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 = "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] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "coverage" +version = "7.10.1" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "python_version >= \"3.10\"" +files = [ + {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 = "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 = "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] +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 = "cryptography" +version = "45.0.6" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = true +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["main"] +markers = "python_version >= \"3.10\"" +files = [ + {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 (>=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 = "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.8" +groups = ["dev"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -207,6 +615,7 @@ version = "2.0.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, @@ -218,6 +627,8 @@ 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"}, @@ -226,12 +637,67 @@ files = [ [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] +testing = ["hatch", "pre-commit", "pytest", "tox"] + +[[package]] +name = "gssapi" +version = "1.9.0" +description = "Python GSSAPI Wrapper" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform != \"win32\"" +files = [ + {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] +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"}, @@ -246,6 +712,7 @@ version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -257,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"}, @@ -265,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"}, @@ -315,12 +809,86 @@ docs = ["sphinx (>=1.6.0)", "sphinx-bootstrap-theme"] flake8 = ["flake8"] tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] +[[package]] +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 = "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.extras] +docs = ["sphinx (>=1.6.0)", "sphinx_bootstrap_theme"] +flake8 = ["flake8"] +tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] + [[package]] name = "mccabe" 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"}, @@ -332,6 +900,7 @@ version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {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"}, @@ -391,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"}, @@ -402,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"}, @@ -439,6 +1011,8 @@ version = "2.2.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" +groups = ["main", "dev"] +markers = "python_version >= \"3.10\"" files = [ {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"}, @@ -503,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"}, @@ -519,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"}, @@ -533,6 +1109,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -544,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"}, @@ -573,11 +1152,7 @@ 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" @@ -611,6 +1186,8 @@ 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"}, @@ -657,7 +1234,11 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} +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" @@ -693,6 +1274,7 @@ 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"}, @@ -704,6 +1286,7 @@ 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.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -720,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"}, @@ -735,6 +1319,8 @@ version = "17.0.0" description = "Python library for Apache Arrow" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.10\" and extra == \"pyarrow\"" files = [ {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"}, @@ -782,57 +1368,147 @@ test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] [[package]] name = "pyarrow" -version = "19.0.1" +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 = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"}, - {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"}, - {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76aef7f5f7e4a757fddcdcf010a8290958f09e3470ea458c80d26f4316ae89"}, - {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03c9d6f2a3dffbd62671ca070f13fc527bb1867b4ec2b98c7eeed381d4f389a"}, - {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:65cf9feebab489b19cdfcfe4aa82f62147218558d8d3f0fc1e9dea0ab8e7905a"}, - {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:41f9706fbe505e0abc10e84bf3a906a1338905cbbcf1177b71486b03e6ea6608"}, - {file = "pyarrow-19.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6cb2335a411b713fdf1e82a752162f72d4a7b5dbc588e32aa18383318b05866"}, - {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90"}, - {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00"}, - {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae"}, - {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5"}, - {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3"}, - {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6"}, - {file = "pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466"}, - {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b"}, - {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294"}, - {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14"}, - {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34"}, - {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6"}, - {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832"}, - {file = "pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960"}, - {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c"}, - {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae"}, - {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4"}, - {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2"}, - {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6"}, - {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136"}, - {file = "pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef"}, - {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0"}, - {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9"}, - {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3"}, - {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6"}, - {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a"}, - {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8"}, - {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b9766a47a9cb56fefe95cb27f535038b5a195707a08bf61b180e642324963b46"}, - {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:6c5941c1aac89a6c2f2b16cd64fe76bcdb94b2b1e99ca6459de4e6f07638d755"}, - {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd44d66093a239358d07c42a91eebf5015aa54fccba959db899f932218ac9cc8"}, - {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:335d170e050bcc7da867a1ed8ffb8b44c57aaa6e0843b156a501298657b1e972"}, - {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:1c7556165bd38cf0cd992df2636f8bcdd2d4b26916c6b7e646101aff3c16f76f"}, - {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:699799f9c80bebcf1da0983ba86d7f289c5a2a5c04b945e2f2bcf7e874a91911"}, - {file = "pyarrow-19.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8464c9fbe6d94a7fe1599e7e8965f350fd233532868232ab2596a71586c5a429"}, - {file = "pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e"}, + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] [package.extras] -test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] +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" @@ -840,6 +1516,7 @@ version = "3.2.7" description = "python code static checker" optional = false python-versions = ">=3.8.0" +groups = ["dev"] files = [ {file = "pylint-3.2.7-py3-none-any.whl", hash = "sha256:02f4aedeac91be69fb3b4bea997ce580a4ac68ce58b89eaefeaf06749df73f4b"}, {file = "pylint-3.2.7.tar.gz", hash = "sha256:1b7a721b575eaeaa7d39db076b6e7743c993ea44f57979127c517c6c572c803e"}, @@ -851,7 +1528,7 @@ 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" @@ -864,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"}, @@ -886,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"}, @@ -901,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"}, @@ -921,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"}, @@ -935,6 +1701,7 @@ version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, @@ -946,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"}, @@ -961,23 +1729,131 @@ 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.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {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 = "sspilib" +version = "0.2.0" +description = "SSPI API bindings for Python" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.10\" and sys_platform == \"win32\"" +files = [ + {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]] +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" 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"}, ] @@ -996,6 +1872,8 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version <= \"3.10\"" files = [ {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"}, @@ -1037,6 +1915,7 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -1048,6 +1927,7 @@ 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.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"}, {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"}, @@ -1059,6 +1939,7 @@ version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] files = [ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, @@ -1070,21 +1951,22 @@ 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.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)"] [extras] -pyarrow = ["pyarrow", "pyarrow"] +pyarrow = ["pyarrow", "pyarrow", "pyarrow"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.8.0" -content-hash = "0bd6a6a019693a69a3da5ae312cea625ea73dfc5832b1e4051c7c7d1e76553d8" +content-hash = "ec311bf26ec866de2f427bcdf4ec69ceed721bfd70edfae3aba1ac12882a09d6" diff --git a/pyproject.toml b/pyproject.toml index 7b95a5097..911f1b79c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "databricks-sql-connector" -version = "4.0.3" +version = "4.2.5" description = "Databricks SQL Connector for Python" authors = ["Databricks "] license = "Apache-2.0" @@ -12,29 +12,39 @@ include = ["CHANGELOG.md"] python = "^3.8.0" thrift = ">=0.16.0,<0.21.0" pandas = [ - { version = ">=1.2.5,<2.3.0", python = ">=3.8,<3.13" }, - { version = ">=2.2.3,<2.3.0", python = ">=3.13" } + { 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" } ] -lz4 = "^4.0.2" requests = "^2.18.1" oauthlib = "^3.1.0" openpyxl = "^3.0.10" 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", optional=true } + { version = ">=18.0.0", python = ">=3.13,<3.14", optional=true }, + { version = ">=22.0.0", python = ">=3.14", optional=true } ] -python-dateutil = "^2.8.0" +pyjwt = "^2.0.0" +pybreaker = "^1.0.0" +requests-kerberos = {version = "^0.15.0", optional = true} + [tool.poetry.extras] 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" }, @@ -56,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"] 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..15e119841 --- /dev/null +++ b/scripts/dependency_manager.py @@ -0,0 +1,251 @@ +""" +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 + 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('~'): + # ~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 432ac687d..b0c2f497d 100755 --- a/src/databricks/sql/auth/retry.py +++ b/src/databricks/sql/auth/retry.py @@ -127,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], ) @@ -355,8 +355,14 @@ def should_retry(self, method: str, status_code: int) -> Tuple[bool, str]: 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: return ( @@ -367,6 +373,13 @@ def should_retry(self, method: str, status_code: int) -> Tuple[bool, str]: if status_code == 403: 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: return False, "Received code 501 from server." @@ -375,33 +388,6 @@ def should_retry(self, method: str, status_code: int) -> Tuple[bool, str]: 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 diff --git a/src/databricks/sql/auth/thrift_http_client.py b/src/databricks/sql/auth/thrift_http_client.py index f0daae162..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 @@ -204,15 +211,9 @@ def flush(self): ) ) - @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), - ) - 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..ff130cd39 --- /dev/null +++ b/src/databricks/sql/backend/sea/backend.py @@ -0,0 +1,827 @@ +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 + """ + + 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 69% rename from src/databricks/sql/thrift_backend.py rename to src/databricks/sql/backend/thrift_backend.py index 2e3478d77..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__) @@ -73,9 +89,9 @@ } -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,7 +107,7 @@ 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: @@ -131,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") @@ -143,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) @@ -171,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} @@ -216,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): @@ -248,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): @@ -304,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()) @@ -330,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. @@ -390,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 = ( @@ -421,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 @@ -473,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 @@ -487,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): @@ -500,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): @@ -521,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 = { @@ -552,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: @@ -573,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): @@ -615,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): @@ -623,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 { @@ -654,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): @@ -665,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: @@ -674,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: @@ -687,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): @@ -717,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, @@ -790,43 +888,52 @@ def get_execution_result(self, op_handle, cursor): t_result_set_metadata_resp = resp.resultSetMetadata - 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 - ) - 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 - 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, - description=description, - ssl_options=self._ssl_options, + description = self._hive_schema_to_description( + t_result_set_metadata_resp.schema, + schema_bytes, + self._host, ) - return ExecuteResponse( - arrow_queue=queue, - status=resp.status, + lz4_compressed = t_result_set_metadata_resp.lz4Compressed + is_staging_operation = t_result_set_metadata_resp.isStagingOperation + has_more_rows = resp.hasMoreRows + + status = CommandState.from_thrift_state(resp.status) or CommandState.RUNNING + + execute_response = ExecuteResponse( + command_id=command_id, + status=status, + description=description, 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): @@ -847,46 +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, enforce_embedded_schema_correctness=False, - ): - assert session_handle is not None + 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, @@ -896,8 +1024,21 @@ 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, # For async operation we don't want the direct results @@ -910,46 +1051,94 @@ def execute_command( 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 + ) - def get_catalogs(self, session_handle, max_rows, max_bytes, cursor): - assert session_handle is not None + 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_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 ), @@ -957,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 ), @@ -983,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 ), @@ -1009,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, @@ -1023,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, @@ -1058,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, @@ -1069,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 ea901c3ae..2aeea175e 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,16 +49,33 @@ 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__) @@ -66,6 +91,9 @@ NO_NATIVE_PARAMS: List = [] +# Transaction isolation level constants (extension to PEP 249) +TRANSACTION_ISOLATION_LEVEL_REPEATABLE_READ = "REPEATABLE_READ" + class Connection: def __init__( @@ -78,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) @@ -176,6 +210,23 @@ 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: @@ -214,73 +265,149 @@ 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 ) - 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." - ) + client_context = build_client_context(server_hostname, __version__, **kwargs) + self.http_client = UnifiedHttpClient(client_context) - if user_agent_entry: - useragent_header = "{}/{} ({})".format( - USER_AGENT_NAME, __version__, user_agent_entry + try: + self.session = Session( + server_hostname, + http_path, + self.http_client, + http_headers, + session_configuration, + catalog, + schema, + _use_arrow_native_complex_types, + **kwargs, ) - else: - useragent_header = "{}/{}".format(USER_AGENT_NAME, __version__) - - 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.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 + + 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, ) - 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]): @@ -330,53 +457,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 @@ -390,44 +534,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: + 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: - logger.debug("Session appears to have been closed already") + 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): - raise NotSupportedError("Transactions are not supported on Databricks") + def rollback(self) -> None: + """ + Rollback the current transaction. + + 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 @@ -436,16 +856,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 @@ -463,7 +886,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] @@ -600,10 +1027,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. @@ -612,23 +1045,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 @@ -646,23 +1099,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 @@ -675,11 +1127,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 ): @@ -689,32 +1144,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 ): @@ -724,37 +1224,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. @@ -785,9 +1305,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 @@ -809,9 +1337,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, @@ -820,28 +1348,25 @@ def execute( parameters=prepared_params, async_op=False, enforce_embedded_schema_correctness=enforce_embedded_schema_correctness, - ) - self.active_result_set = ResultSet( - self.connection, - execute_response, - self.thrift_backend, - self.buffer_size_bytes, - self.arraysize, - self.connection.use_cloud_fetch, + 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": """ @@ -849,8 +1374,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 @@ -872,9 +1401,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, @@ -883,18 +1412,22 @@ def execute_async( 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): """ @@ -903,11 +1436,7 @@ def is_query_pending(self): :return: """ operation_state = self.get_query_state() - - return not operation_state or operation_state in [ - ttypes.TOperationState.RUNNING_STATE, - ttypes.TOperationState.PENDING_STATE, - ] + return operation_state in [CommandState.PENDING, CommandState.RUNNING] def get_async_execution_result(self): """ @@ -923,30 +1452,30 @@ def get_async_execution_result(self): 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. @@ -955,12 +1484,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. @@ -969,21 +1503,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": @@ -995,23 +1523,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, @@ -1028,8 +1550,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, @@ -1038,15 +1560,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, @@ -1063,8 +1579,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, @@ -1073,13 +1589,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]: @@ -1093,7 +1602,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]: """ @@ -1107,7 +1620,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]: """ @@ -1129,21 +1646,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: """ @@ -1152,8 +1681,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 " @@ -1163,7 +1692,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() @@ -1175,8 +1704,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 @@ -1221,288 +1750,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/feature_flag.py b/src/databricks/sql/common/feature_flag.py new file mode 100644 index 000000000..36e4b8a02 --- /dev/null +++ b/src/databricks/sql/common/feature_flag.py @@ -0,0 +1,191 @@ +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 + + 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..0f723d144 --- /dev/null +++ b/src/databricks/sql/session.py @@ -0,0 +1,216 @@ +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 + +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__) + + base_headers = [("User-Agent", self.useragent_header)] + all_headers = (http_headers or []) + base_headers + + 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) + + 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..408162400 --- /dev/null +++ b/src/databricks/sql/telemetry/telemetry_client.py @@ -0,0 +1,752 @@ +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, + ) -> 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 + + # 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) + + 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, + ): + """ + 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, + ) + 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 348c268da..b1fff7202 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 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): @@ -742,3 +874,113 @@ 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 + 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}" + + # 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/tests/e2e/common/large_queries_mixin.py b/tests/e2e/common/large_queries_mixin.py index ed8ac4574..dd7c56996 100644 --- a/tests/e2e/common/large_queries_mixin.py +++ b/tests/e2e/common/large_queries_mixin.py @@ -2,6 +2,8 @@ import math import time +import pytest + log = logging.getLogger(__name__) @@ -42,7 +44,14 @@ def fetch_rows(self, cursor, row_count, fetchmany_size): + "assuming 10K fetch size." ) - def test_query_with_large_wide_result_set(self): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_query_with_large_wide_result_set(self, extra_params): resultSize = 300 * 1000 * 1000 # 300 MB width = 8192 # B rows = resultSize // width @@ -52,7 +61,7 @@ def test_query_with_large_wide_result_set(self): 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: + with self.cursor(extra_params) 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)]) @@ -68,7 +77,14 @@ def test_query_with_large_wide_result_set(self): 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): + @pytest.mark.parametrize( + "extra_params", + [ + {}, + {"use_sea": True}, + ], + ) + def test_query_with_large_narrow_result_set(self, extra_params): resultSize = 300 * 1000 * 1000 # 300 MB width = 8 # sizeof(long) rows = resultSize / width @@ -77,24 +93,31 @@ def test_query_with_large_narrow_result_set(self): 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: + with self.cursor(extra_params) 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, + @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 3 minutes, and asserts that the query completes successfully. """ minutes = 60 - min_duration = 5 * minutes + min_duration = 3 * minutes duration = -1 scale0 = 10000 scale_factor = 1 - with self.cursor() as cursor: + with self.cursor(extra_params) as cursor: while duration < min_duration: - assert scale_factor < 1024, "Detected infinite loop" + assert scale_factor < 4096, "Detected infinite loop" start = time.time() cursor.execute( @@ -113,5 +136,5 @@ def test_long_running_query(self): 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 + # Extrapolate linearly to reach 3 min and add 50% padding to push over the limit scale_factor = math.ceil(1.5 * scale_factor / current_fraction) diff --git a/tests/e2e/common/retry_test_mixins.py b/tests/e2e/common/retry_test_mixins.py index b5d01a45d..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 @@ -127,7 +213,17 @@ class PySQLRetryTestsMixin: "_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 """ @@ -147,31 +243,57 @@ 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 floor @@ -184,7 +306,8 @@ def test_retry_exponential_backoff(self): 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 @@ -200,18 +323,33 @@ def test_retry_exponential_backoff(self): # 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 8c0a4a5a3..e04e348c9 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, @@ -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 @@ -179,10 +185,19 @@ def test_cloud_fetch(self): class TestPySQLAsyncQueriesSuite(PySQLPytestTestCase): - def test_execute_async__long_running(self): + @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 @@ -195,10 +210,21 @@ def test_execute_async__long_running(self): assert result[0].asDict() == {"count(1)": 0} - def test_execute_async__small_result(self): + @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() as cursor: + with self.cursor(extra_params) as cursor: cursor.execute_async(small_result_query) ## Fake sleep for 5 secs @@ -214,7 +240,16 @@ def test_execute_async__small_result(self): assert result[0].asDict() == {"1": 1} - def test_execute_async__large_result(self): + @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""" @@ -228,7 +263,7 @@ def test_execute_async__large_result(self): RANGE({y_dimension}) y """ - with self.cursor() as cursor: + with self.cursor(extra_params) as cursor: cursor.execute_async(large_result_query) ## Fake sleep for 5 secs @@ -256,6 +291,7 @@ class TestPySQLCoreSuite( PySQLStagingIngestionTestSuiteMixin, PySQLRetryTestsMixin, PySQLUCVolumeTestSuiteMixin, + PySQLStreamingPutTestSuiteMixin, ): validate_row_value_type = True validate_result = True @@ -327,8 +363,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( @@ -526,10 +576,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])]) @@ -537,9 +601,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 @@ -577,8 +652,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") @@ -588,8 +677,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;") @@ -601,8 +704,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) @@ -613,8 +730,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) @@ -623,8 +751,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) @@ -632,8 +774,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) @@ -641,8 +797,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) @@ -715,8 +885,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] @@ -801,47 +987,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 - ) - - 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 - ) + len(rows) == expected_rows + ), f"Expected {expected_rows} rows, got {len(rows)}" - 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..ae4e74c20 --- /dev/null +++ b/tests/e2e/test_transactions.py @@ -0,0 +1,2078 @@ +""" +End-to-end integration tests for Multi-Statement Transaction (MST) APIs. + +These tests verify: +- autocommit property (getter/setter) +- commit() and rollback() methods +- get_transaction_isolation() and set_transaction_isolation() methods +- Transaction error handling + +Requirements: +- DBSQL warehouse that supports Multi-Statement Transactions (MST) +- Test environment configured via test.env file or environment variables + +Setup: +Set the following environment variables: +- DATABRICKS_SERVER_HOSTNAME +- DATABRICKS_HTTP_PATH +- DATABRICKS_ACCESS_TOKEN (or use OAuth) + +Usage: + pytest tests/e2e/test_transactions.py -v +""" + +import logging +import os +import pytest +from typing import Any, Dict + +import databricks.sql as sql +from databricks.sql import TransactionError, NotSupportedError, InterfaceError + +logger = logging.getLogger(__name__) + + +class TestTransactions: + """E2E tests for transaction control methods (MST support).""" + + # Test table name + TEST_TABLE_NAME = "pysql_transaction_test_table" + + @pytest.fixture(autouse=True) + def setup_and_teardown(self, connection_details): + """Setup test environment before each test and cleanup after.""" + self.connection_params = { + "server_hostname": connection_details["host"], + "http_path": connection_details["http_path"], + "access_token": connection_details.get("access_token"), + "ignore_transactions": False, # Enable actual transaction functionality for these tests + } + + # Get catalog and schema from environment or use defaults + self.catalog = os.getenv("DATABRICKS_CATALOG", "main") + self.schema = os.getenv("DATABRICKS_SCHEMA", "default") + + # Create connection for setup + self.connection = sql.connect(**self.connection_params) + + # Setup: Create test table + self._create_test_table() + + yield + + # Teardown: Cleanup + self._cleanup() + + def _get_fully_qualified_table_name(self) -> str: + """Get the fully qualified table name.""" + return f"{self.catalog}.{self.schema}.{self.TEST_TABLE_NAME}" + + def _create_test_table(self): + """Create the test table with Delta format and MST support.""" + fq_table_name = self._get_fully_qualified_table_name() + cursor = self.connection.cursor() + + try: + # Drop if exists + cursor.execute(f"DROP TABLE IF EXISTS {fq_table_name}") + + # Create table with Delta and catalog-owned feature for MST compatibility + cursor.execute( + f""" + CREATE TABLE IF NOT EXISTS {fq_table_name} + (id INT, value STRING) + USING DELTA + TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') + """ + ) + + logger.info(f"Created test table: {fq_table_name}") + finally: + cursor.close() + + def _cleanup(self): + """Cleanup after test: rollback pending transactions, drop table, close connection.""" + try: + # Try to rollback any pending transaction + if ( + self.connection + and self.connection.open + and not self.connection.autocommit + ): + try: + self.connection.rollback() + except Exception as e: + logger.debug( + f"Rollback during cleanup failed (may be expected): {e}" + ) + + # Reset to autocommit mode + try: + self.connection.autocommit = True + except Exception as e: + logger.debug(f"Reset autocommit during cleanup failed: {e}") + + # Drop test table + if self.connection and self.connection.open: + fq_table_name = self._get_fully_qualified_table_name() + cursor = self.connection.cursor() + try: + cursor.execute(f"DROP TABLE IF EXISTS {fq_table_name}") + logger.info(f"Dropped test table: {fq_table_name}") + except Exception as e: + logger.warning(f"Failed to drop test table: {e}") + finally: + cursor.close() + + finally: + # Close connection + if self.connection: + self.connection.close() + + # ==================== BASIC AUTOCOMMIT TESTS ==================== + + def test_default_autocommit_is_true(self): + """Test that new connection defaults to autocommit=true.""" + assert ( + self.connection.autocommit is True + ), "New connection should have autocommit=true by default" + + def test_set_autocommit_to_false(self): + """Test successfully setting autocommit to false.""" + self.connection.autocommit = False + assert ( + self.connection.autocommit is False + ), "autocommit should be false after setting to false" + + def test_set_autocommit_to_true(self): + """Test successfully setting autocommit back to true.""" + # First disable + self.connection.autocommit = False + assert self.connection.autocommit is False + + # Then enable + self.connection.autocommit = True + assert ( + self.connection.autocommit is True + ), "autocommit should be true after setting to true" + + # ==================== COMMIT TESTS ==================== + + def test_commit_single_insert(self): + """Test successfully committing a transaction with single INSERT.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Start transaction + self.connection.autocommit = False + + # Insert data + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'test_value')" + ) + cursor.close() + + # Commit + self.connection.commit() + + # Verify data is persisted using a new connection + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT value FROM {fq_table_name} WHERE id = 1") + result = verify_cursor.fetchone() + verify_cursor.close() + + assert result is not None, "Should find inserted row after commit" + assert result[0] == "test_value", "Value should match inserted value" + finally: + verify_conn.close() + + def test_commit_multiple_inserts(self): + """Test successfully committing a transaction with multiple INSERTs.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + # Insert multiple rows + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'value1')") + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'value2')") + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (3, 'value3')") + cursor.close() + + self.connection.commit() + + # Verify all rows persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + verify_cursor.close() + + assert result[0] == 3, "Should have 3 rows after commit" + finally: + verify_conn.close() + + # ==================== ROLLBACK TESTS ==================== + + def test_rollback_single_insert(self): + """Test successfully rolling back a transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + # Insert data + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (100, 'rollback_test')" + ) + cursor.close() + + # Rollback + self.connection.rollback() + + # Verify data is NOT persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 100" + ) + result = verify_cursor.fetchone() + verify_cursor.close() + + assert result[0] == 0, "Rolled back data should not be persisted" + finally: + verify_conn.close() + + # ==================== SEQUENTIAL TRANSACTION TESTS ==================== + + def test_multiple_sequential_transactions(self): + """Test executing multiple sequential transactions (commit, commit, rollback).""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + # First transaction - commit + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'txn1')") + cursor.close() + self.connection.commit() + + # Second transaction - commit + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'txn2')") + cursor.close() + self.connection.commit() + + # Third transaction - rollback + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (3, 'txn3')") + cursor.close() + self.connection.rollback() + + # Verify only first two transactions persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name} WHERE id IN (1, 2)" + ) + result = verify_cursor.fetchone() + assert result[0] == 2, "Should have 2 committed rows" + + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 3") + result = verify_cursor.fetchone() + assert result[0] == 0, "Rolled back row should not exist" + verify_cursor.close() + finally: + verify_conn.close() + + def test_auto_start_transaction_after_commit(self): + """Test that new transaction automatically starts after commit.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + # First transaction - commit + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'first')") + cursor.close() + self.connection.commit() + + # New transaction should start automatically - insert and rollback + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'second')") + cursor.close() + self.connection.rollback() + + # Verify: first committed, second rolled back + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 1") + result = verify_cursor.fetchone() + assert result[0] == 1, "First insert should be committed" + + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 2") + result = verify_cursor.fetchone() + assert result[0] == 0, "Second insert should be rolled back" + verify_cursor.close() + finally: + verify_conn.close() + + def test_auto_start_transaction_after_rollback(self): + """Test that new transaction automatically starts after rollback.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + # First transaction - rollback + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'first')") + cursor.close() + self.connection.rollback() + + # New transaction should start automatically - insert and commit + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'second')") + cursor.close() + self.connection.commit() + + # Verify: first rolled back, second committed + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 1") + result = verify_cursor.fetchone() + assert result[0] == 0, "First insert should be rolled back" + + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 2") + result = verify_cursor.fetchone() + assert result[0] == 1, "Second insert should be committed" + verify_cursor.close() + finally: + verify_conn.close() + + # ==================== UPDATE/DELETE OPERATION TESTS ==================== + + def test_update_in_transaction(self): + """Test UPDATE operation in transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + # First insert a row with autocommit + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'original')" + ) + cursor.close() + + # Start transaction and update + self.connection.autocommit = False + cursor = self.connection.cursor() + cursor.execute(f"UPDATE {fq_table_name} SET value = 'updated' WHERE id = 1") + cursor.close() + self.connection.commit() + + # Verify update persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT value FROM {fq_table_name} WHERE id = 1") + result = verify_cursor.fetchone() + assert result[0] == "updated", "Value should be updated after commit" + verify_cursor.close() + finally: + verify_conn.close() + + # ==================== MULTI-TABLE TRANSACTION TESTS ==================== + + def test_multi_table_transaction_commit(self): + """Test atomic commit across multiple tables.""" + fq_table1_name = self._get_fully_qualified_table_name() + table2_name = self.TEST_TABLE_NAME + "_2" + fq_table2_name = f"{self.catalog}.{self.schema}.{table2_name}" + + # Create second table + cursor = self.connection.cursor() + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2_name}") + cursor.execute( + f""" + CREATE TABLE IF NOT EXISTS {fq_table2_name} + (id INT, category STRING) + USING DELTA + TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') + """ + ) + cursor.close() + + try: + # Start transaction and insert into both tables + self.connection.autocommit = False + + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table1_name} (id, value) VALUES (10, 'table1_data')" + ) + cursor.execute( + f"INSERT INTO {fq_table2_name} (id, category) VALUES (10, 'table2_data')" + ) + cursor.close() + + # Commit both atomically + self.connection.commit() + + # Verify both inserts persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table1_name} WHERE id = 10" + ) + result = verify_cursor.fetchone() + assert result[0] == 1, "Table1 insert should be committed" + + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table2_name} WHERE id = 10" + ) + result = verify_cursor.fetchone() + assert result[0] == 1, "Table2 insert should be committed" + + verify_cursor.close() + finally: + verify_conn.close() + + finally: + # Cleanup second table + self.connection.autocommit = True + cursor = self.connection.cursor() + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2_name}") + cursor.close() + + def test_multi_table_transaction_rollback(self): + """Test atomic rollback across multiple tables.""" + fq_table1_name = self._get_fully_qualified_table_name() + table2_name = self.TEST_TABLE_NAME + "_2" + fq_table2_name = f"{self.catalog}.{self.schema}.{table2_name}" + + # Create second table + cursor = self.connection.cursor() + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2_name}") + cursor.execute( + f""" + CREATE TABLE IF NOT EXISTS {fq_table2_name} + (id INT, category STRING) + USING DELTA + TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') + """ + ) + cursor.close() + + try: + # Start transaction and insert into both tables + self.connection.autocommit = False + + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table1_name} (id, value) VALUES (20, 'rollback1')" + ) + cursor.execute( + f"INSERT INTO {fq_table2_name} (id, category) VALUES (20, 'rollback2')" + ) + cursor.close() + + # Rollback both atomically + self.connection.rollback() + + # Verify both inserts were rolled back + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table1_name} WHERE id = 20" + ) + result = verify_cursor.fetchone() + assert result[0] == 0, "Table1 insert should be rolled back" + + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table2_name} WHERE id = 20" + ) + result = verify_cursor.fetchone() + assert result[0] == 0, "Table2 insert should be rolled back" + + verify_cursor.close() + finally: + verify_conn.close() + + finally: + # Cleanup second table + self.connection.autocommit = True + cursor = self.connection.cursor() + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2_name}") + cursor.close() + + # ==================== ERROR HANDLING TESTS ==================== + + def test_set_autocommit_during_active_transaction(self): + """Test that setting autocommit during an active transaction throws error.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Start transaction + self.connection.autocommit = False + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (99, 'test')") + cursor.close() + + # Try to set autocommit=True during active transaction + with pytest.raises(TransactionError) as exc_info: + self.connection.autocommit = True + + # Verify error message mentions autocommit or active transaction + error_msg = str(exc_info.value).lower() + assert ( + "autocommit" in error_msg or "active transaction" in error_msg + ), "Error should mention autocommit or active transaction" + + # Cleanup - rollback the transaction + self.connection.rollback() + + def test_commit_without_active_transaction_throws_error(self): + """Test that commit() throws error when autocommit=true (no active transaction).""" + # Ensure autocommit is true (default) + assert self.connection.autocommit is True + + # Attempt commit without active transaction should throw + with pytest.raises(TransactionError) as exc_info: + self.connection.commit() + + # Verify error message indicates no active transaction + error_message = str(exc_info.value) + assert ( + "MULTI_STATEMENT_TRANSACTION_NO_ACTIVE_TRANSACTION" in error_message + or "no active transaction" in error_message.lower() + ), "Error should indicate no active transaction" + + def test_rollback_without_active_transaction_is_safe(self): + """Test that rollback() without active transaction is a safe no-op.""" + # With autocommit=true (no active transaction) + assert self.connection.autocommit is True + + # ROLLBACK should be safe (no exception) + self.connection.rollback() + + # Verify connection is still usable + assert self.connection.autocommit is True + assert self.connection.open is True + + # ==================== TRANSACTION ISOLATION TESTS ==================== + + def test_get_transaction_isolation_returns_repeatable_read(self): + """Test that get_transaction_isolation() returns REPEATABLE_READ.""" + isolation_level = self.connection.get_transaction_isolation() + assert ( + isolation_level == "REPEATABLE_READ" + ), "Databricks MST should use REPEATABLE_READ (Snapshot Isolation)" + + def test_set_transaction_isolation_accepts_repeatable_read(self): + """Test that set_transaction_isolation() accepts REPEATABLE_READ.""" + # Should not raise - these are all valid formats + self.connection.set_transaction_isolation("REPEATABLE_READ") + self.connection.set_transaction_isolation("REPEATABLE READ") + self.connection.set_transaction_isolation("repeatable_read") + self.connection.set_transaction_isolation("repeatable read") + + def test_set_transaction_isolation_rejects_unsupported_level(self): + """Test that set_transaction_isolation() rejects unsupported levels.""" + with pytest.raises(NotSupportedError) as exc_info: + self.connection.set_transaction_isolation("READ_COMMITTED") + + error_message = str(exc_info.value) + assert "not supported" in error_message.lower() + assert "READ_COMMITTED" in error_message + + # ==================== METADATA OPERATIONS IN TRANSACTION (MST Gaps) ==================== + + def test_cursor_columns_inside_active_transaction(self): + """cursor.columns() inside active transaction should return results.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert a row to start the transaction + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'columns_test')" + ) + + # Call columns() inside the active transaction + cursor.columns( + catalog_name=self.catalog, + schema_name=self.schema, + table_name=self.TEST_TABLE_NAME, + ) + columns = cursor.fetchall() + + assert len(columns) > 0, "cursor.columns() should return column metadata inside a transaction" + finally: + self.connection.rollback() + cursor.close() + + @pytest.mark.xfail(strict=False, reason="Thrift metadata RPCs may return non-transactional results during MST (known issue LC-13427)") + def test_cursor_tables_inside_active_transaction(self): + """cursor.tables() inside active transaction should return results.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert a row to start the transaction + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'tables_test')" + ) + + # Call tables() inside the active transaction + cursor.tables( + catalog_name=self.catalog, + schema_name=self.schema, + table_name=self.TEST_TABLE_NAME, + ) + tables = cursor.fetchall() + + assert len(tables) > 0, "cursor.tables() should return table metadata inside a transaction" + finally: + self.connection.rollback() + cursor.close() + + def test_cursor_schemas_inside_active_transaction(self): + """cursor.schemas() inside active transaction should return results.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert a row to start the transaction + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'schemas_test')" + ) + + # Call schemas() inside the active transaction + cursor.schemas( + catalog_name=self.catalog, + schema_name=self.schema, + ) + schemas = cursor.fetchall() + + assert len(schemas) > 0, "cursor.schemas() should return schema metadata inside a transaction" + finally: + self.connection.rollback() + cursor.close() + + def test_cursor_catalogs_inside_active_transaction(self): + """cursor.catalogs() inside active transaction should return results.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert a row to start the transaction + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'catalogs_test')" + ) + + # Call catalogs() inside the active transaction + cursor.catalogs() + catalogs = cursor.fetchall() + + assert len(catalogs) > 0, "cursor.catalogs() should return catalog metadata inside a transaction" + finally: + self.connection.rollback() + cursor.close() + + def test_cursor_description_before_execute_in_transaction(self): + """cursor.description before execute in transaction should be None.""" + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Before any execute, description should be None + assert cursor.description is None, ( + "cursor.description should be None before any execute in a transaction" + ) + finally: + self.connection.rollback() + cursor.close() + + def test_cursor_description_after_execute_in_transaction(self): + """cursor.description after execute in transaction should have metadata.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert a row first so the table has data and description is populated + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'desc_test')" + ) + + cursor.execute(f"SELECT * FROM {fq_table_name} LIMIT 1") + + assert cursor.description is not None, ( + "cursor.description should not be None after execute in a transaction" + ) + assert len(cursor.description) >= 2, ( + "cursor.description should have at least 2 columns (id, value)" + ) + finally: + self.connection.rollback() + cursor.close() + + # ==================== MSTCheckRule-Blocked SQL in Transaction ==================== + + def test_show_columns_blocked_in_transaction(self): + """SHOW COLUMNS should be blocked inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert a row to start the transaction + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'blocked_test')" + ) + + # SHOW COLUMNS should be blocked + with pytest.raises(Exception): + cursor.execute(f"SHOW COLUMNS IN {fq_table_name}") + + # Verify transaction is aborted by trying another DML + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_blocked')" + ) + finally: + try: + self.connection.rollback() + except Exception: + pass + cursor.close() + + def test_show_tables_blocked_in_transaction(self): + """SHOW TABLES should be blocked inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'blocked_test')" + ) + + with pytest.raises(Exception): + cursor.execute(f"SHOW TABLES IN {self.catalog}.{self.schema}") + + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_blocked')" + ) + finally: + try: + self.connection.rollback() + except Exception: + pass + cursor.close() + + def test_show_schemas_blocked_in_transaction(self): + """SHOW SCHEMAS should be blocked inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'blocked_test')" + ) + + with pytest.raises(Exception): + cursor.execute(f"SHOW SCHEMAS IN {self.catalog}") + + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_blocked')" + ) + finally: + try: + self.connection.rollback() + except Exception: + pass + cursor.close() + + def test_show_catalogs_blocked_in_transaction(self): + """SHOW CATALOGS should be blocked inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'blocked_test')" + ) + + with pytest.raises(Exception): + cursor.execute("SHOW CATALOGS") + + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_blocked')" + ) + finally: + try: + self.connection.rollback() + except Exception: + pass + cursor.close() + + def test_show_functions_blocked_in_transaction(self): + """SHOW FUNCTIONS should be blocked inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'blocked_test')" + ) + + with pytest.raises(Exception): + cursor.execute("SHOW FUNCTIONS") + + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_blocked')" + ) + finally: + try: + self.connection.rollback() + except Exception: + pass + cursor.close() + + def test_describe_query_blocked_in_transaction(self): + """DESCRIBE QUERY should be blocked inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'blocked_test')" + ) + + with pytest.raises(Exception): + cursor.execute(f"DESCRIBE QUERY SELECT * FROM {fq_table_name}") + + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_blocked')" + ) + finally: + try: + self.connection.rollback() + except Exception: + pass + cursor.close() + + def test_describe_table_extended_blocked_in_transaction(self): + """DESCRIBE TABLE EXTENDED should be blocked inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'blocked_test')" + ) + + with pytest.raises(Exception): + cursor.execute(f"DESCRIBE TABLE EXTENDED {fq_table_name}") + + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_blocked')" + ) + finally: + try: + self.connection.rollback() + except Exception: + pass + cursor.close() + + def test_information_schema_blocked_in_transaction(self): + """SELECT from information_schema should be blocked inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'blocked_test')" + ) + + with pytest.raises(Exception): + cursor.execute( + f"SELECT * FROM {self.catalog}.information_schema.tables LIMIT 1" + ) + + with pytest.raises(Exception): + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_blocked')" + ) + finally: + try: + self.connection.rollback() + except Exception: + pass + cursor.close() + + # ==================== ALLOWED OPERATIONS IN TRANSACTION ==================== + + @pytest.mark.xfail( + reason="SET CATALOG routes through SetCatalogCommand in Thrift, " + "which is blocked in MST even though the doc says it should be allowed" + ) + def test_set_catalog_allowed_in_transaction(self): + """SET CATALOG should work inside active transaction (currently blocked via Thrift).""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'before_set_catalog')" + ) + + cursor.execute(f"SET CATALOG {self.catalog}") + + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_set_catalog')" + ) + + self.connection.commit() + + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + assert result[0] == 2, "Both rows should be committed after SET CATALOG" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + @pytest.mark.xfail( + reason="USE SCHEMA routes through a Thrift command that is blocked in MST" + ) + def test_use_schema_allowed_in_transaction(self): + """USE SCHEMA should work inside active transaction (currently blocked via Thrift).""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'before_use_schema')" + ) + + cursor.execute(f"USE SCHEMA {self.catalog}.{self.schema}") + + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'after_use_schema')" + ) + + self.connection.commit() + + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + assert result[0] == 2, "Both rows should be committed after USE SCHEMA" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + @pytest.mark.xfail( + reason="DESCRIBE TABLE routes through DescribeRelation in Thrift, " + "which is blocked in MST" + ) + def test_describe_table_basic_allowed_in_transaction(self): + """DESCRIBE TABLE (basic) should be allowed inside active transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'describe_test')" + ) + + cursor.execute(f"DESCRIBE TABLE {fq_table_name}") + result = cursor.fetchall() + assert len(result) > 0, "DESCRIBE TABLE should return column info" + + self.connection.commit() + finally: + cursor.close() + + # ==================== DML METHOD VARIANTS IN TRANSACTION ==================== + + def test_executemany_insert_in_transaction(self): + """executemany() with INSERT should work within a transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.executemany( + f"INSERT INTO {fq_table_name} (id, value) VALUES (:id, :val)", + [{"id": 1, "val": "a"}, {"id": 2, "val": "b"}, {"id": 3, "val": "c"}], + ) + + self.connection.commit() + + # Verify 3 rows persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + assert result[0] == 3, "Should have 3 rows after executemany + commit" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + def test_executemany_rollback_in_transaction(self): + """executemany() followed by rollback should discard all rows.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.executemany( + f"INSERT INTO {fq_table_name} (id, value) VALUES (:id, :val)", + [{"id": 1, "val": "a"}, {"id": 2, "val": "b"}, {"id": 3, "val": "c"}], + ) + + self.connection.rollback() + + # Verify 0 rows + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + assert result[0] == 0, "Should have 0 rows after executemany + rollback" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + def test_parameterized_insert_in_transaction(self): + """Parameterized INSERT should work within a transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (:id, :value)", + {"id": 1, "value": "param_test"}, + ) + + self.connection.commit() + + # Verify row persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT value FROM {fq_table_name} WHERE id = 1") + result = verify_cursor.fetchone() + assert result is not None, "Parameterized insert should persist after commit" + assert result[0] == "param_test", "Value should match parameterized value" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + def test_parameterized_update_in_transaction(self): + """Parameterized UPDATE should work within a transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Insert row with autocommit + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'original')" + ) + cursor.close() + + # Start transaction and update with parameters + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"UPDATE {fq_table_name} SET value = :val WHERE id = :id", + {"val": "updated_param", "id": 1}, + ) + + self.connection.commit() + + # Verify update persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT value FROM {fq_table_name} WHERE id = 1") + result = verify_cursor.fetchone() + assert result[0] == "updated_param", "Value should be updated via parameterized UPDATE" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + def test_parameterized_select_in_transaction(self): + """Parameterized SELECT should work within a transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Insert rows with autocommit + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'select_test')" + ) + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'other_row')" + ) + cursor.close() + + # Start transaction and select with parameters + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f"SELECT * FROM {fq_table_name} WHERE id = :id", + {"id": 1}, + ) + result = cursor.fetchone() + + assert result is not None, "Parameterized SELECT should return a result" + assert result[0] == 1, "Should find row with id=1" + assert result[1] == "select_test", "Should find correct value" + finally: + self.connection.rollback() + cursor.close() + + def test_delete_in_transaction(self): + """DELETE operation should work within a transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Insert row with autocommit + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'to_delete')" + ) + cursor.close() + + # Start transaction and delete + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute(f"DELETE FROM {fq_table_name} WHERE id = 1") + + self.connection.commit() + + # Verify row deleted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + assert result[0] == 0, "Row should be deleted after commit" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + def test_mixed_dml_in_transaction(self): + """INSERT + UPDATE + DELETE in single transaction should work.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Insert initial rows with autocommit + cursor = self.connection.cursor() + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'row1')") + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'row2')") + cursor.execute(f"INSERT INTO {fq_table_name} (id, value) VALUES (3, 'row3')") + cursor.close() + + # Start transaction with mixed DML + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # INSERT a new row + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (4, 'row4')" + ) + + # UPDATE an existing row + cursor.execute( + f"UPDATE {fq_table_name} SET value = 'row1_updated' WHERE id = 1" + ) + + # DELETE a row + cursor.execute(f"DELETE FROM {fq_table_name} WHERE id = 3") + + self.connection.commit() + + # Verify final state + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + + # Should have 3 rows: id 1 (updated), 2, 4 + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name}" + ) + result = verify_cursor.fetchone() + assert result[0] == 3, "Should have 3 rows after mixed DML" + + # Verify UPDATE + verify_cursor.execute( + f"SELECT value FROM {fq_table_name} WHERE id = 1" + ) + result = verify_cursor.fetchone() + assert result[0] == "row1_updated", "Row 1 should be updated" + + # Verify DELETE + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 3" + ) + result = verify_cursor.fetchone() + assert result[0] == 0, "Row 3 should be deleted" + + # Verify INSERT + verify_cursor.execute( + f"SELECT value FROM {fq_table_name} WHERE id = 4" + ) + result = verify_cursor.fetchone() + assert result is not None, "Row 4 should exist" + assert result[0] == "row4", "Row 4 value should match" + + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + # ==================== CONCURRENT TRANSACTIONS ==================== + + def test_concurrent_connections_write_conflict(self): + """Two connections writing to same table should trigger write conflict.""" + fq_table_name = self._get_fully_qualified_table_name() + + conn1 = sql.connect(**self.connection_params) + conn2 = sql.connect(**self.connection_params) + try: + conn1.autocommit = False + conn2.autocommit = False + + cursor1 = conn1.cursor() + cursor2 = conn2.cursor() + + # Both connections insert into the same table + cursor1.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'conn1_data')" + ) + cursor2.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'conn2_data')" + ) + + # First commit should succeed + conn1.commit() + + # Second commit may succeed (append-only) or fail (write conflict) + # Under Snapshot Isolation, concurrent append-only INSERTs to different + # parts of the table can sometimes succeed. + try: + conn2.commit() + # If both commits succeeded, that's valid for append-only workloads + except Exception: + # Write conflict is also expected behavior + pass + + cursor1.close() + cursor2.close() + finally: + try: + conn1.close() + except Exception: + pass + try: + conn2.close() + except Exception: + pass + + # Verify at least conn1's data persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + assert result[0] >= 1, "At least conn1's data should be persisted" + verify_cursor.close() + finally: + verify_conn.close() + + def test_concurrent_connections_write_skew_across_tables(self): + """Two connections writing to different tables should both succeed (Snapshot Isolation).""" + fq_table1_name = self._get_fully_qualified_table_name() + table2_name = self.TEST_TABLE_NAME + "_concurrent_2" + fq_table2_name = f"{self.catalog}.{self.schema}.{table2_name}" + + # Create second table + cursor = self.connection.cursor() + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2_name}") + cursor.execute( + f""" + CREATE TABLE IF NOT EXISTS {fq_table2_name} + (id INT, value STRING) + USING DELTA + TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') + """ + ) + cursor.close() + + conn1 = sql.connect(**self.connection_params) + conn2 = sql.connect(**self.connection_params) + try: + conn1.autocommit = False + conn2.autocommit = False + + cursor1 = conn1.cursor() + cursor2 = conn2.cursor() + + # Write to different tables + cursor1.execute( + f"INSERT INTO {fq_table1_name} (id, value) VALUES (1, 'table1_data')" + ) + cursor2.execute( + f"INSERT INTO {fq_table2_name} (id, value) VALUES (1, 'table2_data')" + ) + + # Both commits should succeed + conn1.commit() + conn2.commit() + + cursor1.close() + cursor2.close() + + # Verify data in both tables + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table1_name} WHERE id = 1" + ) + result = verify_cursor.fetchone() + assert result[0] == 1, "Table1 should have data from conn1" + + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table2_name} WHERE id = 1" + ) + result = verify_cursor.fetchone() + assert result[0] == 1, "Table2 should have data from conn2" + + verify_cursor.close() + finally: + verify_conn.close() + finally: + try: + conn1.close() + except Exception: + pass + try: + conn2.close() + except Exception: + pass + # Cleanup second table + try: + self.connection.autocommit = True + except Exception: + pass + cleanup_cursor = self.connection.cursor() + cleanup_cursor.execute(f"DROP TABLE IF EXISTS {fq_table2_name}") + cleanup_cursor.close() + + def test_repeatable_reads_in_transaction(self): + """Reads within transaction should see consistent snapshot.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Insert initial row with autocommit + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'initial')" + ) + cursor.close() + + # Start transaction on conn1 + conn1 = sql.connect(**self.connection_params) + try: + conn1.autocommit = False + + cursor1 = conn1.cursor() + + # First read - count rows + cursor1.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + first_count = cursor1.fetchone()[0] + + # Another connection inserts a new row (autocommit) + conn2 = sql.connect(**self.connection_params) + try: + cursor2 = conn2.cursor() + cursor2.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'new_row')" + ) + cursor2.close() + finally: + conn2.close() + + # Second read in same transaction - should see same snapshot + cursor1.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + second_count = cursor1.fetchone()[0] + + assert first_count == second_count, ( + "Reads within a transaction should see consistent snapshot (repeatable reads)" + ) + + cursor1.close() + conn1.rollback() + finally: + conn1.close() + + # ==================== MULTIPLE CURSORS IN TRANSACTION ==================== + + def test_multiple_cursors_dml_in_transaction(self): + """Multiple cursors DML in same transaction should all commit.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor1 = self.connection.cursor() + cursor2 = self.connection.cursor() + try: + cursor1.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'cursor1_data')" + ) + cursor2.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'cursor2_data')" + ) + + self.connection.commit() + + # Verify both rows persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + assert result[0] == 2, "Both cursor inserts should be committed" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor1.close() + cursor2.close() + + def test_cursor_metadata_while_other_cursor_active(self): + """Cursor metadata call while another cursor has active result set.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor1 = self.connection.cursor() + cursor2 = self.connection.cursor() + try: + # cursor1 executes a SELECT (active result set) + cursor1.execute(f"SELECT * FROM {fq_table_name}") + + # cursor2 calls tables() while cursor1 has active result set + cursor2.tables( + catalog_name=self.catalog, + schema_name=self.schema, + table_name=self.TEST_TABLE_NAME, + ) + tables = cursor2.fetchall() + + # Should not crash - verify we got results + assert tables is not None, "cursor.tables() should not crash while another cursor is active" + finally: + self.connection.rollback() + cursor1.close() + cursor2.close() + + def test_cursor_close_does_not_end_transaction(self): + """Closing a cursor should not end the transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor1 = self.connection.cursor() + try: + cursor1.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'cursor1_data')" + ) + cursor1.close() + + # Open a new cursor and insert more data - transaction should still be active + cursor2 = self.connection.cursor() + cursor2.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'cursor2_data')" + ) + cursor2.close() + + self.connection.commit() + + # Verify both rows persisted + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SELECT COUNT(*) FROM {fq_table_name}") + result = verify_cursor.fetchone() + assert result[0] == 2, "Both rows should be committed despite cursor close" + verify_cursor.close() + finally: + verify_conn.close() + except Exception: + # If cursor1 is already closed, just ensure cleanup + raise + + # ==================== CONNECTION LIFECYCLE IN TRANSACTION ==================== + + def test_close_connection_with_pending_transaction(self): + """Closing connection with pending transaction should implicitly rollback.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Use a separate connection for this test + test_conn = sql.connect(**self.connection_params) + try: + test_conn.autocommit = False + + cursor = test_conn.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'pending')" + ) + cursor.close() + + # Close connection with pending transaction + test_conn.close() + except Exception: + try: + test_conn.close() + except Exception: + pass + + # Verify row was NOT persisted (implicit rollback) + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 1" + ) + result = verify_cursor.fetchone() + assert result[0] == 0, "Pending transaction should be implicitly rolled back on connection close" + verify_cursor.close() + finally: + verify_conn.close() + + def test_close_connection_implicit_rollback(self): + """Closing connection with pending transaction should not throw.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Use a separate connection for this test + test_conn = sql.connect(**self.connection_params) + test_conn.autocommit = False + + cursor = test_conn.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'no_throw')" + ) + cursor.close() + + # Closing connection with pending transaction should not raise + try: + test_conn.close() + except Exception as e: + pytest.fail( + f"Closing connection with pending transaction should not throw, but got: {e}" + ) + + # ==================== DDL IN TRANSACTION ==================== + + def test_ddl_create_table_in_transaction(self): + """CREATE TABLE inside transaction should document behavior.""" + ddl_table_name = self.TEST_TABLE_NAME + "_ddl_create" + fq_ddl_table_name = f"{self.catalog}.{self.schema}.{ddl_table_name}" + + # Ensure the DDL table doesn't exist + cursor = self.connection.cursor() + cursor.execute(f"DROP TABLE IF EXISTS {fq_ddl_table_name}") + cursor.close() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + try: + cursor.execute( + f""" + CREATE TABLE {fq_ddl_table_name} + (id INT, value STRING) + USING DELTA + TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') + """ + ) + # If CREATE TABLE succeeded, try rollback and check if table exists + self.connection.rollback() + + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SHOW TABLES IN {self.catalog}.{self.schema} LIKE '{ddl_table_name}'") + tables = verify_cursor.fetchall() + verify_cursor.close() + logger.info( + f"CREATE TABLE in transaction: table exists after rollback = {len(tables) > 0}" + ) + finally: + verify_conn.close() + except Exception as e: + logger.info( + f"CREATE TABLE inside transaction raised exception (documenting behavior): {e}" + ) + try: + self.connection.rollback() + except Exception: + pass + finally: + cursor.close() + # Cleanup + try: + self.connection.autocommit = True + except Exception: + pass + cleanup_cursor = self.connection.cursor() + cleanup_cursor.execute(f"DROP TABLE IF EXISTS {fq_ddl_table_name}") + cleanup_cursor.close() + + def test_ddl_drop_table_in_transaction(self): + """DROP TABLE inside transaction should document behavior.""" + ddl_table_name = self.TEST_TABLE_NAME + "_ddl_drop" + fq_ddl_table_name = f"{self.catalog}.{self.schema}.{ddl_table_name}" + + # Create a temp table with autocommit + cursor = self.connection.cursor() + cursor.execute(f"DROP TABLE IF EXISTS {fq_ddl_table_name}") + cursor.execute( + f""" + CREATE TABLE {fq_ddl_table_name} + (id INT, value STRING) + USING DELTA + TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') + """ + ) + cursor.close() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + try: + cursor.execute(f"DROP TABLE {fq_ddl_table_name}") + # If DROP TABLE succeeded, try rollback and check if table still exists + self.connection.rollback() + + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"SHOW TABLES IN {self.catalog}.{self.schema} LIKE '{ddl_table_name}'") + tables = verify_cursor.fetchall() + verify_cursor.close() + logger.info( + f"DROP TABLE in transaction: table still exists after rollback = {len(tables) > 0}" + ) + finally: + verify_conn.close() + except Exception as e: + logger.info( + f"DROP TABLE inside transaction raised exception (documenting behavior): {e}" + ) + try: + self.connection.rollback() + except Exception: + pass + finally: + cursor.close() + # Cleanup + try: + self.connection.autocommit = True + except Exception: + pass + cleanup_cursor = self.connection.cursor() + cleanup_cursor.execute(f"DROP TABLE IF EXISTS {fq_ddl_table_name}") + cleanup_cursor.close() + + def test_ddl_alter_table_in_transaction(self): + """ALTER TABLE inside transaction should document behavior.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert a row to start the transaction + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'alter_test')" + ) + + try: + cursor.execute( + f"ALTER TABLE {fq_table_name} ADD COLUMNS (extra STRING)" + ) + # If ALTER TABLE succeeded, rollback + self.connection.rollback() + + # Check table schema + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute(f"DESCRIBE {fq_table_name}") + columns = verify_cursor.fetchall() + column_names = [row[0] for row in columns] + verify_cursor.close() + logger.info( + f"ALTER TABLE in transaction: columns after rollback = {column_names}" + ) + finally: + verify_conn.close() + except Exception as e: + logger.info( + f"ALTER TABLE inside transaction raised exception (documenting behavior): {e}" + ) + try: + self.connection.rollback() + except Exception: + pass + finally: + cursor.close() + + # ==================== EDGE CASES ==================== + + def test_empty_transaction_commit(self): + """Empty transaction commit should succeed or throw appropriate error.""" + self.connection.autocommit = False + + # Immediately commit with no statements + try: + self.connection.commit() + except Exception as e: + logger.info( + f"Empty transaction commit raised: {e} (documenting behavior)" + ) + + def test_empty_transaction_rollback(self): + """Empty transaction rollback should succeed.""" + self.connection.autocommit = False + + # Immediately rollback with no statements - should succeed + self.connection.rollback() + + def test_read_only_queries_in_transaction(self): + """SELECT-only transaction should work correctly.""" + fq_table_name = self._get_fully_qualified_table_name() + + # Insert data with autocommit + cursor = self.connection.cursor() + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'read_only_test')" + ) + cursor.close() + + # Start transaction with SELECT only + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute(f"SELECT * FROM {fq_table_name}") + result = cursor.fetchall() + assert len(result) >= 1, "Should read at least 1 row in read-only transaction" + + self.connection.commit() + finally: + cursor.close() + + def test_multi_table_transaction_atomicity(self): + """Partial failure in multi-table transaction should rollback all.""" + fq_table1_name = self._get_fully_qualified_table_name() + nonexistent_table = f"{self.catalog}.{self.schema}.nonexistent_table_xyz_12345" + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert into existing table + cursor.execute( + f"INSERT INTO {fq_table1_name} (id, value) VALUES (1, 'atomicity_test')" + ) + + # Try to insert into nonexistent table - should fail + try: + cursor.execute( + f"INSERT INTO {nonexistent_table} (id, value) VALUES (1, 'fail')" + ) + except Exception: + pass + + # Rollback the entire transaction + try: + self.connection.rollback() + except Exception: + pass + + # Verify table1 data was also rolled back + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table1_name} WHERE id = 1" + ) + result = verify_cursor.fetchone() + assert result[0] == 0, "Table1 data should be rolled back due to partial failure" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + def test_rollback_after_query_failure(self): + """Rollback after query failure should clean up transaction state.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # Insert a valid row + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'valid_row')" + ) + + # Execute invalid SQL + try: + cursor.execute("THIS IS INVALID SQL") + except Exception: + pass + + # Rollback + try: + self.connection.rollback() + except Exception: + pass + finally: + cursor.close() + + # Reset autocommit state explicitly to clean up after failed transaction + self.connection.autocommit = True + self.connection.autocommit = False + + # Start a new transaction and verify clean state with a fresh cursor + cursor = self.connection.cursor() + try: + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'new_row')" + ) + + self.connection.commit() + + # Verify: only the new row exists, not the old one + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 1" + ) + result = verify_cursor.fetchone() + assert result[0] == 0, "Old row should not exist after rollback" + + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 2" + ) + result = verify_cursor.fetchone() + assert result[0] == 1, "New row should exist after commit" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + def test_auto_start_transaction_after_commit_with_dml(self): + """After commit, DML without explicit BEGIN should start new transaction.""" + fq_table_name = self._get_fully_qualified_table_name() + + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + # First transaction: insert and commit + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (1, 'committed')" + ) + self.connection.commit() + + # Second transaction: insert and rollback (auto-started) + cursor.execute( + f"INSERT INTO {fq_table_name} (id, value) VALUES (2, 'rolled_back')" + ) + self.connection.rollback() + + # Verify only row 1 exists + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 1" + ) + result = verify_cursor.fetchone() + assert result[0] == 1, "Committed row should exist" + + verify_cursor.execute( + f"SELECT COUNT(*) FROM {fq_table_name} WHERE id = 2" + ) + result = verify_cursor.fetchone() + assert result[0] == 0, "Rolled back row should not exist" + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + + def test_cross_table_merge_in_transaction(self): + """MERGE across tables inside transaction should work.""" + fq_table1_name = self._get_fully_qualified_table_name() + table2_name = self.TEST_TABLE_NAME + "_merge_source" + fq_table2_name = f"{self.catalog}.{self.schema}.{table2_name}" + + # Create source table and insert data + cursor = self.connection.cursor() + cursor.execute(f"DROP TABLE IF EXISTS {fq_table2_name}") + cursor.execute( + f""" + CREATE TABLE IF NOT EXISTS {fq_table2_name} + (id INT, value STRING) + USING DELTA + TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') + """ + ) + cursor.execute( + f"INSERT INTO {fq_table2_name} (id, value) VALUES (1, 'source_val1')" + ) + cursor.execute( + f"INSERT INTO {fq_table2_name} (id, value) VALUES (2, 'source_val2')" + ) + # Insert existing row into target for MERGE WHEN MATCHED + cursor.execute( + f"INSERT INTO {fq_table1_name} (id, value) VALUES (1, 'old_val1')" + ) + cursor.close() + + try: + self.connection.autocommit = False + + cursor = self.connection.cursor() + try: + cursor.execute( + f""" + MERGE INTO {fq_table1_name} AS target + USING {fq_table2_name} AS source + ON target.id = source.id + WHEN MATCHED THEN UPDATE SET target.value = source.value + WHEN NOT MATCHED THEN INSERT (id, value) VALUES (source.id, source.value) + """ + ) + + self.connection.commit() + + # Verify merge results + verify_conn = sql.connect(**self.connection_params) + try: + verify_cursor = verify_conn.cursor() + + verify_cursor.execute( + f"SELECT value FROM {fq_table1_name} WHERE id = 1" + ) + result = verify_cursor.fetchone() + assert result[0] == "source_val1", "Row 1 should be updated by MERGE" + + verify_cursor.execute( + f"SELECT value FROM {fq_table1_name} WHERE id = 2" + ) + result = verify_cursor.fetchone() + assert result is not None, "Row 2 should be inserted by MERGE" + assert result[0] == "source_val2", "Row 2 value should match source" + + verify_cursor.close() + finally: + verify_conn.close() + finally: + cursor.close() + finally: + # Cleanup source table + try: + self.connection.autocommit = True + except Exception: + pass + cleanup_cursor = self.connection.cursor() + cleanup_cursor.execute(f"DROP TABLE IF EXISTS {fq_table2_name}") + cleanup_cursor.close() 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_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 c39aeb524..3f264d8cd 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 @@ -80,111 +89,78 @@ class ClientTestSuite(unittest.TestCase): "access_token": "tok", } - @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 - - connection = databricks.sql.connect(**self.DUMMY_CONNECTION_ARGS) - connection.close() + 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 - # 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 + + # 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.client.ThriftBackend" % PACKAGE_NAME) + @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 +170,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 +185,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 +210,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 +265,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 +279,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 +291,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 +312,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 +335,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 +361,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 +377,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 +385,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 +394,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 +410,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 +428,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 +445,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 +453,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 +465,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 +478,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 +531,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 +548,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 +573,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 +585,630 @@ 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", + } + + 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() + + # ==================== ADDITIONAL TRANSACTION TESTS ==================== + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_commit_on_closed_cursor_does_not_affect_transaction( + self, mock_session_class + ): + """Closing a cursor should not affect the transaction state.""" + conn = self._create_mock_connection(mock_session_class) + + # Create and close a cursor + mock_cursor1 = Mock() + mock_cursor2 = Mock() + + with patch.object(conn, "cursor", side_effect=[mock_cursor1, mock_cursor2]): + # Create cursor, close it + cursor1 = conn.cursor() + cursor1.close() + + # Commit should still work (creates new cursor internally via commit) + # We need to patch cursor again for the commit call + mock_commit_cursor = Mock() + with patch.object(conn, "cursor", return_value=mock_commit_cursor): + conn.commit() + + # Verify COMMIT SQL was executed + mock_commit_cursor.execute.assert_called_once_with("COMMIT") + mock_commit_cursor.close.assert_called_once() + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_executemany_wraps_database_error_in_transaction( + self, mock_session_class + ): + """executemany() should propagate DatabaseError from execute().""" + conn = self._create_mock_connection(mock_session_class) + + server_error = DatabaseError( + "MULTI_STATEMENT_TRANSACTION_ABORTED", + context={"sql_state": "25000"}, + host_url="test-host", + ) + + # Get a real cursor object, then mock its execute method to raise + cursor = conn.cursor() + with patch.object(cursor, "execute", side_effect=server_error): + with self.assertRaises(DatabaseError): + cursor.executemany( + "INSERT INTO test_table VALUES (%s, %s)", + [(1, "a"), (2, "b")], + ) + + conn.close() + + @patch("%s.client.Session" % PACKAGE_NAME) + def test_autocommit_toggle_multiple_times(self, mock_session_class): + """Toggling autocommit multiple times should maintain correct state.""" + conn = self._create_mock_connection(mock_session_class) + + mock_cursor = Mock() + with patch.object(conn, "cursor", return_value=mock_cursor): + # Set to False + conn.autocommit = False + mock_cursor.execute.assert_called_with("SET AUTOCOMMIT = FALSE") + conn.session.set_autocommit.assert_called_with(False) + + mock_cursor.reset_mock() + conn.session.reset_mock() + + # Set to True + conn.autocommit = True + mock_cursor.execute.assert_called_with("SET AUTOCOMMIT = TRUE") + conn.session.set_autocommit.assert_called_with(True) + + mock_cursor.reset_mock() + conn.session.reset_mock() + + # Set to False again + conn.autocommit = False + mock_cursor.execute.assert_called_with("SET AUTOCOMMIT = FALSE") + conn.session.set_autocommit.assert_called_with(False) + + 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 7dec4e680..97bb99ad9 100644 --- a/tests/unit/test_cloud_fetch_queue.py +++ b/tests/unit/test_cloud_fetch_queue.py @@ -4,7 +4,7 @@ pyarrow = None import unittest import pytest -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock, patch, Mock from databricks.sql.thrift_api.TCLIService.ttypes import TSparkArrowResultLink import databricks.sql.utils as utils @@ -13,6 +13,31 @@ @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", @@ -52,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 @@ -71,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 @@ -88,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) @@ -108,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) @@ -129,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 @@ -147,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 @@ -169,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 @@ -190,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 @@ -213,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 @@ -249,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 @@ -268,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 @@ -287,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 ): @@ -297,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 @@ -314,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 71766f2cb..7a0706838 100644 --- a/tests/unit/test_fetches.py +++ b/tests/unit/test_fetches.py @@ -8,7 +8,10 @@ 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") @@ -37,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 @@ -64,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, @@ -72,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 552872221..1d485ea61 100644 --- a/tests/unit/test_fetches_bench.py +++ b/tests/unit/test_fetches_bench.py @@ -10,7 +10,8 @@ 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") @@ -31,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 897a1d111..0d01d8675 100644 --- a/tests/unit/test_retry.py +++ b/tests/unit/test_retry.py @@ -83,3 +83,15 @@ def test_excessive_retry_attempts_error(self, t_mock, retry_policy): retry_policy.sleep(HTTPResponse(status=503)) # Internally urllib3 calls the increment function generating a new instance for every retry retry_policy = retry_policy.increment() + + 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() + + # 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..f71e60943 --- /dev/null +++ b/tests/unit/test_sea_backend.py @@ -0,0 +1,1152 @@ +""" +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 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..3a43c1a75 --- /dev/null +++ b/tests/unit/test_session.py @@ -0,0 +1,225 @@ +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 + +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", + } + + @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", + }, + { + "server_hostname": "foo", + "http_path": None, + "_tls_client_cert_file": "something", + "_use_cert_as_auth": True, + "access_token": None, + }, + ] + + 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" 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 592fd0065..7254b66cb 100644 --- a/tests/unit/test_thrift_backend.py +++ b/tests/unit/test_thrift_backend.py @@ -17,7 +17,9 @@ 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(): @@ -51,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( @@ -73,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() @@ -124,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 = [ @@ -161,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 = [ @@ -172,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() @@ -180,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"} @@ -194,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 @@ -227,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( @@ -313,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) @@ -337,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) @@ -354,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"], @@ -369,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"], @@ -384,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"], @@ -399,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( @@ -465,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 @@ -491,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, @@ -510,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={ @@ -530,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, [ @@ -543,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: @@ -586,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: @@ -601,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 @@ -614,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, @@ -626,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 ): @@ -670,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: @@ -684,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 @@ -708,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 @@ -744,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())) @@ -774,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( @@ -786,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( @@ -796,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( @@ -806,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 @@ -861,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): @@ -898,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() @@ -915,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") @@ -937,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") @@ -963,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, @@ -972,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 ): @@ -1009,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 ): @@ -1061,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 @@ -1106,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) @@ -1155,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) @@ -1183,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, @@ -1209,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) @@ -1220,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, @@ -1248,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) @@ -1261,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, @@ -1289,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) @@ -1302,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 ): @@ -1383,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()) @@ -1441,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") @@ -1595,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): @@ -1613,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 @@ -1652,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, ) @@ -1679,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) @@ -1700,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 @@ -1729,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, ) @@ -1761,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: @@ -1777,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 @@ -1789,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, @@ -1818,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 = [ @@ -1942,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(): @@ -1957,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), @@ -1968,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 = { @@ -1984,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 @@ -1996,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: @@ -2034,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")] @@ -2064,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 @@ -2124,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 @@ -2133,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: @@ -2152,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] @@ -2170,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] @@ -2200,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 index a47ab786f..687bdd391 100644 --- a/tests/unit/test_util.py +++ b/tests/unit/test_util.py @@ -1,8 +1,18 @@ 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, +) -from databricks.sql.utils import convert_to_assigned_datatypes_in_column_table +try: + import pyarrow +except ImportError: + pyarrow = None class TestUtils: @@ -122,3 +132,95 @@ def test_convert_to_assigned_datatypes_in_column_table(self): 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"