vgi-python 0.16.0__tar.gz → 0.17.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.0 → vgi_python-0.17.0}/.github/workflows/integration.yml +1 -1
- {vgi_python-0.16.0 → vgi_python-0.17.0}/PKG-INFO +2 -2
- {vgi_python-0.16.0 → vgi_python-0.17.0}/pyproject.toml +2 -2
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/landing/describe.expected.json +243 -1
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_filter_pushdown.py +85 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/uv.lock +5 -5
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/__init__.py +16 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/arithmetic.py +77 -0
- vgi_python-0.17.0/vgi/_test_fixtures/scalar/bench_ladder.py +134 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/__init__.py +8 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/cache.py +337 -2
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table_in_out.py +6 -10
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/worker.py +57 -53
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/cache_control.py +10 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/catalog_interface.py +7 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/duckdb_statistics.py +129 -102
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/metadata.py +4 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/protocol.py +21 -4
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/scalar_function.py +10 -1
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/table_filter_pushdown.py +75 -44
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/table_function.py +5 -2
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/table_in_out_function.py +2 -2
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/worker.py +35 -8
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.gitattributes +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.gitignore +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.python-version +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/.vale.ini +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/CLAUDE.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/LICENSE +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/README.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/SECURITY.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/ci/README.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/auth.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/client.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/filters.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/functions.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/http.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/index.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/observability.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/storage.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/api/worker.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/authentication.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/catalog-interface.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/cli.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/generator-api.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/index.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/metadata.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/robots.txt +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/mkdocs.yml +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/test-data/generate.sh +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/conftest.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/landing/_checker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/landing/describe.schema.json +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_auth.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_cache_control.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_landing_conformance.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_otel.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_serve.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/argument_spec.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/arguments.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/auth.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/client/client.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/http/describe_json.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/http/landing.html +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/invocation.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/meta_worker.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/otel.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/py.typed +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/serve.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.16.0 → vgi_python-0.17.0}/wrangler.jsonc +0 -0
|
@@ -32,7 +32,7 @@ env:
|
|
|
32
32
|
VGI_REF: main
|
|
33
33
|
# The Haybarn release providing the prebuilt haybarn-unittest binary. Must be
|
|
34
34
|
# ABI-compatible with the community-published vgi extension.
|
|
35
|
-
HAYBARN_RELEASE: haybarn-v1.5.4-
|
|
35
|
+
HAYBARN_RELEASE: haybarn-v1.5.4-rc3
|
|
36
36
|
|
|
37
37
|
jobs:
|
|
38
38
|
integration:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.17.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'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "vgi-python"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.17.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
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
{
|
|
4
4
|
"attach_options": [],
|
|
5
5
|
"counts": {
|
|
6
|
-
"functions":
|
|
6
|
+
"functions": 207,
|
|
7
7
|
"schemas": 2,
|
|
8
8
|
"tables": 59,
|
|
9
9
|
"views": 3
|
|
@@ -655,6 +655,63 @@
|
|
|
655
655
|
"returns": "binary",
|
|
656
656
|
"type": "scalar"
|
|
657
657
|
},
|
|
658
|
+
{
|
|
659
|
+
"args": [
|
|
660
|
+
{
|
|
661
|
+
"desc": "Value",
|
|
662
|
+
"name": "value",
|
|
663
|
+
"type": "int64"
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
"desc": "Constant addend",
|
|
667
|
+
"name": "addend",
|
|
668
|
+
"type": "int64"
|
|
669
|
+
}
|
|
670
|
+
],
|
|
671
|
+
"doc": "value + const addend (advertises vgi.cache.ttl)",
|
|
672
|
+
"name": "cached_add_const",
|
|
673
|
+
"returns": "int64",
|
|
674
|
+
"type": "scalar"
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
"args": [
|
|
678
|
+
{
|
|
679
|
+
"desc": "Value to double",
|
|
680
|
+
"name": "value",
|
|
681
|
+
"type": "int64"
|
|
682
|
+
}
|
|
683
|
+
],
|
|
684
|
+
"doc": "Doubles a BIGINT value (advertises vgi.cache.ttl for per-value memo)",
|
|
685
|
+
"name": "cached_double_scalar",
|
|
686
|
+
"returns": "int64",
|
|
687
|
+
"type": "scalar"
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
"args": [
|
|
691
|
+
{
|
|
692
|
+
"desc": "Value",
|
|
693
|
+
"name": "value",
|
|
694
|
+
"type": "int64"
|
|
695
|
+
}
|
|
696
|
+
],
|
|
697
|
+
"doc": "value -> 'lbl-<value>' or NULL for negatives (advertises vgi.cache.ttl)",
|
|
698
|
+
"name": "cached_label",
|
|
699
|
+
"returns": "string",
|
|
700
|
+
"type": "scalar"
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"args": [
|
|
704
|
+
{
|
|
705
|
+
"desc": "Positive integer",
|
|
706
|
+
"name": "value",
|
|
707
|
+
"type": "int64"
|
|
708
|
+
}
|
|
709
|
+
],
|
|
710
|
+
"doc": "Number of Collatz (3n+1) steps for each integer to reach 1",
|
|
711
|
+
"name": "collatz_steps",
|
|
712
|
+
"returns": "int64",
|
|
713
|
+
"type": "scalar"
|
|
714
|
+
},
|
|
658
715
|
{
|
|
659
716
|
"args": [
|
|
660
717
|
{
|
|
@@ -864,6 +921,24 @@
|
|
|
864
921
|
"returns": "double",
|
|
865
922
|
"type": "scalar"
|
|
866
923
|
},
|
|
924
|
+
{
|
|
925
|
+
"args": [
|
|
926
|
+
{
|
|
927
|
+
"desc": "String to stretch",
|
|
928
|
+
"name": "value",
|
|
929
|
+
"type": "string"
|
|
930
|
+
},
|
|
931
|
+
{
|
|
932
|
+
"desc": "Number of SHA-256 rounds",
|
|
933
|
+
"name": "rounds",
|
|
934
|
+
"type": "int64"
|
|
935
|
+
}
|
|
936
|
+
],
|
|
937
|
+
"doc": "Apply SHA-256 `rounds` times (key-stretching); rounds is a const compute knob",
|
|
938
|
+
"name": "hash_rounds",
|
|
939
|
+
"returns": "string",
|
|
940
|
+
"type": "scalar"
|
|
941
|
+
},
|
|
867
942
|
{
|
|
868
943
|
"args": [
|
|
869
944
|
{
|
|
@@ -975,6 +1050,19 @@
|
|
|
975
1050
|
"returns": "string",
|
|
976
1051
|
"type": "scalar"
|
|
977
1052
|
},
|
|
1053
|
+
{
|
|
1054
|
+
"args": [
|
|
1055
|
+
{
|
|
1056
|
+
"desc": "String value",
|
|
1057
|
+
"name": "value",
|
|
1058
|
+
"type": "string"
|
|
1059
|
+
}
|
|
1060
|
+
],
|
|
1061
|
+
"doc": "Returns the input string unchanged (zero-compute wire probe)",
|
|
1062
|
+
"name": "passthru",
|
|
1063
|
+
"returns": "string",
|
|
1064
|
+
"type": "scalar"
|
|
1065
|
+
},
|
|
978
1066
|
{
|
|
979
1067
|
"args": [
|
|
980
1068
|
{
|
|
@@ -1051,6 +1139,19 @@
|
|
|
1051
1139
|
"returns": "string",
|
|
1052
1140
|
"type": "scalar"
|
|
1053
1141
|
},
|
|
1142
|
+
{
|
|
1143
|
+
"args": [
|
|
1144
|
+
{
|
|
1145
|
+
"desc": "String to hash",
|
|
1146
|
+
"name": "value",
|
|
1147
|
+
"type": "string"
|
|
1148
|
+
}
|
|
1149
|
+
],
|
|
1150
|
+
"doc": "Lowercase hex SHA-256 digest of the UTF-8 string",
|
|
1151
|
+
"name": "sha256_hex",
|
|
1152
|
+
"returns": "string",
|
|
1153
|
+
"type": "scalar"
|
|
1154
|
+
},
|
|
1054
1155
|
{
|
|
1055
1156
|
"args": [
|
|
1056
1157
|
{
|
|
@@ -1259,6 +1360,18 @@
|
|
|
1259
1360
|
"name": "blended_drop",
|
|
1260
1361
|
"type": "table"
|
|
1261
1362
|
},
|
|
1363
|
+
{
|
|
1364
|
+
"args": [
|
|
1365
|
+
{
|
|
1366
|
+
"desc": "Fan-out count: emit rows 0..n-1 for this input row",
|
|
1367
|
+
"name": "n",
|
|
1368
|
+
"type": "int64"
|
|
1369
|
+
}
|
|
1370
|
+
],
|
|
1371
|
+
"doc": "Blended 1->N fan-out (emit 0..n-1 per input row) with row provenance",
|
|
1372
|
+
"name": "blended_explode",
|
|
1373
|
+
"type": "table"
|
|
1374
|
+
},
|
|
1262
1375
|
{
|
|
1263
1376
|
"args": [
|
|
1264
1377
|
{
|
|
@@ -1468,6 +1581,54 @@
|
|
|
1468
1581
|
"name": "cache_parallel",
|
|
1469
1582
|
"type": "table"
|
|
1470
1583
|
},
|
|
1584
|
+
{
|
|
1585
|
+
"args": [
|
|
1586
|
+
{
|
|
1587
|
+
"desc": "Rows per (region, year) partition",
|
|
1588
|
+
"name": "rows_per_partition",
|
|
1589
|
+
"type": "int64"
|
|
1590
|
+
}
|
|
1591
|
+
],
|
|
1592
|
+
"doc": "Per-partition cacheable over (region, year) SINGLE_VALUE partition columns",
|
|
1593
|
+
"name": "cache_partition_multicol",
|
|
1594
|
+
"type": "table"
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
"args": [
|
|
1598
|
+
{
|
|
1599
|
+
"desc": "Rows per country partition",
|
|
1600
|
+
"name": "rows_per_country",
|
|
1601
|
+
"type": "int64"
|
|
1602
|
+
}
|
|
1603
|
+
],
|
|
1604
|
+
"doc": "Per-partition cacheable; work-queue fan-out (parallel capture); one NULL partition",
|
|
1605
|
+
"name": "cache_partition_parallel",
|
|
1606
|
+
"type": "table"
|
|
1607
|
+
},
|
|
1608
|
+
{
|
|
1609
|
+
"args": [
|
|
1610
|
+
{
|
|
1611
|
+
"desc": "Rows per country partition",
|
|
1612
|
+
"name": "rows_per_country",
|
|
1613
|
+
"type": "int64"
|
|
1614
|
+
}
|
|
1615
|
+
],
|
|
1616
|
+
"doc": "Per-partition cacheable with projection pushdown + explicit partition_values",
|
|
1617
|
+
"name": "cache_partition_proj",
|
|
1618
|
+
"type": "table"
|
|
1619
|
+
},
|
|
1620
|
+
{
|
|
1621
|
+
"args": [
|
|
1622
|
+
{
|
|
1623
|
+
"desc": "Rows per country partition",
|
|
1624
|
+
"name": "rows_per_country",
|
|
1625
|
+
"type": "int64"
|
|
1626
|
+
}
|
|
1627
|
+
],
|
|
1628
|
+
"doc": "Per-partition cacheable single-value-partitioned result (vgi.cache.partition_scope)",
|
|
1629
|
+
"name": "cache_partition_scope",
|
|
1630
|
+
"type": "table"
|
|
1631
|
+
},
|
|
1471
1632
|
{
|
|
1472
1633
|
"args": [
|
|
1473
1634
|
{
|
|
@@ -1563,6 +1724,42 @@
|
|
|
1563
1724
|
"name": "cacheable_numbers",
|
|
1564
1725
|
"type": "table"
|
|
1565
1726
|
},
|
|
1727
|
+
{
|
|
1728
|
+
"args": [
|
|
1729
|
+
{
|
|
1730
|
+
"desc": "Input column",
|
|
1731
|
+
"name": "x",
|
|
1732
|
+
"type": "int64"
|
|
1733
|
+
}
|
|
1734
|
+
],
|
|
1735
|
+
"doc": "Cacheable blended map x -> x*2 (advertises vgi.cache.ttl)",
|
|
1736
|
+
"name": "cached_double",
|
|
1737
|
+
"type": "table"
|
|
1738
|
+
},
|
|
1739
|
+
{
|
|
1740
|
+
"args": [],
|
|
1741
|
+
"doc": "Cacheable classic (TABLE-input) passthrough (advertises vgi.cache.ttl)",
|
|
1742
|
+
"name": "cached_echo",
|
|
1743
|
+
"type": "table"
|
|
1744
|
+
},
|
|
1745
|
+
{
|
|
1746
|
+
"args": [
|
|
1747
|
+
{
|
|
1748
|
+
"desc": "Input column",
|
|
1749
|
+
"name": "x",
|
|
1750
|
+
"type": "int64"
|
|
1751
|
+
}
|
|
1752
|
+
],
|
|
1753
|
+
"doc": "Blended map x->x*2 with always-revalidate (304 not_modified) contract",
|
|
1754
|
+
"name": "cached_reval_double",
|
|
1755
|
+
"type": "table"
|
|
1756
|
+
},
|
|
1757
|
+
{
|
|
1758
|
+
"args": [],
|
|
1759
|
+
"doc": "Classic passthrough with always-revalidate (304 not_modified) contract",
|
|
1760
|
+
"name": "cached_reval_echo",
|
|
1761
|
+
"type": "table"
|
|
1762
|
+
},
|
|
1566
1763
|
{
|
|
1567
1764
|
"args": [],
|
|
1568
1765
|
"doc": "Scan colors table (ENUM column)",
|
|
@@ -1885,6 +2082,25 @@
|
|
|
1885
2082
|
"name": "geo_encode",
|
|
1886
2083
|
"type": "table"
|
|
1887
2084
|
},
|
|
2085
|
+
{
|
|
2086
|
+
"args": [
|
|
2087
|
+
{
|
|
2088
|
+
"desc": "Input column (echoed as output)",
|
|
2089
|
+
"name": "x",
|
|
2090
|
+
"type": "int64"
|
|
2091
|
+
},
|
|
2092
|
+
{
|
|
2093
|
+
"default": "\"range\"",
|
|
2094
|
+
"desc": "range | length | base64",
|
|
2095
|
+
"name": "mode",
|
|
2096
|
+
"named": true,
|
|
2097
|
+
"type": "string"
|
|
2098
|
+
}
|
|
2099
|
+
],
|
|
2100
|
+
"doc": "Adversarial blended fixture emitting malformed vgi_rpc.parent_row",
|
|
2101
|
+
"name": "hostile_provenance",
|
|
2102
|
+
"type": "table"
|
|
2103
|
+
},
|
|
1888
2104
|
{
|
|
1889
2105
|
"args": [
|
|
1890
2106
|
{
|
|
@@ -2302,6 +2518,18 @@
|
|
|
2302
2518
|
"name": "profiling_demo",
|
|
2303
2519
|
"type": "table"
|
|
2304
2520
|
},
|
|
2521
|
+
{
|
|
2522
|
+
"args": [
|
|
2523
|
+
{
|
|
2524
|
+
"desc": "Input column",
|
|
2525
|
+
"name": "x",
|
|
2526
|
+
"type": "int64"
|
|
2527
|
+
}
|
|
2528
|
+
],
|
|
2529
|
+
"doc": "Blended 1->1 map with projection_pushdown + two output columns",
|
|
2530
|
+
"name": "projectable_blended",
|
|
2531
|
+
"type": "table"
|
|
2532
|
+
},
|
|
2305
2533
|
{
|
|
2306
2534
|
"args": [
|
|
2307
2535
|
{
|
|
@@ -2815,6 +3043,20 @@
|
|
|
2815
3043
|
"name": "buffer_input",
|
|
2816
3044
|
"type": "table_in_out"
|
|
2817
3045
|
},
|
|
3046
|
+
{
|
|
3047
|
+
"args": [
|
|
3048
|
+
{
|
|
3049
|
+
"default": "false",
|
|
3050
|
+
"desc": "Whether to log during processing",
|
|
3051
|
+
"name": "logging",
|
|
3052
|
+
"named": true,
|
|
3053
|
+
"type": "bool"
|
|
3054
|
+
}
|
|
3055
|
+
],
|
|
3056
|
+
"doc": "Cacheable column-wise sum across all input (advertises vgi.cache.ttl)",
|
|
3057
|
+
"name": "cached_sum_all",
|
|
3058
|
+
"type": "table_in_out"
|
|
3059
|
+
},
|
|
2818
3060
|
{
|
|
2819
3061
|
"args": [],
|
|
2820
3062
|
"doc": "Worker raises during combine (test)",
|
|
@@ -1404,3 +1404,88 @@ class TestJoinKeysBatch:
|
|
|
1404
1404
|
assert merged.num_columns == 2
|
|
1405
1405
|
assert merged.column("a").to_pylist() == [1, 2, 3]
|
|
1406
1406
|
assert merged.column("b").to_pylist() == [10, 20, 30]
|
|
1407
|
+
|
|
1408
|
+
|
|
1409
|
+
# =============================================================================
|
|
1410
|
+
# TestDegenerateConjunctions
|
|
1411
|
+
# =============================================================================
|
|
1412
|
+
|
|
1413
|
+
|
|
1414
|
+
class TestDegenerateConjunctions:
|
|
1415
|
+
"""An AND whose children all degrade must not render as `WHERE ()`.
|
|
1416
|
+
|
|
1417
|
+
`_parse_filter` returns None for a join-key filter whose keys column cannot
|
|
1418
|
+
be resolved ("graceful degradation — DuckDB filters client-side"). Dropping
|
|
1419
|
+
such a child from an AND is safe on its own, but when *every* child drops the
|
|
1420
|
+
conjunction is left empty, and `f"({' AND '.join([])})"` yields `()` — which
|
|
1421
|
+
reaches the backend as the syntactically invalid `... WHERE () LIMIT n`.
|
|
1422
|
+
"""
|
|
1423
|
+
|
|
1424
|
+
def _and_of_join_keys_batch(self) -> pa.RecordBatch:
|
|
1425
|
+
"""A filter spec of one AND whose only children are join-key filters.
|
|
1426
|
+
|
|
1427
|
+
No `join_keys` batches are supplied to `deserialize_filters`, so every
|
|
1428
|
+
child resolves to None — the shape observed in production.
|
|
1429
|
+
"""
|
|
1430
|
+
spec = json.dumps(
|
|
1431
|
+
[
|
|
1432
|
+
{
|
|
1433
|
+
"column_name": "trade_canceled",
|
|
1434
|
+
"column_index": 0,
|
|
1435
|
+
"type": "and",
|
|
1436
|
+
"children": [
|
|
1437
|
+
{
|
|
1438
|
+
"column_name": "trade_canceled",
|
|
1439
|
+
"column_index": 0,
|
|
1440
|
+
"type": "join_keys",
|
|
1441
|
+
"keys_column": "missing_keys_a",
|
|
1442
|
+
},
|
|
1443
|
+
{
|
|
1444
|
+
"column_name": "_partition_date",
|
|
1445
|
+
"column_index": 1,
|
|
1446
|
+
"type": "join_keys",
|
|
1447
|
+
"keys_column": "missing_keys_b",
|
|
1448
|
+
},
|
|
1449
|
+
],
|
|
1450
|
+
}
|
|
1451
|
+
]
|
|
1452
|
+
)
|
|
1453
|
+
s = pa.schema([pa.field("filter_spec", pa.string(), metadata={b"vgi_filter_version": b"1"})])
|
|
1454
|
+
return pa.RecordBatch.from_pydict({"filter_spec": [spec]}, schema=s)
|
|
1455
|
+
|
|
1456
|
+
def test_and_with_all_children_dropped_yields_no_filter(self) -> None:
|
|
1457
|
+
"""All conjuncts unresolvable -> the AND is dropped entirely, not emptied."""
|
|
1458
|
+
pf = deserialize_filters(self._and_of_join_keys_batch())
|
|
1459
|
+
assert len(pf) == 0
|
|
1460
|
+
assert pf.to_sql() == ("", [])
|
|
1461
|
+
|
|
1462
|
+
def test_and_with_all_children_dropped_never_emits_empty_parens(self) -> None:
|
|
1463
|
+
"""Regression: the rendered clause must never be the invalid `()`."""
|
|
1464
|
+
where, params = deserialize_filters(self._and_of_join_keys_batch()).to_sql()
|
|
1465
|
+
assert where != "()"
|
|
1466
|
+
assert not params
|
|
1467
|
+
# A caller appending `WHERE {where}` only when truthy must produce no WHERE.
|
|
1468
|
+
assert not where
|
|
1469
|
+
|
|
1470
|
+
def test_empty_and_renders_as_true(self) -> None:
|
|
1471
|
+
"""An empty conjunction is AND's identity: it constrains nothing."""
|
|
1472
|
+
f = AndFilter(column_name="c", column_index=0, children=())
|
|
1473
|
+
assert _filter_to_sql(f, lambda s: f'"{s}"', "?", 0) == ("TRUE", [])
|
|
1474
|
+
assert _filters(f).to_sql() == ("TRUE", [])
|
|
1475
|
+
|
|
1476
|
+
def test_empty_or_renders_as_false(self) -> None:
|
|
1477
|
+
"""An empty disjunction admits nothing — it must not widen the result set."""
|
|
1478
|
+
f = OrFilter(column_name="c", column_index=0, children=())
|
|
1479
|
+
assert _filter_to_sql(f, lambda s: f'"{s}"', "?", 0) == ("FALSE", [])
|
|
1480
|
+
assert _filters(f).to_sql() == ("FALSE", [])
|
|
1481
|
+
|
|
1482
|
+
def test_and_keeps_resolvable_children(self) -> None:
|
|
1483
|
+
"""Partial degradation still yields a usable (weaker) conjunction."""
|
|
1484
|
+
f = AndFilter(
|
|
1485
|
+
column_name="c",
|
|
1486
|
+
column_index=0,
|
|
1487
|
+
children=(_eq("a", 0, 1), _eq("b", 1, 2)),
|
|
1488
|
+
)
|
|
1489
|
+
where, params = _filters(f).to_sql()
|
|
1490
|
+
assert where == '("a" = ? AND "b" = ?)'
|
|
1491
|
+
assert params == [1, 2]
|
|
@@ -2228,7 +2228,7 @@ requires-dist = [
|
|
|
2228
2228
|
|
|
2229
2229
|
[[package]]
|
|
2230
2230
|
name = "vgi-python"
|
|
2231
|
-
version = "0.
|
|
2231
|
+
version = "0.17.0"
|
|
2232
2232
|
source = { editable = "." }
|
|
2233
2233
|
dependencies = [
|
|
2234
2234
|
{ name = "click" },
|
|
@@ -2338,7 +2338,7 @@ requires-dist = [
|
|
|
2338
2338
|
{ name = "vgi-python", extras = ["test-fixtures"], marker = "extra == 'test-fixtures-writable'" },
|
|
2339
2339
|
{ name = "vgi-python", extras = ["test-fixtures", "test-fixtures-writable", "http", "oauth", "otel", "sentry", "azure"], marker = "extra == 'dev'" },
|
|
2340
2340
|
{ name = "vgi-python", extras = ["transactor"], marker = "extra == 'test-fixtures-writable'" },
|
|
2341
|
-
{ name = "vgi-rpc", specifier = ">=0.
|
|
2341
|
+
{ name = "vgi-rpc", specifier = ">=0.26.0" },
|
|
2342
2342
|
{ name = "vgi-rpc", extras = ["conformance", "external", "http", "oauth", "otel", "sentry"], marker = "extra == 'dev'" },
|
|
2343
2343
|
{ name = "vgi-rpc", extras = ["http"], marker = "extra == 'http'" },
|
|
2344
2344
|
{ name = "vgi-rpc", extras = ["oauth"], marker = "extra == 'oauth'" },
|
|
@@ -2367,7 +2367,7 @@ docs = [
|
|
|
2367
2367
|
|
|
2368
2368
|
[[package]]
|
|
2369
2369
|
name = "vgi-rpc"
|
|
2370
|
-
version = "0.
|
|
2370
|
+
version = "0.26.0"
|
|
2371
2371
|
source = { registry = "https://pypi.org/simple" }
|
|
2372
2372
|
dependencies = [
|
|
2373
2373
|
{ name = "docstring-parser" },
|
|
@@ -2375,9 +2375,9 @@ dependencies = [
|
|
|
2375
2375
|
{ name = "pywin32", marker = "sys_platform == 'win32'" },
|
|
2376
2376
|
{ name = "tzdata", marker = "sys_platform == 'win32'" },
|
|
2377
2377
|
]
|
|
2378
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
2378
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b5/51/86d4c4466cf5311e80db28f535c02b92961f3d5160a0aae348112a03f7d5/vgi_rpc-0.26.0.tar.gz", hash = "sha256:c0966c99e087f923b228b2211877a8695bf42052d9cde05ce9a4bf077047cb78", size = 869625, upload-time = "2026-07-21T17:39:12.871Z" }
|
|
2379
2379
|
wheels = [
|
|
2380
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2380
|
+
{ url = "https://files.pythonhosted.org/packages/57/51/d86efc32aef03d69d197916f9d18d0f3719ebd843424cfb9a782ced041c9/vgi_rpc-0.26.0-py3-none-any.whl", hash = "sha256:2c455edb517831867342ce2f105386b73b1fa23137477916c5e5d7a14b66e0fc", size = 386786, upload-time = "2026-07-21T17:39:11.142Z" },
|
|
2381
2381
|
]
|
|
2382
2382
|
|
|
2383
2383
|
[package.optional-dependencies]
|
|
@@ -19,12 +19,21 @@ unchanged.
|
|
|
19
19
|
|
|
20
20
|
from vgi._test_fixtures.scalar.arithmetic import (
|
|
21
21
|
AddValuesFunction,
|
|
22
|
+
CachedAddConstScalarFunction,
|
|
23
|
+
CachedDoubleScalarFunction,
|
|
24
|
+
CachedLabelScalarFunction,
|
|
22
25
|
ConcatValuesIntFunction,
|
|
23
26
|
ConcatValuesStrFunction,
|
|
24
27
|
DoubleFunction,
|
|
25
28
|
MultiplyFunction,
|
|
26
29
|
SumValuesFunction,
|
|
27
30
|
)
|
|
31
|
+
from vgi._test_fixtures.scalar.bench_ladder import (
|
|
32
|
+
CollatzStepsFunction,
|
|
33
|
+
HashRoundsFunction,
|
|
34
|
+
PassthruFunction,
|
|
35
|
+
Sha256HexFunction,
|
|
36
|
+
)
|
|
28
37
|
from vgi._test_fixtures.scalar.binary import (
|
|
29
38
|
BinaryPacketFunction,
|
|
30
39
|
UpperCaseFunction,
|
|
@@ -83,10 +92,17 @@ __all__ = [
|
|
|
83
92
|
"AnyMixedStrFunction",
|
|
84
93
|
"BernoulliFunction",
|
|
85
94
|
"BinaryPacketFunction",
|
|
95
|
+
"CachedAddConstScalarFunction",
|
|
96
|
+
"CachedDoubleScalarFunction",
|
|
97
|
+
"CachedLabelScalarFunction",
|
|
98
|
+
"CollatzStepsFunction",
|
|
86
99
|
"ConcatValuesIntFunction",
|
|
87
100
|
"ConcatValuesStrFunction",
|
|
88
101
|
"ConditionalMessageFunction",
|
|
89
102
|
"DoubleFunction",
|
|
103
|
+
"HashRoundsFunction",
|
|
104
|
+
"PassthruFunction",
|
|
105
|
+
"Sha256HexFunction",
|
|
90
106
|
"FormatNumberDefaultFunction",
|
|
91
107
|
"FormatNumberFullFunction",
|
|
92
108
|
"FormatNumberPrecisionFunction",
|
|
@@ -11,6 +11,7 @@ import pyarrow.compute as pc
|
|
|
11
11
|
|
|
12
12
|
from vgi._test_fixtures.scalar._common import _is_addable_type, _is_multipliable_type, _promote_for_addition
|
|
13
13
|
from vgi.arguments import ConstParam, Param, Returns
|
|
14
|
+
from vgi.cache_control import CacheControl
|
|
14
15
|
from vgi.metadata import FunctionExample
|
|
15
16
|
from vgi.scalar_function import BindParameters, BindResult, ScalarFunction
|
|
16
17
|
|
|
@@ -131,6 +132,82 @@ class DoubleFunction(ScalarFunction):
|
|
|
131
132
|
return result
|
|
132
133
|
|
|
133
134
|
|
|
135
|
+
class CachedDoubleScalarFunction(ScalarFunction):
|
|
136
|
+
"""Doubles a BIGINT value and advertises vgi.cache.* — backs scalar per-value memo tests.
|
|
137
|
+
|
|
138
|
+
A deterministic 1:1 map, so opting into the result cache is sound: the extension
|
|
139
|
+
memoizes the output per distinct input value and serves a fully-warm distinct set
|
|
140
|
+
without the worker.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
# Opt into the result cache (per-value memoization on the C++ side).
|
|
144
|
+
CACHE_CONTROL = CacheControl(ttl=300)
|
|
145
|
+
|
|
146
|
+
class Meta:
|
|
147
|
+
"""Function metadata."""
|
|
148
|
+
|
|
149
|
+
name = "cached_double_scalar"
|
|
150
|
+
description = "Doubles a BIGINT value (advertises vgi.cache.ttl for per-value memo)"
|
|
151
|
+
|
|
152
|
+
@classmethod
|
|
153
|
+
def compute(
|
|
154
|
+
cls,
|
|
155
|
+
value: Annotated[pa.Int64Array, Param(doc="Value to double")],
|
|
156
|
+
) -> Annotated[pa.Int64Array, Returns(pa.int64())]:
|
|
157
|
+
"""Double the input values."""
|
|
158
|
+
return pc.multiply(value, 2)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class CachedAddConstScalarFunction(ScalarFunction):
|
|
162
|
+
"""value + addend (a CONST param), cacheable — backs per-value const-param keying tests.
|
|
163
|
+
|
|
164
|
+
Two calls with the same ``value`` but different ``addend`` must NOT cross-serve: the
|
|
165
|
+
const arg is folded into the cache key.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
CACHE_CONTROL = CacheControl(ttl=300)
|
|
169
|
+
|
|
170
|
+
class Meta:
|
|
171
|
+
"""Function metadata."""
|
|
172
|
+
|
|
173
|
+
name = "cached_add_const"
|
|
174
|
+
description = "value + const addend (advertises vgi.cache.ttl)"
|
|
175
|
+
|
|
176
|
+
@classmethod
|
|
177
|
+
def compute(
|
|
178
|
+
cls,
|
|
179
|
+
value: Annotated[pa.Int64Array, Param(doc="Value")],
|
|
180
|
+
addend: Annotated[pa.Int64Scalar, ConstParam("Constant addend")],
|
|
181
|
+
) -> Annotated[pa.Int64Array, Returns(pa.int64())]:
|
|
182
|
+
"""Add the const addend to each value."""
|
|
183
|
+
return pc.add(value, addend)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class CachedLabelScalarFunction(ScalarFunction):
|
|
187
|
+
"""VARCHAR output with NULLs, cacheable — exercises string/null round-trip through the cache.
|
|
188
|
+
|
|
189
|
+
Returns ``lbl-<value>`` for value >= 0, NULL otherwise, so a cached per-value entry must
|
|
190
|
+
round-trip both a heap string and a null.
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
CACHE_CONTROL = CacheControl(ttl=300)
|
|
194
|
+
|
|
195
|
+
class Meta:
|
|
196
|
+
"""Function metadata."""
|
|
197
|
+
|
|
198
|
+
name = "cached_label"
|
|
199
|
+
description = "value -> 'lbl-<value>' or NULL for negatives (advertises vgi.cache.ttl)"
|
|
200
|
+
|
|
201
|
+
@classmethod
|
|
202
|
+
def compute(
|
|
203
|
+
cls,
|
|
204
|
+
value: Annotated[pa.Int64Array, Param(doc="Value")],
|
|
205
|
+
) -> Annotated[pa.StringArray, Returns(pa.string())]:
|
|
206
|
+
"""Label non-negative values; NULL for negatives."""
|
|
207
|
+
labels = ["lbl-" + str(v.as_py()) if (v.is_valid and v.as_py() >= 0) else None for v in value]
|
|
208
|
+
return pa.array(labels, type=pa.string())
|
|
209
|
+
|
|
210
|
+
|
|
134
211
|
class AddValuesFunction(ScalarFunction):
|
|
135
212
|
"""Adds two numeric values together.
|
|
136
213
|
|