vgi-python 0.33.0__tar.gz → 0.34.0__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.33.0 → vgi_python-0.34.0}/PKG-INFO +1 -1
- {vgi_python-0.33.0 → vgi_python-0.34.0}/pyproject.toml +1 -1
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/test_blended_exchange.py +70 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/test_blended_metadata.py +40 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_argument_spec.py +59 -2
- {vgi_python-0.33.0 → vgi_python-0.34.0}/uv.lock +1 -1
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table_in_out.py +84 -1
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/worker.py +4 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/argument_spec.py +42 -8
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.dockerignore +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.gitattributes +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.github/workflows/tailnet-integration.yml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.gitignore +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.python-version +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/.vale.ini +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/CLAUDE.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/LICENSE +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/PROTOCOL.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/README.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/RELEASE-RUNBOOK.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/SECURITY.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/ci/README.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/README.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/generate_runtime.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/manifest.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/run_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime-manifest.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/auth.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/client.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/filters.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/functions.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/http.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/index.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/observability.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/storage.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/api/worker.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/authentication.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/catalog-interface.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/cli.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/generator-api.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/global-functions.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/how-to/iroh.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/how-to/tailnet.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/index.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/metadata.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/protocol/index.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/robots.txt +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/batch_index_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/cache_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/copy_format_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/identity.png +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/mkdocs.yml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/scripts/regen_generated.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/test-data/generate.sh +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_attach_option.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_aggregate_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_batch_metadata_callback.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_bind_and_join_keys.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_copy_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_http_response_budget.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_iroh_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_scan_branches_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_split_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_stop_force.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_table_column_statistics.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_time_travel_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_splits.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/conftest.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/bad_version.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/generate.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/manifest.json +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/truncated.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table/test_wide_columns.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/tailnet/Dockerfile +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/tailnet/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/tailnet/compose.yaml +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/tailnet/probe.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/tailnet/run.sh +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/tailnet/test_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/tailnet/worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_auth.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_cache_control.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_call_state_attach.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_client_oauth.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_codegen_request_inventory.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_filter_v2.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_filter_v2_builder.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_filter_v2_spec_schema.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_fixture_catalog_parity.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_function_shape_mismatch.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_cpp_protocol_name.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_java_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_rust_request_builders.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_rust_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_launch_transport.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_otel.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_schema_paths_v2.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_schema_scoped_functions.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_serve.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_signing_key.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_split_token.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_wire_record_schema_parity.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/test_write_results.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/global_functions.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/splits.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table/wide.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/arguments.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/attach_header.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/auth.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/cache_control.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/catalog_interface.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/aggregate.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/client/errors.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/cpp_protocol_name.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/java_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/rust_request_builders.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/rust_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/filter_v2.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/filter_v2_builder.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/http/landing.html +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/http/vgi-client.js +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/invocation.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/meta_worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/metadata.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/otel.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/profiling.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/protocol.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/py.typed +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/scalar_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/schema_path.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/serve.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/split_token.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/table_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/worker.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/vgi/write_results.py +0 -0
- {vgi_python-0.33.0 → vgi_python-0.34.0}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.34.0
|
|
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
|
|
@@ -280,3 +280,73 @@ class TestHasFinalizeSkip:
|
|
|
280
280
|
assert len(with_finalize) == 1
|
|
281
281
|
assert len(without_finalize) == 1
|
|
282
282
|
assert with_finalize[0].column("i").to_pylist() == without_finalize[0].column("i").to_pylist()
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
class TestBlendedAny:
|
|
286
|
+
"""`blended_any` / `blended_any_varargs`: positional input columns declared ANY.
|
|
287
|
+
|
|
288
|
+
An ANY arg names no concrete Arrow type, so the output type can only come from
|
|
289
|
+
the input schema the client supplies at bind. These drive that over the wire:
|
|
290
|
+
the same registration must bind to whatever type each call resolves to, and
|
|
291
|
+
echo the column back untouched (nested types and nulls included).
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
@pytest.mark.parametrize(
|
|
295
|
+
"array",
|
|
296
|
+
[
|
|
297
|
+
pa.array(["a", None, "c"], type=pa.string()),
|
|
298
|
+
pa.array([1, 2, None], type=pa.int32()),
|
|
299
|
+
pa.array(
|
|
300
|
+
[{"message": "lost pkg", "tier": "gold"}, None, {"message": None, "tier": "free"}],
|
|
301
|
+
type=pa.struct([("message", pa.string()), ("tier", pa.string())]),
|
|
302
|
+
),
|
|
303
|
+
pa.array([[1, 2], [], None], type=pa.list_(pa.int64())),
|
|
304
|
+
],
|
|
305
|
+
ids=["string", "int32", "struct", "list"],
|
|
306
|
+
)
|
|
307
|
+
def test_output_is_typed_from_the_input_and_echoed(self, fixture_worker: str, array: pa.Array[Any]) -> None:
|
|
308
|
+
"""One registration, bound per call to the resolved input type."""
|
|
309
|
+
batch = pa.record_batch({"value": array})
|
|
310
|
+
bound: list[pa.Schema] = []
|
|
311
|
+
|
|
312
|
+
with Client(fixture_worker) as client:
|
|
313
|
+
results = list(
|
|
314
|
+
client.table_in_out_function(
|
|
315
|
+
function_name="blended_any",
|
|
316
|
+
schema_path=["main"],
|
|
317
|
+
input=iter([batch]),
|
|
318
|
+
bind_result_callback=lambda r: bound.append(r.output_schema),
|
|
319
|
+
has_finalize=False,
|
|
320
|
+
)
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
assert [s.names for s in bound] == [["value"]]
|
|
324
|
+
assert bound[0].field("value").type == array.type
|
|
325
|
+
(out,) = results
|
|
326
|
+
assert out.column("value").type == array.type
|
|
327
|
+
# A null struct and a struct with a null field must stay distinct.
|
|
328
|
+
assert out.column("value").to_pylist() == array.to_pylist()
|
|
329
|
+
|
|
330
|
+
def test_varargs_columns_each_keep_their_own_type(self, fixture_worker: str) -> None:
|
|
331
|
+
"""The vararg element type is ANY, so every runtime column types itself."""
|
|
332
|
+
batch = pa.record_batch(
|
|
333
|
+
{
|
|
334
|
+
"col0": pa.array(["a", "b"], type=pa.string()),
|
|
335
|
+
"col1": pa.array([[1], [2, 3]], type=pa.list_(pa.int32())),
|
|
336
|
+
"col2": pa.array([{"k": 1.5}, None], type=pa.struct([("k", pa.float64())])),
|
|
337
|
+
}
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
with Client(fixture_worker) as client:
|
|
341
|
+
(out,) = list(
|
|
342
|
+
client.table_in_out_function(
|
|
343
|
+
function_name="blended_any_varargs",
|
|
344
|
+
schema_path=["main"],
|
|
345
|
+
input=iter([batch]),
|
|
346
|
+
has_finalize=False,
|
|
347
|
+
)
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
assert out.schema.names == ["col0", "col1", "col2"]
|
|
351
|
+
assert out.schema.types == batch.schema.types
|
|
352
|
+
assert out.to_pylist() == batch.to_pylist()
|
|
@@ -148,3 +148,43 @@ class TestBlendedFootguns:
|
|
|
148
148
|
|
|
149
149
|
with pytest.raises(TypeError, match="at least one positional Arg"):
|
|
150
150
|
resolve_metadata(_NamedOnly)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class TestBlendedAnyResolution:
|
|
154
|
+
"""A blended function may declare its positional input column(s) ANY.
|
|
155
|
+
|
|
156
|
+
The ANY marker lives on the argument *spec* — the ``vgi_type=any`` field
|
|
157
|
+
metadata the client reads to learn it must take the column's type from the
|
|
158
|
+
call rather than from the declaration.
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
def test_any_positional_is_a_blended_input_column(self) -> None:
|
|
162
|
+
"""The ANY arg resolves as a positional input column, not a bind constant."""
|
|
163
|
+
from vgi._test_fixtures.table_in_out import BlendedAnyFunction
|
|
164
|
+
from vgi.argument_spec import extract_argument_specs
|
|
165
|
+
|
|
166
|
+
m = resolve_metadata(BlendedAnyFunction)
|
|
167
|
+
assert m.input_from_args is True
|
|
168
|
+
assert m.has_finalize is False
|
|
169
|
+
(spec,) = extract_argument_specs(BlendedAnyFunction)
|
|
170
|
+
assert (spec.name, spec.position, spec.is_any_type, spec.is_varargs) == ("value", 0, True, False)
|
|
171
|
+
|
|
172
|
+
def test_any_varargs_is_a_blended_input_column(self) -> None:
|
|
173
|
+
"""The varargs form keeps both markers: ANY element type and varargs."""
|
|
174
|
+
from vgi._test_fixtures.table_in_out import BlendedAnyVarargsFunction
|
|
175
|
+
from vgi.argument_spec import extract_argument_specs
|
|
176
|
+
|
|
177
|
+
assert resolve_metadata(BlendedAnyVarargsFunction).input_from_args is True
|
|
178
|
+
(spec,) = extract_argument_specs(BlendedAnyVarargsFunction)
|
|
179
|
+
assert (spec.name, spec.position, spec.is_any_type, spec.is_varargs) == ("values", 0, True, True)
|
|
180
|
+
|
|
181
|
+
def test_any_marker_survives_the_wire_schema(self) -> None:
|
|
182
|
+
"""The client learns the arg is ANY from the serialized arguments schema."""
|
|
183
|
+
from vgi._test_fixtures.table_in_out import BlendedAnyFunction, BlendedAnyVarargsFunction
|
|
184
|
+
from vgi.argument_spec import argument_specs_to_schema, extract_argument_specs, schema_to_argument_specs
|
|
185
|
+
|
|
186
|
+
for function in (BlendedAnyFunction, BlendedAnyVarargsFunction):
|
|
187
|
+
specs = extract_argument_specs(function)
|
|
188
|
+
wire = schema_to_argument_specs(argument_specs_to_schema(specs))
|
|
189
|
+
assert [s.is_any_type for s in wire] == [True]
|
|
190
|
+
assert [s.is_varargs for s in wire] == [s.is_varargs for s in specs]
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
+
import dataclasses
|
|
7
8
|
from typing import Annotated, Any
|
|
8
9
|
|
|
9
10
|
import pyarrow as pa
|
|
@@ -856,7 +857,7 @@ class TestArgumentConstraints:
|
|
|
856
857
|
assert defaults.column("label")[0].as_py() is None
|
|
857
858
|
|
|
858
859
|
def test_typed_default_requires_concrete_parameter_type(self) -> None:
|
|
859
|
-
"""An ANY parameter cannot carry an untyped protocol default."""
|
|
860
|
+
"""An ANY parameter cannot carry an untyped protocol default VALUE."""
|
|
860
861
|
spec = ArgumentSpec(
|
|
861
862
|
name="value",
|
|
862
863
|
position=0,
|
|
@@ -865,9 +866,65 @@ class TestArgumentConstraints:
|
|
|
865
866
|
default_value=1,
|
|
866
867
|
)
|
|
867
868
|
|
|
868
|
-
with pytest.raises(ValueError, match="typed
|
|
869
|
+
with pytest.raises(ValueError, match="a typed default requires an explicit parameter type"):
|
|
869
870
|
parameter_default_values_from_specs([spec], require_trailing=True)
|
|
870
871
|
|
|
872
|
+
def test_an_any_parameter_may_default_to_none(self) -> None:
|
|
873
|
+
"""`None` IS representable on an ANY parameter — a null array holds nulls.
|
|
874
|
+
|
|
875
|
+
It is column presence, not the value, that marks a parameter as having a
|
|
876
|
+
default, so this costs the protocol nothing. It buys a function the
|
|
877
|
+
ability to declare a *required* ANY argument with ``default=None`` so
|
|
878
|
+
that omitting it reaches ``on_bind()``, where the function can name the
|
|
879
|
+
argument and show its shape, instead of raising a bare ``KeyError``
|
|
880
|
+
during argument parsing before any user code runs.
|
|
881
|
+
"""
|
|
882
|
+
spec = ArgumentSpec(
|
|
883
|
+
name="questions",
|
|
884
|
+
position="questions",
|
|
885
|
+
arrow_type=pa.null(),
|
|
886
|
+
is_any_type=True,
|
|
887
|
+
default_value=None,
|
|
888
|
+
)
|
|
889
|
+
|
|
890
|
+
defaults = parameter_default_values_from_specs([spec], require_trailing=True)
|
|
891
|
+
|
|
892
|
+
assert defaults is not None
|
|
893
|
+
assert defaults.schema.names == ["questions"]
|
|
894
|
+
assert defaults.column("questions").type == pa.null()
|
|
895
|
+
assert defaults.column("questions")[0].as_py() is None
|
|
896
|
+
|
|
897
|
+
def test_an_optional_any_argument_is_still_an_any_argument(self) -> None:
|
|
898
|
+
"""``AnyArrow | None`` must stay ANY-typed, not collapse to a NULL column.
|
|
899
|
+
|
|
900
|
+
A marker type is recognised by identity, so an Optional wrapper used to
|
|
901
|
+
hide it: the parameter silently became NULL-typed and DuckDB could then
|
|
902
|
+
cast nothing into it (`Unimplemented type for cast (STRUCT(...) -> NULL)`).
|
|
903
|
+
Declaring a REQUIRED ANY argument nullable, with ``default=None``, is how
|
|
904
|
+
a function gets to reject the missing case in its own ``on_bind()`` with
|
|
905
|
+
a message naming the argument.
|
|
906
|
+
"""
|
|
907
|
+
|
|
908
|
+
@dataclasses.dataclass(slots=True, frozen=True, kw_only=True)
|
|
909
|
+
class _Args:
|
|
910
|
+
"""Args with a required-but-nullable ANY parameter."""
|
|
911
|
+
|
|
912
|
+
payload: Annotated[AnyArrow | None, Arg("payload", default=None)] = None
|
|
913
|
+
|
|
914
|
+
class _Fn(TableInOutFunction[_Args]):
|
|
915
|
+
"""A function declaring one optional ANY argument."""
|
|
916
|
+
|
|
917
|
+
FunctionArguments = _Args
|
|
918
|
+
|
|
919
|
+
class Meta:
|
|
920
|
+
"""Metadata."""
|
|
921
|
+
|
|
922
|
+
name = "optional_any"
|
|
923
|
+
|
|
924
|
+
(spec,) = [sp for sp in extract_argument_specs(_Fn) if sp.name == "payload"]
|
|
925
|
+
assert spec.is_any_type, "an optional ANY argument lost its ANY marker"
|
|
926
|
+
assert pa.types.is_null(spec.arrow_type)
|
|
927
|
+
|
|
871
928
|
def test_typed_defaults_reject_case_insensitive_duplicate_names(self) -> None:
|
|
872
929
|
"""Default-batch field names must identify one signature slot."""
|
|
873
930
|
specs = [
|
|
@@ -51,7 +51,7 @@ from vgi_rpc import ArrowSerializableDataclass, ArrowType
|
|
|
51
51
|
from vgi_rpc.log import Level
|
|
52
52
|
from vgi_rpc.rpc import OutputCollector
|
|
53
53
|
|
|
54
|
-
from vgi.arguments import Arg, Setting, TableInput
|
|
54
|
+
from vgi.arguments import AnyArrow, Arg, Setting, TableInput
|
|
55
55
|
from vgi.cache_control import CacheControl
|
|
56
56
|
from vgi.invocation import BindResponse
|
|
57
57
|
from vgi.metadata import FunctionExample
|
|
@@ -94,6 +94,8 @@ __all__ = [
|
|
|
94
94
|
"GeoEncode3Function",
|
|
95
95
|
"RowSumFunction",
|
|
96
96
|
"BlendedDropFunction",
|
|
97
|
+
"BlendedAnyFunction",
|
|
98
|
+
"BlendedAnyVarargsFunction",
|
|
97
99
|
"SubstreamPartialSumFunction",
|
|
98
100
|
"MultiBatchFinishFunction",
|
|
99
101
|
"SumAllColumnsFunction",
|
|
@@ -1880,6 +1882,87 @@ class BlendedExplodeFunction(RowTransformFunction[_ExplodeArgs]):
|
|
|
1880
1882
|
cast("VgiOutputCollector", out).emit(out_batch, parent_rows=parent_rows)
|
|
1881
1883
|
|
|
1882
1884
|
|
|
1885
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
1886
|
+
class _AnyArgs:
|
|
1887
|
+
"""One positional ANY-typed input column."""
|
|
1888
|
+
|
|
1889
|
+
value: Annotated[AnyArrow, Arg(0, doc="Input column of any type (echoed back unchanged)")]
|
|
1890
|
+
|
|
1891
|
+
|
|
1892
|
+
class BlendedAnyFunction(RowTransformFunction[_AnyArgs]):
|
|
1893
|
+
"""Blended 1->1 echo of a single ANY-typed input column.
|
|
1894
|
+
|
|
1895
|
+
Proves a blended positional arg may be declared ANY: the declared type names
|
|
1896
|
+
no concrete Arrow type, so the client must build the worker's input schema
|
|
1897
|
+
from the type DuckDB actually resolved for the call (a STRUCT built per row,
|
|
1898
|
+
a whole-row struct, a LIST, a plain VARCHAR ...) rather than from the
|
|
1899
|
+
declaration. The output column ``value`` is bound to that resolved input
|
|
1900
|
+
type at bind time and the column is passed through untouched, so a test
|
|
1901
|
+
asserts on DuckDB's own ``typeof(value)`` and on the round-tripped values —
|
|
1902
|
+
nothing here depends on how an SDK happens to render a type name.
|
|
1903
|
+
"""
|
|
1904
|
+
|
|
1905
|
+
class Meta:
|
|
1906
|
+
name = "blended_any"
|
|
1907
|
+
description = "Blended 1->1 echo of one ANY-typed input column (output typed from the input)"
|
|
1908
|
+
categories = ["blended", "test"]
|
|
1909
|
+
|
|
1910
|
+
@classmethod
|
|
1911
|
+
def on_bind(cls, params: BindParams[_AnyArgs]) -> BindResponse:
|
|
1912
|
+
input_schema = params.bind_call.input_schema
|
|
1913
|
+
assert input_schema is not None
|
|
1914
|
+
return BindResponse(output_schema=pa.schema([pa.field("value", input_schema.field(0).type)]))
|
|
1915
|
+
|
|
1916
|
+
@classmethod
|
|
1917
|
+
def process(
|
|
1918
|
+
cls,
|
|
1919
|
+
params: ProcessParams[_AnyArgs],
|
|
1920
|
+
state: None,
|
|
1921
|
+
batch: pa.RecordBatch,
|
|
1922
|
+
out: OutputCollector,
|
|
1923
|
+
) -> None:
|
|
1924
|
+
out.emit(pa.record_batch([batch.column(0)], schema=params.output_schema))
|
|
1925
|
+
|
|
1926
|
+
|
|
1927
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
1928
|
+
class _AnyVarargsArgs:
|
|
1929
|
+
"""N positional ANY-typed input columns, each free to be a different type."""
|
|
1930
|
+
|
|
1931
|
+
values: Annotated[list[AnyArrow], Arg(0, varargs=True, doc="Input columns of any types (echoed back)")]
|
|
1932
|
+
|
|
1933
|
+
|
|
1934
|
+
class BlendedAnyVarargsFunction(RowTransformFunction[_AnyVarargsArgs]):
|
|
1935
|
+
"""Blended 1->1 echo of N ANY-typed VARARGS input columns.
|
|
1936
|
+
|
|
1937
|
+
The varargs counterpart of ``blended_any``: every runtime column may resolve
|
|
1938
|
+
to a different concrete type, so the client must take each column's type
|
|
1939
|
+
from the call rather than from the (ANY) vararg element type. Output columns
|
|
1940
|
+
are ``col0..colN-1`` — the names the client generates for varargs blended
|
|
1941
|
+
input — each bound to its own resolved input type.
|
|
1942
|
+
"""
|
|
1943
|
+
|
|
1944
|
+
class Meta:
|
|
1945
|
+
name = "blended_any_varargs"
|
|
1946
|
+
description = "Blended 1->1 echo of N ANY-typed varargs input columns (col0..colN-1)"
|
|
1947
|
+
categories = ["blended", "test"]
|
|
1948
|
+
|
|
1949
|
+
@classmethod
|
|
1950
|
+
def on_bind(cls, params: BindParams[_AnyVarargsArgs]) -> BindResponse:
|
|
1951
|
+
input_schema = params.bind_call.input_schema
|
|
1952
|
+
assert input_schema is not None
|
|
1953
|
+
return BindResponse(output_schema=pa.schema([pa.field(f"col{i}", f.type) for i, f in enumerate(input_schema)]))
|
|
1954
|
+
|
|
1955
|
+
@classmethod
|
|
1956
|
+
def process(
|
|
1957
|
+
cls,
|
|
1958
|
+
params: ProcessParams[_AnyVarargsArgs],
|
|
1959
|
+
state: None,
|
|
1960
|
+
batch: pa.RecordBatch,
|
|
1961
|
+
out: OutputCollector,
|
|
1962
|
+
) -> None:
|
|
1963
|
+
out.emit(pa.record_batch(cls.input_columns(batch), schema=params.output_schema))
|
|
1964
|
+
|
|
1965
|
+
|
|
1883
1966
|
class CachedExplodeFunction(RowTransformFunction[_ExplodeArgs]):
|
|
1884
1967
|
"""Cacheable blended 1->N fan-out advertising vgi.cache.per_value.
|
|
1885
1968
|
|
|
@@ -267,6 +267,8 @@ from vgi._test_fixtures.table.tt_pushdown import (
|
|
|
267
267
|
)
|
|
268
268
|
from vgi._test_fixtures.table_in_out import (
|
|
269
269
|
BatchIndexBufferInputFunction,
|
|
270
|
+
BlendedAnyFunction,
|
|
271
|
+
BlendedAnyVarargsFunction,
|
|
270
272
|
BlendedDropFunction,
|
|
271
273
|
BlendedExplodeFunction,
|
|
272
274
|
BufferEmitWideFunction,
|
|
@@ -432,6 +434,8 @@ _EXAMPLE_CATALOG = Catalog(
|
|
|
432
434
|
GeoEncode3Function,
|
|
433
435
|
RowSumFunction,
|
|
434
436
|
BlendedDropFunction,
|
|
437
|
+
BlendedAnyFunction,
|
|
438
|
+
BlendedAnyVarargsFunction,
|
|
435
439
|
BlendedExplodeFunction,
|
|
436
440
|
CachedExplodeFunction,
|
|
437
441
|
ProjectableBlendedFunction,
|
|
@@ -19,7 +19,8 @@ import warnings
|
|
|
19
19
|
from collections.abc import Sequence
|
|
20
20
|
from dataclasses import dataclass
|
|
21
21
|
from functools import cache
|
|
22
|
-
from
|
|
22
|
+
from types import UnionType
|
|
23
|
+
from typing import Annotated, Any, Union, get_args, get_origin, get_type_hints
|
|
23
24
|
|
|
24
25
|
import pyarrow as pa
|
|
25
26
|
|
|
@@ -395,14 +396,22 @@ def parameter_default_values_from_specs(
|
|
|
395
396
|
arrays: list[pa.Array[Any]] = []
|
|
396
397
|
names: list[str] = []
|
|
397
398
|
for spec in default_specs:
|
|
398
|
-
if pa.types.is_null(spec.arrow_type):
|
|
399
|
-
raise ValueError(
|
|
400
|
-
f"Parameter {spec.name!r} has a default but no concrete Arrow type; "
|
|
401
|
-
"typed defaults require an explicit parameter type"
|
|
402
|
-
)
|
|
403
399
|
value = spec.default_value
|
|
404
400
|
if isinstance(value, pa.Scalar):
|
|
405
401
|
value = value.as_py()
|
|
402
|
+
# An ANY-typed parameter (AnyArrow) has no concrete Arrow type, so a
|
|
403
|
+
# VALUE default cannot be represented. `None` still can: a null-typed
|
|
404
|
+
# array holds nulls, and it is column PRESENCE, not the value, that
|
|
405
|
+
# marks a parameter as having a default. Allowing it lets a required
|
|
406
|
+
# ANY parameter be declared `default=None` so that omitting it reaches
|
|
407
|
+
# the function's own on_bind() validation — which can name the argument
|
|
408
|
+
# and show its shape — instead of raising a bare KeyError during
|
|
409
|
+
# argument parsing, before any user code runs.
|
|
410
|
+
if pa.types.is_null(spec.arrow_type) and value is not None:
|
|
411
|
+
raise ValueError(
|
|
412
|
+
f"Parameter {spec.name!r} has a non-null default but no concrete Arrow type; "
|
|
413
|
+
"a typed default requires an explicit parameter type (None is allowed)"
|
|
414
|
+
)
|
|
406
415
|
try:
|
|
407
416
|
arrays.append(pa.array([value], type=spec.arrow_type))
|
|
408
417
|
except (pa.ArrowException, TypeError, ValueError) as exc:
|
|
@@ -538,6 +547,30 @@ def _format_range(
|
|
|
538
547
|
return f"{low}, {high}"
|
|
539
548
|
|
|
540
549
|
|
|
550
|
+
def _unwrap_optional(annotation: Any) -> Any:
|
|
551
|
+
"""``T | None`` -> ``T``; anything else unchanged.
|
|
552
|
+
|
|
553
|
+
A special marker type (``AnyArrow``, ``TableInput``) is recognised by
|
|
554
|
+
identity, so an Optional wrapper would hide it — an ``AnyArrow | None``
|
|
555
|
+
parameter would silently become a NULL-typed one, and DuckDB then cannot
|
|
556
|
+
cast anything into it. Unwrapping first lets a marker be declared nullable,
|
|
557
|
+
which is how a REQUIRED ANY argument opts into reaching its function's own
|
|
558
|
+
``on_bind()`` validation (with ``default=None``) instead of being rejected
|
|
559
|
+
during parsing. Mirrors what ``_accepts_none`` already looks for.
|
|
560
|
+
|
|
561
|
+
Args:
|
|
562
|
+
annotation: The declared type of an ``Annotated[T, Arg(...)]`` field.
|
|
563
|
+
|
|
564
|
+
Returns:
|
|
565
|
+
The single non-``None`` member of an optional union, else ``annotation``.
|
|
566
|
+
"""
|
|
567
|
+
origin = get_origin(annotation)
|
|
568
|
+
if origin is not Union and origin is not UnionType:
|
|
569
|
+
return annotation
|
|
570
|
+
members = [a for a in get_args(annotation) if a is not type(None)]
|
|
571
|
+
return members[0] if len(members) == 1 else annotation
|
|
572
|
+
|
|
573
|
+
|
|
541
574
|
def _constraint_kwargs(arg: Arg[Any]) -> dict[str, Any]:
|
|
542
575
|
"""Extract discovery-facing constraint metadata from an [`Arg`][] descriptor.
|
|
543
576
|
|
|
@@ -744,6 +777,7 @@ def _extract_argument_specs(
|
|
|
744
777
|
if type_args:
|
|
745
778
|
infer_type = type_args[0]
|
|
746
779
|
|
|
780
|
+
infer_type = _unwrap_optional(infer_type)
|
|
747
781
|
is_table_input = infer_type is TableInput
|
|
748
782
|
is_any_type = infer_type is AnyArrow or infer_type is AnyArrowValue
|
|
749
783
|
|
|
@@ -790,8 +824,8 @@ def _extract_argument_specs(
|
|
|
790
824
|
# Check for special types (AnyArrow, TableInput)
|
|
791
825
|
# Priority: Arg subscript type (Arg[AnyArrow]) > class type hint
|
|
792
826
|
# Also check _returns_any_arrow_value for Annotated[AnyArrowValue, ...]
|
|
793
|
-
hint = hints.get(attr_name)
|
|
794
|
-
type_param = getattr(arg_legacy, "_type_param", None)
|
|
827
|
+
hint = _unwrap_optional(hints.get(attr_name))
|
|
828
|
+
type_param = _unwrap_optional(getattr(arg_legacy, "_type_param", None))
|
|
795
829
|
is_table_input = type_param is TableInput or hint is TableInput
|
|
796
830
|
is_any_type = (
|
|
797
831
|
type_param is AnyArrow
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/negative/unknown-node.json
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/positive/empty-snapshot.json
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/cases/positive/remove-delta.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.33.0 → vgi_python-0.34.0}/conformance/filter-v2/runtime/comparison-le/input.arrow
RENAMED
|
File without changes
|