vgi-python 0.8.9__tar.gz → 0.8.10__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.8.9 → vgi_python-0.8.10}/PKG-INFO +1 -1
- {vgi_python-0.8.9 → vgi_python-0.8.10}/ci/run-integration.sh +12 -1
- {vgi_python-0.8.9 → vgi_python-0.8.10}/pyproject.toml +1 -1
- {vgi_python-0.8.9 → vgi_python-0.8.10}/uv.lock +1 -1
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/arithmetic.py +10 -2
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/arguments.py +41 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/scalar_function.py +45 -3
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.gitattributes +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/dependabot.yml +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.github/workflows/release.yml +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.gitignore +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.python-version +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/.vale.ini +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/CLAUDE.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/LICENSE +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/README.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/SECURITY.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/ci/README.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/arguments.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/auth.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/catalogs.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/client.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/exceptions.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/filters.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/functions.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/http.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/index.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/metadata.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/observability.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/storage.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/transactor.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/api/worker.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/argument-serialization.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/logo.png +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/assets/social-card.png +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/authentication.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/catalog-interface.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/cli.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/column-statistics.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/concepts/index.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/contributing-docs.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/generator-api.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/index.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/index.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/lifecycle.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/metadata.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/overrides/main.html +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/robots.txt +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/shared-storage.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/tutorial/index.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/tutorial/table.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/docs/vgi-logo.png +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/calc_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/filter_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/row_count_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/examples/sum_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/mkdocs.yml +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/scripts/measure_startup.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/test-data/generate.sh +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_required_field_filter_paths.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/test_cli.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/conftest.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_auth.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_docstrings.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_exceptions.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_metadata.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_otel.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_serve.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_union_argument.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/test_worker_page.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_duckdb.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/argument_spec.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/auth.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/catalog_interface.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/client/client.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/exceptions.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/function_storage.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/http/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/invocation.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/logging_config.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/meta_worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/metadata.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/otel.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/protocol.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/py.typed +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/schema_utils.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/secret_service.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/serve.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/table_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/client.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/transactor/server.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/vgi/worker.py +0 -0
- {vgi_python-0.8.9 → vgi_python-0.8.10}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.10
|
|
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
|
|
@@ -133,12 +133,23 @@ trap cleanup EXIT
|
|
|
133
133
|
# set BOOTED_PORT to the port it reports (PORT:<n>, the worker's readiness
|
|
134
134
|
# contract). Sets a global rather than echoing so the backgrounded worker stays a
|
|
135
135
|
# child of this shell (a $(...) subshell would reparent it and break teardown).
|
|
136
|
+
#
|
|
137
|
+
# The worker is spawned with cwd=$STAGE — the same directory the unittest binary
|
|
138
|
+
# runs from below (`cd "$STAGE"`). copy_from/copy_to tests have DuckDB write a
|
|
139
|
+
# source file under a relative `__TEST_DIR__` (duckdb_unittest_tempdir/...) that
|
|
140
|
+
# the worker then opens by the same relative path; the worker only resolves it
|
|
141
|
+
# if it shares DuckDB's cwd. On the stdio lane the C++ extension spawns the
|
|
142
|
+
# worker as a subprocess that inherits DuckDB's cwd, so it matches for free; the
|
|
143
|
+
# `( cd … ; exec … )` subshell gives the http worker the same footing (and
|
|
144
|
+
# mirrors the vgi repo's run_http_integration.sh, which boots server and DuckDB
|
|
145
|
+
# from one cwd). exec keeps the worker on the subshell's pid so teardown via the
|
|
146
|
+
# captured `$!` still works.
|
|
136
147
|
BOOTED_PORT=""
|
|
137
148
|
boot_http_worker() {
|
|
138
149
|
local exe="$1" log pid port=""
|
|
139
150
|
BOOTED_PORT=""
|
|
140
151
|
log="$(mktemp)"
|
|
141
|
-
"$exe" --http --port 0 >"$log" 2>&1 &
|
|
152
|
+
( cd "$STAGE" && exec "$exe" --http --port 0 ) >"$log" 2>&1 &
|
|
142
153
|
pid=$!
|
|
143
154
|
echo "$pid" >> "$BG_PIDS_FILE"
|
|
144
155
|
for _ in $(seq 1 60); do
|
|
@@ -51,9 +51,17 @@ class MultiplyFunction(ScalarFunction):
|
|
|
51
51
|
def compute(
|
|
52
52
|
cls,
|
|
53
53
|
value: Annotated[pa.Int64Array, Param(doc="Integer value to multiply")],
|
|
54
|
-
factor: Annotated[
|
|
54
|
+
factor: Annotated[pa.Int64Scalar, ConstParam("Multiplication factor")],
|
|
55
55
|
) -> Annotated[pa.Int64Array, Returns()]:
|
|
56
|
-
"""Multiply values by the constant factor.
|
|
56
|
+
"""Multiply values by the constant factor.
|
|
57
|
+
|
|
58
|
+
``factor`` is annotated as a ``pa.Int64Scalar`` (not a Python ``int``), so
|
|
59
|
+
the SDK delivers the typed Arrow scalar straight through and it can be
|
|
60
|
+
passed directly into ``pc.multiply``. Passing a bare Python int instead
|
|
61
|
+
makes pyarrow infer an Arrow scalar on every call — ~40-50x slower on
|
|
62
|
+
Windows than a typed scalar, and the dominant per-batch cost for a scalar
|
|
63
|
+
UDF. This is the idiomatic fast pattern for compute-bound constants.
|
|
64
|
+
"""
|
|
57
65
|
return pc.multiply(value, factor)
|
|
58
66
|
|
|
59
67
|
|
|
@@ -109,6 +109,46 @@ COMPLEX_ARRAY_CLASSES: set[type] = {
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
|
|
112
|
+
# Simple scalar classes that can be inferred automatically. Annotating a const
|
|
113
|
+
# parameter with one of these — ``Annotated[pa.Int64Scalar, ConstParam(...)]`` —
|
|
114
|
+
# makes the SDK deliver the typed ``pa.Scalar`` straight through to ``compute()``
|
|
115
|
+
# instead of converting it to a Python object via ``as_py()``. That lets the
|
|
116
|
+
# const be passed directly into ``pyarrow.compute`` with no per-call scalar
|
|
117
|
+
# re-inference, which is ~40-50x slower on Windows than a typed scalar. Built
|
|
118
|
+
# defensively so a pyarrow release missing a class name doesn't break import.
|
|
119
|
+
def _build_scalar_class_to_datatype() -> dict[type, pa.DataType]:
|
|
120
|
+
pairs: list[tuple[str, pa.DataType]] = [
|
|
121
|
+
("Int8Scalar", pa.int8()),
|
|
122
|
+
("Int16Scalar", pa.int16()),
|
|
123
|
+
("Int32Scalar", pa.int32()),
|
|
124
|
+
("Int64Scalar", pa.int64()),
|
|
125
|
+
("UInt8Scalar", pa.uint8()),
|
|
126
|
+
("UInt16Scalar", pa.uint16()),
|
|
127
|
+
("UInt32Scalar", pa.uint32()),
|
|
128
|
+
("UInt64Scalar", pa.uint64()),
|
|
129
|
+
("HalfFloatScalar", pa.float16()),
|
|
130
|
+
("FloatScalar", pa.float32()),
|
|
131
|
+
("DoubleScalar", pa.float64()),
|
|
132
|
+
("StringScalar", pa.string()),
|
|
133
|
+
("LargeStringScalar", pa.large_string()),
|
|
134
|
+
("BinaryScalar", pa.binary()),
|
|
135
|
+
("LargeBinaryScalar", pa.large_binary()),
|
|
136
|
+
("BooleanScalar", pa.bool_()),
|
|
137
|
+
("Date32Scalar", pa.date32()),
|
|
138
|
+
("Date64Scalar", pa.date64()),
|
|
139
|
+
("NullScalar", pa.null()),
|
|
140
|
+
]
|
|
141
|
+
out: dict[type, pa.DataType] = {}
|
|
142
|
+
for name, dt in pairs:
|
|
143
|
+
cls = getattr(pa, name, None)
|
|
144
|
+
if isinstance(cls, type):
|
|
145
|
+
out[cls] = dt
|
|
146
|
+
return out
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
SCALAR_CLASS_TO_DATATYPE: dict[type, pa.DataType] = _build_scalar_class_to_datatype()
|
|
150
|
+
|
|
151
|
+
|
|
112
152
|
# Sentinel for missing default value - proper type pattern
|
|
113
153
|
class _MissingType:
|
|
114
154
|
"""Sentinel type for missing default values.
|
|
@@ -158,6 +198,7 @@ __all__ = [
|
|
|
158
198
|
"Param",
|
|
159
199
|
"PYTHON_TO_ARROW",
|
|
160
200
|
"Returns",
|
|
201
|
+
"SCALAR_CLASS_TO_DATATYPE",
|
|
161
202
|
"TableInput",
|
|
162
203
|
"TaggedUnion",
|
|
163
204
|
"TypeBoundPredicate",
|
|
@@ -48,6 +48,7 @@ from vgi.arguments import (
|
|
|
48
48
|
_PYTHON_TO_ARROW,
|
|
49
49
|
ARRAY_CLASS_TO_DATATYPE,
|
|
50
50
|
COMPLEX_ARRAY_CLASSES,
|
|
51
|
+
SCALAR_CLASS_TO_DATATYPE,
|
|
51
52
|
Arg,
|
|
52
53
|
Arguments,
|
|
53
54
|
ArgumentValidationError,
|
|
@@ -212,6 +213,25 @@ def _param_to_arg(param: Param, base_type: type, position: int) -> Arg[Any]:
|
|
|
212
213
|
)
|
|
213
214
|
|
|
214
215
|
|
|
216
|
+
def _is_scalar_annotation(base_type: object) -> bool:
|
|
217
|
+
"""Whether a [`ConstParam`][] is annotated with a pyarrow scalar class.
|
|
218
|
+
|
|
219
|
+
``Annotated[pa.Int64Scalar, ConstParam(...)]`` (or the generic ``pa.Scalar``)
|
|
220
|
+
signals that the typed Arrow scalar should be delivered to ``compute()``
|
|
221
|
+
unchanged, instead of converting it to a Python value via ``as_py()``. The
|
|
222
|
+
scalar can then flow straight into ``pyarrow.compute`` with no per-call scalar
|
|
223
|
+
re-inference (the latter is ~40-50x slower on Windows than a typed scalar).
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
base_type: The type from the ``Annotated`` first argument.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
True iff ``base_type`` is ``pa.Scalar`` or a subclass.
|
|
230
|
+
|
|
231
|
+
"""
|
|
232
|
+
return isinstance(base_type, type) and issubclass(base_type, pa.Scalar)
|
|
233
|
+
|
|
234
|
+
|
|
215
235
|
def _const_param_to_arg(const_param: ConstParam, base_type: type, position: int) -> Arg[Any]:
|
|
216
236
|
"""Convert [`ConstParam`][] dataclass to internal [`Arg`][] object.
|
|
217
237
|
|
|
@@ -235,6 +255,15 @@ def _const_param_to_arg(const_param: ConstParam, base_type: type, position: int)
|
|
|
235
255
|
elif base_type in _PYTHON_TO_ARROW:
|
|
236
256
|
# Infer from Annotated first argument
|
|
237
257
|
arrow_type = _PYTHON_TO_ARROW[base_type]
|
|
258
|
+
elif base_type in SCALAR_CLASS_TO_DATATYPE:
|
|
259
|
+
# Annotated[pa.Int64Scalar, ConstParam(...)] — infer from the scalar class
|
|
260
|
+
# and deliver the typed scalar through (see _is_scalar_annotation).
|
|
261
|
+
arrow_type = SCALAR_CLASS_TO_DATATYPE[base_type]
|
|
262
|
+
elif _is_scalar_annotation(base_type):
|
|
263
|
+
raise TypeError(
|
|
264
|
+
f"Cannot infer Arrow type from {getattr(base_type, '__name__', base_type)}. "
|
|
265
|
+
f"Use a concrete scalar class (e.g. pa.Int64Scalar) or set arrow_type=... on ConstParam()."
|
|
266
|
+
)
|
|
238
267
|
else:
|
|
239
268
|
raise TypeError(
|
|
240
269
|
f"Cannot infer Arrow type from {base_type}. "
|
|
@@ -791,6 +820,7 @@ class ScalarFunction(ScalarFunctionGenerator):
|
|
|
791
820
|
|
|
792
821
|
_compute_params: dict[str, Arg[Any]] # Regular Param() arguments (arrays)
|
|
793
822
|
_const_params: dict[str, Arg[Any]] # ConstParam() arguments (scalars)
|
|
823
|
+
_const_scalar_params: set[str] # ConstParams annotated as pa.Scalar — delivered un-as_py()'d
|
|
794
824
|
_setting_params: dict[str, str] # Setting params: param_name -> setting_key
|
|
795
825
|
_secret_params: dict[str, Secret] # Secret params: param_name -> Secret instance
|
|
796
826
|
_output_length_param: str | None # OutputLength param name (batch row count)
|
|
@@ -866,6 +896,7 @@ class ScalarFunction(ScalarFunctionGenerator):
|
|
|
866
896
|
|
|
867
897
|
compute_params: dict[str, Arg[Any]] = {}
|
|
868
898
|
const_params: dict[str, Arg[Any]] = {}
|
|
899
|
+
const_scalar_params: set[str] = set() # ConstParams annotated as pa.Scalar
|
|
869
900
|
output_length_param: str | None = None # param that receives batch row count
|
|
870
901
|
auth_param: str | None = None # param that receives AuthContext
|
|
871
902
|
returns_output_type: pa.DataType | None = None
|
|
@@ -940,6 +971,8 @@ class ScalarFunction(ScalarFunctionGenerator):
|
|
|
940
971
|
# _resolution_index points to Arguments.positional index
|
|
941
972
|
arg._resolution_index = const_index
|
|
942
973
|
const_params[name] = arg
|
|
974
|
+
if _is_scalar_annotation(base_type):
|
|
975
|
+
const_scalar_params.add(name)
|
|
943
976
|
setattr(cls, name, _ConstArgDescriptor(arg, name))
|
|
944
977
|
overall_position += 1
|
|
945
978
|
const_index += 1
|
|
@@ -966,6 +999,7 @@ class ScalarFunction(ScalarFunctionGenerator):
|
|
|
966
999
|
|
|
967
1000
|
cls._compute_params = compute_params
|
|
968
1001
|
cls._const_params = const_params
|
|
1002
|
+
cls._const_scalar_params = const_scalar_params
|
|
969
1003
|
cls._setting_params = setting_params
|
|
970
1004
|
cls._secret_params = secret_params
|
|
971
1005
|
cls._output_length_param = output_length_param
|
|
@@ -1051,14 +1085,22 @@ class ScalarFunction(ScalarFunctionGenerator):
|
|
|
1051
1085
|
# Regular param: extract column by index
|
|
1052
1086
|
kwargs[name] = batch.column(col_idx)
|
|
1053
1087
|
|
|
1054
|
-
# Const params: extract
|
|
1088
|
+
# Const params: extract values from the constant arguments. Params annotated
|
|
1089
|
+
# with a pyarrow scalar class (e.g. Annotated[pa.Int64Scalar, ConstParam(...)])
|
|
1090
|
+
# receive the typed pa.Scalar unchanged, so it can be passed straight into
|
|
1091
|
+
# pyarrow.compute with no per-call scalar re-inference; all others get the
|
|
1092
|
+
# Python value via as_py() (backward compatible).
|
|
1055
1093
|
for name, arg in cls._const_params.items():
|
|
1056
1094
|
# Use _resolution_index for Arguments.positional lookup
|
|
1057
1095
|
arg_idx = cast(int, arg._resolution_index)
|
|
1058
1096
|
# Get the scalar value from arguments
|
|
1059
1097
|
scalar = bind_call.arguments.positional[arg_idx]
|
|
1060
|
-
|
|
1061
|
-
|
|
1098
|
+
if scalar is None:
|
|
1099
|
+
kwargs[name] = None
|
|
1100
|
+
elif name in cls._const_scalar_params:
|
|
1101
|
+
kwargs[name] = scalar
|
|
1102
|
+
else:
|
|
1103
|
+
kwargs[name] = scalar.as_py()
|
|
1062
1104
|
|
|
1063
1105
|
# Setting params: extract pa.Scalar from settings RecordBatch
|
|
1064
1106
|
if bind_call.settings is not None and cls._setting_params:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|