vgi-python 0.16.1__tar.gz → 0.18.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.16.1 → vgi_python-0.18.0}/PKG-INFO +2 -2
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/catalog-interface.md +53 -1
- {vgi_python-0.16.1 → vgi_python-0.18.0}/pyproject.toml +2 -2
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/test_broken_pipe.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/test_worker_debug.py +4 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_function_inventory.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_http_client.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_http_external_location.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_http_upload_url.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_protocol_version.py +4 -3
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_resumable_scan.py +8 -6
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_scalar.py +3 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/landing/describe.expected.json +99 -22
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_bernoulli_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_binary_packet_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_client.py +35 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_conditional_message_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_hash_seed_function.py +7 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_multiply_by_setting_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_multiply_function.py +3 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_random_bytes_function.py +6 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_return_secret_value_function.py +1 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_constant_columns_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_double_sequence_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_exception_function.py +3 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_filter_echo_function.py +3 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_logging_function.py +3 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_nested_sequence_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_partitioned_function.py +6 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_projected_data_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_sequence_function.py +1 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_settings_function.py +4 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_struct_settings_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_ten_thousand_function.py +1 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_buffer_input_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_echo_function.py +2 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_exception_functions.py +5 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +3 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +4 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +3 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +13 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/test_client.py +11 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_bind_exceptions.py +5 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_examples_workers.py +9 -5
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_exception_handling.py +11 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_projection_enforcement.py +4 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_projection_repro.py +7 -0
- vgi_python-0.18.0/tests/test_schema_scoped_functions.py +193 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_setting_secret_annotations.py +4 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_tcp_transport.py +1 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/uv.lock +5 -5
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/__init__.py +16 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/arithmetic.py +7 -4
- vgi_python-0.18.0/vgi/_test_fixtures/scalar/bench_ladder.py +134 -0
- vgi_python-0.18.0/vgi/_test_fixtures/scalar/same_name.py +82 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/__init__.py +0 -2
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/cache.py +0 -107
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table_in_out.py +60 -2
- vgi_python-0.18.0/vgi/_test_fixtures/twin_catalogs.py +146 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/worker.py +30 -6
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/cache_control.py +15 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli.py +12 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/client.py +29 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/meta_worker.py +53 -22
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/protocol.py +10 -1
- vgi_python-0.18.0/vgi/protocol_version.txt +1 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/worker.py +124 -34
- vgi_python-0.16.1/vgi/protocol_version.txt +0 -1
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.gitattributes +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.gitignore +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.python-version +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/.vale.ini +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/CLAUDE.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/LICENSE +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/README.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/SECURITY.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/ci/README.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/auth.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/client.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/filters.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/functions.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/http.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/index.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/observability.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/storage.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/worker.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/authentication.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/cli.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/generator-api.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/index.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/metadata.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/robots.txt +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/mkdocs.yml +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/test-data/generate.sh +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conftest.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/landing/_checker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/landing/describe.schema.json +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_auth.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_cache_control.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_landing_conformance.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_otel.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_serve.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/argument_spec.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/arguments.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/auth.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/catalog_interface.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/describe_json.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/landing.html +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/invocation.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/metadata.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/otel.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/py.typed +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/scalar_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/serve.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/table_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.16.1 → vgi_python-0.18.0}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.18.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
|
|
@@ -162,7 +162,7 @@ Requires-Dist: httpx>=0.24
|
|
|
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.26.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'
|
|
@@ -307,6 +307,52 @@ class MyReadOnlyCatalog(ReadOnlyCatalogInterface):
|
|
|
307
307
|
|
|
308
308
|
---
|
|
309
309
|
|
|
310
|
+
## Function Name Scoping
|
|
311
|
+
|
|
312
|
+
A function name is **not** a global key. The worker resolves a call by the pair
|
|
313
|
+
`(schema, function name)`, so the same name may be declared in more than one
|
|
314
|
+
schema of a catalog, and a schema-qualified call reaches the implementation in
|
|
315
|
+
that schema:
|
|
316
|
+
|
|
317
|
+
```python test="lint"
|
|
318
|
+
Catalog(
|
|
319
|
+
name="example",
|
|
320
|
+
default_schema="main",
|
|
321
|
+
schemas=[
|
|
322
|
+
Schema(name="main", functions=[ProdLookup]), # Meta.name = "lookup"
|
|
323
|
+
Schema(name="staging", functions=[StagingLookup]), # Meta.name = "lookup"
|
|
324
|
+
],
|
|
325
|
+
)
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
```sql
|
|
329
|
+
SELECT example.main.lookup(1); -- ProdLookup
|
|
330
|
+
SELECT example.staging.lookup(1); -- StagingLookup
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
The DuckDB extension carries the owning schema on every bind request
|
|
334
|
+
(`BindRequest.schema_name`), taken from the schema entry the function was
|
|
335
|
+
registered into. Two consequences worth knowing:
|
|
336
|
+
|
|
337
|
+
- **Overloads still work.** Several classes sharing a name *within one schema*
|
|
338
|
+
are overloads, disambiguated by argument signature as before. Only the
|
|
339
|
+
cross-schema case is resolved by schema.
|
|
340
|
+
- **Callers without a schema must be unambiguous.** The pure-Python `Client`
|
|
341
|
+
and the CLI send no schema. If the name is unique across the worker they
|
|
342
|
+
resolve normally; if two schemas declare it, the worker raises an ambiguity
|
|
343
|
+
error naming the schemas involved.
|
|
344
|
+
|
|
345
|
+
Functions declared via the legacy `Worker.functions` list have no schema of
|
|
346
|
+
their own, so they are registered into the catalog's `default_schema` — the
|
|
347
|
+
same schema DuckDB registers them into.
|
|
348
|
+
|
|
349
|
+
Across **catalogs**, the key is the attachment rather than the name: two
|
|
350
|
+
catalogs served by one worker process (see `vgi.meta_worker.MetaWorker`) may
|
|
351
|
+
each declare `main.lookup`, and each attachment's `attach_opaque_data` routes
|
|
352
|
+
its calls to the right catalog.
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
310
356
|
## Declarative Catalogs
|
|
311
357
|
|
|
312
358
|
For most use cases, the declarative catalog API provides a simpler way to define catalogs using Python dataclasses instead of implementing `CatalogInterface` directly.
|
|
@@ -483,13 +529,19 @@ class MyWorker(Worker):
|
|
|
483
529
|
|
|
484
530
|
To disable the catalog interface entirely:
|
|
485
531
|
|
|
486
|
-
```python
|
|
532
|
+
```python test="lint"
|
|
487
533
|
class MyWorker(Worker):
|
|
488
534
|
catalog_interface = None
|
|
489
535
|
catalog_name = None # Required to fully disable
|
|
490
536
|
functions = [...]
|
|
491
537
|
```
|
|
492
538
|
|
|
539
|
+
A catalog-less worker is reachable only from the pure-Python [`Client`][], which
|
|
540
|
+
binds by `(schema, function name)` and needs no attachment — its functions
|
|
541
|
+
register into the default `main` schema. It is **not** reachable from DuckDB:
|
|
542
|
+
`ATTACH ... (TYPE vgi)` requires a catalog, and there is no standalone
|
|
543
|
+
call form. If the worker should be usable from SQL, give it a catalog.
|
|
544
|
+
|
|
493
545
|
---
|
|
494
546
|
|
|
495
547
|
## Client Usage
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "vgi-python"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.18.0"
|
|
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.26.0",
|
|
44
44
|
"httpx>=0.24",
|
|
45
45
|
]
|
|
46
46
|
|
|
@@ -40,6 +40,7 @@ class TestClientWorkerExitHandling:
|
|
|
40
40
|
list(
|
|
41
41
|
client.table_in_out_function(
|
|
42
42
|
function_name="test",
|
|
43
|
+
schema_name="main",
|
|
43
44
|
arguments=Arguments(),
|
|
44
45
|
input=iter([_make_test_batch()]),
|
|
45
46
|
)
|
|
@@ -56,6 +57,7 @@ class TestClientWorkerExitHandling:
|
|
|
56
57
|
list(
|
|
57
58
|
client.table_in_out_function(
|
|
58
59
|
function_name="test",
|
|
60
|
+
schema_name="main",
|
|
59
61
|
arguments=Arguments(),
|
|
60
62
|
input=iter([_make_test_batch()]),
|
|
61
63
|
)
|
|
@@ -68,6 +68,7 @@ class TestStderrInErrorMessages:
|
|
|
68
68
|
list(
|
|
69
69
|
client.table_function(
|
|
70
70
|
function_name="nonexistent",
|
|
71
|
+
schema_name="main",
|
|
71
72
|
arguments=Arguments(),
|
|
72
73
|
)
|
|
73
74
|
)
|
|
@@ -87,6 +88,7 @@ class TestStderrInErrorMessages:
|
|
|
87
88
|
list(
|
|
88
89
|
client.table_function(
|
|
89
90
|
function_name="nonexistent",
|
|
91
|
+
schema_name="main",
|
|
90
92
|
arguments=Arguments(),
|
|
91
93
|
)
|
|
92
94
|
)
|
|
@@ -108,6 +110,7 @@ class TestStderrInErrorMessages:
|
|
|
108
110
|
list(
|
|
109
111
|
client.table_in_out_function(
|
|
110
112
|
function_name="nonexistent",
|
|
113
|
+
schema_name="main",
|
|
111
114
|
input=iter([batch]),
|
|
112
115
|
)
|
|
113
116
|
)
|
|
@@ -126,6 +129,7 @@ class TestStderrInErrorMessages:
|
|
|
126
129
|
list(
|
|
127
130
|
client.scalar_function(
|
|
128
131
|
function_name="nonexistent",
|
|
132
|
+
schema_name="main",
|
|
129
133
|
input=iter([batch]),
|
|
130
134
|
)
|
|
131
135
|
)
|
|
@@ -178,6 +178,7 @@ def test_scalar_function_end_to_end(attached_example: tuple[str, bytes]) -> None
|
|
|
178
178
|
out_batches = list(
|
|
179
179
|
client.scalar_function(
|
|
180
180
|
function_name="double",
|
|
181
|
+
schema_name="main",
|
|
181
182
|
arguments=Arguments(positional=(pa.scalar("x"),)),
|
|
182
183
|
input=iter([input_batch]),
|
|
183
184
|
)
|
|
@@ -199,6 +200,7 @@ def test_table_function_end_to_end(attached_example: tuple[str, bytes]) -> None:
|
|
|
199
200
|
out_batches = list(
|
|
200
201
|
client.table_function(
|
|
201
202
|
function_name="sequence",
|
|
203
|
+
schema_name="main",
|
|
202
204
|
arguments=Arguments(positional=(pa.scalar(5),)),
|
|
203
205
|
)
|
|
204
206
|
)
|
|
@@ -102,6 +102,7 @@ def test_scalar_function_over_http(http_example_base_url: str) -> None:
|
|
|
102
102
|
out = list(
|
|
103
103
|
client.scalar_function(
|
|
104
104
|
function_name="double",
|
|
105
|
+
schema_name="main",
|
|
105
106
|
arguments=Arguments(positional=(pa.scalar("x"),)),
|
|
106
107
|
input=iter([batch]),
|
|
107
108
|
)
|
|
@@ -119,6 +120,7 @@ def test_table_function_over_http(http_example_base_url: str) -> None:
|
|
|
119
120
|
out = list(
|
|
120
121
|
client.table_function(
|
|
121
122
|
function_name="sequence",
|
|
123
|
+
schema_name="main",
|
|
122
124
|
arguments=Arguments(positional=(pa.scalar(5),)),
|
|
123
125
|
)
|
|
124
126
|
)
|
|
@@ -83,6 +83,7 @@ def test_pointer_batch_auto_resolved(demo_storage_base_url: str) -> None:
|
|
|
83
83
|
out = list(
|
|
84
84
|
client.scalar_function(
|
|
85
85
|
function_name="random_bytes",
|
|
86
|
+
schema_name="main",
|
|
86
87
|
arguments=Arguments(positional=(pa.scalar(seed), pa.scalar(payload_bytes))),
|
|
87
88
|
input=iter([input_batch]),
|
|
88
89
|
)
|
|
@@ -116,6 +117,7 @@ def test_http_client_uses_default_external_config(demo_storage_base_url: str) ->
|
|
|
116
117
|
list(
|
|
117
118
|
client.scalar_function(
|
|
118
119
|
function_name="random_bytes",
|
|
120
|
+
schema_name="main",
|
|
119
121
|
arguments=Arguments(positional=(pa.scalar(0), pa.scalar(payload_bytes))),
|
|
120
122
|
input=iter([input_batch]),
|
|
121
123
|
)
|
|
@@ -85,6 +85,7 @@ def test_oversize_input_auto_externalized(small_request_limit_base_url: str) ->
|
|
|
85
85
|
out = list(
|
|
86
86
|
client.scalar_function(
|
|
87
87
|
function_name="double",
|
|
88
|
+
schema_name="main",
|
|
88
89
|
arguments=Arguments(positional=(pa.scalar("x"),)),
|
|
89
90
|
input=iter([input_batch]),
|
|
90
91
|
)
|
|
@@ -115,6 +116,7 @@ def test_small_input_not_externalized(small_request_limit_base_url: str) -> None
|
|
|
115
116
|
out = list(
|
|
116
117
|
client.scalar_function(
|
|
117
118
|
function_name="double",
|
|
119
|
+
schema_name="main",
|
|
118
120
|
arguments=Arguments(positional=(pa.scalar("x"),)),
|
|
119
121
|
input=iter([input_batch]),
|
|
120
122
|
)
|
|
@@ -32,18 +32,19 @@ CLIENT_PROTOCOL_VERSION = VgiProtocol.protocol_version
|
|
|
32
32
|
|
|
33
33
|
def test_client_protocol_version_is_canonical() -> None:
|
|
34
34
|
"""Sanity-check the constants this test reasons about haven't drifted apart."""
|
|
35
|
-
assert CLIENT_PROTOCOL_VERSION == "1.
|
|
35
|
+
assert CLIENT_PROTOCOL_VERSION == "1.1.0"
|
|
36
36
|
# The fixture must be a genuine mismatch in the major/minor that the
|
|
37
37
|
# framework compares; a patch-only difference would (correctly) pass.
|
|
38
38
|
assert BAD_PROTOCOL_VERSION.split(".")[:2] != CLIENT_PROTOCOL_VERSION.split(".")[:2]
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
def test_mismatched_worker_protocol_version_raises() -> None:
|
|
42
|
-
"""A worker enforcing 99.0.0 must reject the 1.
|
|
42
|
+
"""A worker enforcing 99.0.0 must reject the 1.1.0 client at dispatch."""
|
|
43
43
|
with Client("vgi-fixture-bad-protocol-worker") as client, pytest.raises(ClientError) as exc_info:
|
|
44
44
|
list(
|
|
45
45
|
client.table_function(
|
|
46
46
|
function_name="sequence",
|
|
47
|
+
schema_name="main",
|
|
47
48
|
arguments=Arguments(positional=(pa.scalar(5),)),
|
|
48
49
|
)
|
|
49
50
|
)
|
|
@@ -53,5 +54,5 @@ def test_mismatched_worker_protocol_version_raises() -> None:
|
|
|
53
54
|
assert "protocol_version mismatch" in message
|
|
54
55
|
assert CLIENT_PROTOCOL_VERSION in message
|
|
55
56
|
assert BAD_PROTOCOL_VERSION in message
|
|
56
|
-
# Directional hint: the client (1.
|
|
57
|
+
# Directional hint: the client (1.1.0) is older than the worker (99.0.0).
|
|
57
58
|
assert "upgrade the VGI extension/client" in message
|
|
@@ -50,7 +50,7 @@ def _reference_rows(base_url: str) -> list[int]:
|
|
|
50
50
|
with Client.from_http(base_url) as client:
|
|
51
51
|
return [
|
|
52
52
|
v
|
|
53
|
-
for b in client.table_function(function_name="sequence", arguments=_ARGS)
|
|
53
|
+
for b in client.table_function(function_name="sequence", schema_name="main", arguments=_ARGS)
|
|
54
54
|
for v in b.column("n").to_pylist()
|
|
55
55
|
]
|
|
56
56
|
|
|
@@ -62,7 +62,7 @@ def test_resumable_scan_matches_table_function(http_base_url: str) -> None:
|
|
|
62
62
|
|
|
63
63
|
rows: list[int] = []
|
|
64
64
|
with Client.from_http(http_base_url) as client:
|
|
65
|
-
cur = client.table_scan_resumable(function_name="sequence", arguments=_ARGS)
|
|
65
|
+
cur = client.table_scan_resumable(function_name="sequence", schema_name="main", arguments=_ARGS)
|
|
66
66
|
while True:
|
|
67
67
|
batch, _token = cur.next()
|
|
68
68
|
if batch is None:
|
|
@@ -81,7 +81,7 @@ def test_resume_on_fresh_client_after_node_hop(http_base_url: str) -> None:
|
|
|
81
81
|
token: bytes | None = None
|
|
82
82
|
# Read the first few batches, then abandon the connection (as if the LB node died).
|
|
83
83
|
with Client.from_http(http_base_url) as client:
|
|
84
|
-
cur = client.table_scan_resumable(function_name="sequence", arguments=_ARGS)
|
|
84
|
+
cur = client.table_scan_resumable(function_name="sequence", schema_name="main", arguments=_ARGS)
|
|
85
85
|
for _ in range(3):
|
|
86
86
|
batch, token = cur.next()
|
|
87
87
|
assert batch is not None
|
|
@@ -91,7 +91,9 @@ def test_resume_on_fresh_client_after_node_hop(http_base_url: str) -> None:
|
|
|
91
91
|
|
|
92
92
|
# A brand-new client resumes from the serialized token alone.
|
|
93
93
|
with Client.from_http(http_base_url) as client2:
|
|
94
|
-
cur2 = client2.table_scan_resumable(
|
|
94
|
+
cur2 = client2.table_scan_resumable(
|
|
95
|
+
function_name="sequence", schema_name="main", arguments=_ARGS, resume_token=token
|
|
96
|
+
)
|
|
95
97
|
while True:
|
|
96
98
|
batch, token = cur2.next()
|
|
97
99
|
if batch is None:
|
|
@@ -116,7 +118,7 @@ def test_continue_on_fresh_client_skips_rebind(http_base_url: str) -> None:
|
|
|
116
118
|
rows: list[int] = []
|
|
117
119
|
token: bytes | None = None
|
|
118
120
|
with Client.from_http(http_base_url) as client:
|
|
119
|
-
cur = client.table_scan_resumable(function_name="sequence", arguments=_ARGS)
|
|
121
|
+
cur = client.table_scan_resumable(function_name="sequence", schema_name="main", arguments=_ARGS)
|
|
120
122
|
for _ in range(3):
|
|
121
123
|
batch, token = cur.next()
|
|
122
124
|
assert batch is not None
|
|
@@ -153,4 +155,4 @@ def test_resumable_scan_rejected_on_subprocess() -> None:
|
|
|
153
155
|
client = Client("/nonexistent/worker") # subprocess transport, never started
|
|
154
156
|
assert client.supports_resumable_scan is False
|
|
155
157
|
with pytest.raises(ResumeUnsupported):
|
|
156
|
-
client.table_scan_resumable(function_name="sequence", arguments=_ARGS)
|
|
158
|
+
client.table_scan_resumable(function_name="sequence", schema_name="main", arguments=_ARGS)
|
|
@@ -23,6 +23,9 @@ skip_area(
|
|
|
23
23
|
"hash_seed.test",
|
|
24
24
|
"null_handling.test",
|
|
25
25
|
"random_int.test",
|
|
26
|
+
# Covered on the Python side by tests/test_schema_scoped_functions.py.
|
|
27
|
+
"same_name_catalogs.test",
|
|
28
|
+
"same_name_schemas.test",
|
|
26
29
|
"sum_values.test",
|
|
27
30
|
"unnest_tensor.test",
|
|
28
31
|
"upper_case.test",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
{
|
|
4
4
|
"attach_options": [],
|
|
5
5
|
"counts": {
|
|
6
|
-
"functions":
|
|
6
|
+
"functions": 209,
|
|
7
7
|
"schemas": 2,
|
|
8
8
|
"tables": 59,
|
|
9
9
|
"views": 3
|
|
@@ -15,7 +15,21 @@
|
|
|
15
15
|
"schemas": [
|
|
16
16
|
{
|
|
17
17
|
"doc": "Example tables backed by functions",
|
|
18
|
-
"functions": [
|
|
18
|
+
"functions": [
|
|
19
|
+
{
|
|
20
|
+
"args": [
|
|
21
|
+
{
|
|
22
|
+
"desc": "Integer value to tag",
|
|
23
|
+
"name": "value",
|
|
24
|
+
"type": "int64"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"doc": "Schema-disambiguation probe; the data-schema implementation",
|
|
28
|
+
"name": "test_same_name_bind",
|
|
29
|
+
"returns": "string",
|
|
30
|
+
"type": "scalar"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
19
33
|
"name": "data",
|
|
20
34
|
"tables": [
|
|
21
35
|
{
|
|
@@ -699,6 +713,19 @@
|
|
|
699
713
|
"returns": "string",
|
|
700
714
|
"type": "scalar"
|
|
701
715
|
},
|
|
716
|
+
{
|
|
717
|
+
"args": [
|
|
718
|
+
{
|
|
719
|
+
"desc": "Positive integer",
|
|
720
|
+
"name": "value",
|
|
721
|
+
"type": "int64"
|
|
722
|
+
}
|
|
723
|
+
],
|
|
724
|
+
"doc": "Number of Collatz (3n+1) steps for each integer to reach 1",
|
|
725
|
+
"name": "collatz_steps",
|
|
726
|
+
"returns": "int64",
|
|
727
|
+
"type": "scalar"
|
|
728
|
+
},
|
|
702
729
|
{
|
|
703
730
|
"args": [
|
|
704
731
|
{
|
|
@@ -908,6 +935,24 @@
|
|
|
908
935
|
"returns": "double",
|
|
909
936
|
"type": "scalar"
|
|
910
937
|
},
|
|
938
|
+
{
|
|
939
|
+
"args": [
|
|
940
|
+
{
|
|
941
|
+
"desc": "String to stretch",
|
|
942
|
+
"name": "value",
|
|
943
|
+
"type": "string"
|
|
944
|
+
},
|
|
945
|
+
{
|
|
946
|
+
"desc": "Number of SHA-256 rounds",
|
|
947
|
+
"name": "rounds",
|
|
948
|
+
"type": "int64"
|
|
949
|
+
}
|
|
950
|
+
],
|
|
951
|
+
"doc": "Apply SHA-256 `rounds` times (key-stretching); rounds is a const compute knob",
|
|
952
|
+
"name": "hash_rounds",
|
|
953
|
+
"returns": "string",
|
|
954
|
+
"type": "scalar"
|
|
955
|
+
},
|
|
911
956
|
{
|
|
912
957
|
"args": [
|
|
913
958
|
{
|
|
@@ -1019,6 +1064,19 @@
|
|
|
1019
1064
|
"returns": "string",
|
|
1020
1065
|
"type": "scalar"
|
|
1021
1066
|
},
|
|
1067
|
+
{
|
|
1068
|
+
"args": [
|
|
1069
|
+
{
|
|
1070
|
+
"desc": "String value",
|
|
1071
|
+
"name": "value",
|
|
1072
|
+
"type": "string"
|
|
1073
|
+
}
|
|
1074
|
+
],
|
|
1075
|
+
"doc": "Returns the input string unchanged (zero-compute wire probe)",
|
|
1076
|
+
"name": "passthru",
|
|
1077
|
+
"returns": "string",
|
|
1078
|
+
"type": "scalar"
|
|
1079
|
+
},
|
|
1022
1080
|
{
|
|
1023
1081
|
"args": [
|
|
1024
1082
|
{
|
|
@@ -1095,6 +1153,19 @@
|
|
|
1095
1153
|
"returns": "string",
|
|
1096
1154
|
"type": "scalar"
|
|
1097
1155
|
},
|
|
1156
|
+
{
|
|
1157
|
+
"args": [
|
|
1158
|
+
{
|
|
1159
|
+
"desc": "String to hash",
|
|
1160
|
+
"name": "value",
|
|
1161
|
+
"type": "string"
|
|
1162
|
+
}
|
|
1163
|
+
],
|
|
1164
|
+
"doc": "Lowercase hex SHA-256 digest of the UTF-8 string",
|
|
1165
|
+
"name": "sha256_hex",
|
|
1166
|
+
"returns": "string",
|
|
1167
|
+
"type": "scalar"
|
|
1168
|
+
},
|
|
1098
1169
|
{
|
|
1099
1170
|
"args": [
|
|
1100
1171
|
{
|
|
@@ -1144,6 +1215,19 @@
|
|
|
1144
1215
|
"returns": "null",
|
|
1145
1216
|
"type": "scalar"
|
|
1146
1217
|
},
|
|
1218
|
+
{
|
|
1219
|
+
"args": [
|
|
1220
|
+
{
|
|
1221
|
+
"desc": "Integer value to tag",
|
|
1222
|
+
"name": "value",
|
|
1223
|
+
"type": "int64"
|
|
1224
|
+
}
|
|
1225
|
+
],
|
|
1226
|
+
"doc": "Schema-disambiguation probe; the main-schema implementation",
|
|
1227
|
+
"name": "test_same_name_bind",
|
|
1228
|
+
"returns": "string",
|
|
1229
|
+
"type": "scalar"
|
|
1230
|
+
},
|
|
1147
1231
|
{
|
|
1148
1232
|
"args": [
|
|
1149
1233
|
{
|
|
@@ -1445,25 +1529,6 @@
|
|
|
1445
1529
|
"name": "cache_filtered",
|
|
1446
1530
|
"type": "table"
|
|
1447
1531
|
},
|
|
1448
|
-
{
|
|
1449
|
-
"args": [
|
|
1450
|
-
{
|
|
1451
|
-
"desc": "Total number of rows to generate",
|
|
1452
|
-
"name": "rows",
|
|
1453
|
-
"type": "int64"
|
|
1454
|
-
},
|
|
1455
|
-
{
|
|
1456
|
-
"default": "20000",
|
|
1457
|
-
"desc": "Rows per partition",
|
|
1458
|
-
"name": "chunk_size",
|
|
1459
|
-
"named": true,
|
|
1460
|
-
"type": "int64"
|
|
1461
|
-
}
|
|
1462
|
-
],
|
|
1463
|
-
"doc": "Parallel batch_index-tagged cacheable sequence; cache serve reassembles order",
|
|
1464
|
-
"name": "cache_interleaved",
|
|
1465
|
-
"type": "table"
|
|
1466
|
-
},
|
|
1467
1532
|
{
|
|
1468
1533
|
"args": [
|
|
1469
1534
|
{
|
|
@@ -1675,7 +1740,7 @@
|
|
|
1675
1740
|
"type": "int64"
|
|
1676
1741
|
}
|
|
1677
1742
|
],
|
|
1678
|
-
"doc": "Cacheable blended map x -> x*2 (advertises vgi.cache.ttl)",
|
|
1743
|
+
"doc": "Cacheable blended map x -> x*2 (advertises vgi.cache.ttl + per_value)",
|
|
1679
1744
|
"name": "cached_double",
|
|
1680
1745
|
"type": "table"
|
|
1681
1746
|
},
|
|
@@ -1685,6 +1750,18 @@
|
|
|
1685
1750
|
"name": "cached_echo",
|
|
1686
1751
|
"type": "table"
|
|
1687
1752
|
},
|
|
1753
|
+
{
|
|
1754
|
+
"args": [
|
|
1755
|
+
{
|
|
1756
|
+
"desc": "Fan-out count: emit rows 0..n-1 for this input row",
|
|
1757
|
+
"name": "n",
|
|
1758
|
+
"type": "int64"
|
|
1759
|
+
}
|
|
1760
|
+
],
|
|
1761
|
+
"doc": "Cacheable blended 1->N fan-out (per_value) — 1:0 / 1:1 / 1:N by input",
|
|
1762
|
+
"name": "cached_explode",
|
|
1763
|
+
"type": "table"
|
|
1764
|
+
},
|
|
1688
1765
|
{
|
|
1689
1766
|
"args": [
|
|
1690
1767
|
{
|
|
@@ -22,6 +22,7 @@ class TestBernoulliFunction:
|
|
|
22
22
|
outputs = list(
|
|
23
23
|
client.scalar_function(
|
|
24
24
|
function_name="bernoulli",
|
|
25
|
+
schema_name="main",
|
|
25
26
|
input=iter([batch]),
|
|
26
27
|
)
|
|
27
28
|
)
|
|
@@ -38,6 +39,7 @@ class TestBernoulliFunction:
|
|
|
38
39
|
outputs = list(
|
|
39
40
|
client.scalar_function(
|
|
40
41
|
function_name="bernoulli",
|
|
42
|
+
schema_name="main",
|
|
41
43
|
input=iter([batch]),
|
|
42
44
|
)
|
|
43
45
|
)
|
|
@@ -30,6 +30,7 @@ class TestBinaryPacketFunction:
|
|
|
30
30
|
outputs = list(
|
|
31
31
|
client.scalar_function(
|
|
32
32
|
function_name="binary_packet",
|
|
33
|
+
schema_name="main",
|
|
33
34
|
input=iter([batch]),
|
|
34
35
|
arguments=Arguments(positional=(header, config)),
|
|
35
36
|
)
|
|
@@ -56,6 +57,7 @@ class TestBinaryPacketFunction:
|
|
|
56
57
|
outputs = list(
|
|
57
58
|
client.scalar_function(
|
|
58
59
|
function_name="binary_packet",
|
|
60
|
+
schema_name="main",
|
|
59
61
|
input=iter([batch]),
|
|
60
62
|
arguments=Arguments(positional=(header, config)),
|
|
61
63
|
)
|