vgi-python 0.41.0__tar.gz → 0.42.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vgi_python-0.41.0 → vgi_python-0.42.1}/CLAUDE.md +19 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/PKG-INFO +2 -2
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/index.md +1 -1
- vgi_python-0.42.1/docs/api/transactor.md +32 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/authentication.md +43 -1
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/catalog-interface.md +28 -3
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/cli.md +1 -1
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/how-to/function-patterns.md +9 -6
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/how-to/state-storage.md +5 -3
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/shared-storage.md +2 -2
- {vgi_python-0.41.0 → vgi_python-0.42.1}/pyproject.toml +2 -2
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_bind_request_at_clause.py +32 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_filter_v2.py +34 -0
- vgi_python-0.42.1/tests/test_grant_auth.py +290 -0
- vgi_python-0.42.1/tests/test_table_function_early_close.py +81 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/uv.lock +5 -5
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_duckdb.py +3 -3
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/http_server.py +2 -1
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/identity_fixture.py +7 -1
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/client.py +80 -37
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/filter_v2.py +29 -1
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/rpc_server.py +56 -3
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/serve.py +73 -2
- vgi_python-0.41.0/docs/api/transactor.md +0 -12
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.dockerignore +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.gitattributes +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.github/dependabot.yml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.github/workflows/release.yml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.github/workflows/tailnet-integration.yml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.gitignore +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.python-version +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/.vale.ini +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/LICENSE +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/PROTOCOL.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/README.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/RELEASE-RUNBOOK.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/SECURITY.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/ci/README.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/ci/run-integration.sh +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/README.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/filter-v2.schema.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/generate_runtime.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/manifest.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/run_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/conformance/filter-v2/runtime-manifest.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/arguments.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/auth.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/catalogs.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/client.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/exceptions.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/filters.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/functions.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/http.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/metadata.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/observability.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/storage.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/api/worker.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/argument-serialization.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/logo.png +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/social-card.png +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/assets/video-thumbnail.jpg +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/column-statistics.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/concepts/index.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/contributing-docs.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/generator-api.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/global-functions.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/how-to/index.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/how-to/iroh.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/how-to/tailnet.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/index.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/lifecycle.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/metadata.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/overrides/main.html +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/protocol/index.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/robots.txt +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/tutorial/index.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/tutorial/table.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/docs/vgi-logo.png +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/batch_index_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/cache_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/calc_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/copy_format_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/filter_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/row_count_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/examples/sum_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/identity.png +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/mkdocs.yml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/scripts/hosted_protocols_conformance.sh +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/scripts/measure_startup.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/scripts/regen_generated.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/test-data/generate.sh +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/_hosted_protocols_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_attach_option.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_catalog_contents.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_client_load_catalog.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_aggregate_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_batch_metadata_callback.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_bind_and_join_keys.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_cli.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_copy_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_http_response_budget.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_iroh_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_scan_branches_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_split_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_stop_force.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_table_column_statistics.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_time_travel_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_splits.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/conftest.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/bad_version.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/generate.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/manifest.json +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/stale_anchor.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/truncated.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/valid_sealed.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/data/split_tokens/valid_unsealed.bin +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table/test_wide_columns.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/test_blended_exchange.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/table_in_out/test_table_buffering_empty_input.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/tailnet/Dockerfile +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/tailnet/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/tailnet/compose.yaml +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/tailnet/probe.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/tailnet/run.sh +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/tailnet/test_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/tailnet/worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_auth.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_cache_control.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_call_state_attach.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_client_oauth.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_codegen_request_inventory.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_docstrings.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_dynamic_filter_http_turns.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_exceptions.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_filter_v2_builder.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_filter_v2_runtime_corpus.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_filter_v2_spec_schema.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_fixture_catalog_parity.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_function_shape_mismatch.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_function_storage.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_cpp_protocol_name.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_csharp.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_go_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_java_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_java_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_rust_request_builders.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_rust_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_rust_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_generated_ts_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_hosted_protocols.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_import_side_effects.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_landing_discovery.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_launch_transport.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_metadata.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_otel.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_schema_paths_v2.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_schema_scoped_functions.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_serve.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_signing_key.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_split_token.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_subprocess_transport.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_union_argument.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_wire_record_schema_parity.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_worker_page.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/test_write_results.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/catalog_contents.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/global_functions.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/same_name.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/secret_cache.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/splits.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table/wide.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/twin_catalogs.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/argument_spec.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/arguments.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/attach_header.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/auth.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/cache_control.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/catalog_interface.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/aggregate.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/cli.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/client/errors.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/cpp_protocol_name.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/csharp_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/csharp_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/go_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/java_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/java_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/rust_request_builders.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/rust_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/rust_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/codegen/ts_types.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/exceptions.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/filter_v2_builder.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/function_storage.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/http/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/http/landing.html +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/http/vgi-client.js +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/invocation.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/logging_config.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/meta_worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/metadata.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/otel.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/profiling.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/protocol.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/py.typed +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/scalar_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/schema_path.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/schema_utils.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/secret_service.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/split_token.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/table_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/transactor/client.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/transactor/server.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/worker.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/vgi/write_results.py +0 -0
- {vgi_python-0.41.0 → vgi_python-0.42.1}/wrangler.jsonc +0 -0
|
@@ -297,6 +297,7 @@ vgi-client --input data.parquet --function sum_all_columns --worker vgi-fixture-
|
|
|
297
297
|
| `VGI_OAUTH_DEVICE_CODE_CLIENT_ID` | Client ID for device-code flow (optional, URL-safe chars only) |
|
|
298
298
|
| `VGI_OAUTH_DEVICE_CODE_CLIENT_SECRET` | Client secret for device-code flow (optional, URL-safe chars only) |
|
|
299
299
|
| `VGI_OAUTH_USE_ID_TOKEN` | When `1`/`true`/`yes`, clients use OIDC `id_token` as Bearer instead of `access_token` |
|
|
300
|
+
| `VGI_RPC_GRANT_KEYS` | Comma-separated base64 32-byte sealed-grant keys (first mints, all verify); enables grants as HTTP bearers. Also `VGI_RPC_GRANT_AUDIENCE`, `VGI_RPC_GRANT_MAX_TTL_SECONDS` |
|
|
300
301
|
| `VGI_INTROSPECT_PRINCIPALS` | Comma-separated principals permitted to call `vgi_rpc.Identity.v1`'s `introspect_token`. Required — no permissive default — whenever the worker implements `resolve_token()` (see below) |
|
|
301
302
|
| `VGI_WORKER_ACCESS_LOG_SAMPLE` | Fraction of *successful* calls to keep in the access log, `0.0`–`1.0`. Errors are always kept; the decision is per call, so every record of one stream shares a fate |
|
|
302
303
|
| `VGI_WORKER_ACCESS_LOG_ASYNC` | When `1`/`true`/`yes`, emit access-log records from a listener thread. Bounded queue; full means drop, and a crash loses whatever is queued |
|
|
@@ -484,6 +485,24 @@ sidecar outage raised as one is read as "not my credential, try the next" and
|
|
|
484
485
|
ends up a 401 from the end of the chain, restarting every session in the fleet
|
|
485
486
|
over a thirty-second blip.
|
|
486
487
|
|
|
488
|
+
### Grants and `resolve_token` as HTTP Bearers
|
|
489
|
+
|
|
490
|
+
With `VGI_RPC_GRANT_KEYS` (or `vgi-serve --grant-key`) set, the HTTP worker
|
|
491
|
+
hosts Identity even without hooks. It mints sealed `vgig1.` grants through
|
|
492
|
+
`issue_grant`, unless the worker overrides `mint_grant`, and accepts them back
|
|
493
|
+
as `Authorization: Bearer` credentials, authenticated as the grant's owner. A
|
|
494
|
+
worker that overrides `resolve_token` also has it consulted for bearers. The
|
|
495
|
+
order is the deployment's authenticator, then grants, then `resolve_token`. A
|
|
496
|
+
bad `vgig1.` token is a 401 and never reaches `resolve_token`. vgi-rpc composes
|
|
497
|
+
this in `make_wsgi_app`. vgi-python resolves the keys in
|
|
498
|
+
`vgi.rpc_server.resolve_grant_keys` and passes them explicitly to `RpcServer`
|
|
499
|
+
(`None` off HTTP, never vgi-rpc's `"env"` default), so grants stay HTTP-only. It
|
|
500
|
+
also puts the bearers *inside* VGI's proxy-proof gate
|
|
501
|
+
(`serve._compose_identity_bearer`), because vgi-rpc refuses to OR them beside
|
|
502
|
+
one. Allowlist rules are unchanged. See `docs/authentication.md` and
|
|
503
|
+
`tests/test_grant_auth.py`, which also runs the shared
|
|
504
|
+
`grant_token_vectors.json` through `create_app`.
|
|
505
|
+
|
|
487
506
|
### Hosting Additional Protocols (`hosted_protocols`)
|
|
488
507
|
|
|
489
508
|
Every transport (stdio, unix/named pipe, TCP, Iroh, HTTP) builds its `RpcServer`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.42.1
|
|
4
4
|
Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
|
|
5
5
|
Project-URL: Homepage, https://query.farm
|
|
6
6
|
Project-URL: Repository, https://github.com/Query-farm/vgi-python
|
|
@@ -162,7 +162,7 @@ Requires-Dist: httpx2>=2.12.0
|
|
|
162
162
|
Requires-Dist: platformdirs
|
|
163
163
|
Requires-Dist: pyarrow
|
|
164
164
|
Requires-Dist: typer>=0.9
|
|
165
|
-
Requires-Dist: vgi-rpc>=0.
|
|
165
|
+
Requires-Dist: vgi-rpc>=0.49.0
|
|
166
166
|
Provides-Extra: azure
|
|
167
167
|
Requires-Dist: azure-identity>=1.16.0; extra == 'azure'
|
|
168
168
|
Requires-Dist: pymssql>=2.3.0; extra == 'azure'
|
|
@@ -32,7 +32,7 @@ added incrementally.
|
|
|
32
32
|
| [Auth & Secrets](auth.md) | `AuthContext`, `CallContext`, bearer/JWT authenticators, secret protocol | HTTP: `[http]`; JWT: `[oauth]` |
|
|
33
33
|
| [Observability](observability.md) | OpenTelemetry tracing, worker logging configuration | `[otel]` for tracing |
|
|
34
34
|
| [HTTP](http.md) | Worker page, blob storage, request-size middleware | `pip install vgi-python[http]` |
|
|
35
|
-
| [Transactor](transactor.md) | `TransactorClient`, `TransactorProtocol` | `
|
|
35
|
+
| [Transactor](transactor.md) | `TransactorClient`, `TransactorProtocol` | `[transactor]` extra and a [compatible engine build](transactor.md#runtime-requirements) |
|
|
36
36
|
| [Exceptions](exceptions.md) | VGI exception types | — |
|
|
37
37
|
|
|
38
38
|
## Import Convention
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Transactor
|
|
2
|
+
|
|
3
|
+
!!! note "Advanced — reference only"
|
|
4
|
+
The transactor is an advanced feature without a dedicated how-to guide yet. This page is the
|
|
5
|
+
API reference; start from the [tutorial](../tutorial/index.md) and
|
|
6
|
+
[function patterns](../how-to/function-patterns.md) if you're new to VGI.
|
|
7
|
+
|
|
8
|
+
The transactor is a long-lived subprocess that gives worker functions transactional access to a
|
|
9
|
+
database, mediated by `TransactorClient` over the `TransactorProtocol`.
|
|
10
|
+
|
|
11
|
+
## Runtime requirements
|
|
12
|
+
|
|
13
|
+
The bundled transactor requires both:
|
|
14
|
+
|
|
15
|
+
- `pip install 'vgi-python[transactor]'` for its Python dependencies.
|
|
16
|
+
- A VGI fork build of `duckdb-python` providing `DuckDBPyConnection.subcursor()`,
|
|
17
|
+
which lets reads share an open write transaction. This extension has not yet
|
|
18
|
+
been merged into Haybarn or upstream DuckDB; installing the extra alone is
|
|
19
|
+
insufficient.
|
|
20
|
+
|
|
21
|
+
Engine resolution prefers `haybarn` when installed, then falls back to `duckdb`.
|
|
22
|
+
Use an environment where the selected engine provides `subcursor()`; installing
|
|
23
|
+
a compatible `duckdb` build alongside an incompatible `haybarn` installation
|
|
24
|
+
does not override that preference.
|
|
25
|
+
|
|
26
|
+
These requirements apply to the bundled transactor. Workers can implement
|
|
27
|
+
[table writes](../catalog-interface.md#table-writes-and-indexes) against their own
|
|
28
|
+
backing data sources without using it.
|
|
29
|
+
|
|
30
|
+
## API
|
|
31
|
+
|
|
32
|
+
::: vgi.transactor
|
|
@@ -24,7 +24,7 @@ the principal in the `AuthContext` available to functions.
|
|
|
24
24
|
| Variable | Description |
|
|
25
25
|
|----------|-------------|
|
|
26
26
|
| `VGI_BEARER_TOKENS` | Comma-separated `token=principal` pairs for static bearer auth |
|
|
27
|
-
| `VGI_JWT_ISSUER` | JWT issuer URL (requires `vgi[oauth]` extra) |
|
|
27
|
+
| `VGI_JWT_ISSUER` | JWT issuer URL (requires `vgi-python[oauth]` extra) |
|
|
28
28
|
| `VGI_JWT_AUDIENCE` | JWT audience string, comma-separated for multiple audiences (required when `VGI_JWT_ISSUER` is set) |
|
|
29
29
|
| `VGI_JWT_JWKS_URI` | JWKS endpoint URL (auto-discovered from issuer if omitted) |
|
|
30
30
|
| `VGI_OAUTH_RESOURCE` | OAuth resource URL for RFC 9728 metadata |
|
|
@@ -39,6 +39,48 @@ When both `VGI_BEARER_TOKENS` and `VGI_JWT_ISSUER` are set, they are
|
|
|
39
39
|
chained — JWT validation is attempted first, falling back to bearer token
|
|
40
40
|
lookup.
|
|
41
41
|
|
|
42
|
+
## Grants and resolved tokens as bearer credentials
|
|
43
|
+
|
|
44
|
+
`vgi_rpc.Identity.v1`'s `issue_grant` mints a standing credential that
|
|
45
|
+
unattended automation later presents as an ordinary bearer. Over HTTP the
|
|
46
|
+
worker accepts two kinds of identity credential after the deployment's own
|
|
47
|
+
authenticator:
|
|
48
|
+
|
|
49
|
+
1. **Sealed grants** (opt-in). Set `VGI_RPC_GRANT_KEYS` (or
|
|
50
|
+
`vgi-serve --http --grant-key KEY`, repeatable). `issue_grant` then mints a
|
|
51
|
+
`vgig1.` grant sealed with the first key, unless the worker overrides
|
|
52
|
+
`mint_grant`. Every key verifies, so to rotate you add the new key first and
|
|
53
|
+
drop the old one once its grants have expired. A request carrying
|
|
54
|
+
`Authorization: Bearer vgig1.…` is authenticated as the grant's owner, with
|
|
55
|
+
`domain="grant"` and claims `grant_id`, `scopes` and `purpose`. The claims
|
|
56
|
+
carry no `auth_time`, so a grant cannot mint another grant.
|
|
57
|
+
2. **`resolve_token`**. A worker that overrides
|
|
58
|
+
[`Worker.resolve_token`][vgi.worker.Worker.resolve_token] has it consulted
|
|
59
|
+
for any other bearer, with `domain="token"`. `None` means the credential is
|
|
60
|
+
unknown, which is a 401 unless something else accepts it.
|
|
61
|
+
`AuthUnavailableError` is a 503 with the hook's `Retry-After`.
|
|
62
|
+
|
|
63
|
+
The order is the deployment's authenticator (JWT, static bearer), then sealed
|
|
64
|
+
grants, then `resolve_token`. A `vgig1.` token that does not verify is a 401
|
|
65
|
+
that stops the chain: it never reaches `resolve_token`. A JWS-shaped token or
|
|
66
|
+
one over 4096 bytes never reaches the hook either. Your own `authenticate`
|
|
67
|
+
callback must raise `ValueError` for a credential it does not recognise, so the
|
|
68
|
+
chain moves on. One that answers anonymous for every request ends the chain
|
|
69
|
+
before grants are checked. With no authenticator configured, a request with no
|
|
70
|
+
`Authorization` header stays anonymous as before.
|
|
71
|
+
|
|
72
|
+
| Variable | Description |
|
|
73
|
+
|----------|-------------|
|
|
74
|
+
| `VGI_RPC_GRANT_KEYS` | Comma-separated standard-base64 keys, 32 bytes each. The first mints and all verify. Unset means grants are off. A malformed key stops startup |
|
|
75
|
+
| `VGI_RPC_GRANT_AUDIENCE` | Bound into every grant, so two deployments that share a key still reject each other's grants |
|
|
76
|
+
| `VGI_RPC_GRANT_MAX_TTL_SECONDS` | Ceiling on a grant's lifetime (default 7 days) |
|
|
77
|
+
|
|
78
|
+
The startup rules are unchanged. Overriding `resolve_token` still requires
|
|
79
|
+
`VGI_INTROSPECT_PRINCIPALS`. Grant keys alone need no allowlist, because
|
|
80
|
+
minting answers only for the caller. Grants and `resolve_token` bearers are
|
|
81
|
+
HTTP-only, like the rest of Identity. When `VGI_PROXY_PROOF_MODE` is on, both
|
|
82
|
+
are accepted only *inside* the proxy-proof gate, never as an alternative to it.
|
|
83
|
+
|
|
42
84
|
## Programmatic API
|
|
43
85
|
|
|
44
86
|
```python test="skip"
|
|
@@ -944,7 +944,7 @@ if __name__ == "__main__":
|
|
|
944
944
|
|
|
945
945
|
---
|
|
946
946
|
|
|
947
|
-
##
|
|
947
|
+
## Catalog capabilities and limitations { #api-limitations }
|
|
948
948
|
|
|
949
949
|
The current CatalogInterface has the following limitations:
|
|
950
950
|
|
|
@@ -952,8 +952,33 @@ The current CatalogInterface has the following limitations:
|
|
|
952
952
|
- **Tags**: Cannot be updated after object creation
|
|
953
953
|
- **Schema metadata**: Comments and tags cannot be updated on schemas
|
|
954
954
|
- **Constraints**: Only NOT NULL can be added/dropped (no ALTER for UNIQUE/CHECK)
|
|
955
|
-
|
|
956
|
-
|
|
955
|
+
|
|
956
|
+
### Table writes and indexes
|
|
957
|
+
|
|
958
|
+
`INSERT`, `UPDATE`, and `DELETE` are supported when the catalog supplies a write
|
|
959
|
+
function for the operation. For declarative catalogs, configure the
|
|
960
|
+
[`Table`][vgi.catalog.descriptors.Table] descriptor:
|
|
961
|
+
|
|
962
|
+
| Operation | Descriptor field | Requirement |
|
|
963
|
+
|-----------|------------------|-------------|
|
|
964
|
+
| `INSERT` | `insert_function` | A `TableInOutGenerator` that accepts rows to insert |
|
|
965
|
+
| `UPDATE` | `update_function` | A write function and a scan `function` that provides row IDs |
|
|
966
|
+
| `DELETE` | `delete_function` | A write function and a scan `function` that provides row IDs |
|
|
967
|
+
|
|
968
|
+
Each field defaults to `None`, which leaves that operation unsupported. Custom
|
|
969
|
+
catalogs implement `table_insert_function_get()`, `table_update_function_get()`,
|
|
970
|
+
or `table_delete_function_get()` to return the corresponding `ScanFunctionResult`.
|
|
971
|
+
The worker's write functions implement the changes to the backing data source;
|
|
972
|
+
declaring a table alone does not make it writable.
|
|
973
|
+
|
|
974
|
+
`ReadOnlyCatalogInterface` rejects catalog DDL, but can expose these write functions
|
|
975
|
+
on declarative tables. Table writes do not require the bundled
|
|
976
|
+
[transactor](api/transactor.md); that is an optional database-access service with
|
|
977
|
+
additional engine requirements.
|
|
978
|
+
|
|
979
|
+
Index metadata can be declared with [`Index`][vgi.catalog.descriptors.Index]. Custom
|
|
980
|
+
catalogs can implement `index_get()`, `index_create()`, and `index_drop()`; support
|
|
981
|
+
depends on the catalog implementation and backing data source.
|
|
957
982
|
|
|
958
983
|
---
|
|
959
984
|
|
|
@@ -545,7 +545,7 @@ vgi-fixture-worker --log-format json
|
|
|
545
545
|
| `VGI_QUIET=1` | Suppress the interactive-terminal startup warning (same as `--quiet`) |
|
|
546
546
|
| `VGI_FILTER_DEBUG=1` | Enable filter pushdown debug logging |
|
|
547
547
|
| `VGI_BEARER_TOKENS` | Comma-separated `token=principal` pairs for static bearer auth (HTTP only) |
|
|
548
|
-
| `VGI_JWT_ISSUER` | JWT issuer URL for JWT/JWKS auth (requires `vgi[oauth]` extra) |
|
|
548
|
+
| `VGI_JWT_ISSUER` | JWT issuer URL for JWT/JWKS auth (requires `vgi-python[oauth]` extra) |
|
|
549
549
|
| `VGI_JWT_AUDIENCE` | JWT audience string, comma-separated for multiple audiences (required when `VGI_JWT_ISSUER` is set) |
|
|
550
550
|
| `VGI_JWT_JWKS_URI` | JWKS endpoint URL (auto-discovered if omitted) |
|
|
551
551
|
| `VGI_OAUTH_RESOURCE` | OAuth resource URL for RFC 9728 metadata |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "How to write each of the
|
|
2
|
+
description: "How to write each of the five VGI function patterns: scalar, table, table-in-out, aggregate, and buffering — with a complete runnable worker for each."
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# Function patterns
|
|
@@ -178,11 +178,14 @@ ATTACH 'aggregates' (TYPE vgi, LOCATION 'uv run sum_worker.py');
|
|
|
178
178
|
SELECT category, aggregates.vgi_sum(value) FROM t GROUP BY category;
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
??? info "State must be
|
|
182
|
-
Table generators and aggregates keep state between calls.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
181
|
+
??? info "State must be serializable"
|
|
182
|
+
Table generators and aggregates keep state between calls. A state type must provide
|
|
183
|
+
`serialize_to_bytes()` and `deserialize_from_bytes()` so the framework can carry it across
|
|
184
|
+
HTTP round-trips or persist it between aggregate calls. `ArrowSerializableDataclass`
|
|
185
|
+
implements these methods for you and is the usual starting point. Custom state types can
|
|
186
|
+
implement the same [`StreamStateCodec`][vgi.function.StreamStateCodec] contract without
|
|
187
|
+
inheriting from `ArrowSerializableDataclass`. See
|
|
188
|
+
[State Class](../aggregate-functions.md#state-class) for both approaches.
|
|
186
189
|
|
|
187
190
|
## Buffering
|
|
188
191
|
|
|
@@ -22,9 +22,11 @@ function that coordinates partial results across workers.
|
|
|
22
22
|
|
|
23
23
|
## Two kinds of "state" — don't confuse them
|
|
24
24
|
|
|
25
|
-
- **Generator cursor state** — the small
|
|
26
|
-
*within one scan* (see [streaming with state](function-patterns.md#streaming-with-state)).
|
|
27
|
-
|
|
25
|
+
- **Generator cursor state** — the small serializable object a table generator keeps
|
|
26
|
+
*within one scan* (see [streaming with state](function-patterns.md#streaming-with-state)).
|
|
27
|
+
Over HTTP, the framework serializes it between requests. `ArrowSerializableDataclass`
|
|
28
|
+
supplies the serialization methods; custom types can implement
|
|
29
|
+
[`StreamStateCodec`][vgi.function.StreamStateCodec] instead.
|
|
28
30
|
- **Shared storage** (this page) — state that must outlive a single call or be shared across
|
|
29
31
|
**separate worker processes**, e.g. combining partial aggregate results. This is backed by a
|
|
30
32
|
pluggable store.
|
|
@@ -10,7 +10,7 @@ variable.
|
|
|
10
10
|
| Backend | Value | Use Case | Dependencies |
|
|
11
11
|
|---------|-------|----------|-------------|
|
|
12
12
|
| SQLite | `sqlite` (default) | Local / subprocess transport | None (stdlib) |
|
|
13
|
-
| Azure SQL | `azure-sql` | Azure cloud deployments | `vgi[azure]` |
|
|
13
|
+
| Azure SQL | `azure-sql` | Azure cloud deployments | `vgi-python[azure]` |
|
|
14
14
|
| Cloudflare DO | `cloudflare-do` | Edge / multi-cloud deployments | None (stdlib) |
|
|
15
15
|
|
|
16
16
|
## SQLite (Default)
|
|
@@ -36,7 +36,7 @@ workers run on separate hosts.
|
|
|
36
36
|
1. Install the Azure extra:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
pip install vgi[azure]
|
|
39
|
+
pip install 'vgi-python[azure]'
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
2. Create an Azure SQL Database (Serverless recommended for cost):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "vgi-python"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.42.1"
|
|
4
4
|
description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
keywords = [
|
|
@@ -40,7 +40,7 @@ dependencies = [
|
|
|
40
40
|
"pyarrow",
|
|
41
41
|
"typer>=0.9",
|
|
42
42
|
"platformdirs",
|
|
43
|
-
"vgi-rpc>=0.
|
|
43
|
+
"vgi-rpc>=0.49.0",
|
|
44
44
|
"httpx2>=2.12.0",
|
|
45
45
|
]
|
|
46
46
|
|
|
@@ -13,10 +13,14 @@ Python protocol contract (round-trip + additive wire compatibility + accessors).
|
|
|
13
13
|
|
|
14
14
|
from __future__ import annotations
|
|
15
15
|
|
|
16
|
+
from types import SimpleNamespace
|
|
17
|
+
|
|
16
18
|
import pyarrow as pa
|
|
17
19
|
import pyarrow.ipc as ipc
|
|
20
|
+
import pytest
|
|
18
21
|
|
|
19
22
|
from vgi.arguments import Arguments
|
|
23
|
+
from vgi.client.client import Client
|
|
20
24
|
from vgi.invocation import FunctionType
|
|
21
25
|
from vgi.protocol import BindRequest, InitRequest
|
|
22
26
|
from vgi.table_function import BindParams, ProcessParams, ResolvedSecrets
|
|
@@ -108,3 +112,31 @@ def test_process_params_accessor_none_when_no_init_call() -> None:
|
|
|
108
112
|
)
|
|
109
113
|
assert params.at_unit is None
|
|
110
114
|
assert params.at_value is None
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def test_client_bind_forwards_at_clause_and_secrets(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
118
|
+
"""``Client.bind`` carries at_unit/at_value and secrets onto its BindRequest, as table_function does."""
|
|
119
|
+
captured: list[BindRequest] = []
|
|
120
|
+
client = Client("unused-worker")
|
|
121
|
+
client._primary = SimpleNamespace(proxy=None) # type: ignore[assignment]
|
|
122
|
+
|
|
123
|
+
def fake_do_bind(_proxy: object, request: BindRequest, _callback: object) -> object:
|
|
124
|
+
captured.append(request)
|
|
125
|
+
return SimpleNamespace()
|
|
126
|
+
|
|
127
|
+
monkeypatch.setattr(client, "_do_bind", fake_do_bind)
|
|
128
|
+
client.bind(
|
|
129
|
+
function_name="sequence",
|
|
130
|
+
schema_path=["main"],
|
|
131
|
+
at_unit="VERSION",
|
|
132
|
+
at_value="3",
|
|
133
|
+
secrets={"token": "s3cr3t"},
|
|
134
|
+
)
|
|
135
|
+
(request,) = captured
|
|
136
|
+
assert (request.at_unit, request.at_value) == ("VERSION", "3")
|
|
137
|
+
assert request.secrets is not None
|
|
138
|
+
|
|
139
|
+
captured.clear()
|
|
140
|
+
client.bind(function_name="sequence", schema_path=["main"])
|
|
141
|
+
(request,) = captured
|
|
142
|
+
assert (request.at_unit, request.at_value, request.secrets) == (None, None, None)
|
|
@@ -22,6 +22,7 @@ from vgi import (
|
|
|
22
22
|
FilterVersionError,
|
|
23
23
|
RuntimeFilterAlgorithmCapability,
|
|
24
24
|
deserialize_filters,
|
|
25
|
+
filter_v2,
|
|
25
26
|
)
|
|
26
27
|
|
|
27
28
|
_METADATA: dict[bytes, bytes] = {
|
|
@@ -767,3 +768,36 @@ def test_standard_v1_evaluator_requires_oracle_engine(
|
|
|
767
768
|
with pytest.raises(filter_v2.FilterV2Error, match=f"found {engine} {re.escape(version)}"):
|
|
768
769
|
filter_v2._get_evaluation_connection(context)
|
|
769
770
|
assert opened == []
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
class _NoNbytes:
|
|
774
|
+
"""Stands in for a view-typed batch under pyarrow < 19, where ``nbytes`` raises."""
|
|
775
|
+
|
|
776
|
+
def __init__(self, total: int | None) -> None:
|
|
777
|
+
self._total = total
|
|
778
|
+
|
|
779
|
+
@property
|
|
780
|
+
def nbytes(self) -> int:
|
|
781
|
+
raise pa.ArrowTypeError("not implemented for string_view")
|
|
782
|
+
|
|
783
|
+
def get_total_buffer_size(self) -> int:
|
|
784
|
+
if self._total is None:
|
|
785
|
+
raise pa.ArrowNotImplementedError("not implemented")
|
|
786
|
+
return self._total
|
|
787
|
+
|
|
788
|
+
|
|
789
|
+
def test_payload_size_falls_back_when_nbytes_is_unavailable() -> None:
|
|
790
|
+
"""A view-typed payload is measured by total buffer size instead of raising ArrowTypeError."""
|
|
791
|
+
assert filter_v2._payload_nbytes(_NoNbytes(123)) == 123 # type: ignore[arg-type]
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
def test_payload_size_unmeasurable_is_a_filter_error() -> None:
|
|
795
|
+
"""When no measurement works, the caller sees FilterV2Error, not a raw Arrow error."""
|
|
796
|
+
with pytest.raises(filter_v2.FilterV2Error, match="cannot measure filter payload size"):
|
|
797
|
+
filter_v2._payload_nbytes(_NoNbytes(None)) # type: ignore[arg-type]
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
def test_payload_size_of_a_view_typed_batch() -> None:
|
|
801
|
+
"""A real string_view payload is measured without error."""
|
|
802
|
+
batch = pa.record_batch([pa.array(["a", "bc"], type=pa.string_view())], names=["needles"])
|
|
803
|
+
assert filter_v2._payload_nbytes(batch) > 0
|